From 1dc12429f2d18cfaa3beb90a45317aca57252a38 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:50 -0600 Subject: [PATCH 0001/2998] Pin reportlab to latest version 3.3.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index a5d11da171..2faf608b01 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,7 +2,7 @@ docutils==0.12 requests[security] sphinx -reportlab +reportlab==3.3.0 alabaster releases==1.2.1 # Updated from 1.2.0 aafigure From 8e6a1b9ed61c426ca72e53c17f98239cc8569890 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:51 -0600 Subject: [PATCH 0002/2998] Pin alabaster to latest version 0.7.9 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 2faf608b01..a7c4bb8f19 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,6 +3,6 @@ docutils==0.12 requests[security] sphinx reportlab==3.3.0 -alabaster +alabaster==0.7.9 releases==1.2.1 # Updated from 1.2.0 aafigure From 091487bb189b780a39457678e9f1e22cd7fb2c07 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:53 -0600 Subject: [PATCH 0003/2998] Update releases from 1.2.1 to 1.3.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index a7c4bb8f19..11e0d0c800 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,5 +4,5 @@ requests[security] sphinx reportlab==3.3.0 alabaster==0.7.9 -releases==1.2.1 # Updated from 1.2.0 +releases==1.3.0 # Updated from 1.2.0 aafigure From 0a3c78ef0bbcab8abfdd295f6272f49cd353bbc0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:54 -0600 Subject: [PATCH 0004/2998] Update docutils from 0.12 to 0.13.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 11e0d0c800..6a670c2269 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,5 +1,5 @@ -r ./base.txt -docutils==0.12 +docutils==0.13.1 requests[security] sphinx reportlab==3.3.0 From c4fdccfef813adcbee46507a41f73293d11043d3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:56 -0600 Subject: [PATCH 0005/2998] Pin aafigure to latest version 0.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 6a670c2269..d5bc6bed41 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -5,4 +5,4 @@ sphinx reportlab==3.3.0 alabaster==0.7.9 releases==1.3.0 # Updated from 1.2.0 -aafigure +aafigure==0.5 From 1eeaa91785f2db52cfed8a08e9e073f528c07eeb Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:57 -0600 Subject: [PATCH 0006/2998] Pin sphinx to latest version 1.5.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index d5bc6bed41..f8a57de17b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security] -sphinx +sphinx==1.5.1 reportlab==3.3.0 alabaster==0.7.9 releases==1.3.0 # Updated from 1.2.0 From fff4b42c00edf942ddc56e00f32b84993b3e9fca Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:48:59 -0600 Subject: [PATCH 0007/2998] Pin requests to latest version 2.12.4 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index f8a57de17b..7dab4553ff 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security] +requests[security]==2.12.4 sphinx==1.5.1 reportlab==3.3.0 alabaster==0.7.9 From 8d7fa641beae5fb82365b6a96e4d9353d441d46c Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 22 Dec 2016 12:49:00 -0600 Subject: [PATCH 0008/2998] Pin colorama to latest version 0.3.7 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 4241100e18..1964ca44f0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.6.1 # Updated from 0.6.0 click==6.6 -colorama +colorama==0.3.7 From 3b9548a71038930d184b186ad5b6a1c7925e4b15 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 23 Dec 2016 06:24:17 -0600 Subject: [PATCH 0009/2998] remove itunes --- README.rst | 5 ++--- doc/_templates/book.html | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 357d27ca2a..93e27815c5 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,8 @@ tmuxp, tmux session manager. built on `libtmux`_. |pypi| |docs| |build-status| |coverage| |license| -**New to tmux?** Pre-order a copy of my new book `The Tao of tmux `_ on Leanpub, -`Amazon Kindle`_, `Apple iBooks`_, or for free `on the web`_. Scheduled for release January 2017. +**New to tmux?** Pre-order a copy of my new book `The Tao of tmux `_ on Leanpub and +`Amazon Kindle`_, or for free `on the web`_. Scheduled for release January 2017. Load a tmux session ------------------- @@ -166,7 +166,6 @@ tests .. code-block:: bash .. _BSD: http://opensource.org/licenses/BSD-3-Clause .. _developing and testing: http://tmuxp.git-pull.com/en/latest/developing.html .. _Amazon Kindle: http://amzn.to/2gPfRhC -.. _Apple iBooks: https://geo.itunes.apple.com/us/book/the-tao-of-tmux/id1168912720?mt=11&at=1001lrwP .. |pypi| image:: https://img.shields.io/pypi/v/tmuxp.svg :alt: Python Package diff --git a/doc/_templates/book.html b/doc/_templates/book.html index d0bf029364..ad4c5e93c3 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -2,10 +2,9 @@

Book Pre-order

-

Get your copy of the The Tao of tmux on Leanpub, Kindle (Amazon), -and iBooks (iTunes store). The final version will be delivered to you January 2017.

+

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon). +The final version will be delivered to you January 2017.

Pre-order on Leanpub before Dec 23rd for the special discount price of $7.99.

Read and browse the book for free on the web.

Amazon Kindle -iTunes From b87ed4f8054accef8931b71c37229d7f8815eed3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 23 Dec 2016 20:24:40 -0600 Subject: [PATCH 0010/2998] remove ended pre-order coupon for book --- doc/_templates/book.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/_templates/book.html b/doc/_templates/book.html index ad4c5e93c3..889959009b 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -4,7 +4,5 @@

Book Pre-order

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon). The final version will be delivered to you January 2017.

-

Pre-order on Leanpub before Dec 23rd for the special discount -price of $7.99.

Read and browse the book for free on the web.

Amazon Kindle From 558a718799826132051409bda5a84b6798472e7e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 29 Dec 2016 17:12:37 -0600 Subject: [PATCH 0011/2998] fix book link --- doc/_templates/book.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/_templates/book.html b/doc/_templates/book.html index 889959009b..1c1a0b98a1 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -2,7 +2,7 @@

Book Pre-order

-

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon). +

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon). The final version will be delivered to you January 2017.

Read and browse the book for free on the web.

Amazon Kindle From 7f528ea2d068f3c9994272ecdadd3b2e0d56764b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Jan 2017 22:58:29 -0600 Subject: [PATCH 0012/2998] switch order of book pre-order --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 19e4a62050..ab639337fe 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -56,8 +56,8 @@ 'star.html', 'navigation.html', 'relations.html', - 'more.html', 'book.html', + 'more.html', 'searchbox.html', ] } From d6d7791efc51fb18db56554b6058b4e8ee1c7df9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Jan 2017 22:58:38 -0600 Subject: [PATCH 0013/2998] add book preorder to bottom --- doc/_static/tmuxp.css | 41 +++++++++++++++++++++++++++++++++++++++++ doc/about_tmux.rst | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 0a69b44293..5c7c9c5578 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -37,3 +37,44 @@ div#text-based-window-manager { display: none; } } + +/*** Book Stuff ***/ +div.book-container { + clear: both; + height: 200px; +} + +div.book-container > p { + text-align: center; +} + +div.book-container div.leftside-book { + width: 125px; + padding: 0px; + float: left; +} + +div.book-container div.leftside-book div.figure.align-left { + padding: 0px; + margin: 0px; +} + +div.book-container div.leftside-book div.figure.align-left img { + width: 125px; + height: 162px; +} + +div.book-container div.rightside-book { + margin-left: 125px; + padding: 0px 10px; +} + +div.book-container div.rightside-book div.figure { + padding: 0; + margin: 0; +} + +div.book-container div.rightside-book div.figure.align-left { + /* clear:none; if using a rightside button like iBooks */ + clear: both; +} diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 27779933d1..82dec5c9bc 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -4,7 +4,6 @@ The Tao of tmux ############### - .. figure:: _static/tao-tmux-screenshot.png :scale: 60% :align: center @@ -650,10 +649,38 @@ To get the text documentation of a ``.1`` manual file: .. [1] http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/tmux.1 +.. _Creative Commons BY-NC-ND 3.0 US: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ + +.. container:: book-container + + **Pre-order the book!** + + .. container:: leftside-book + + .. figure:: https://s3.amazonaws.com/titlepages.leanpub.com/the-tao-of-tmux/large + :scale: 100% + :align: left + :target: https://leanpub.com/the-tao-of-tmux + :alt: The Tao of tmux + + .. container:: rightside-book + + Get your copy of the *The Tao of tmux* on `Leanpub`_ and `Kindle`_ + (Amazon). The final version will be delivered to you by January 2017. + + .. figure:: _static/img/books/amazon-logo.png + :scale: 19% + :target: http://amzn.to/2gPfRhC + :alt: Amazon Kindle + + Read and browse the book for `free on the web`_. + + .. _free on the web: https://leanpub.com/the-tao-of-tmux/read + .. _Leanpub: https://leanpub.com/the-tao-of-tmux + .. _Kindle: http://amzn.to/2gPfRhC + ======= License ======= This page is licensed `Creative Commons BY-NC-ND 3.0 US`_. - -.. _Creative Commons BY-NC-ND 3.0 US: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ From 2848a20f2f6b15848aeec53a60c98af09d590578 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 2 Jan 2017 01:26:55 -0600 Subject: [PATCH 0014/2998] Revert "switch order of book pre-order" This reverts commit 7f528ea2d068f3c9994272ecdadd3b2e0d56764b. --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index ab639337fe..19e4a62050 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -56,8 +56,8 @@ 'star.html', 'navigation.html', 'relations.html', - 'book.html', 'more.html', + 'book.html', 'searchbox.html', ] } From 847f62465ec70f2208cb2d7d167c0ebe12023a3b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 2 Jan 2017 09:38:26 -0600 Subject: [PATCH 0015/2998] book styling stuff --- doc/_static/tmuxp.css | 16 +++++++++++----- doc/about_tmux.rst | 10 ++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 5c7c9c5578..3f8513bded 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -41,7 +41,7 @@ div#text-based-window-manager { /*** Book Stuff ***/ div.book-container { clear: both; - height: 200px; + height: 230px; } div.book-container > p { @@ -49,7 +49,7 @@ div.book-container > p { } div.book-container div.leftside-book { - width: 125px; + width: 180px; padding: 0px; float: left; } @@ -60,15 +60,19 @@ div.book-container div.leftside-book div.figure.align-left { } div.book-container div.leftside-book div.figure.align-left img { - width: 125px; - height: 162px; + width: 180px; + height: 230px; } div.book-container div.rightside-book { - margin-left: 125px; + margin-left: 180px; padding: 0px 10px; } +div.book-container div.rightside-book p:first-child { + text-align: center; +} + div.book-container div.rightside-book div.figure { padding: 0; margin: 0; @@ -78,3 +82,5 @@ div.book-container div.rightside-book div.figure.align-left { /* clear:none; if using a rightside button like iBooks */ clear: both; } + + diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 82dec5c9bc..e994a9854f 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -651,9 +651,10 @@ To get the text documentation of a ``.1`` manual file: .. _Creative Commons BY-NC-ND 3.0 US: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ -.. container:: book-container +The Book +-------- - **Pre-order the book!** +.. container:: book-container .. container:: leftside-book @@ -665,6 +666,8 @@ To get the text documentation of a ``.1`` manual file: .. container:: rightside-book + **Pre-order the book!** + Get your copy of the *The Tao of tmux* on `Leanpub`_ and `Kindle`_ (Amazon). The final version will be delivered to you by January 2017. @@ -679,8 +682,7 @@ To get the text documentation of a ``.1`` manual file: .. _Leanpub: https://leanpub.com/the-tao-of-tmux .. _Kindle: http://amzn.to/2gPfRhC -======= License -======= +------- This page is licensed `Creative Commons BY-NC-ND 3.0 US`_. From 9c3d0dc16aced8ee4bff8f42725ddaeb3e265929 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 6 Jan 2017 17:59:13 -0600 Subject: [PATCH 0016/2998] Update click from 6.6 to 6.7 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 1964ca44f0..b10d9dcc70 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.6.1 # Updated from 0.6.0 -click==6.6 +click==6.7 colorama==0.3.7 From 7a34d81b44e16194ba62a6590bdd015d3a9636e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 13 Jan 2017 17:46:11 -0600 Subject: [PATCH 0017/2998] update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 70aeb4a828..34fcf04646 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.2.4 <2017-01-13>` +- :bug:`198` bump click from 6.6 to 6.7 +- :support:`195` pin packages for colorama and doc requirements + - :release:`1.2.3 <2016-12-21>` - :support:`-` bump libtmux 0.6.0 to 0.6.1 - :support:`193` improve suppress history test, courtesy of @abeyer. From 052609f9e834de111d473d5ef60c8c89d90fbfed Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 13 Jan 2017 17:46:27 -0600 Subject: [PATCH 0018/2998] tag tmuxp v1.2.4 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 01676ddce3..90eed11183 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.3' +__version__ = '1.2.4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 0575c768c62eae3272d888adeece3af7a2ef14e0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 13 Jan 2017 22:43:47 -0600 Subject: [PATCH 0019/2998] update README --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 93e27815c5..99aadba9c5 100644 --- a/README.rst +++ b/README.rst @@ -57,8 +57,8 @@ Store configs in (``~/.tmuxp``) or include in your project as ``~/.tmuxp.{yaml,json}``. See `author's tmuxp configs`_ and the the projects' `tmuxp.yaml`_. -bootstrap project dependencies before loading tmux. See the -`bootstrap_env.py`_ and `before_script`_ example +Run custom startup scripts (such as installing project dependencies before +loading tmux. See the `bootstrap_env.py`_ and `before_script`_ example You can also load sessions in the background by passing ``-d`` flag From 8f70d12a145a83a5594cc1959c2eac028f162134 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 18 Jan 2017 02:35:20 -0600 Subject: [PATCH 0020/2998] MIT -> ISC --- doc/about_tmux.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index e994a9854f..18b2872331 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -8,7 +8,7 @@ The Tao of tmux :scale: 60% :align: center - BSD-licensed terminal multiplexer. + ISC-licensed terminal multiplexer. tmux is geared for developers and admins who interact regularly with CLI (text-only interfaces) From c92a756deed813475f3bfd7cfb7aec8139ee05e7 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 18 Jan 2017 09:23:59 -0600 Subject: [PATCH 0021/2998] Update requests from 2.12.4 to 2.12.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 7dab4553ff..50f123fcc1 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.12.4 +requests[security]==2.12.5 sphinx==1.5.1 reportlab==3.3.0 alabaster==0.7.9 From df6065701d087ef1be23bf9760c7d356633893d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 19 Jan 2017 20:46:52 -0600 Subject: [PATCH 0022/2998] bump libtmux 0.6.1 -> 0.6.2 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index b10d9dcc70..2d594b5dfe 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.6.1 # Updated from 0.6.0 +libtmux==0.6.2 # Updated from 0.6.1 click==6.7 colorama==0.3.7 From e4871af0b7f5f0c03dd5ac624ae14cb358d46522 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 22 Jan 2017 06:34:45 -0600 Subject: [PATCH 0023/2998] Update sphinx from 1.5.1 to 1.5.2 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 50f123fcc1..18d106a5dd 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.12.5 -sphinx==1.5.1 +sphinx==1.5.2 reportlab==3.3.0 alabaster==0.7.9 releases==1.3.0 # Updated from 1.2.0 From 48ec9455e49229467f9d02018427501253e3c754 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Jan 2017 15:57:28 -0600 Subject: [PATCH 0024/2998] book pre-order -> order --- README.rst | 4 ++-- doc/_templates/book.html | 5 ++--- doc/about_tmux.rst | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 99aadba9c5..b922aa7e32 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,8 @@ tmuxp, tmux session manager. built on `libtmux`_. |pypi| |docs| |build-status| |coverage| |license| -**New to tmux?** Pre-order a copy of my new book `The Tao of tmux `_ on Leanpub and -`Amazon Kindle`_, or for free `on the web`_. Scheduled for release January 2017. +**New to tmux?** Order a copy of `The Tao of tmux `_ on Leanpub and +`Amazon Kindle`_, or for free `on the web`_. Load a tmux session ------------------- diff --git a/doc/_templates/book.html b/doc/_templates/book.html index 1c1a0b98a1..28502fa67b 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -1,8 +1,7 @@ -

Book Pre-order

+

Buy the book!

-

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon). -The final version will be delivered to you January 2017.

+

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon).

Read and browse the book for free on the web.

Amazon Kindle diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 18b2872331..7f3696e35e 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -666,10 +666,10 @@ The Book .. container:: rightside-book - **Pre-order the book!** + **Buy the book!** Get your copy of the *The Tao of tmux* on `Leanpub`_ and `Kindle`_ - (Amazon). The final version will be delivered to you by January 2017. + (Amazon). .. figure:: _static/img/books/amazon-logo.png :scale: 19% From 34b73296164bd5b93086a56d47f35fb05005eb2b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 22 Jan 2017 16:04:17 -0600 Subject: [PATCH 0025/2998] Update pytest from 3.0.5 to 3.0.6 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 43c1823da1..bcca284ca2 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.0.5 # Updated from 3.0.4 +pytest==3.0.6 # Updated from 3.0.4 pytest-rerunfailures==2.1.0 # Updated from 2.0.1 From 6141a9bab64f42ed05a063fbc8ed3c21e8a35070 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Jan 2017 20:28:18 -0600 Subject: [PATCH 0026/2998] copy tweak --- doc/_templates/book.html | 2 +- doc/about_tmux.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/_templates/book.html b/doc/_templates/book.html index 28502fa67b..9c6390514e 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -1,4 +1,4 @@ -

Buy the book!

+

Get the book!

diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 7f3696e35e..2d7c7fc2fd 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -666,7 +666,7 @@ The Book .. container:: rightside-book - **Buy the book!** + **Get the book!** Get your copy of the *The Tao of tmux* on `Leanpub`_ and `Kindle`_ (Amazon). From 806217f84cb73af6bc93da23d427279381ac695f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Jan 2017 02:05:58 -0600 Subject: [PATCH 0027/2998] update years --- tmuxp/__about__.py | 2 +- tmuxp/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 90eed11183..0f7050c73a 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -5,4 +5,4 @@ __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' __license__ = 'BSD' -__copyright__ = 'Copyright 2013-2016 Tony Narlock' +__copyright__ = 'Copyright 2013-2017 Tony Narlock' diff --git a/tmuxp/__init__.py b/tmuxp/__init__.py index a49fdb94ab..ebbc66ee45 100644 --- a/tmuxp/__init__.py +++ b/tmuxp/__init__.py @@ -5,7 +5,7 @@ tmuxp ~~~~~ -:copyright: Copyright 2013 Tony Narlock. +:copyright: Copyright 2013-2017 Tony Narlock. :license: BSD, see LICENSE for details """ From e5544bfbeff2391a9b121e3e9fb925edacaddc0a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Jan 2017 03:25:02 -0600 Subject: [PATCH 0028/2998] readme tweak --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b922aa7e32..fe96c3ebcb 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ tmuxp, tmux session manager. built on `libtmux`_. |pypi| |docs| |build-status| |coverage| |license| -**New to tmux?** Order a copy of `The Tao of tmux `_ on Leanpub and +**New to tmux?** Grab a copy of `The Tao of tmux `_ on Leanpub and `Amazon Kindle`_, or for free `on the web`_. Load a tmux session From c128f4c4e7b152dc507a86e449e2747eb56498a2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 24 Jan 2017 09:30:58 -0600 Subject: [PATCH 0029/2998] Update requests from 2.12.5 to 2.13.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 18d106a5dd..6dd35173b7 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.12.5 +requests[security]==2.13.0 sphinx==1.5.2 reportlab==3.3.0 alabaster==0.7.9 From 8ab1f175f7671f8d721580d4765599d9dcc4362e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Jan 2017 15:51:39 -0600 Subject: [PATCH 0030/2998] book copy/css updates --- README.rst | 5 +++-- doc/_static/tmuxp.css | 14 +++++--------- doc/_templates/book.html | 4 ++-- doc/about_tmux.rst | 5 +---- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/README.rst b/README.rst index fe96c3ebcb..80e617d982 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,9 @@ tmuxp, tmux session manager. built on `libtmux`_. |pypi| |docs| |build-status| |coverage| |license| -**New to tmux?** Grab a copy of `The Tao of tmux `_ on Leanpub and -`Amazon Kindle`_, or for free `on the web`_. +**New to tmux?** `The Tao of tmux `_ is +available on Leanpub and `Amazon Kindle`_. Read and browse the book for free +`on the web`_. Load a tmux session ------------------- diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 3f8513bded..6b706eb1cc 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -41,7 +41,7 @@ div#text-based-window-manager { /*** Book Stuff ***/ div.book-container { clear: both; - height: 230px; + height: 170px; } div.book-container > p { @@ -49,7 +49,7 @@ div.book-container > p { } div.book-container div.leftside-book { - width: 180px; + width: 131px; padding: 0px; float: left; } @@ -60,19 +60,15 @@ div.book-container div.leftside-book div.figure.align-left { } div.book-container div.leftside-book div.figure.align-left img { - width: 180px; - height: 230px; + width: 131px; + height: 170px; } div.book-container div.rightside-book { - margin-left: 180px; + margin-left: 131px; padding: 0px 10px; } -div.book-container div.rightside-book p:first-child { - text-align: center; -} - div.book-container div.rightside-book div.figure { padding: 0; margin: 0; diff --git a/doc/_templates/book.html b/doc/_templates/book.html index 9c6390514e..dd093cd2b0 100644 --- a/doc/_templates/book.html +++ b/doc/_templates/book.html @@ -1,7 +1,7 @@ -

Get the book!

+

The book!

-

Get your copy of the The Tao of tmux on Leanpub and Kindle (Amazon).

+

The Tao of tmux is available on Leanpub and Kindle (Amazon).

Read and browse the book for free on the web.

Amazon Kindle diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 2d7c7fc2fd..4e08167da7 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -666,10 +666,7 @@ The Book .. container:: rightside-book - **Get the book!** - - Get your copy of the *The Tao of tmux* on `Leanpub`_ and `Kindle`_ - (Amazon). + *The Tao of tmux* is available on `Leanpub`_ and `Kindle`_ (Amazon). .. figure:: _static/img/books/amazon-logo.png :scale: 19% From 2fd8999f9a72f9c5c7740be8157d53b43e5d3550 Mon Sep 17 00:00:00 2001 From: Ilyes512 Date: Tue, 31 Jan 2017 23:13:58 +0100 Subject: [PATCH 0031/2998] Get config_dir from env TMUXP_CONFIG_DIR or TMUXP_DIR --- tmuxp/cli.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index fce70eb9f2..b1bd269ee1 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -26,6 +26,12 @@ def get_config_dir(): + if 'TMUXP_CONFIG_DIR' in os.environ: + return os.path.expanduser(os.environ['TMUXP_CONFIG_DIR']) + + if 'TMUXP_DIR' in os.environ: + return os.path.expanduser(os.environ['TMUXP_DIR']) + return os.path.expanduser('~/.tmuxp/') From 4f89d506b20bd36bb7cfc221bb3a9a978294bbfe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Feb 2017 05:11:13 -0600 Subject: [PATCH 0032/2998] rename resolve_config -> scan_config --- tests/test_cli.py | 110 +++++++++++++++++++++++----------------------- tmuxp/cli.py | 22 +++++----- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index ed859f8f70..b6809ddb22 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -11,7 +11,7 @@ from click.testing import CliRunner from tmuxp import cli, config -from tmuxp.cli import is_pure_name, load_workspace, resolve_config +from tmuxp.cli import is_pure_name, load_workspace, scan_config from .fixtures._util import curjoin, loadfixture @@ -118,107 +118,107 @@ def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): with projectdir.as_cwd(): expect = project_config - assert resolve_config('.') == expect - assert resolve_config('./') == expect - assert resolve_config('') == expect - assert resolve_config('../project') == expect - assert resolve_config('../project/') == expect - assert resolve_config('.tmuxp.yaml') == expect - assert resolve_config( + assert scan_config('.') == expect + assert scan_config('./') == expect + assert scan_config('') == expect + assert scan_config('../project') == expect + assert scan_config('../project/') == expect + assert scan_config('.tmuxp.yaml') == expect + assert scan_config( '../../.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert resolve_config('myconfig') == str(user_config) - assert resolve_config( + assert scan_config('myconfig') == str(user_config) + assert scan_config( '~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): - resolve_config('.tmuxp.json') + scan_config('.tmuxp.json') with pytest.raises(Exception): - resolve_config('.tmuxp.ini') + scan_config('.tmuxp.ini') with pytest.raises(Exception): - resolve_config('../') + scan_config('../') with pytest.raises(Exception): - resolve_config('mooooooo') + scan_config('mooooooo') with homedir.as_cwd(): expect = project_config - assert resolve_config('work/project') == expect - assert resolve_config('work/project/') == expect - assert resolve_config('./work/project') == expect - assert resolve_config('./work/project/') == expect - assert resolve_config( + assert scan_config('work/project') == expect + assert scan_config('work/project/') == expect + assert scan_config('./work/project') == expect + assert scan_config('./work/project/') == expect + assert scan_config( '.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert resolve_config( + assert scan_config( './.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert resolve_config('myconfig') == str(user_config) - assert resolve_config( + assert scan_config('myconfig') == str(user_config) + assert scan_config( '~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): - resolve_config('') + scan_config('') with pytest.raises(Exception): - resolve_config('.') + scan_config('.') with pytest.raises(Exception): - resolve_config('.tmuxp.yaml') + scan_config('.tmuxp.yaml') with pytest.raises(Exception): - resolve_config('../') + scan_config('../') with pytest.raises(Exception): - resolve_config('mooooooo') + scan_config('mooooooo') with configdir.as_cwd(): expect = project_config - assert resolve_config('../work/project') == expect - assert resolve_config('../../home/work/project') == expect - assert resolve_config('../work/project/') == expect - assert resolve_config( + assert scan_config('../work/project') == expect + assert scan_config('../../home/work/project') == expect + assert scan_config('../work/project/') == expect + assert scan_config( '%s.yaml' % user_config_name) == str(user_config) - assert resolve_config( + assert scan_config( './%s.yaml' % user_config_name) == str(user_config) - assert resolve_config('myconfig') == str(user_config) - assert resolve_config( + assert scan_config('myconfig') == str(user_config) + assert scan_config( '~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): - resolve_config('') + scan_config('') with pytest.raises(Exception): - resolve_config('.') + scan_config('.') with pytest.raises(Exception): - resolve_config('.tmuxp.yaml') + scan_config('.tmuxp.yaml') with pytest.raises(Exception): - resolve_config('../') + scan_config('../') with pytest.raises(Exception): - resolve_config('mooooooo') + scan_config('mooooooo') with tmpdir.as_cwd(): expect = project_config - assert resolve_config('home/work/project') == expect - assert resolve_config('./home/work/project/') == expect - assert resolve_config( + assert scan_config('home/work/project') == expect + assert scan_config('./home/work/project/') == expect + assert scan_config( 'home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert resolve_config( + assert scan_config( './home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert resolve_config('myconfig') == str(user_config) - assert resolve_config( + assert scan_config('myconfig') == str(user_config) + assert scan_config( '~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): - resolve_config('') + scan_config('') with pytest.raises(Exception): - resolve_config('.') + scan_config('.') with pytest.raises(Exception): - resolve_config('.tmuxp.yaml') + scan_config('.tmuxp.yaml') with pytest.raises(Exception): - resolve_config('../') + scan_config('../') with pytest.raises(Exception): - resolve_config('mooooooo') + scan_config('mooooooo') -def test_resolve_config_arg(homedir, configdir, projectdir, monkeypatch): +def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): runner = CliRunner() @click.command() @click.argument( 'config', click.Path(exists=True), nargs=-1, - callback=cli.resolve_config_argument) + callback=cli.scan_config_argument) def config_cmd(config): click.echo(config) @@ -430,21 +430,21 @@ def test_validate_choices(): assert validate('choice3') -def test_create_resolve_config_arg(tmpdir): +def test_create_scan_config_arg(tmpdir): configdir = tmpdir.join('myconfigdir') configdir.mkdir() user_config_name = 'myconfig' user_config = configdir.join('%s.yaml' % user_config_name).ensure() expect = str(configdir.join('myconfig.yaml')) - my_resolve_config = cli._create_resolve_config_argument(str(configdir)) + my_scan_config = cli._create_scan_config_argument(str(configdir)) runner = CliRunner() @click.command() @click.argument( 'config', click.Path(exists=True), nargs=-1, - callback=my_resolve_config) + callback=my_scan_config) def config_cmd(config): click.echo(config) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index b1bd269ee1..b6648c7c83 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -75,18 +75,18 @@ def is_pure_name(path): ) -def _create_resolve_config_argument(config_dir): +def _create_scan_config_argument(config_dir): """For finding configurations in tmuxinator/teamocil""" def func(ctx, param, value): - return resolve_config_argument(ctx, param, value, config_dir) + return scan_config_argument(ctx, param, value, config_dir) return func -def resolve_config_argument(ctx, param, value, config_dir=None): +def scan_config_argument(ctx, param, value, config_dir=None): """Validate / translate config name/path values for click config arg. - Wrapper on top of :func:`cli.resolve_config`.""" + Wrapper on top of :func:`cli.scan_config`.""" if callable(config_dir): config_dir = config_dir() @@ -96,11 +96,11 @@ def resolve_config_argument(ctx, param, value, config_dir=None): ctx.exit() if isinstance(value, string_types): - value = resolve_config(value, config_dir=config_dir) + value = scan_config(value, config_dir=config_dir) elif isinstance(value, tuple): value = tuple( - [resolve_config(v, config_dir=config_dir) for v in value]) + [scan_config(v, config_dir=config_dir) for v in value]) return value @@ -126,7 +126,7 @@ def _resolve_path_no_overwrite(config): return path -def resolve_config(config, config_dir=None): +def scan_config(config, config_dir=None): """Return the real config path or raise an exception. :param config: config file, valid examples: @@ -451,7 +451,7 @@ def command_freeze(session_name, socket_name, socket_path): @cli.command(name='load', short_help='Load tmuxp workspaces.') @click.pass_context @click.argument('config', click.Path(exists=True), nargs=-1, - callback=resolve_config_argument) + callback=scan_config_argument) @click.option('-S', 'socket_path', help='pass-through for tmux -L') @click.option('-L', 'socket_name', help='pass-through for tmux -L') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @@ -582,7 +582,7 @@ def import_config(configfile, importfunc): short_help='Convert and import a teamocil config.') @click.argument( 'configfile', click.Path(exists=True), nargs=1, - callback=_create_resolve_config_argument(get_teamocil_dir) + callback=_create_scan_config_argument(get_teamocil_dir) ) def command_import_teamocil(configfile): """Convert a teamocil config from CONFIGFILE to tmuxp format and import @@ -596,7 +596,7 @@ def command_import_teamocil(configfile): short_help='Convert and import a tmuxinator config.') @click.argument( 'configfile', click.Path(exists=True), nargs=1, - callback=_create_resolve_config_argument(get_tmuxinator_dir) + callback=_create_scan_config_argument(get_tmuxinator_dir) ) def command_import_tmuxinator(configfile): """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import @@ -606,7 +606,7 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') @click.argument('config', click.Path(exists=True), nargs=1, - callback=resolve_config_argument) + callback=scan_config_argument) def command_convert(config): """Convert a tmuxp config between JSON and YAML.""" From f490641ce44d9b003ae2262a0e90b5a287f9bbc7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Feb 2017 05:16:57 -0600 Subject: [PATCH 0033/2998] use TMUXP_CONFIGDIR for get_config_dir --- tmuxp/cli.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index b6648c7c83..483e7eb235 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -26,10 +26,7 @@ def get_config_dir(): - if 'TMUXP_CONFIG_DIR' in os.environ: - return os.path.expanduser(os.environ['TMUXP_CONFIG_DIR']) - - if 'TMUXP_DIR' in os.environ: + if 'TMUXP_CONFIGDIR' in os.environ: return os.path.expanduser(os.environ['TMUXP_DIR']) return os.path.expanduser('~/.tmuxp/') From 6bf746220da3475651f3521c897bcc03508bb542 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Feb 2017 05:19:12 -0600 Subject: [PATCH 0034/2998] pep8 --- tests/test_cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index b6809ddb22..b11eb48317 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -74,6 +74,7 @@ def test_get_configs_cwd(tmpdir): def test_is_pure_name(path, expect): assert is_pure_name(path) == expect + """ scans for .tmuxp.{yaml,yml,json} in directory, returns first result log warning if multiple found: From d34cd3ee8429f4788baab590453193b8e95f9e79 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 01:07:36 -0600 Subject: [PATCH 0035/2998] test for TMUXP_CONFIGDIR --- tests/test_cli.py | 10 +++++++++- tmuxp/cli.py | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index b11eb48317..5c16064faa 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -11,7 +11,9 @@ from click.testing import CliRunner from tmuxp import cli, config -from tmuxp.cli import is_pure_name, load_workspace, scan_config +from tmuxp.cli import ( + is_pure_name, load_workspace, scan_config, get_config_dir +) from .fixtures._util import curjoin, loadfixture @@ -109,6 +111,12 @@ def projectdir(homedir): return homedir.join('work').join('project') +def test_tmuxp_configdir_env_var(tmpdir, monkeypatch): + monkeypatch.setenv('TMUXP_CONFIGDIR', tmpdir) + + assert get_config_dir() == tmpdir + + def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): monkeypatch.setenv('HOME', homedir) projectdir.join('.tmuxp.yaml').ensure() diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 483e7eb235..92a3ae682c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -27,7 +27,7 @@ def get_config_dir(): if 'TMUXP_CONFIGDIR' in os.environ: - return os.path.expanduser(os.environ['TMUXP_DIR']) + return os.path.expanduser(os.environ['TMUXP_CONFIGDIR']) return os.path.expanduser('~/.tmuxp/') From 38055209df367bbe9ddedaed0e384308d3e88338 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 01:12:06 -0600 Subject: [PATCH 0036/2998] move links to the bottom --- doc/quickstart.rst | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 3722506ab5..42cdfdc4fd 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -59,12 +59,6 @@ session. You can also `Import`_ configs `teamocil`_ and `tmuxinator`_. -.. _Import: http://tmuxp.readthedocs.io/en/latest/cli.html#import -.. _tmuxinator: https://github.com/aziz/tmuxinator -.. _teamocil: https://github.com/remiprev/teamocil - - - Pythonics --------- @@ -72,14 +66,10 @@ Pythonics :ref:`libtmux python API documentation ` and :ref:`developing`, :ref:`internals`. - ORM - `Object Relational Mapper`_ AL - `Abstraction Layer`_ -.. _Abstraction Layer: http://en.wikipedia.org/wiki/Abstraction_layer -.. _Object Relational Mapper: http://en.wikipedia.org/wiki/Object-relational_mapping - python abstraction layer """""""""""""""""""""""" @@ -94,3 +84,9 @@ python abstraction layer :meth:`libtmux.Window.split_window` ``$ tmux split-window`` :meth:`libtmux.Pane.send_keys` ``$ tmux send-keys`` ======================================== ================================= + +.. _Import: http://tmuxp.readthedocs.io/en/latest/cli.html#import +.. _tmuxinator: https://github.com/aziz/tmuxinator +.. _teamocil: https://github.com/remiprev/teamocil +.. _Abstraction Layer: http://en.wikipedia.org/wiki/Abstraction_layer +.. _Object Relational Mapper: http://en.wikipedia.org/wiki/Object-relational_mapping From 756c822dd8797c2340d10990a33307c52d03e18d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 03:12:07 -0600 Subject: [PATCH 0037/2998] add some docs for custom tmuxp dir --- doc/quickstart.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 42cdfdc4fd..92fb105f8f 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -57,6 +57,19 @@ Load multiple tmux sessions at once: tmuxp will offer to ``switch-client`` for you if you're already in a session. +You can also have a custom tmuxp config directory by setting the +``TMUX_CONFIGDIR`` in your environment variables. + +.. code-block:: bash + + $ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython + +Or in your ``~/.bashrc`` / ``~/.zshrc`` you can set: + +.. code-block:: bash + + export TMUX_CONFIGDIR=$HOME/.yourconfigdir/tmuxp + You can also `Import`_ configs `teamocil`_ and `tmuxinator`_. Pythonics From a31adca0837347d6b6c37c281dd9c61baf0d06a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 03:13:53 -0600 Subject: [PATCH 0038/2998] fix typo --- doc/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 92fb105f8f..7c58ccdbe0 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -68,7 +68,7 @@ Or in your ``~/.bashrc`` / ``~/.zshrc`` you can set: .. code-block:: bash - export TMUX_CONFIGDIR=$HOME/.yourconfigdir/tmuxp + export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp You can also `Import`_ configs `teamocil`_ and `tmuxinator`_. From 1a40e788281a8393131153f720f3787b64bbaff2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 03:14:03 -0600 Subject: [PATCH 0039/2998] update changelog --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 34fcf04646..7f83dd7179 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changelog Here you can find the recent changes to tmuxp +- :feature:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` + variable. + - :release:`1.2.4 <2017-01-13>` - :bug:`198` bump click from 6.6 to 6.7 - :support:`195` pin packages for colorama and doc requirements From b242e37eba579de66d5dbea2a3265af5050af82a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 7 Feb 2017 03:20:59 -0600 Subject: [PATCH 0040/2998] fix developer image --- doc/developing.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/developing.rst b/doc/developing.rst index cfeca9e14e..9c8f58c7e8 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -162,8 +162,6 @@ tmuxp developer config ---------------------- .. image:: _static/tmuxp-dev-screenshot.png - :scale: 100% - :width: 60% :align: center After you :ref:`install_dev_env`, when inside the tmuxp checkout: From 60ef08b681c85322adf8f923c0dc127943ce5ce7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 8 Feb 2017 14:09:23 -0600 Subject: [PATCH 0041/2998] bump libtmux to 0.6.3 to fix #199 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 2d594b5dfe..b6a872f0fd 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.6.2 # Updated from 0.6.1 +libtmux==0.6.3 # Updated from 0.6.2 click==6.7 colorama==0.3.7 From bd6eda2fb539e67aff81c54fa408337a7e4e3989 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 8 Feb 2017 15:31:37 -0600 Subject: [PATCH 0042/2998] update CHANGES --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 7f83dd7179..2af9b87174 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,11 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.2.5 <2017-02-08>` - :feature:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` variable. +- :support:`199` support for running tmuxp on tmux ``master``. +- :support:`-` update libtmux from 0.6.2 to 0.6.3. - :release:`1.2.4 <2017-01-13>` - :bug:`198` bump click from 6.6 to 6.7 From 786f808a1b410c7a5dca5c93a22c0809f3afa835 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 8 Feb 2017 15:31:56 -0600 Subject: [PATCH 0043/2998] tag v1.2.5 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 0f7050c73a..d1dd72fd7b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.4' +__version__ = '1.2.5' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From ad969636e2b4bde81d797ec9292fa9e58a8d52f7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 8 Feb 2017 20:07:21 -0600 Subject: [PATCH 0044/2998] update CHANGES to show versioning better --- CHANGES | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 2af9b87174..29dfc76781 100644 --- a/CHANGES +++ b/CHANGES @@ -5,20 +5,20 @@ Changelog Here you can find the recent changes to tmuxp - :release:`1.2.5 <2017-02-08>` -- :feature:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` - variable. -- :support:`199` support for running tmuxp on tmux ``master``. -- :support:`-` update libtmux from 0.6.2 to 0.6.3. +- :feature:`207 backported` add custom tmuxp config directory via + ``TMUXP_CONFIGDIR`` variable. +- :support:`199 backported` support for running tmuxp on tmux ``master``. +- :support:`- backported` update libtmux from 0.6.2 to 0.6.3. - :release:`1.2.4 <2017-01-13>` -- :bug:`198` bump click from 6.6 to 6.7 -- :support:`195` pin packages for colorama and doc requirements +- :bug:`198 backported` bump click from 6.6 to 6.7 +- :support:`195 backported` pin packages for colorama and doc requirements - :release:`1.2.3 <2016-12-21>` -- :support:`-` bump libtmux 0.6.0 to 0.6.1 -- :support:`193` improve suppress history test, courtesy of @abeyer. -- :support:`191` documentation typo from @modille -- :support:`186` documentation typo from @joelwallis +- :support:`- backported` bump libtmux 0.6.0 to 0.6.1 +- :support:`193 backported` improve suppress history test, courtesy of @abeyer. +- :support:`191 backported` documentation typo from @modille +- :support:`186 backported` documentation typo from @joelwallis - :release:`1.2.2 <2016-09-16>` - :bug:`181` Support tmux 2.3 From 218b2e1f4d6a538baa5d2d8b6a274dc8e906a72f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 24 Feb 2017 13:53:55 -0600 Subject: [PATCH 0045/2998] attempt at fixing pane order #217 --- tmuxp/workspacebuilder.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 12bb47018b..40893d99f5 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -267,11 +267,11 @@ def iter_create_panes(self, w, wconf): pane_base_index = int(w.show_window_option('pane-base-index', g=True)) - for pindex, pconf in enumerate(wconf['panes'], start=pane_base_index): + p = None + for pindex, pconf in enumerate(wconf['panes'], start=pane_base_index): if pindex == int(pane_base_index): p = w.attached_pane - else: def get_pane_start_directory(): @@ -284,6 +284,7 @@ def get_pane_start_directory(): p = w.split_window( attach=True, start_directory=get_pane_start_directory(), + target=p.id ) assert(isinstance(p, Pane)) From d0ec0a13d3d2614767dd0aced59a7f58c0c50f6a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 24 Feb 2017 15:10:06 -0600 Subject: [PATCH 0046/2998] remove window_layouts from workspace builder tests --- tests/fixtures/workspacebuilder/environment_vars.yaml | 3 +-- tests/fixtures/workspacebuilder/focus_and_pane.yaml | 1 - tests/fixtures/workspacebuilder/global_options.yaml | 3 +-- tests/fixtures/workspacebuilder/session_options.yaml | 3 +-- tests/fixtures/workspacebuilder/start_directory.yaml | 5 ----- .../fixtures/workspacebuilder/start_directory_relative.yaml | 4 ---- 6 files changed, 3 insertions(+), 16 deletions(-) diff --git a/tests/fixtures/workspacebuilder/environment_vars.yaml b/tests/fixtures/workspacebuilder/environment_vars.yaml index eaee25684b..1a3e6dddc4 100644 --- a/tests/fixtures/workspacebuilder/environment_vars.yaml +++ b/tests/fixtures/workspacebuilder/environment_vars.yaml @@ -4,7 +4,6 @@ environment: FOO: BAR PATH: /tmp windows: -- layout: main-horizontal +- window_name: editor panes: - pane - window_name: editor diff --git a/tests/fixtures/workspacebuilder/focus_and_pane.yaml b/tests/fixtures/workspacebuilder/focus_and_pane.yaml index 3a986dbf59..e6917c3ff1 100644 --- a/tests/fixtures/workspacebuilder/focus_and_pane.yaml +++ b/tests/fixtures/workspacebuilder/focus_and_pane.yaml @@ -2,7 +2,6 @@ session_name: sampleconfig start_directory: '~' windows: - window_name: focused window - layout: main-horizontal focus: true panes: - shell_command: diff --git a/tests/fixtures/workspacebuilder/global_options.yaml b/tests/fixtures/workspacebuilder/global_options.yaml index 99c6131a14..cf34d9eb60 100644 --- a/tests/fixtures/workspacebuilder/global_options.yaml +++ b/tests/fixtures/workspacebuilder/global_options.yaml @@ -4,9 +4,8 @@ global_options: repeat-time: 493 status-position: 'top' windows: -- layout: main-horizontal +- window_name: moo panes: - pane - pane - pane - window_name: moo diff --git a/tests/fixtures/workspacebuilder/session_options.yaml b/tests/fixtures/workspacebuilder/session_options.yaml index 788c795a5c..fd2fd81a54 100644 --- a/tests/fixtures/workspacebuilder/session_options.yaml +++ b/tests/fixtures/workspacebuilder/session_options.yaml @@ -4,9 +4,8 @@ options: default-shell: /bin/sh default-command: /bin/sh windows: -- layout: main-horizontal +- window_name: moo panes: - pane - pane - pane - window_name: moo diff --git a/tests/fixtures/workspacebuilder/start_directory.yaml b/tests/fixtures/workspacebuilder/start_directory.yaml index a8b0ba02a1..e27f8be189 100644 --- a/tests/fixtures/workspacebuilder/start_directory.yaml +++ b/tests/fixtures/workspacebuilder/start_directory.yaml @@ -4,7 +4,6 @@ windows: - window_name: supposed to be /usr/bin window_index: 1 start_directory: /usr/bin - layout: main-horizontal options: main-pane-height: 50 panes: @@ -15,7 +14,6 @@ windows: - window_name: support to be /dev window_index: 2 start_directory: /dev - layout: main-horizontal panes: - shell_command: - echo hello @@ -26,7 +24,6 @@ windows: - window_name: cwd containing a space window_index: 3 start_directory: {TEST_DIR} - layout: main-horizontal panes: - shell_command: - echo hello @@ -36,7 +33,6 @@ windows: - echo "moo" - window_name: testsa3 window_index: 4 - layout: main-horizontal panes: - shell_command: - echo hello @@ -46,7 +42,6 @@ windows: - echo "moo3" - window_name: cwd relative to start_directory since no rel dir entered window_index: 5 - layout: main-horizontal start_directory: ./ panes: - shell_command: diff --git a/tests/fixtures/workspacebuilder/start_directory_relative.yaml b/tests/fixtures/workspacebuilder/start_directory_relative.yaml index 1c01108ceb..1b4ac7cdad 100644 --- a/tests/fixtures/workspacebuilder/start_directory_relative.yaml +++ b/tests/fixtures/workspacebuilder/start_directory_relative.yaml @@ -12,7 +12,6 @@ windows: - echo "moo" - window_name: support to be /dev start_directory: '/dev' - layout: main-horizontal panes: - shell_command: - echo hello @@ -22,7 +21,6 @@ windows: - echo "moo" - window_name: cwd containing a space start_directory: {TEST_DIR} - layout: main-horizontal panes: - shell_command: - echo hello @@ -31,7 +29,6 @@ windows: - shell_command: - echo "moo" - window_name: inherit start_directory which is rel to config file - layout: main-horizontal panes: - shell_command: - echo hello @@ -40,7 +37,6 @@ windows: - shell_command: - echo "moo3" - window_name: cwd relative to config file - layout: main-horizontal start_directory: ./ panes: - shell_command: From 2b8899bc9bd3a402fa909fc83fb92584dd544116 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 24 Feb 2017 15:10:23 -0600 Subject: [PATCH 0047/2998] select-layout before splitting panes --- tests/test_workspacebuilder.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e3f344f441..b34be18a74 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -33,6 +33,7 @@ def test_split_windows(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): + w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) @@ -54,6 +55,7 @@ def test_split_windows_three_pane(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): + w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) @@ -246,6 +248,7 @@ def test_window_options(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): + w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) @@ -302,7 +305,9 @@ def test_automatic_rename_option(session): window_count = len(session._windows) # current window count assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): + for p in builder.iter_create_panes(w, wconf): + w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows), window_count assert isinstance(w, Window) @@ -514,6 +519,7 @@ def test_pane_order(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): + w.select_layout('tiled') # fix glitch with pane size p = p assert len(s._windows) == window_count From da87f8d1bfd4f2ad303c90a94bfd21946283e376 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 24 Feb 2017 16:02:29 -0600 Subject: [PATCH 0048/2998] update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 29dfc76781..3d561fd633 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.2.6 <2017-02-24>` +- :support:`218 backported` Fix pane ordering by running ``select-layout`` before + splits. + - :release:`1.2.5 <2017-02-08>` - :feature:`207 backported` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` variable. From 52e7ce1c2a28f094f034ddb439ffc8c6c245da27 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 24 Feb 2017 16:04:27 -0600 Subject: [PATCH 0049/2998] tag v1.2.6 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index d1dd72fd7b..ea05b72ecc 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.5' +__version__ = '1.2.6' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 61ec99bc3a93be5ca397a6a60e3cbbf780dd6604 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 26 Feb 2017 05:36:34 -0600 Subject: [PATCH 0050/2998] Update sphinx from 1.5.2 to 1.5.3 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 6dd35173b7..bb26132f25 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.13.0 -sphinx==1.5.2 +sphinx==1.5.3 reportlab==3.3.0 alabaster==0.7.9 releases==1.3.0 # Updated from 1.2.0 From 9813ff44d19890bd4c3109726875e9ff4faad266 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 28 Feb 2017 14:35:15 -0600 Subject: [PATCH 0051/2998] Update alabaster from 0.7.9 to 0.7.10 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index bb26132f25..7593861894 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,6 +3,6 @@ docutils==0.13.1 requests[security]==2.13.0 sphinx==1.5.3 reportlab==3.3.0 -alabaster==0.7.9 +alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 aafigure==0.5 From df338d130b9e3decd99f3340839bdf04e861d2d1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 7 Mar 2017 05:20:06 -0600 Subject: [PATCH 0052/2998] Update reportlab from 3.3.0 to 3.4.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 7593861894..70f17fa031 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,7 +2,7 @@ docutils==0.13.1 requests[security]==2.13.0 sphinx==1.5.3 -reportlab==3.3.0 +reportlab==3.4.0 alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 aafigure==0.5 From 28c8c3002ca72539119325dcd0f34680e08c14e5 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 14 Mar 2017 21:07:41 -0500 Subject: [PATCH 0053/2998] Update pytest from 3.0.6 to 3.0.7 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index bcca284ca2..a52b39cccf 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.0.6 # Updated from 3.0.4 +pytest==3.0.7 # Updated from 3.0.4 pytest-rerunfailures==2.1.0 # Updated from 2.0.1 From 1911b86c083424c0b14dd035bf53c4085342f639 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Mar 2017 18:42:09 -0500 Subject: [PATCH 0054/2998] add logo for tmuxp --- doc/_static/img/tmuxp.svg | 1 + doc/conf.py | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 doc/_static/img/tmuxp.svg diff --git a/doc/_static/img/tmuxp.svg b/doc/_static/img/tmuxp.svg new file mode 100644 index 0000000000..394121c960 --- /dev/null +++ b/doc/_static/img/tmuxp.svg @@ -0,0 +1 @@ +tmuxp \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py index 19e4a62050..4875c03e6f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -62,6 +62,10 @@ ] } +html_theme_options = { + 'logo': 'img/tmuxp.svg', +} + html_theme_path = ['_themes'] html_static_path = ['_static'] From df3b4ea9e0c2881542fbb3584b7bdde5fa6b2d21 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Mar 2017 19:49:35 -0500 Subject: [PATCH 0055/2998] ignore .DS_Store on macOS --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ca208683b7..c6bbbb131a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# macOS +.DS_Store + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] From c7a58ae82c7a53de14be46796d94cd981e8c17df Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Mar 2017 19:49:52 -0500 Subject: [PATCH 0056/2998] update tmuxp logo --- doc/_static/img/tmuxp.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/_static/img/tmuxp.svg b/doc/_static/img/tmuxp.svg index 394121c960..12237acbef 100644 --- a/doc/_static/img/tmuxp.svg +++ b/doc/_static/img/tmuxp.svg @@ -1 +1 @@ -tmuxp \ No newline at end of file +tmuxp \ No newline at end of file From 01bd84dc36c2d289faa89da2a4455f0d6edbbac0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 22 Mar 2017 16:13:59 -0500 Subject: [PATCH 0057/2998] update Makefile command for docs --- doc/Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index d5a598b0e6..1e547512d7 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -162,4 +162,9 @@ watch: if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) html; else $(MAKE) html; fi serve: - echo 'docs built to '; python -m SimpleHTTPServer 8003 + @echo '=================================================' + @echo + @echo 'docs server running at http://0.0.0.0:8031/_build/html' + @echo + @echo '=================================================' + python -m SimpleHTTPServer 8031 From 07e62ae313325e6716bea14fe3ce28038dd9b71a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 22 Mar 2017 20:46:05 -0500 Subject: [PATCH 0058/2998] change title for examples in docs --- doc/examples.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index 84f27f4d72..534319c8ee 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -1,8 +1,8 @@ .. _examples: -======== -Examples -======== +====================== +Example Configurations +====================== Short hand / inline ------------------- From 7cb30127127a41c1071b3b9a0bfe19dad99dbf36 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 23 Mar 2017 10:22:53 -0500 Subject: [PATCH 0059/2998] fix url for vcspull tmuxp config --- doc/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/examples.rst b/doc/examples.rst index 534319c8ee..1f7d3e9504 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -401,7 +401,7 @@ See examples of ``tmuxp`` in the wild. Have a project config to show off? Edit this page. * https://github.com/tony/dockerfiles/blob/master/.tmuxp.yaml -* https://github.com/tony/pullv/blob/master/.tmuxp.yaml +* https://github.com/tony/vcspull/blob/master/.tmuxp.yaml * https://github.com/tony/sphinxcontrib-github/blob/master/.tmuxp.yaml You can use ``start_directory: ./`` to make the directories relative to From 019a132d894ad86fea3e91cebf683fd36a98a6b3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Mar 2017 13:10:48 -0500 Subject: [PATCH 0060/2998] update libtmux to 0.6.4 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index b6a872f0fd..0f1f775882 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.6.3 # Updated from 0.6.2 +libtmux==0.6.4 # Updated from 0.6.3 click==6.7 colorama==0.3.7 From 2bfa19e1bd0decdc32e3a295341663379be32dbc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Mar 2017 13:58:27 -0500 Subject: [PATCH 0061/2998] tag v1.2.7 --- CHANGES | 4 ++++ tmuxp/__about__.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 3d561fd633..0c9b228cb4 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp + +- :release:`1.2.7 <2017-03-25>` +- :support:`- backported` Support for OpenBSD. + - :release:`1.2.6 <2017-02-24>` - :support:`218 backported` Fix pane ordering by running ``select-layout`` before splits. diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index ea05b72ecc..b355276786 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.6' +__version__ = '1.2.7' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From f946de4f8c7295d83720c623e56d12a94154a932 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 2 Apr 2017 10:03:38 -0500 Subject: [PATCH 0062/2998] Update sphinx from 1.5.3 to 1.5.4 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 70f17fa031..7df911014d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.13.0 -sphinx==1.5.3 +sphinx==1.5.4 reportlab==3.4.0 alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 From 22e358f1a794b7ed046f4a83487651a5d6c0ab1f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Apr 2017 01:48:27 -0500 Subject: [PATCH 0063/2998] upgrade libtmux to 0.6.5 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 0f1f775882..0f4aa13c85 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.6.4 # Updated from 0.6.3 +libtmux==0.6.5 # Updated from 0.6.4 click==6.7 colorama==0.3.7 From e14a6f65563f6bed81bcc2addea1c5ae9675cda6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Apr 2017 01:54:05 -0500 Subject: [PATCH 0064/2998] add nicer error message for missing tmux, fixes #229 --- tmuxp/cli.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 92a3ae682c..4369ee0068 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -15,6 +15,7 @@ import kaptan from click.exceptions import FileError from libtmux.common import has_required_tmux_version, which +from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server from . import WorkspaceBuilder, config, exc, log, util @@ -316,6 +317,9 @@ def cli(log_level): http://tmuxp.readthedocs.io/en/latest/""" try: has_required_tmux_version() + except TmuxCommandNotFound: + click.echo('tmux not found. tmuxp requires you install tmux first.') + sys.exit() except exc.TmuxpException as e: click.echo(e, err=True) sys.exit() From e56defa732cdd422b84e6bb854216ae7ce7809f2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Apr 2017 02:16:23 -0500 Subject: [PATCH 0065/2998] update CHANGES for 1.2.8 --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 0c9b228cb4..6fa1876849 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.2.8 <2017-04-02>` +- :support:`229 backported` More helpful error message on systems missing + tmux. +- :support:`- backported` Update libtmux from 0.6.4 to 0.6.5. - :release:`1.2.7 <2017-03-25>` - :support:`- backported` Support for OpenBSD. From d332a23b8753609b308ea9d7d74621269e0d4196 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Apr 2017 02:16:53 -0500 Subject: [PATCH 0066/2998] tag v1.2.8 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index b355276786..e51fd9a8d7 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.7' +__version__ = '1.2.8' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 769f7d2442860c352e176784314e64bf638568db Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 3 Apr 2017 15:32:47 -0500 Subject: [PATCH 0067/2998] Update sphinx from 1.5.4 to 1.5.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 7df911014d..69a5c37805 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.13.0 -sphinx==1.5.4 +sphinx==1.5.5 reportlab==3.4.0 alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 From 98f20bc9e75bbe44624ab91484b018b21ecadbb8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Apr 2017 14:03:43 -0500 Subject: [PATCH 0068/2998] update the style of tables and css in alabaster --- doc/_static/tmuxp.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 6b706eb1cc..198f98079c 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -80,3 +80,21 @@ div.book-container div.rightside-book div.figure.align-left { } +table.docutils { + background-color: #fafbfc; + border: 0; +} + +table.docutils td, table.docutils th { + border: 0; +} + +table.docutils pre { + background-color: rgba(239, 242, 244, .75); +} + +pre { + background-color: #fafbfc; + border-left: 5px solid #558abb; + font-size: 0.75em; +} From 25573aeb519492de08fa50ccc67bbd9092f93ae0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Apr 2017 09:02:30 -0500 Subject: [PATCH 0069/2998] more css tweaks --- doc/_static/tmuxp.css | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 198f98079c..4b5e17c2ea 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -98,3 +98,32 @@ pre { border-left: 5px solid #558abb; font-size: 0.75em; } + +div.seealso, div.note { + background-color: #fafbfc; + border-right: 0; + border-top: 0; + border-bottom: 0; +} + +div.seealso { + border-left: 5px solid #8abb55; +} + +div.note { + border-left: 5px solid #bb5557; +} + +code { + background-color: rgba(27,31,35,0.05); + border-radius: 3px; + color: #24292e; + font-size: 85%; + padding-bottom: 0.2em; + padding-top: 0.2em; +} + +code::before, code::after { + letter-spacing: -0.2em; + content: "\00a0"; +} From 634974c0f9dedd244215b47f7d90a64004ac5b9a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Apr 2017 16:51:03 -0500 Subject: [PATCH 0070/2998] try to add in a favicon --- doc/_static/favicon.ico | Bin 0 -> 1150 bytes doc/conf.py | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/_static/favicon.ico diff --git a/doc/_static/favicon.ico b/doc/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a9f8b7195b2fbb2e14dc4cb843fcfbf83de57663 GIT binary patch literal 1150 zcmZQzU<5(|0R|vYV8~!$U=RbcG=LZ+qyWT>V3L8s0VszK{{R2aC@3iOpBxO+D=)9~ zpBxObb6Ke+P7E|33{=kk|Bnlg>Zg79!QufMO-%S>(+3kHM*qc)z5j9Hp|1b=_G*IZ gAD7?19G?sdMn;es*f1=NLF%w!kX{Cc|Nkk$0BLpHH2?qr literal 0 HcmV?d00001 diff --git a/doc/conf.py b/doc/conf.py index 4875c03e6f..8432f5c296 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -2,6 +2,8 @@ import os import sys +import alabaster + # Get the project root dir, which is the parent dir of this cwd = os.getcwd() @@ -46,9 +48,8 @@ pygments_style = 'sphinx' -import alabaster - html_theme_path = [alabaster.get_path()] +html_favicon = 'favicon.ico' html_theme = 'alabaster' html_sidebars = { '**': [ From fc7aae914bc0be1afd5768a2b40cbf7d73f32fd1 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Tue, 11 Apr 2017 12:33:36 +0200 Subject: [PATCH 0071/2998] Implement `options_after` window option Created new method config_after_window() that applies relevant configurations after windows and panes have been created. Currently, it only knows the `options_after` option. This is useful for setting `synchronize-panes: on` *after* pane creation and shell command execution. --- tmuxp/workspacebuilder.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 40893d99f5..4868cf127f 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -188,6 +188,8 @@ def build(self, session=None): if 'focus' in wconf and wconf['focus']: focus = w + self.config_after_window(w, wconf) + if focus_pane: focus_pane.select_pane() @@ -308,6 +310,14 @@ def get_pane_start_directory(): yield p, pconf + """ + Applies window configurations relevant after window and pane creation. + """ + def config_after_window(self, w, wconf): + if 'options_after' in wconf and isinstance(wconf['options_after'], dict): + for key, val in wconf['options_after'].items(): + w.set_window_option(key, val) + def freeze(session): """Freeze live tmux session and Return session config :py:obj:`dict`. From ee17439c58ea2e62f3d9052336b36f685467f984 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Tue, 11 Apr 2017 15:51:59 +0200 Subject: [PATCH 0072/2998] Add test case for window_options_after --- .../window_options_after.yaml | 11 ++++++++ tests/test_workspacebuilder.py | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 tests/fixtures/workspacebuilder/window_options_after.yaml diff --git a/tests/fixtures/workspacebuilder/window_options_after.yaml b/tests/fixtures/workspacebuilder/window_options_after.yaml new file mode 100644 index 0000000000..d9088be3e3 --- /dev/null +++ b/tests/fixtures/workspacebuilder/window_options_after.yaml @@ -0,0 +1,11 @@ +session_name: tmuxp test window_options_after +options: + default-shell: /bin/sh + default-command: /bin/sh +windows: + - window_name: test + panes: + - echo 0 + - echo 1 + options_after: + synchronize-panes: on diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index b34be18a74..e959d83180 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -259,6 +259,34 @@ def test_window_options(session): w.select_layout(wconf['layout']) +def test_window_options_after(session): + yaml_config = loadfixture("workspacebuilder/window_options_after.yaml") + s = session + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + builder.build(session=session) + + def assert_last_line(p, s): + # Print output for easier debugging if test fails + print('\n'.join(p.cmd('capture-pane', '-p').stdout)) + assert p.cmd('capture-pane', '-p').stdout[-2] == s + + for i, pane in enumerate(session.attached_window.panes): + assert_last_line(pane, str(i)) + pane.cmd('send-keys', 'Up') # Will repeat echo + pane.enter() # in each iteration + assert_last_line(pane, str(i)) + + session.cmd('send-keys', 'echo moo') + session.cmd('send-keys', 'Enter') + + for pane in session.attached_window.panes: + assert_last_line(pane, 'moo') + + def test_window_shell(session): yaml_config = loadfixture("workspacebuilder/window_shell.yaml") s = session From bdfa6259d2d2a696b988ea53c0f8af9ed44641de Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Wed, 12 Apr 2017 12:31:37 +0200 Subject: [PATCH 0073/2998] Use bash in window_options_after test, disable history suppression --- tests/fixtures/workspacebuilder/window_options_after.yaml | 4 ++-- tests/test_workspacebuilder.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/fixtures/workspacebuilder/window_options_after.yaml b/tests/fixtures/workspacebuilder/window_options_after.yaml index d9088be3e3..3d60c97ffa 100644 --- a/tests/fixtures/workspacebuilder/window_options_after.yaml +++ b/tests/fixtures/workspacebuilder/window_options_after.yaml @@ -1,9 +1,9 @@ session_name: tmuxp test window_options_after options: - default-shell: /bin/sh - default-command: /bin/sh + default-shell: /bin/bash windows: - window_name: test + suppress_history: false panes: - echo 0 - echo 1 diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e959d83180..30e73cd16d 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -280,7 +280,7 @@ def assert_last_line(p, s): pane.enter() # in each iteration assert_last_line(pane, str(i)) - session.cmd('send-keys', 'echo moo') + session.cmd('send-keys', ' echo moo') session.cmd('send-keys', 'Enter') for pane in session.attached_window.panes: From 4c4759dab35ec1f865735952f19b5a8fee4d8189 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Wed, 12 Apr 2017 13:32:08 +0200 Subject: [PATCH 0074/2998] Make test more robust against slow CI runs Similar to test_suppress_history --- tests/test_workspacebuilder.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 30e73cd16d..263b202966 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -259,6 +259,7 @@ def test_window_options(session): w.select_layout(wconf['layout']) +@pytest.mark.flaky(reruns=5) def test_window_options_after(session): yaml_config = loadfixture("workspacebuilder/window_options_after.yaml") s = session @@ -270,21 +271,35 @@ def test_window_options_after(session): builder.build(session=session) def assert_last_line(p, s): - # Print output for easier debugging if test fails - print('\n'.join(p.cmd('capture-pane', '-p').stdout)) - assert p.cmd('capture-pane', '-p').stdout[-2] == s + correct = False + for _ in range(10): + pane_out = p.cmd('capture-pane', '-p', '-J').stdout + if len(pane_out) > 1 and pane_out[-2].strip() == s: + correct = True + break + + time.sleep(0.1) + + # Print output for easier debugging if assertion fails + if not correct: + print('\n'.join(pane_out)) + + return correct for i, pane in enumerate(session.attached_window.panes): - assert_last_line(pane, str(i)) + assert assert_last_line(pane, str(i)), \ + "Initial command did not execute properly/" + str(i) pane.cmd('send-keys', 'Up') # Will repeat echo pane.enter() # in each iteration - assert_last_line(pane, str(i)) + assert assert_last_line(pane, str(i)), \ + "Repeated command did not execute properly/" + str(i) session.cmd('send-keys', ' echo moo') session.cmd('send-keys', 'Enter') for pane in session.attached_window.panes: - assert_last_line(pane, 'moo') + assert assert_last_line(pane, 'moo'), \ + "Synchronized command did not execute properly" def test_window_shell(session): From dae71f1129c602a4f69d2e419775116271e8a9a6 Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Wed, 12 Apr 2017 15:58:47 +0200 Subject: [PATCH 0075/2998] delete trailing empty lines in pane-capture to make tmux 1.8 happy --- tests/test_workspacebuilder.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 263b202966..ea8adfa321 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -274,6 +274,8 @@ def assert_last_line(p, s): correct = False for _ in range(10): pane_out = p.cmd('capture-pane', '-p', '-J').stdout + # delete trailing empty lines for tmux 1.8... + while not pane_out[-1].strip(): pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break From 9fd088dc1237bd0573825121372f58429424a758 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 13 Apr 2017 15:32:30 -0500 Subject: [PATCH 0076/2998] add installation to readme --- README.rst | 7 +++++++ doc/index.rst | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 80e617d982..dacef7300f 100644 --- a/README.rst +++ b/README.rst @@ -6,6 +6,13 @@ tmuxp, tmux session manager. built on `libtmux`_. available on Leanpub and `Amazon Kindle`_. Read and browse the book for free `on the web`_. +Installation +------------ + +.. code-block:: shell + + $ pip install --user tmuxp + Load a tmux session ------------------- diff --git a/doc/index.rst b/doc/index.rst index b9634f57f2..255d43eff9 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -15,10 +15,10 @@ tmux session manager :width: 100% -Freeze a tmux session ---------------------- +Installation +------------ .. include:: ../README.rst - :start-after: Freeze a tmux session + :start-after: Installation Explore: From 1af40ada9f0080f89fe80991e80c8bb3566a1abe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 13 Apr 2017 15:39:09 -0500 Subject: [PATCH 0077/2998] README consistency tweaks --- README.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index dacef7300f..bd45c2c233 100644 --- a/README.rst +++ b/README.rst @@ -35,19 +35,19 @@ Load tmux sessions via json and YAML, `tmuxinator`_ and - echo third pane # pane no. 3 - echo forth pane # pane no. 4 -Save as ``mysession.yaml``. And load: +Save as *mysession.yaml*, and load: .. code-block:: sh $ tmuxp load ./mysession.yaml -Sessions in ``~/.tmuxp/`` can use names: +Sessions in *~/.tmuxp/* can use names: .. code-block:: sh $ tmuxp load mysession -Projects with ``.tmuxp.yaml`` or ``.tmuxp.json`` load via directory: +Projects with *.tmuxp.yaml* or *.tmuxp.json* load via directory: .. code-block:: sh @@ -61,8 +61,8 @@ Load multiple at once (in bg, offer to attach last): `simple`_, `very elaborate`_ config examples -Store configs in (``~/.tmuxp``) or include in your project as -``~/.tmuxp.{yaml,json}``. See `author's tmuxp configs`_ and the +Store configs in (*~/.tmuxp*) or include in your project as +*~/.tmuxp.{yaml,json}*. See `author's tmuxp configs`_ and the the projects' `tmuxp.yaml`_. Run custom startup scripts (such as installing project dependencies before @@ -79,11 +79,11 @@ You can also load sessions in the background by passing ``-d`` flag Freeze a tmux session --------------------- -snapshot your tmux layout, pane paths, and window/session names. +Snapshot your tmux layout, pane paths, and window/session names. .. code-block:: sh - $ tmuxp freeze SESSION_NAME + $ tmuxp freeze session-name See more about `freezing tmux`_ sessions. From ba3988aa089873c0002792c44fe892a8b767e55d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 13 Apr 2017 15:47:01 -0500 Subject: [PATCH 0078/2998] fix sphinx docs --- doc/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 255d43eff9..b9634f57f2 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -15,10 +15,10 @@ tmux session manager :width: 100% -Installation ------------- +Freeze a tmux session +--------------------- .. include:: ../README.rst - :start-after: Installation + :start-after: Freeze a tmux session Explore: From ae24fae2236bfea82b52f40074aae8c731c973a7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 14:43:13 -0500 Subject: [PATCH 0079/2998] add python 3.6 to ci --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 581a5509b0..aed36e3563 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ python: - 3.3 - 3.4 - 3.5 + - 3.6 env: - TMUX_VERSION=master - TMUX_VERSION=2.3 From c90af1f2e535fa3fa2bc8e5b4615cb292deb1e27 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 14:44:55 -0500 Subject: [PATCH 0080/2998] use pip install --user to install --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index bd45c2c233..0b376145c4 100644 --- a/README.rst +++ b/README.rst @@ -155,7 +155,7 @@ git repo .. code-block:: bash $ git clone https://github.com/tony/tmuxp.git install stable .. code-block:: bash - $ sudo pip install tmuxp + $ pip install --user tmuxp install dev .. code-block:: bash $ git clone https://github.com/tony/tmuxp.git tmuxp From 9bae999053160e3c83cec13731156a3a61a762ec Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 14:45:33 -0500 Subject: [PATCH 0081/2998] fix copy in bootstrap_env --- bootstrap_env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap_env.py b/bootstrap_env.py index 05457388a8..af3a0fbad9 100755 --- a/bootstrap_env.py +++ b/bootstrap_env.py @@ -82,7 +82,7 @@ def which(exe=None, throw=True): message = ( 'Virtualenv is required for this bootstrap to run.\n' 'Install virtualenv via:\n' - '\t$ [sudo] pip install virtualenv' + '\t$ pip install --user virtualenv' ) fail(message) From 126ddc016c77a6475dab10dac1af952d67e06073 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 16:40:16 -0500 Subject: [PATCH 0082/2998] add pypy and pypy3 to ci --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index aed36e3563..79e01c9f01 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ python: - 3.4 - 3.5 - 3.6 + - pypy + - pypy3 env: - TMUX_VERSION=master - TMUX_VERSION=2.3 From d465539e2f94b48ae11910d7854059dcdff09638 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 17:02:04 -0500 Subject: [PATCH 0083/2998] update pypy3 for travis ci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 79e01c9f01..c8578a14d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ python: - 3.5 - 3.6 - pypy - - pypy3 + - pypy3.3-5.2-alpha1 env: - TMUX_VERSION=master - TMUX_VERSION=2.3 From b9dac9df6279c9bf740731fa3df137a5907e7bfb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 17:41:50 -0500 Subject: [PATCH 0084/2998] update readme for pypy/pypy3 support --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0b376145c4..de030bce84 100644 --- a/README.rst +++ b/README.rst @@ -138,7 +138,7 @@ Project details ============== ========================================================== tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3 -python support 2.6, 2.7, >= 3.3 +python support 2.6, 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tony/tmuxp Docs http://tmuxp.git-pull.com From 00fa01de8632f6f518eeea9f2593d26eb0fabdcc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 17:42:42 -0500 Subject: [PATCH 0085/2998] add pypy and python 3.6 to package classifiers --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 63ebf9c34b..d8c8ad6ddf 100644 --- a/setup.py +++ b/setup.py @@ -66,6 +66,8 @@ def run_tests(self): 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: Implementation :: PyPy', "Topic :: Utilities", "Topic :: System :: Shells", ], From 7b55cfa6b9dfb73c9937b76ae1e6b7a9faa6032c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Apr 2017 17:51:18 -0500 Subject: [PATCH 0086/2998] update sidebar with cihai, new style --- doc/_templates/more.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/_templates/more.html b/doc/_templates/more.html index 81a1882d46..cca1629d63 100644 --- a/doc/_templates/more.html +++ b/doc/_templates/more.html @@ -5,9 +5,10 @@

Other Projects

More open source projects from Tony Narlock:

From c72ec4a11adeaf129126484fa3c1d78b5d92c7c2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 20 Apr 2017 11:09:36 -0500 Subject: [PATCH 0087/2998] add tmux 2.4 to test matrix --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c8578a14d1..08e9a4b55e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ python: - pypy3.3-5.2-alpha1 env: - TMUX_VERSION=master + - TMUX_VERSION=2.4 - TMUX_VERSION=2.3 - TMUX_VERSION=2.2 - TMUX_VERSION=2.1 From aa8394556af91a5e74f437312993176c221df1c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 21 Apr 2017 00:52:41 -0500 Subject: [PATCH 0088/2998] fix codecov link --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index de030bce84..fe33926a1c 100644 --- a/README.rst +++ b/README.rst @@ -146,7 +146,7 @@ API http://tmuxp.git-pull.com/en/latest/api.html Changelog http://tmuxp.git-pull.com/en/latest/history.html Issues https://github.com/tony/tmuxp/issues Travis http://travis-ci.org/tony/tmuxp -Test Coverage https://coveralls.io/r/tony/tmuxp +Test Coverage https://codecov.io/gh/tony/tmuxp pypi https://pypi.python.org/pypi/tmuxp Open Hub https://www.openhub.net/p/tmuxp License `BSD`_. From b299a2bd4040ce4a456484a1656bf563d94b4a04 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 23 Apr 2017 04:52:05 -0500 Subject: [PATCH 0089/2998] Update colorama from 0.3.7 to 0.3.8 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 0f4aa13c85..70a18e309c 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.6.5 # Updated from 0.6.4 click==6.7 -colorama==0.3.7 +colorama==0.3.8 From 648171df8a885b4da306181004409b3a698cf3bb Mon Sep 17 00:00:00 2001 From: Sebastian Stammler Date: Mon, 24 Apr 2017 19:09:46 +0200 Subject: [PATCH 0090/2998] Add documentation and example configurations for options_after Example shows how to ssh into two different servers with synchronized panes. --- doc/examples.rst | 19 +++++++++++++++++++ examples/2-pane-synchronized.json | 15 +++++++++++++++ examples/2-pane-synchronized.yaml | 8 ++++++++ 3 files changed, 42 insertions(+) create mode 100644 examples/2-pane-synchronized.json create mode 100644 examples/2-pane-synchronized.yaml diff --git a/doc/examples.rst b/doc/examples.rst index 1f7d3e9504..c111449f6e 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -301,6 +301,25 @@ JSON .. literalinclude:: ../examples/options.json :language: json +Set window options after pane creation +-------------------------------------- + +Apply window options after panes have been created. Useful for +``synchronize-panes`` option after executing individual commands in each +pane during creation. + +YAML +~~~~ + +.. literalinclude:: ../examples/2-pane-synchronized.yaml + :language: yaml + +JSON +~~~~ + +.. literalinclude:: ../examples/2-pane-synchronized.json + :language: json + Main pane height ---------------- diff --git a/examples/2-pane-synchronized.json b/examples/2-pane-synchronized.json new file mode 100644 index 0000000000..6cd349ebbf --- /dev/null +++ b/examples/2-pane-synchronized.json @@ -0,0 +1,15 @@ +{ + "session_name": "2-pane-synchronized", + "windows": [ + { + "window_name": "Two synchronized panes", + "panes": [ + "ssh server1", + "ssh server2" + ], + "options_after": { + "synchronize-panes": true + } + } + ] +} \ No newline at end of file diff --git a/examples/2-pane-synchronized.yaml b/examples/2-pane-synchronized.yaml new file mode 100644 index 0000000000..fbb65b7937 --- /dev/null +++ b/examples/2-pane-synchronized.yaml @@ -0,0 +1,8 @@ +session_name: 2-pane-synchronized +windows: + - window_name: Two synchronized panes + panes: + - ssh server1 + - ssh server2 + options_after: + synchronize-panes: on From b2605a36b3a886690985e00b2751bdd14635afaa Mon Sep 17 00:00:00 2001 From: Rafael Bodill Date: Mon, 17 Apr 2017 13:34:25 +0300 Subject: [PATCH 0091/2998] When loading, get the config canonical file path Fix issue when config files are symlinks in `~/.tmuxp` --- tmuxp/cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 4369ee0068..70296a7f67 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -218,6 +218,8 @@ def load_workspace( :param type: string """ + # get the canonical path, eliminating any symlinks + config_file = os.path.realpath(config_file) sconfig = kaptan.Kaptan() sconfig = sconfig.import_config(config_file).get() From 1dc1f4918adfd8f4e635723c0393bef2c763a479 Mon Sep 17 00:00:00 2001 From: Rafael Bodill Date: Sun, 23 Apr 2017 11:08:52 +0300 Subject: [PATCH 0092/2998] Add symlink test with ./ start_directory --- tests/test_cli.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 5c16064faa..cf1d8c8d8a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -263,7 +263,7 @@ def check_cmd(config_arg): def test_load_workspace(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within - # a tmux session by the developer themselv, delete the TMUX variable + # a tmux session by the developer himself, delete the TMUX variable # temporarily. monkeypatch.delenv('TMUX', raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") @@ -278,6 +278,37 @@ def test_load_workspace(server, monkeypatch): assert session.name == 'sampleconfig' +def test_load_symlinked_workspace(server, tmpdir, monkeypatch): + # this is an implementation test. Since this testsuite may be ran within + # a tmux session by the developer himself, delete the TMUX variable + # temporarily. + monkeypatch.delenv('TMUX', raising=False) + + realtemp = tmpdir.mkdir('myrealtemp') + linktemp = tmpdir.join('symlinktemp') + linktemp.mksymlinkto(realtemp) + projfile = linktemp.join('simple.yaml') + + projfile.write(""" +session_name: samplesimple +start_directory: './' +windows: +- panes: + - echo 'hey'""") + + # open it detached + session = load_workspace( + projfile.strpath, + socket_name=server.socket_name, + detached=True + ) + pane = session.attached_window.attached_pane + + assert isinstance(session, libtmux.Session) + assert session.name == 'samplesimple' + assert pane.current_path == realtemp.strpath + + def test_regression_00132_session_name_with_dots(tmpdir, server, session): yaml_config = curjoin("workspacebuilder/regression_00132_dots.yaml") cli_args = [yaml_config] From 3403f5a3e4793417cdd8013fca23a6e6aa000823 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 26 Apr 2017 14:58:42 -0500 Subject: [PATCH 0093/2998] add CHANGES --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 6fa1876849..ae661e3a9e 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,11 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.3.0 <2017-04-26>` +- :feature:`236` Support for symlinked directories, thanks @rafi. +- :feature:`236` Support for ``options_after``, for setting options like + ``synchronize-panes``. Thanks @sebastianst. + - :release:`1.2.8 <2017-04-02>` - :support:`229 backported` More helpful error message on systems missing tmux. From b3c0d9a1961101f6c257bdc8950d0b8a18b93898 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 27 Apr 2017 02:46:55 -0500 Subject: [PATCH 0094/2998] Update colorama from 0.3.8 to 0.3.9 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 70a18e309c..39c85b8836 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.6.5 # Updated from 0.6.4 click==6.7 -colorama==0.3.8 +colorama==0.3.9 From ba463181fc6dec51c498d515570455b052b011e5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 13:52:05 -0500 Subject: [PATCH 0095/2998] update release uri in docs --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 8432f5c296..41c070554d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -30,7 +30,7 @@ releases_unstable_prehistory = True releases_document_name = "history" releases_issue_uri = "https://github.com/tony/tmuxp/issues/%s" -releases_release_uri = "https://github.com/tony/tmuxp/tree/%s" +releases_release_uri = "https://github.com/tony/tmuxp/tree/v%s" templates_path = ['_templates'] From 8cdba8e54283c3081e1a5fc15ebf8bb39778f2c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 13:57:04 -0500 Subject: [PATCH 0096/2998] add tmux 2.4 to readme --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index fe33926a1c..a897302f8d 100644 --- a/README.rst +++ b/README.rst @@ -137,7 +137,7 @@ Project details --------------- ============== ========================================================== -tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3 +tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4 python support 2.6, 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tony/tmuxp From 60852c114cbf4aa435d00d880904c77435d3916b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 14:01:37 -0500 Subject: [PATCH 0097/2998] bump libtmux to 0.7.1 and update import --- requirements/base.txt | 2 +- tmuxp/cli.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 39c85b8836..daea08343e 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.6.5 # Updated from 0.6.4 +libtmux==0.7.1 # Updated from 0.6.5 click==6.7 colorama==0.3.9 diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 70296a7f67..7159b350a2 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -14,7 +14,7 @@ import click import kaptan from click.exceptions import FileError -from libtmux.common import has_required_tmux_version, which +from libtmux.common import has_minimum_version, which from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server @@ -318,7 +318,7 @@ def cli(log_level): See detailed documentation and examples at: http://tmuxp.readthedocs.io/en/latest/""" try: - has_required_tmux_version() + has_minimum_version() except TmuxCommandNotFound: click.echo('tmux not found. tmuxp requires you install tmux first.') sys.exit() From ccbcec781a8ab414ee8c0e1e426aa378a2a62fae Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 14:20:21 -0500 Subject: [PATCH 0098/2998] drop python 2.6 support --- .travis.yml | 1 - README.rst | 2 +- setup.py | 1 - tox.ini | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 08e9a4b55e..77f2e11968 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: python sudo: false python: - - 2.6 - 2.7 - 3.3 - 3.4 diff --git a/README.rst b/README.rst index a897302f8d..93ca5f8715 100644 --- a/README.rst +++ b/README.rst @@ -138,7 +138,7 @@ Project details ============== ========================================================== tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4 -python support 2.6, 2.7, >= 3.3, pypy, pypy3 +python support 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tony/tmuxp Docs http://tmuxp.git-pull.com diff --git a/setup.py b/setup.py index d8c8ad6ddf..bfaf71dd57 100644 --- a/setup.py +++ b/setup.py @@ -61,7 +61,6 @@ def run_tests(self): 'Environment :: Web Environment', 'Intended Audience :: Developers', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', diff --git a/tox.ini b/tox.ini index c3102c4c0c..cf419f3250 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py26, py27, py33, py34, py35 +envlist = py27, py33, py34, py35, py36 [testenv] commands = make test [] From a9ad62bc2e967195bce2ed41d3936d129d2e1b49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 14:35:20 -0500 Subject: [PATCH 0099/2998] add tests for pane-border-format, pep8 --- tests/test_workspacebuilder.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index ea8adfa321..a8e958614c 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -12,6 +12,7 @@ from . import fixtures_dir from libtmux import Window +from libtmux.common import has_gte_version from libtmux.test import temp_session from tmuxp import config, exc from tmuxp._compat import text_type @@ -242,6 +243,9 @@ def test_window_options(session): sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) + if has_gte_version('2.3'): + sconfig['windows'][0]['options']['pane-border-format'] = ' #P ' + builder = WorkspaceBuilder(sconf=sconfig) window_count = len(session._windows) # current window count @@ -253,6 +257,8 @@ def test_window_options(session): assert len(s._windows) == window_count assert isinstance(w, Window) assert w.show_window_option('main-pane-height') == 5 + if has_gte_version('2.3'): + assert w.show_window_option('pane-border-format') == ' #P ' assert len(s._windows) == window_count window_count += 1 @@ -262,7 +268,6 @@ def test_window_options(session): @pytest.mark.flaky(reruns=5) def test_window_options_after(session): yaml_config = loadfixture("workspacebuilder/window_options_after.yaml") - s = session sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -274,8 +279,8 @@ def assert_last_line(p, s): correct = False for _ in range(10): pane_out = p.cmd('capture-pane', '-p', '-J').stdout - # delete trailing empty lines for tmux 1.8... - while not pane_out[-1].strip(): pane_out.pop() + while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 + pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break @@ -291,10 +296,11 @@ def assert_last_line(p, s): for i, pane in enumerate(session.attached_window.panes): assert assert_last_line(pane, str(i)), \ "Initial command did not execute properly/" + str(i) - pane.cmd('send-keys', 'Up') # Will repeat echo - pane.enter() # in each iteration - assert assert_last_line(pane, str(i)), \ - "Repeated command did not execute properly/" + str(i) + pane.cmd('send-keys', 'Up') # Will repeat echo + pane.enter() # in each iteration + assert assert_last_line(pane, str(i)), ( + "Repeated command did not execute properly/" + str(i) + ) session.cmd('send-keys', ' echo moo') session.cmd('send-keys', 'Enter') From 58552fbd83ed50daa0308791568cd24ca6af7a63 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 16:11:04 -0500 Subject: [PATCH 0100/2998] update CHANGES --- CHANGES | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ae661e3a9e..df5ec4c295 100644 --- a/CHANGES +++ b/CHANGES @@ -4,10 +4,15 @@ Changelog Here you can find the recent changes to tmuxp -- :release:`1.3.0 <2017-04-26>` +- :release:`1.3.0 <2017-04-27>` +- :feature:`239` Improve support for formatted options when freezing and + using configs with them. - :feature:`236` Support for symlinked directories, thanks @rafi. - :feature:`236` Support for ``options_after``, for setting options like ``synchronize-panes``. Thanks @sebastianst. +- :support:`248` Drop python 2.6 support +- :support:`248` Upgrade libtmux to 0.7.1 +- :support:`-` Upgrade colorama from 0.3.7 to 0.3.9 - :release:`1.2.8 <2017-04-02>` - :support:`229 backported` More helpful error message on systems missing From 530e36e4075e93acb792333ce009601a97b90b05 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 16:11:38 -0500 Subject: [PATCH 0101/2998] Tag v1.3.0 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index e51fd9a8d7..176942dc2e 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.2.8' +__version__ = '1.3.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From c7b2cc7ffdfde33771ccd5c33ce2d3c79d110d19 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 28 Apr 2017 18:01:15 -0500 Subject: [PATCH 0102/2998] fix link to @sebastianst's ticket in changelog --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index df5ec4c295..4b3859fdde 100644 --- a/CHANGES +++ b/CHANGES @@ -8,7 +8,7 @@ Here you can find the recent changes to tmuxp - :feature:`239` Improve support for formatted options when freezing and using configs with them. - :feature:`236` Support for symlinked directories, thanks @rafi. -- :feature:`236` Support for ``options_after``, for setting options like +- :feature:`235` Support for ``options_after``, for setting options like ``synchronize-panes``. Thanks @sebastianst. - :support:`248` Drop python 2.6 support - :support:`248` Upgrade libtmux to 0.7.1 From e23360dc24765dbdc028a491638211dfc4a9f61e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 14:13:50 -0500 Subject: [PATCH 0103/2998] fix highlighting tao of tmux --- doc/about_tmux.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 4e08167da7..4b909bd8db 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -511,7 +511,7 @@ Depending on your tmux version, there is different options available. Vi-style copy and paste ----------------------- -.. code-block:: ini +.. code-block:: sh # Vi copypaste mode set-window-option -g mode-keys vi @@ -521,7 +521,7 @@ Vi-style copy and paste Aggressive resizing for clients ------------------------------- -.. code-block:: ini +.. code-block:: sh setw -g aggressive-resize on @@ -530,7 +530,7 @@ Reload config ```` + ``r``. -.. code-block:: ini +.. code-block:: sh bind r source-file ~/.tmux.conf \; display-message "Config reloaded." @@ -544,7 +544,7 @@ You can use `tmux-mem-cpu-load`_ to get stats (requires compilation) and `basic-cpu-and-memory.tmux`_. You can pipe in a bash command to a tmux status line like: -.. code-block:: ini +.. code-block:: sh $(shell-command) From b4503492e2ca24bb257e37b3e5093f0f624be67a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 14:18:32 -0500 Subject: [PATCH 0104/2998] update code css --- doc/_static/tmuxp.css | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 4b5e17c2ea..ebfce47947 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -115,12 +115,15 @@ div.note { } code { - background-color: rgba(27,31,35,0.05); - border-radius: 3px; - color: #24292e; font-size: 85%; - padding-bottom: 0.2em; - padding-top: 0.2em; + color: #24292e; + box-sizing: border-box; + display: inline-block; + padding: 0 5px; + background: #fafcfc; + border: 1px solid #f0f4f7; + border-radius: 4px; + line-height: 20px; } code::before, code::after { From 0edb3ad87882ab0ed430cf5c724572f5b8fd082b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 14:31:51 -0500 Subject: [PATCH 0105/2998] fix documentation start-line --- doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index b9634f57f2..3708aa125a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,7 @@ tmux session manager Freeze a tmux session --------------------- .. include:: ../README.rst - :start-after: Freeze a tmux session + :start-after: --------------------- Explore: From 176de3da99bdc36e55e1f25893166adfdc2315c0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 14:31:59 -0500 Subject: [PATCH 0106/2998] more css styling tweaks --- doc/_static/tmuxp.css | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index ebfce47947..016b3990b2 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -119,13 +119,25 @@ code { color: #24292e; box-sizing: border-box; display: inline-block; - padding: 0 5px; + padding: 0 2px; background: #fafcfc; border: 1px solid #f0f4f7; border-radius: 4px; line-height: 20px; } +code.descclassname { /* left side of sphinx autodoc */ + border-right: 0px; + border-bottom-right-radius: 0px; + border-top-right-radius: 0px; +} + +code.descname { /* right side of sphinx autodoc */ + border-left: 0px; + border-bottom-left-radius: 0px; + border-top-left-radius: 0px; +} + code::before, code::after { letter-spacing: -0.2em; content: "\00a0"; From f5a28095f5150f6ed402ae1af8de61035a5fabe9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 14:44:52 -0500 Subject: [PATCH 0107/2998] more css tweaks --- doc/_static/tmuxp.css | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index 016b3990b2..a1958d98d4 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -114,7 +114,7 @@ div.note { border-left: 5px solid #bb5557; } -code { +code.literal{ font-size: 85%; color: #24292e; box-sizing: border-box; @@ -126,18 +126,6 @@ code { line-height: 20px; } -code.descclassname { /* left side of sphinx autodoc */ - border-right: 0px; - border-bottom-right-radius: 0px; - border-top-right-radius: 0px; -} - -code.descname { /* right side of sphinx autodoc */ - border-left: 0px; - border-bottom-left-radius: 0px; - border-top-left-radius: 0px; -} - code::before, code::after { letter-spacing: -0.2em; content: "\00a0"; From e9f50788591fed8fe4e53e1496d0e6a3e4cc6a7d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Apr 2017 15:12:55 -0500 Subject: [PATCH 0108/2998] remove border on code roles --- doc/_static/tmuxp.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css index a1958d98d4..0eb84468c1 100644 --- a/doc/_static/tmuxp.css +++ b/doc/_static/tmuxp.css @@ -119,10 +119,9 @@ code.literal{ color: #24292e; box-sizing: border-box; display: inline-block; - padding: 0 2px; + padding: 0; background: #fafcfc; border: 1px solid #f0f4f7; - border-radius: 4px; line-height: 20px; } From b62acec94120959504bbdafb5e8995ad22ddccaa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Apr 2017 17:24:28 -0500 Subject: [PATCH 0109/2998] autodoc: string -> str --- bootstrap_env.py | 5 +++-- tmuxp/cli.py | 4 ++-- tmuxp/config.py | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/bootstrap_env.py b/bootstrap_env.py index af3a0fbad9..6e09e2a08b 100755 --- a/bootstrap_env.py +++ b/bootstrap_env.py @@ -31,10 +31,10 @@ def which(exe=None, throw=True): from salt.util - https://www.github.com/saltstack/salt - license apache :param exe: Application to search PATHs for. - :type exe: string + :type exe: str :param throw: Raise ``Exception`` if not found in paths :type throw: bool - :rtype: string + :rtype: str """ if exe: @@ -131,5 +131,6 @@ def main(): if os.path.exists(os.path.join(env_dir, 'build')): os.removedirs(os.path.join(env_dir, 'build')) + if __name__ == '__main__': main() diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7159b350a2..3b942354fb 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -131,7 +131,7 @@ def scan_config(config, config_dir=None): - a file name, myconfig.yaml - relative path, ../config.yaml or ../project - a period, . - :type config: string + :type config: str If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If one or more found, it will warn and pick the first. @@ -215,7 +215,7 @@ def load_workspace( """Build config workspace. :param config_file: full path to config file - :param type: string + :param type: str """ # get the canonical path, eliminating any symlinks diff --git a/tmuxp/config.py b/tmuxp/config.py index 20aa9dd7f7..c48f7aa01b 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -51,9 +51,9 @@ def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): """Return True if file has a valid config file type. :param filename: filename to check (e.g. ``mysession.json``). - :type filename: string + :type filename: str :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). - :type extensions: list or string + :type extensions: list or str :rtype: bool """ @@ -70,7 +70,7 @@ def in_dir( """Return a list of configs in ``config_dir``. :param config_dir: directory to search - :type config_dir: string + :type config_dir: str :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). :type extensions: list :rtype: list @@ -109,9 +109,9 @@ def expandshell(_path): :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars` :param _path: path to expand - :type _path: string + :type _path: str :returns: expanded path - :rtype: string + :rtype: str """ return os.path.expandvars(os.path.expanduser(_path)) @@ -174,7 +174,7 @@ def expand(sconf, cwd=None, parent=None): :type sconf: dict :param cwd: directory to expand relative paths against. should be the dir of the config directory. - :type cwd: string + :type cwd: str :param parent: (used on recursive entries) start_directory of parent window or session object. :type parent: str From 145a312c97243f1c7559fe1bae4572965ad7aed1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 10 May 2017 13:19:26 -0500 Subject: [PATCH 0110/2998] Update requests from 2.13.0 to 2.14.2 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 69a5c37805..80b83620a2 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.13.0 +requests[security]==2.14.2 sphinx==1.5.5 reportlab==3.4.0 alabaster==0.7.10 From f9159219618e802fd57a7c860eb5908401280ee6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 14 May 2017 16:25:35 -0500 Subject: [PATCH 0111/2998] Update sphinx from 1.5.5 to 1.5.6 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 69a5c37805..856cf24343 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.13.0 -sphinx==1.5.5 +sphinx==1.5.6 reportlab==3.4.0 alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 From a787529f112364179e8087c9915809a51c6aa6d2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 14 May 2017 19:48:20 -0500 Subject: [PATCH 0112/2998] Update doc.txt --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 80b83620a2..4006cdcb35 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.14.2 -sphinx==1.5.5 +sphinx==1.5.6 reportlab==3.4.0 alabaster==0.7.10 releases==1.3.0 # Updated from 1.2.0 From 0c52010f277964ac4c299b8643ab13c248eac22b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 18 May 2017 17:34:39 -0500 Subject: [PATCH 0113/2998] Update releases from 1.3.0 to 1.3.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 4006cdcb35..bdc60485e5 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,5 +4,5 @@ requests[security]==2.14.2 sphinx==1.5.6 reportlab==3.4.0 alabaster==0.7.10 -releases==1.3.0 # Updated from 1.2.0 +releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From ae57abf9d690af0b97b1ced82a3d123a3809cec6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 20 May 2017 04:57:31 -0500 Subject: [PATCH 0114/2998] update sidebar projects --- doc/_templates/more.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/_templates/more.html b/doc/_templates/more.html index cca1629d63..e2c4d56173 100644 --- a/doc/_templates/more.html +++ b/doc/_templates/more.html @@ -5,7 +5,8 @@

Other Projects

More open source projects from Tony Narlock:

    -
  • cihai
  • +
  • unihan-tabular
  • +
  • cihai (cli)
  • tmuxp (libtmux)
  • vcspull (libvcs)
  • From aae89262378f6aff16f5257f346e0a0f06e2e225 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 22 May 2017 23:34:49 -0500 Subject: [PATCH 0115/2998] Update pytest from 3.0.7 to 3.1.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index a52b39cccf..1c2236a100 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.0.7 # Updated from 3.0.4 +pytest==3.1.0 # Updated from 3.0.4 pytest-rerunfailures==2.1.0 # Updated from 2.0.1 From 80730e946eb35abeb40fa683b2aa30b85cece5df Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 26 May 2017 13:20:57 -0500 Subject: [PATCH 0116/2998] switch theme to alagitpull --- doc/_static/tmuxp.css | 131 ------------------------------------- doc/_templates/layout.html | 5 -- doc/_templates/more.html | 19 ------ doc/_templates/star.html | 4 -- doc/conf.py | 28 ++++---- requirements/doc.txt | 2 +- 6 files changed, 18 insertions(+), 171 deletions(-) delete mode 100644 doc/_static/tmuxp.css delete mode 100644 doc/_templates/layout.html delete mode 100644 doc/_templates/more.html delete mode 100644 doc/_templates/star.html diff --git a/doc/_static/tmuxp.css b/doc/_static/tmuxp.css deleted file mode 100644 index 0eb84468c1..0000000000 --- a/doc/_static/tmuxp.css +++ /dev/null @@ -1,131 +0,0 @@ -div.sidebar { - margin: 0px; - border: 0px; - padding: 0px; - background-color: inherit; -} - -div.sidebar .sidebar-title { - display: none; -} - -div.sidebar { - font-size: 13px; -} - -div.sidebar img { - margin: 0px; - padding: 0px; - width: 50%; - text-align: center; -} - -form.navbar-form { - padding: 0px 10px; -} - -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -div#text-based-window-manager { - clear: both; -} - -@media screen and (max-width: 768px) { - #fork-gh img { - display: none; - } -} - -/*** Book Stuff ***/ -div.book-container { - clear: both; - height: 170px; -} - -div.book-container > p { - text-align: center; -} - -div.book-container div.leftside-book { - width: 131px; - padding: 0px; - float: left; -} - -div.book-container div.leftside-book div.figure.align-left { - padding: 0px; - margin: 0px; -} - -div.book-container div.leftside-book div.figure.align-left img { - width: 131px; - height: 170px; -} - -div.book-container div.rightside-book { - margin-left: 131px; - padding: 0px 10px; -} - -div.book-container div.rightside-book div.figure { - padding: 0; - margin: 0; -} - -div.book-container div.rightside-book div.figure.align-left { - /* clear:none; if using a rightside button like iBooks */ - clear: both; -} - - -table.docutils { - background-color: #fafbfc; - border: 0; -} - -table.docutils td, table.docutils th { - border: 0; -} - -table.docutils pre { - background-color: rgba(239, 242, 244, .75); -} - -pre { - background-color: #fafbfc; - border-left: 5px solid #558abb; - font-size: 0.75em; -} - -div.seealso, div.note { - background-color: #fafbfc; - border-right: 0; - border-top: 0; - border-bottom: 0; -} - -div.seealso { - border-left: 5px solid #8abb55; -} - -div.note { - border-left: 5px solid #bb5557; -} - -code.literal{ - font-size: 85%; - color: #24292e; - box-sizing: border-box; - display: inline-block; - padding: 0; - background: #fafcfc; - border: 1px solid #f0f4f7; - line-height: 20px; -} - -code::before, code::after { - letter-spacing: -0.2em; - content: "\00a0"; -} diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html deleted file mode 100644 index 022f011cab..0000000000 --- a/doc/_templates/layout.html +++ /dev/null @@ -1,5 +0,0 @@ -{# Import the theme's layout. #} -{% extends "!layout.html" %} - -{# Include our new CSS file into existing ones. #} -{% set css_files = css_files + ['_static/tmuxp.css']%} diff --git a/doc/_templates/more.html b/doc/_templates/more.html deleted file mode 100644 index e2c4d56173..0000000000 --- a/doc/_templates/more.html +++ /dev/null @@ -1,19 +0,0 @@ -

    Other Projects

    - -

    - -

    More open source projects from Tony Narlock:

    - - - - - Fork me on GitHub - diff --git a/doc/_templates/star.html b/doc/_templates/star.html deleted file mode 100644 index 0f7feffeb5..0000000000 --- a/doc/_templates/star.html +++ /dev/null @@ -1,4 +0,0 @@ -

    - -

    diff --git a/doc/conf.py b/doc/conf.py index 41c070554d..e53a976c69 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -2,7 +2,7 @@ import os import sys -import alabaster +import alagitpull # Get the project root dir, which is the parent dir of this @@ -19,13 +19,14 @@ exec(fp.read(), about) -extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'aafig', - 'releases', - 'alabaster', - ] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'aafig', + 'releases', + 'alagitpull', +] releases_unstable_prehistory = True releases_document_name = "history" @@ -48,13 +49,12 @@ pygments_style = 'sphinx' -html_theme_path = [alabaster.get_path()] +html_theme_path = [alagitpull.get_path()] html_favicon = 'favicon.ico' -html_theme = 'alabaster' +html_theme = 'alagitpull' html_sidebars = { '**': [ 'about.html', - 'star.html', 'navigation.html', 'relations.html', 'more.html', @@ -65,6 +65,12 @@ html_theme_options = { 'logo': 'img/tmuxp.svg', + 'github_user': 'tony', + 'github_repo': 'tmuxp', + 'github_type': 'star', + 'github_banner': True, + 'projects': alagitpull.projects, + 'project_name': about['__title__'], } html_theme_path = ['_themes'] diff --git a/requirements/doc.txt b/requirements/doc.txt index bdc60485e5..b1346e3d95 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,6 +3,6 @@ docutils==0.13.1 requests[security]==2.14.2 sphinx==1.5.6 reportlab==3.4.0 -alabaster==0.7.10 +alagitpull==0.0.4 releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From dbfa4e8f3ebaf81df4d31bc46ec7b4958f15e349 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 27 May 2017 09:10:52 -0500 Subject: [PATCH 0117/2998] Update requests from 2.14.2 to 2.16.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index b1346e3d95..22b34485f1 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.14.2 +requests[security]==2.16.1 sphinx==1.5.6 reportlab==3.4.0 alagitpull==0.0.4 From 4e3538a87ba571e0bf884a4afd44de12bf3fb809 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 27 May 2017 11:19:55 -0500 Subject: [PATCH 0118/2998] Update alagitpull from 0.0.4 to 0.0.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 22b34485f1..ff3e39b8f4 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,6 +3,6 @@ docutils==0.13.1 requests[security]==2.16.1 sphinx==1.5.6 reportlab==3.4.0 -alagitpull==0.0.4 +alagitpull==0.0.5 releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From 95b0baf30f28b40fefe8a91a7871b7b13d8d679b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 27 May 2017 12:10:53 -0500 Subject: [PATCH 0119/2998] Update requests from 2.16.1 to 2.16.3 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index ff3e39b8f4..6e2f421406 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.16.1 +requests[security]==2.16.3 sphinx==1.5.6 reportlab==3.4.0 alagitpull==0.0.5 From eba5b12103361207f48dd71fa3dc296390eeda91 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 27 May 2017 21:07:53 -0500 Subject: [PATCH 0120/2998] Update requests from 2.16.3 to 2.16.4 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 6e2f421406..fad1c0fa0a 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.16.3 +requests[security]==2.16.4 sphinx==1.5.6 reportlab==3.4.0 alagitpull==0.0.5 From 329fc35fd8e26af636a997a2128cc725d4447ef3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 28 May 2017 04:07:56 -0500 Subject: [PATCH 0121/2998] Update requests from 2.16.4 to 2.16.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index fad1c0fa0a..b59732335e 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.16.4 +requests[security]==2.16.5 sphinx==1.5.6 reportlab==3.4.0 alagitpull==0.0.5 From c0a7050a90c2c7f1e55b61823878868ccff4f3d9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 28 May 2017 13:59:41 -0500 Subject: [PATCH 0122/2998] Update sphinx from 1.5.6 to 1.6.2 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index b59732335e..e8d537f960 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.13.1 requests[security]==2.16.5 -sphinx==1.5.6 +sphinx==1.6.2 reportlab==3.4.0 alagitpull==0.0.5 releases==1.3.1 # Updated from 1.2.0 From e8b95d80a120b0b1186b7bc79d14ed910eb4cc93 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 03:45:24 -0500 Subject: [PATCH 0123/2998] try removing requests dependency from docs --- requirements/doc.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index e8d537f960..08bee6aa8d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,5 @@ -r ./base.txt docutils==0.13.1 -requests[security]==2.16.5 sphinx==1.6.2 reportlab==3.4.0 alagitpull==0.0.5 From 947dde30609354b3a4f67d1ca6df856275c82b10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 03:48:37 -0500 Subject: [PATCH 0124/2998] try removing reportlab dependency from docs --- requirements/doc.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 08bee6aa8d..abbd7315d3 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -reportlab==3.4.0 alagitpull==0.0.5 releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From ee82bbdfc97fbd8028800dd0c871996cc2b00818 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 04:27:38 -0500 Subject: [PATCH 0125/2998] bump libtmux to 0.7.2 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index daea08343e..f4d4d3a3f4 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.1 # Updated from 0.6.5 +libtmux==0.7.2 # Updated from 0.7.1 click==6.7 colorama==0.3.9 From 792d4269047927f6b76cda7d24ff86eebe3ec7d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 04:30:06 -0500 Subject: [PATCH 0126/2998] test #252 regression --- tests/test_cli.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index cf1d8c8d8a..27991109f1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -278,6 +278,37 @@ def test_load_workspace(server, monkeypatch): assert session.name == 'sampleconfig' +def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): + monkeypatch.delenv('TMUX', raising=False) + session_file = curjoin("workspacebuilder/two_pane.yaml") + + # open it detached + session = load_workspace( + session_file, socket_name=server.socket_name, + detached=True + ) + + assert isinstance(session, libtmux.Session) + assert session.name == 'sampleconfig' + + projfile = tmpdir.join('simple.yaml') + + projfile.write(""" +session_name: sampleconfi +start_directory: './' +windows: +- panes: + - echo 'hey'""") + + # open it detached + session = load_workspace( + projfile.strpath, + socket_name=server.socket_name, + detached=True + ) + assert session.name == 'sampleconfi' + + def test_load_symlinked_workspace(server, tmpdir, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable From 9f91601123562bdc4fd5de5106a37ae988827dc7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 04:42:33 -0500 Subject: [PATCH 0127/2998] update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 4b3859fdde..fd9148295c 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +- :bug:`252` Fix bug where loading a session with a name matching a subset + of current session causes undesired behavior. +- :support:`-` Update libtmux to 0.7.2 + - :release:`1.3.0 <2017-04-27>` - :feature:`239` Improve support for formatted options when freezing and using configs with them. From 17854e4fee2b92a7be8c84d978c3996c17cde8a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 05:14:28 -0500 Subject: [PATCH 0128/2998] bump libtmux to 0.7.3 --- CHANGES | 2 +- requirements/base.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index fd9148295c..fd6da5de30 100644 --- a/CHANGES +++ b/CHANGES @@ -6,7 +6,7 @@ Here you can find the recent changes to tmuxp - :bug:`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. -- :support:`-` Update libtmux to 0.7.2 +- :support:`-` Update libtmux to 0.7.3 - :release:`1.3.0 <2017-04-27>` - :feature:`239` Improve support for formatted options when freezing and diff --git a/requirements/base.txt b/requirements/base.txt index f4d4d3a3f4..6a59df2331 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.2 # Updated from 0.7.1 +libtmux==0.7.3 # Updated from 0.7.1 click==6.7 colorama==0.3.9 From 3393fdcad0644f7a664fe2a2bb31b04b9cc58382 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 05:18:20 -0500 Subject: [PATCH 0129/2998] only assert for tmux 2.1 and up --- tests/test_cli.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index 27991109f1..beba8db9b8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -10,6 +10,8 @@ import click from click.testing import CliRunner +from libtmux.common import has_lt_version + from tmuxp import cli, config from tmuxp.cli import ( is_pure_name, load_workspace, scan_config, get_config_dir @@ -278,6 +280,9 @@ def test_load_workspace(server, monkeypatch): assert session.name == 'sampleconfig' +@pytest.mark.skipif( + has_lt_version('2.1'), reason='exact session name matches only tmux >= 2.1' +) def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): monkeypatch.delenv('TMUX', raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") From 3fc6d7494e5ab0fa91ccb11682d2cbd894825ade Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 05:41:13 -0500 Subject: [PATCH 0130/2998] cut v1.3.1 --- CHANGES | 3 +++ tmuxp/__about__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index fd6da5de30..109023ffbb 100644 --- a/CHANGES +++ b/CHANGES @@ -4,9 +4,12 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.3.1 <2017-05-29>` - :bug:`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. - :support:`-` Update libtmux to 0.7.3 +- :support:`-` Switch theme to alagitpull (alabaster subtheme) +- :support:`-` Remove unneeded doc dependency packages - :release:`1.3.0 <2017-04-27>` - :feature:`239` Improve support for formatted options when freezing and diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 176942dc2e..8d8d8f0023 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.0' +__version__ = '1.3.1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From a15e1e788e57f4d30753fa21bf8a197753e02408 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 May 2017 06:12:52 -0500 Subject: [PATCH 0131/2998] update Makefile for doc server --- doc/Makefile | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 1e547512d7..29857d4725 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,7 @@ # Makefile for Sphinx documentation # +PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") +HTTP_PORT = 8031 # You can set these variables from the command line. SPHINXOPTS = @@ -164,7 +166,13 @@ watch: serve: @echo '=================================================' @echo - @echo 'docs server running at http://0.0.0.0:8031/_build/html' + @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' @echo @echo '=================================================' - python -m SimpleHTTPServer 8031 + @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi + +serve_py2: + python -m SimpleHTTPServer ${HTTP_PORT} + +serve_py3: + python -m http.server ${HTTP_PORT} From 93581f61e82944c04e8e07975c2c03c138d48b88 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 31 May 2017 13:57:00 -0500 Subject: [PATCH 0132/2998] Update pytest from 3.1.0 to 3.1.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 1c2236a100..568e0672e5 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.1.0 # Updated from 3.0.4 +pytest==3.1.1 # Updated from 3.0.4 pytest-rerunfailures==2.1.0 # Updated from 2.0.1 From e473e212c7f1790fc42c99f0d28bc114be40f2bd Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 5 Jun 2017 19:59:07 -0500 Subject: [PATCH 0133/2998] Update aafigure from 0.5 to 0.6 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index abbd7315d3..f87df1a244 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,4 +3,4 @@ docutils==0.13.1 sphinx==1.6.2 alagitpull==0.0.5 releases==1.3.1 # Updated from 1.2.0 -aafigure==0.5 +aafigure==0.6 From 9366ddabd57594cfbddf7ca521578183eef61baa Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 7 Jun 2017 19:37:12 -0500 Subject: [PATCH 0134/2998] Update alagitpull from 0.0.5 to 0.0.8 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index abbd7315d3..2d204d327d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -alagitpull==0.0.5 +alagitpull==0.0.8 releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From bcefc569ff915d76ca739a821f2b44849de3d3c4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 8 Jun 2017 16:37:16 -0500 Subject: [PATCH 0135/2998] Update alagitpull from 0.0.8 to 0.0.9 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 2d204d327d..543e19986b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -alagitpull==0.0.8 +alagitpull==0.0.9 releases==1.3.1 # Updated from 1.2.0 aafigure==0.5 From 24ccde48dc73343e532a3ac810f822b0fa40d897 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 9 Jun 2017 13:37:15 -0500 Subject: [PATCH 0136/2998] Update pytest from 3.1.1 to 3.1.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 568e0672e5..aed8da262b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.1.1 # Updated from 3.0.4 +pytest==3.1.2 # Updated from 3.0.4 pytest-rerunfailures==2.1.0 # Updated from 2.0.1 From aff094e01a4b1529427438a73077571615bdb677 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Jun 2017 18:07:19 -0500 Subject: [PATCH 0137/2998] Update alagitpull from 0.0.9 to 0.0.10 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 1b8296282d..343004366e 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -alagitpull==0.0.9 +alagitpull==0.0.10 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From ee93abac0a17e5509fa9ad47608d3c67c70b74f2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 13 Jun 2017 02:07:20 -0500 Subject: [PATCH 0138/2998] Update alagitpull from 0.0.10 to 0.0.11 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 343004366e..64882a6c13 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -alagitpull==0.0.10 +alagitpull==0.0.11 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From d83630ebde0fde04965bf24d2cbbaf7b23bb336d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 18 Jun 2017 15:10:54 -0500 Subject: [PATCH 0139/2998] tao of tmux: update adominition and lists --- doc/about_tmux.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 4b909bd8db..0df1c5062d 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -253,7 +253,8 @@ Start a new session That's all it takes to launch yourself into a tmux session. -.. tip:: Common pitfall +.. admonition:: Common pitfall + :class: note Running ``$ tmux list-sessions`` or any other command for listing tmux entities (such as ``$ tmux list-windows`` or ``$ tmux list-panes``). @@ -261,10 +262,10 @@ That's all it takes to launch yourself into a tmux session. This could be because: - - tmux server has killed its' last session, killing the server. - - tmux server has encountered a crash. (tmux is highly stable, - this will rarely happen) - - tmux has not be launched yet at all. + - tmux server has killed its' last session, killing the server. + - tmux server has encountered a crash. (tmux is highly stable, + this will rarely happen) + - tmux has not be launched yet at all. .. _Prefix key: From 008069f3cb662a82bc4771ece9b6193f3e7b2cc3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 20 Jun 2017 06:46:43 -0500 Subject: [PATCH 0140/2998] tao of tmux: use lowercase t --- doc/about_tmux.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 0df1c5062d..9fe7433f57 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -30,7 +30,7 @@ the text dimension. Inside tmux you can: - switch between multiple workspaces, like virtual desktops ============= -Thinking Tmux +Thinking tmux ============= Text-based window manager @@ -111,7 +111,6 @@ One screen can be used to edit a file, and another may be used to tmux supports as manys terminals as you want. - .. aafig:: :textual: @@ -502,7 +501,7 @@ Short cut Action =================== ==================================================== ================ -Configuring Tmux +Configuring tmux ================ Tmux can be configured via a configuration at ``~/.tmux.conf``. From 4abffeac10cbc94de746e008a5073d67cfe754bf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 21 Jun 2017 15:14:59 -0500 Subject: [PATCH 0141/2998] docs: updates for about page --- doc/about.rst | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/doc/about.rst b/doc/about.rst index 73163aded1..696dfd1fff 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -75,10 +75,11 @@ format [1]_. See :ref:`cli_freeze`. **JSON config** JSON config support. See :ref:`Examples`. -**ORM-based API** - Utilitizes tmux >= 1.8's unique ID's for panes, -windows and sessions to create an object relational view of the tmux -:class:`Server` and its' :class:`Session`, :class:`Window`, :class:`Pane`. -See :ref:`Internals`. +**ORM-based API** via `libtmux`_ - Utilitizes tmux >= 1.8's unique ID's for +panes, windows and sessions to create an object relational view of the tmux +:class:`~libtmux.Server` and its' :class:`~libtmux.Session`, +:class:`~libtmux.Window`, :class:`~libtmux.Pane`. +See :ref:`libtmux's internals `. **Conversion** ``$ tmuxp convert `` can convert files to and from JSON and YAML. @@ -87,6 +88,8 @@ from JSON and YAML. tweaking will probably be required - There is no substitute to a config made with love. +.. _libtmux: https://libtmux.git-pull.com + Minor tweaks ------------ @@ -103,15 +106,9 @@ Minor tweaks - ``$ tmuxp -L``, ``$ tmuxp -S`` for sockets and ``$ tmuxp -f`` for config file. -More details ------------- - -.. include:: ../README.rst - :start-after: --------------- - .. _attempt at 1.7 test: https://travis-ci.org/tony/tmuxp/jobs/12348263 .. _kaptan: https://github.com/emre/kaptan -.. _BSD-licensed: http://opensource.org/licenses/BSD-2-Clause +.. _BSD-licensed: http://opensource.org/licenses/BSD-3-Clause .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil .. _ERB: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html From b538f37180a187dca5f09729352b18def0c4205b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 22 Jun 2017 00:02:37 -0500 Subject: [PATCH 0142/2998] docs: more updates --- doc/about.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/about.rst b/doc/about.rst index 696dfd1fff..f3e6cb2487 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -77,8 +77,8 @@ format [1]_. See :ref:`cli_freeze`. **ORM-based API** via `libtmux`_ - Utilitizes tmux >= 1.8's unique ID's for panes, windows and sessions to create an object relational view of the tmux -:class:`~libtmux.Server` and its' :class:`~libtmux.Session`, -:class:`~libtmux.Window`, :class:`~libtmux.Pane`. +:class:`~libtmux.Server`, its :class:`~libtmux.Session`, +:class:`~libtmux.Window`, and :class:`~libtmux.Pane`. See :ref:`libtmux's internals `. **Conversion** ``$ tmuxp convert `` can convert files to and From cebfee3a58f780a03248f0b7cc9e9a8edff9e9b4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 23 Jun 2017 06:37:39 -0500 Subject: [PATCH 0143/2998] Update pytest-rerunfailures from 2.1.0 to 2.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index aed8da262b..778efa4f03 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.1.2 # Updated from 3.0.4 -pytest-rerunfailures==2.1.0 # Updated from 2.0.1 +pytest-rerunfailures==2.2 # Updated from 2.0.1 From 73c76a4f96d6ae9bd14eed2bc203097d33cd44d4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 24 Jun 2017 08:49:32 -0500 Subject: [PATCH 0144/2998] Update alagitpull from 0.0.11 to 0.0.12 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 64882a6c13..f1a113246a 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.2 -alagitpull==0.0.11 +alagitpull==0.0.12 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From 54d3c56c52669b1db0d16557b61902480ecd8720 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 2 Jul 2017 13:35:54 -0500 Subject: [PATCH 0145/2998] Update sphinx from 1.6.2 to 1.6.3 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index f1a113246a..cf15bca95a 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 -sphinx==1.6.2 +sphinx==1.6.3 alagitpull==0.0.12 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From e87fe2456ac27caac93ddafbd5708088121ccf5c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Jul 2017 13:16:29 -0500 Subject: [PATCH 0146/2998] README tweak --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 93ca5f8715..0feac46a30 100644 --- a/README.rst +++ b/README.rst @@ -59,7 +59,7 @@ Load multiple at once (in bg, offer to attach last): $ tmuxp load mysession ./another/project/ -`simple`_, `very elaborate`_ config examples +`simple`_ and `very elaborate`_ config examples Store configs in (*~/.tmuxp*) or include in your project as *~/.tmuxp.{yaml,json}*. See `author's tmuxp configs`_ and the From 571e6c039d87c5f7350df41d6a33f817f38c41d6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Jul 2017 13:16:50 -0500 Subject: [PATCH 0147/2998] doc header tweak --- doc/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index c111449f6e..90d78c3dbd 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -4,8 +4,8 @@ Example Configurations ====================== -Short hand / inline -------------------- +Short hand / inline style +------------------------- tmuxp has a short-hand syntax to for those who wish to keep their configs punctual. From 80677961c71373f747a8fa4fcf055f6d24ef44ae Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 4 Jul 2017 13:17:03 -0500 Subject: [PATCH 0148/2998] Update pytest from 3.1.2 to 3.1.3 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 778efa4f03..74856f43f9 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.1.2 # Updated from 3.0.4 +pytest==3.1.3 # Updated from 3.0.4 pytest-rerunfailures==2.2 # Updated from 2.0.1 From 105b2fb1c85e4afa16ed78f915d13607997130a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 4 Jul 2017 13:25:45 -0500 Subject: [PATCH 0149/2998] update alagitpull theme to 0.0.13 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index cf15bca95a..45f86da35b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.13.1 sphinx==1.6.3 -alagitpull==0.0.12 +alagitpull==0.0.13 # Updated from 0.0.12 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From 36ad5067a0f33a23a7d97abfdfa3950b1330a666 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 2 Aug 2017 01:23:10 -0500 Subject: [PATCH 0150/2998] Update pytest from 3.1.3 to 3.2.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 74856f43f9..8fbabbb147 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.1.3 # Updated from 3.0.4 +pytest==3.2.0 # Updated from 3.0.4 pytest-rerunfailures==2.2 # Updated from 2.0.1 From 2b1066afccae7a6ced27691332227d6e5b4ea923 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 3 Aug 2017 06:59:13 -0500 Subject: [PATCH 0151/2998] Update docutils from 0.13.1 to 0.14 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 45f86da35b..a6b22c2b5b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,5 +1,5 @@ -r ./base.txt -docutils==0.13.1 +docutils==0.14 sphinx==1.6.3 alagitpull==0.0.13 # Updated from 0.0.12 releases==1.3.1 # Updated from 1.2.0 From 1604d6e7c7152f4ae20bc2cadef22f3ee91fe8d1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 9 Aug 2017 23:57:26 -0500 Subject: [PATCH 0152/2998] Update pytest from 3.2.0 to 3.2.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 8fbabbb147..56ee7a06b4 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.2.0 # Updated from 3.0.4 +pytest==3.2.1 # Updated from 3.0.4 pytest-rerunfailures==2.2 # Updated from 2.0.1 From ac5676b23b9c63e930125d59cee938a07df52213 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Aug 2017 14:34:49 -0500 Subject: [PATCH 0153/2998] assure travis runs on precise to assure prior behavior --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 77f2e11968..f0f7e4f6a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: python - +dist: precise sudo: false python: - 2.7 From b4d089e03d1648b1e35fe61f0a6169963d3b182e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 09:38:56 -0500 Subject: [PATCH 0154/2998] ignore pypy failures on travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f0f7e4f6a1..82209687a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ env: matrix: allow_failures: - env: TMUX_VERSION=master + - python: pypy before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 From badc13837dbe438c8e413a40a06af635691750e1 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 19 Aug 2017 08:45:43 -0500 Subject: [PATCH 0155/2998] Update libtmux from 0.7.3 to 0.7.4 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 6a59df2331..77b32f28d0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.3 # Updated from 0.7.1 +libtmux==0.7.4 # Updated from 0.7.1 click==6.7 colorama==0.3.9 From 70ccccceb622543c9db38d70d8b05dc7af979802 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 10:27:38 -0500 Subject: [PATCH 0156/2998] fix test issue with show-buffer from 0.7.4 libtmux --- tests/test_workspacebuilder.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index a8e958614c..b9e3816833 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -164,7 +164,7 @@ def assertIsMissing(cmd, hist): p.select_pane() # Print the last-in-history command in the pane - session.cmd('send-keys', ' fc -ln -1') + session.cmd('send-keys', 'fc -ln -1') session.cmd('send-keys', 'Enter') for _ in range(10): @@ -172,7 +172,9 @@ def assertIsMissing(cmd, hist): # Get the contents of the pane session.cmd('capture-pane') - captured_pane = session.cmd('show-buffer') + # from v0.7.4 libtmux session.cmd adds target -t self.id by default + # show-buffer doesn't accept -t, use global cmd. + captured_pane = session.server.cmd('show-buffer') session.cmd('delete-buffer') # Parse the sent and last-in-history commands From 6ed3279d47f648dcfadbfe0ce5f4447baed6cc31 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 17 Aug 2017 03:07:39 -0500 Subject: [PATCH 0157/2998] Update pytest-rerunfailures from 2.2 to 3.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 56ee7a06b4..62fb7cc19b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.2.1 # Updated from 3.0.4 -pytest-rerunfailures==2.2 # Updated from 2.0.1 +pytest-rerunfailures==3.0 # Updated from 2.0.1 From 0d305fbda8aa5e3bdefbe0b92fb4a5be9d3047c3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 10:57:02 -0500 Subject: [PATCH 0158/2998] another fix for test_suppress_history and v0.7.4 --- tests/test_workspacebuilder.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index b9e3816833..da43786ef2 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -145,10 +145,10 @@ def test_suppress_history(session): builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - inHistoryPane = session.find_where( - {'window_name': 'inHistory'}).attached_pane - isMissingPane = session.find_where( - {'window_name': 'isMissing'}).attached_pane + inHistoryWindow = session.find_where( + {'window_name': 'inHistory'}) + isMissingWindow = session.find_where( + {'window_name': 'isMissing'}) def assertHistory(cmd, hist): return 'inHistory' in cmd and cmd.endswith(hist) @@ -156,26 +156,28 @@ def assertHistory(cmd, hist): def assertIsMissing(cmd, hist): return 'isMissing' in cmd and not cmd.endswith(hist) - for p, assertCase in [ - (inHistoryPane, assertHistory,), (isMissingPane, assertIsMissing,) + for w, window_name, assertCase in [ + (inHistoryWindow, 'inHistory', assertHistory,), + (isMissingWindow, 'isMissing', assertIsMissing,) ]: correct = False - p.window.select_window() + w.select_window() + p = w.attached_pane p.select_pane() # Print the last-in-history command in the pane - session.cmd('send-keys', 'fc -ln -1') - session.cmd('send-keys', 'Enter') + p.cmd('send-keys', ' fc -ln -1') + p.cmd('send-keys', 'Enter') for _ in range(10): time.sleep(0.1) - - # Get the contents of the pane - session.cmd('capture-pane') # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. + + # Get the contents of the pane + p.cmd('capture-pane') captured_pane = session.server.cmd('show-buffer') - session.cmd('delete-buffer') + session.server.cmd('delete-buffer') # Parse the sent and last-in-history commands sent_cmd = captured_pane.stdout[0].strip() @@ -184,7 +186,9 @@ def assertIsMissing(cmd, hist): if assertCase(sent_cmd, history_cmd): correct = True break - assert correct, "Unknown sent command: [%s]" % sent_cmd + assert correct, "Unknown sent command: [%s] in %s" % ( + sent_cmd, assertCase + ) def test_session_options(session): From 39b66221adaf01794063d16718e44796990362bd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 11:02:46 -0500 Subject: [PATCH 0159/2998] update intersphinx to use https --- doc/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index e53a976c69..356df05c6a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -98,8 +98,8 @@ ] intersphinx_mapping = { - 'python': ('http://docs.python.org/', None), - 'libtmux': ('http://libtmux.readthedocs.io/en/latest', None) + 'python': ('https://docs.python.org/', None), + 'libtmux': ('https://libtmux.readthedocs.io/en/latest', None) } # aafig format, try to get working with pdf From 46981ce60473dd7da5f740ad193907193b92a2d0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 11:17:48 -0500 Subject: [PATCH 0160/2998] update CHANGES for 1.3.2 --- CHANGES | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 109023ffbb..0a3a37f929 100644 --- a/CHANGES +++ b/CHANGES @@ -4,12 +4,18 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.3.2 <2017-08-20>` +- :bug:`184` - update libtmux to fix environmental variables in the + session scope +- :support:`- backported` Update libtmux to 0.7.4 +- :support:`- backported` Updates to pytest and pytest-rerunfailures + - :release:`1.3.1 <2017-05-29>` -- :bug:`252` Fix bug where loading a session with a name matching a subset +- :bug:`252 backported` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. -- :support:`-` Update libtmux to 0.7.3 -- :support:`-` Switch theme to alagitpull (alabaster subtheme) -- :support:`-` Remove unneeded doc dependency packages +- :support:`- backported` Update libtmux to 0.7.3 +- :support:`- backported` Switch theme to alagitpull (alabaster subtheme) +- :support:`- backported` Remove unneeded doc dependency packages - :release:`1.3.0 <2017-04-27>` - :feature:`239` Improve support for formatted options when freezing and From b810d925323155592ab5c1cd11f17f9ce4561669 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Aug 2017 11:18:02 -0500 Subject: [PATCH 0161/2998] tag v1.3.2 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8d8d8f0023..5188499ecd 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.1' +__version__ = '1.3.2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From b741504621ef51fa9f44b46a0e2f15854a1b8e6f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 29 Aug 2017 02:23:01 -0500 Subject: [PATCH 0162/2998] Update pytest-rerunfailures from 3.0 to 3.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 62fb7cc19b..82203029e0 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.2.1 # Updated from 3.0.4 -pytest-rerunfailures==3.0 # Updated from 2.0.1 +pytest-rerunfailures==3.1 # Updated from 2.0.1 From 2ad6dbc92bc636f83b84f2581974347a31cce86f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 Sep 2017 09:49:32 -0500 Subject: [PATCH 0163/2998] update pypy versions in travis --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 82209687a5..608db7ef63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,8 @@ python: - 3.4 - 3.5 - 3.6 - - pypy - - pypy3.3-5.2-alpha1 + - pypy3.5-5.8.0 + - pypy-5.6.0 env: - TMUX_VERSION=master - TMUX_VERSION=2.4 @@ -21,7 +21,6 @@ env: matrix: allow_failures: - env: TMUX_VERSION=master - - python: pypy before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 From 479a5d0631ec4db939334f7aa0583da47b18762e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 26 Sep 2017 05:10:44 -0500 Subject: [PATCH 0164/2998] Update sphinx from 1.6.3 to 1.6.4 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index a6b22c2b5b..b8e8a7706d 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.6.3 +sphinx==1.6.4 alagitpull==0.0.13 # Updated from 0.0.12 releases==1.3.1 # Updated from 1.2.0 aafigure==0.6 From c0208e7015a563523e3e4000c18c6c11a6bc877e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 5 Oct 2017 02:00:59 -0500 Subject: [PATCH 0165/2998] Update pytest from 3.2.1 to 3.2.3 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 82203029e0..0d2c8ec392 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.2.1 # Updated from 3.0.4 +pytest==3.2.3 # Updated from 3.0.4 pytest-rerunfailures==3.1 # Updated from 2.0.1 From 1bd953ebf24626a2285480b8db54323f42b5a385 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Oct 2017 02:12:52 -0500 Subject: [PATCH 0166/2998] update libtmux to 0.7.5 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 77b32f28d0..66992c8720 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.4 # Updated from 0.7.1 +libtmux==0.7.5 # Updated from 0.7.4 click==6.7 colorama==0.3.9 From 2ffc2365b05a7389d4a983dbeb24172305f16e78 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Oct 2017 02:13:50 -0500 Subject: [PATCH 0167/2998] update CHANGES --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 0a3a37f929..47c75b3019 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.3.3 <2017-10-07>` +- :support:`- backported` Update libtmux to 0.7.5 for tmux 2.6 hotfix + - :release:`1.3.2 <2017-08-20>` - :bug:`184` - update libtmux to fix environmental variables in the session scope From f6e34c134022a930c6914cb25bce6a1f3c32c317 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Oct 2017 02:15:14 -0500 Subject: [PATCH 0168/2998] update LICENSE for 2017 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 518a264e33..11c0169026 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2014 Tony Narlock and contributors (see AUTHORS file). +Copyright (c) 2013-2017 Tony Narlock and contributors (see AUTHORS file). All rights reserved. Redistribution and use in source and binary forms, with or without From e764525c7f9c0f427d0fe3a9c9f89e2a1fc1c2b0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Oct 2017 02:15:41 -0500 Subject: [PATCH 0169/2998] tag v1.3.3 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 5188499ecd..b128660e2c 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.2' +__version__ = '1.3.3' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 84ca9a46fd9d883b3dc2304ecfb8efc67ddbd734 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Oct 2017 02:16:21 -0500 Subject: [PATCH 0170/2998] update travis for supporting tmux 2.5 and 2.6 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 608db7ef63..b883ac8bf4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ python: - pypy-5.6.0 env: - TMUX_VERSION=master + - TMUX_VERSION=2.6 + - TMUX_VERSION=2.5 - TMUX_VERSION=2.4 - TMUX_VERSION=2.3 - TMUX_VERSION=2.2 From 16d6bba9d25596847f52e1d6f782a270c0ec1e49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 9 Oct 2017 18:41:25 -0500 Subject: [PATCH 0171/2998] update README for supported versions --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0feac46a30..877e548ac0 100644 --- a/README.rst +++ b/README.rst @@ -137,7 +137,7 @@ Project details --------------- ============== ========================================================== -tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4 +tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 python support 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tony/tmuxp From 224a87fa365054e68ac9600e96c4b7155517ccf0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 12 Oct 2017 05:23:33 -0500 Subject: [PATCH 0172/2998] behavioral update: before_script respect start_directory to cwd --- tmuxp/util.py | 5 +++-- tmuxp/workspacebuilder.py | 11 ++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/tmuxp/util.py b/tmuxp/util.py index cb75b40158..18c8a084c4 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -22,13 +22,14 @@ PY2 = sys.version_info[0] == 2 -def run_before_script(script_file): +def run_before_script(script_file, cwd=None): """Function to wrap try/except for subprocess.check_call().""" try: proc = subprocess.Popen( shlex.split(str(script_file)), stderr=subprocess.PIPE, - stdout=subprocess.PIPE + stdout=subprocess.PIPE, + cwd=cwd ) for line in iter(proc.stdout.readline, b''): sys.stdout.write(console_to_str(line)) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 4868cf127f..c64c7c4339 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -157,7 +157,16 @@ def build(self, session=None): if 'before_script' in self.sconf: try: - run_before_script(self.sconf['before_script']) + cwd = None + + # we want to run the before_script file cwd'd from the + # session start directory, if it exists. + if 'start_directory' in self.sconf: + cwd = self.sconf['start_directory'] + run_before_script( + self.sconf['before_script'], + cwd=cwd + ) except Exception as e: self.session.kill_session() raise e From 9a25bb77443e80fd08f6880a71531dd9c6dbf7d0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 12 Oct 2017 05:24:48 -0500 Subject: [PATCH 0173/2998] update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 47c75b3019..0f871cb8c0 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`- backported` `before_script` now respects `start_directory` + in the session root. This makes it easier to run things like `pipenv + install` as a `before_script`. + - :release:`1.3.3 <2017-10-07>` - :support:`- backported` Update libtmux to 0.7.5 for tmux 2.6 hotfix From 67c5806d1a0a41de6401a3999d44ad5cc1f5779e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 12 Oct 2017 05:42:49 -0500 Subject: [PATCH 0174/2998] add some code examples --- doc/examples.rst | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/doc/examples.rst b/doc/examples.rst index 90d78c3dbd..c6a84b2e27 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -426,6 +426,49 @@ Edit this page. You can use ``start_directory: ./`` to make the directories relative to the config file / project root. +Bonus: pipenv auto-bootstrapping +-------------------------------- + +.. versionadded:: 1.3.4 + + ``before_script`` CWD's into the root (session)-level + ``start_directory``. + +If you use `pipenv`_, you can use a script like this to ensure your +packages are installed: + +.. code-block:: yaml + + # assuming your .tmuxp.yaml is in your project root directory + session_name: my pipenv project + start_directory: ./ + before_script: pipenv install --dev # ensure dev deps install + windows: + - window_name: django project + focus: true + panes: + - blank + - pipenv run ./manage.py runserver + +You can also source yourself into the virtual environment using ``shell_command_before``: + +.. code-block:: yaml + + # assuming your .tmuxp.yaml is in your project root directory + session_name: my pipenv project + start_directory: ./ + before_script: pipenv install --dev # ensure dev deps install + shell_command_before: + - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' + windows: + - window_name: django project + focus: true + panes: + - blank + - ./manage.py runserver + +.. _pipenv: https://docs.pipenv.org/ + Kung fu ------- From 1a46d82b6cf9159a715d3b33c37b1df6a6afe657 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 12 Oct 2017 05:43:50 -0500 Subject: [PATCH 0175/2998] bump tmuxp to 1.3.4 --- CHANGES | 3 ++- tmuxp/__about__.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 0f871cb8c0..3d23fb9bf8 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,8 @@ Changelog Here you can find the recent changes to tmuxp -- :support:`- backported` `before_script` now respects `start_directory` +- :release:`1.3.4 <2017-10-12>` +- :feature:`- backported` `before_script` now respects `start_directory` in the session root. This makes it easier to run things like `pipenv install` as a `before_script`. diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index b128660e2c..2a5b34917c 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.3' +__version__ = '1.3.4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 97455c04e0bdc76a63fef4dca8fe3544e7b1ceda Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 12 Oct 2017 09:11:26 -0500 Subject: [PATCH 0176/2998] add --skip-lock to pipenv tmuxp example --- doc/examples.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index c6a84b2e27..04941b2998 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -442,7 +442,7 @@ packages are installed: # assuming your .tmuxp.yaml is in your project root directory session_name: my pipenv project start_directory: ./ - before_script: pipenv install --dev # ensure dev deps install + before_script: pipenv install --dev --skip-lock # ensure dev deps install windows: - window_name: django project focus: true @@ -457,7 +457,7 @@ You can also source yourself into the virtual environment using ``shell_command_ # assuming your .tmuxp.yaml is in your project root directory session_name: my pipenv project start_directory: ./ - before_script: pipenv install --dev # ensure dev deps install + before_script: pipenv install --dev --skip-lock # ensure dev deps install shell_command_before: - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' windows: From c6dd4ff96b4b45eb8c5067b7cea2b068693a1af6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 18 Oct 2017 20:16:05 -0500 Subject: [PATCH 0177/2998] convert to Pipfile --- .tmuxp.yaml | 9 +-- Pipfile | 18 ++++++ bootstrap_env.py | 136 ---------------------------------------------- doc/_ext/aafig.py | 16 +++--- 4 files changed, 30 insertions(+), 149 deletions(-) create mode 100644 Pipfile delete mode 100755 bootstrap_env.py diff --git a/.tmuxp.yaml b/.tmuxp.yaml index 255b5da85c..cb44faefeb 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -1,26 +1,23 @@ session_name: tmuxp start_directory: ./ # load session relative to config location (project root). -before_script: ./bootstrap_env.py # ./ to load relative to project root. +before_script: pipenv install --dev --skip-lock +shell_command_before: + - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' windows: - window_name: tmuxp focus: True layout: main-horizontal options: main-pane-height: 35 - shell_command_before: - - '[ -d .venv -a -f .venv/bin/activate ] && source .venv/bin/activate' panes: - focus: true - pane - make watch_test - - window_name: docs layout: main-horizontal options: main-pane-height: 35 start_directory: doc/ - shell_command_before: - - '[ -d ../.venv -a -f ../.venv/bin/activate ] && source ../.venv/bin/activate' panes: - focus: true - pane diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000000..e065cf29fd --- /dev/null +++ b/Pipfile @@ -0,0 +1,18 @@ +[[source]] +url = "https://pypi.python.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +kaptan = ">=0.5.7" +libtmux = "==0.7.5" +click = "==6.7" +colorama = "==0.3.9" +docutils = "==0.14" +Sphinx = ">=1.5.0" +alagitpull = "==0.0.13" +releases = "==1.3.1" +aafigure = "==0.6" \ No newline at end of file diff --git a/bootstrap_env.py b/bootstrap_env.py deleted file mode 100755 index 6e09e2a08b..0000000000 --- a/bootstrap_env.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python - -from __future__ import absolute_import, print_function, unicode_literals - -import os -import subprocess -import sys - - -def warning(*objs): - print("WARNING: ", *objs, file=sys.stderr) - - -def fail(message): - sys.exit("Error: {message}".format(message=message)) - - -def has_module(module_name): - try: - import imp - imp.find_module(module_name) - del imp - return True - except ImportError: - return False - - -def which(exe=None, throw=True): - """Return path of bin. Python clone of /usr/bin/which. - - from salt.util - https://www.github.com/saltstack/salt - license apache - - :param exe: Application to search PATHs for. - :type exe: str - :param throw: Raise ``Exception`` if not found in paths - :type throw: bool - :rtype: str - - """ - if exe: - if os.access(exe, os.X_OK): - return exe - - # default path based on busybox's default - default_path = '/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin' - search_path = os.environ.get('PATH', default_path) - - for path in search_path.split(os.pathsep): - full_path = os.path.join(path, exe) - if os.access(full_path, os.X_OK): - return full_path - - message = ( - '{0!r} could not be found in the following search ' - 'path: {1!r}'.format( - exe, search_path - ) - ) - - if throw: - raise Exception(message) - else: - print(message) - return None - - -project_dir = os.path.dirname(os.path.realpath(__file__)) -env_dir = os.path.join(project_dir, '.venv') -pip_bin = os.path.join(env_dir, 'bin', 'pip') -python_bin = os.path.join(env_dir, 'bin', 'python') -virtualenv_bin = which('virtualenv', throw=False) -virtualenv_exists = os.path.exists(env_dir) and os.path.isfile(python_bin) -sphinx_requirements_filepath = os.path.join( - project_dir, 'requirements', 'doc.txt') -test_requirements_filepath = os.path.join( - project_dir, 'requirements', 'test.txt') - - -try: - import virtualenv # NOQA -except ImportError: - message = ( - 'Virtualenv is required for this bootstrap to run.\n' - 'Install virtualenv via:\n' - '\t$ pip install --user virtualenv' - ) - fail(message) - - -try: - import pip # NOQA -except ImportError: - message = ( - 'pip is required for this bootstrap to run.\n' - 'Find instructions on how to install at: %s' % - 'http://pip.readthedocs.io/en/latest/installing.html' - ) - fail(message) - - -def main(): - if not which('entr', throw=False): - message = ( - '\nentr(1) is used in this app as a cross platform file watcher.' - 'You can install it via your package manager on most POSIX ' - 'systems. See the site at http://entrproject.org/\n' - ) - print(message) - - if not virtualenv_exists: - virtualenv_bin = which('virtualenv', throw=False) - - subprocess.check_call( - [virtualenv_bin, env_dir] - ) - - subprocess.check_call( - [pip_bin, 'install', '-e', project_dir] - ) - - if not has_module('pytest'): - subprocess.check_call( - [pip_bin, 'install', '-r', test_requirements_filepath] - ) - - if not os.path.isfile(os.path.join(env_dir, 'bin', 'sphinx-quickstart')): - subprocess.check_call( - [pip_bin, 'install', '-r', sphinx_requirements_filepath] - ) - - if os.path.exists(os.path.join(env_dir, 'build')): - os.removedirs(os.path.join(env_dir, 'build')) - - -if __name__ == '__main__': - main() diff --git a/doc/_ext/aafig.py b/doc/_ext/aafig.py index 17cd661d14..5ca510102b 100644 --- a/doc/_ext/aafig.py +++ b/doc/_ext/aafig.py @@ -12,6 +12,8 @@ :license: BOLA, see LICENSE for details """ +from __future__ import unicode_literals + import posixpath from os import path @@ -46,8 +48,8 @@ def get_basename(text, options, prefix='aafig'): options = options.copy() if 'format' in options: del options['format'] - hashkey = text.encode('utf-8') + str(options) - id = sha(hashkey).hexdigest() + hashkey = text + str(options) + id = sha(hashkey.encode('utf-8')).hexdigest() return '%s-%s' % (prefix, id) @@ -75,7 +77,7 @@ class AafigDirective(images.Image): def run(self): aafig_options = dict() - own_options_keys = self.own_option_spec.keys() + ['scale'] + own_options_keys = [self.own_option_spec.keys()] + ['scale'] for (k, v) in self.options.items(): if k in own_options_keys: # convert flags to booleans @@ -123,7 +125,7 @@ def render_aafig_images(app, doctree): continue try: fname, outfn, id, extra = render_aafigure(app, text, options) - except AafigError, exc: + except AafigError as exc: app.builder.warn('aafigure error: ' + str(exc)) img.replace_self(nodes.literal_block(text, text)) continue @@ -171,7 +173,7 @@ def render_aafigure(app, text, options): f = None try: try: - f = file(metadata_fname, 'r') + f = open(metadata_fname, 'r') extra = f.read() except: raise AafigError() @@ -187,13 +189,13 @@ def render_aafigure(app, text, options): try: (visitor, output) = aafigure.render(text, outfn, options) output.close() - except aafigure.UnsupportedFormatError, e: + except aafigure.UnsupportedFormatError as e: raise AafigError(str(e)) extra = None if options['format'].lower() == 'svg': extra = visitor.get_size_attrs() - f = file(metadata_fname, 'w') + f = open(metadata_fname, 'w') f.write(extra) f.close() From 1456a7b91779464bfe3a2f32dbbf844c837203cb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 19 Oct 2017 10:00:00 -0500 Subject: [PATCH 0178/2998] fix doc Makefile --- doc/Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 29857d4725..8b553a7897 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,6 @@ # Makefile for Sphinx documentation # +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8031 @@ -158,17 +159,15 @@ checkbuild: rm -rf $(BUILDDIR) $(SPHINXBUILD) -n -q ./ $(BUILDDIR) -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null - watch: if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) html; else $(MAKE) html; fi serve: - @echo '=================================================' + @echo '==============================================================' @echo @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' @echo - @echo '=================================================' + @echo '==============================================================' @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi serve_py2: From 165e35e5a6dbd8914ad0e80766e28256f7bed5c6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 19 Oct 2017 10:00:14 -0500 Subject: [PATCH 0179/2998] add py.test to Pipfile dev requirements --- Pipfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index e065cf29fd..816bf3ec78 100644 --- a/Pipfile +++ b/Pipfile @@ -15,4 +15,6 @@ docutils = "==0.14" Sphinx = ">=1.5.0" alagitpull = "==0.0.13" releases = "==1.3.1" -aafigure = "==0.6" \ No newline at end of file +aafigure = "==0.6" +pytest = "==3.2.3" +"pytest-rerunfailures" = "==3.1" \ No newline at end of file From 9ada9b7c0582e5469884e61c809fbe691ae51c9b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Oct 2017 05:56:14 -0500 Subject: [PATCH 0180/2998] update sphinx and releases --- Pipfile | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index 816bf3ec78..44b94b1a28 100644 --- a/Pipfile +++ b/Pipfile @@ -5,6 +5,15 @@ name = "pypi" [packages] + + + + + + + + + [dev-packages] kaptan = ">=0.5.7" @@ -12,9 +21,9 @@ libtmux = "==0.7.5" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" -Sphinx = ">=1.5.0" alagitpull = "==0.0.13" -releases = "==1.3.1" aafigure = "==0.6" pytest = "==3.2.3" -"pytest-rerunfailures" = "==3.1" \ No newline at end of file +"pytest-rerunfailures" = "==3.1" +releases = "==1.4.0" +sphinx = "*" \ No newline at end of file From 6aca36dd4b6fc8750df35363fb9de60609fc9f81 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Oct 2017 05:56:44 -0500 Subject: [PATCH 0181/2998] update releases to 1.4.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index b8e8a7706d..8502760f2c 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,5 +2,5 @@ docutils==0.14 sphinx==1.6.4 alagitpull==0.0.13 # Updated from 0.0.12 -releases==1.3.1 # Updated from 1.2.0 +releases==1.4.0 # Updated from 1.3.1 aafigure==0.6 From 6e19824e29f2a4455521371e7bca0c02527e9812 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 23 Oct 2017 07:52:26 -0500 Subject: [PATCH 0182/2998] Update sphinx from 1.6.4 to 1.6.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 8502760f2c..74e2db5ff8 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.6.4 +sphinx==1.6.5 alagitpull==0.0.13 # Updated from 0.0.12 releases==1.4.0 # Updated from 1.3.1 aafigure==0.6 From c4d25b8f2416bc788e12a0dcf48fc25fa479684a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 11:33:12 -0600 Subject: [PATCH 0183/2998] use a buffer name with capture pane test --- tests/test_workspacebuilder.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index da43786ef2..89386cd7cc 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -160,6 +160,7 @@ def assertIsMissing(cmd, hist): (inHistoryWindow, 'inHistory', assertHistory,), (isMissingWindow, 'isMissing', assertIsMissing,) ]: + assert w.name == window_name correct = False w.select_window() p = w.attached_pane @@ -169,15 +170,19 @@ def assertIsMissing(cmd, hist): p.cmd('send-keys', ' fc -ln -1') p.cmd('send-keys', 'Enter') + buffer_name = 'test' for _ in range(10): time.sleep(0.1) # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. # Get the contents of the pane - p.cmd('capture-pane') - captured_pane = session.server.cmd('show-buffer') - session.server.cmd('delete-buffer') + p.cmd('capture-pane', '-b', buffer_name) + + captured_pane = session.server.cmd( + 'show-buffer', '-b', buffer_name + ) + session.server.cmd('delete-buffer', '-b', buffer_name) # Parse the sent and last-in-history commands sent_cmd = captured_pane.stdout[0].strip() From b34839e9f603122fcb2c1bf60dfd438b4ecfc18b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 11:38:05 -0600 Subject: [PATCH 0184/2998] skip test_suppress_history for now, see #310 --- tests/test_workspacebuilder.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 89386cd7cc..c78bd9aa4e 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -134,7 +134,12 @@ def test_focus_pane_index(session): assert p.current_path == pane_path -@pytest.mark.flaky(reruns=5) +@pytest.mark.skip( + reason=''' +Test needs to be rewritten, assertion not reliable across platforms +and CI. See https://github.com/tony/tmuxp/issues/310. + '''.strip() +) def test_suppress_history(session): yaml_config = loadfixture("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler='yaml') From 1925ab90d2f4b008992d77f59ee8cfb37fb1a4fe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 11:39:33 -0600 Subject: [PATCH 0185/2998] pep8 test_workspacebuilder --- tests/test_workspacebuilder.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index c78bd9aa4e..97ea40e955 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -310,20 +310,22 @@ def assert_last_line(p, s): return correct for i, pane in enumerate(session.attached_window.panes): - assert assert_last_line(pane, str(i)), \ - "Initial command did not execute properly/" + str(i) + assert assert_last_line(pane, str(i)), ( + "Initial command did not execute properly/" + str(i) + ) pane.cmd('send-keys', 'Up') # Will repeat echo pane.enter() # in each iteration assert assert_last_line(pane, str(i)), ( - "Repeated command did not execute properly/" + str(i) + "Repeated command did not execute properly/" + str(i) ) session.cmd('send-keys', ' echo moo') session.cmd('send-keys', 'Enter') for pane in session.attached_window.panes: - assert assert_last_line(pane, 'moo'), \ - "Synchronized command did not execute properly" + assert assert_last_line(pane, 'moo'), ( + "Synchronized command did not execute properly" + ) def test_window_shell(session): From df7e74e69e73a6e4e52bf4f627581d68300766b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 11:45:41 -0600 Subject: [PATCH 0186/2998] flake8 --- tmuxp/workspacebuilder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index c64c7c4339..1b52a169f7 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -323,7 +323,10 @@ def get_pane_start_directory(): Applies window configurations relevant after window and pane creation. """ def config_after_window(self, w, wconf): - if 'options_after' in wconf and isinstance(wconf['options_after'], dict): + if ( + 'options_after' in wconf and + isinstance(wconf['options_after'], dict) + ): for key, val in wconf['options_after'].items(): w.set_window_option(key, val) From acde0f09a24864404a336de7ac36740b9db66599 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 13:38:15 -0600 Subject: [PATCH 0187/2998] Move $HOME/tmux/bin before other travis paths it seems travis includes tmux now (1.6), we want our tmux to have higher precedence. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b883ac8bf4..54638cce38 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ before_script: - git checkout $TMUX_VERSION - sh autogen.sh - ./configure --prefix=$HOME/tmux && make && make install - - export PATH=$PATH:$HOME/tmux/bin + - export PATH=$HOME/tmux/bin:$PATH - cd .. - tmux -V script: coverage run --source=tmuxp setup.py test From 1624abe32ae1fca3d6cd1a86d2bc0fa0c51c6c54 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 14:53:59 -0600 Subject: [PATCH 0188/2998] attempt at fixing #309 layout issues with tmux 2.6 even after setting -x and -y with new-session, select-layout won't take effect. However, it is necessary in 2.6 to get pane creation in detached mode to work. the only way found for tmux select-layout to take effect and prior behavior to have viewed the window you are running "select-layout" for in the client. a solution has been devised to connect the client to the session, then run select-layout on each window in the session. However, it's still not enough to load the session, it seems the window must be selected by the client at least once for the select-layout to take effect. so a hook against the session is created for the session that selects each window, runs select layout at the -t target for the window id. and after that, the hook is neatly unset when that's finished. --- tmuxp/cli.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3b942354fb..c6d18edc35 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -14,7 +14,7 @@ import click import kaptan from click.exceptions import FileError -from libtmux.common import has_minimum_version, which +from libtmux.common import has_minimum_version, which, has_gte_version from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server @@ -278,7 +278,48 @@ def reattach(session): sys.exit('Session created in detached state.') if not detached: + + if has_gte_version('2.6'): + # tmuxp issue: https://github.com/tony/tmuxp/issues/309 + # tmux issue: https://github.com/tmux/tmux/issues/1106 + # + # tmux now requires that the window be viewed with the client + # before select-layout adjustments can be meaningful + # + # To handle this, let's create a temporary hook for this + # session to iterage and run select-layout on all windows + # after client attaches. + cmd = [ + 'set-hook', + '-t', builder.session.id, + 'client-attached' + ] + hook_cmd = [] + for window in builder.session.windows: + # unfortunately, select-layout won't work unless + # we've literally selected the window at least once + # with the client + hook_cmd.append('selectw -t {}'.format(window.id)) + hook_cmd.append('selectl -t {}'.format(window.id)) + hook_cmd.append('selectw -p'.format(window.id)) + + # unset the hook immediately after executing + hook_cmd.append( + 'set-hook -u -t {target_session} client-attached'.format( + target_session=builder.session.id + ) + ) + + # join the hook's commands with semicolons + hook_cmd = '{}'.format('; '.join(hook_cmd)) + + # append the hook command + cmd.append(hook_cmd) + + # create the hook + builder.session.cmd(*cmd) builder.session.attach_session() + except exc.TmuxpException as e: import traceback From 6e08e0396909823a5b5c62a5575d79025f0d47cf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 15:50:45 -0600 Subject: [PATCH 0189/2998] Remove -t from selectl in hook Per the feedback from: - https://github.com/tony/tmuxp/issues/309#issuecomment-343298726 - https://github.com/tony/tmuxp/pull/312#issuecomment-343299428 and verified by me with: - https://github.com/tony/tmuxp/issues/309#issuecomment-343300975 main-pane-width/height wasn't being respected when using targets with selectl. --- tmuxp/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index c6d18edc35..6e798d3052 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -300,7 +300,8 @@ def reattach(session): # we've literally selected the window at least once # with the client hook_cmd.append('selectw -t {}'.format(window.id)) - hook_cmd.append('selectl -t {}'.format(window.id)) + # edit: removed -t, or else it won't respect main-pane-w/h + hook_cmd.append('selectl'.format(window.id)) hook_cmd.append('selectw -p'.format(window.id)) # unset the hook immediately after executing From 89b8d6ca55a0dfeb23c1f512c97ac05cca8ae947 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 21:43:13 -0600 Subject: [PATCH 0190/2998] add dev requirements --- requirements/dev.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 requirements/dev.txt diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 0000000000..1b3b15f981 --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,3 @@ +isort==4.2.15 +flake8==3.5.0 +vulture==0.26 From d37f62b69840282a557833bb76daff87fc1cc6f5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 9 Nov 2017 22:51:43 -0600 Subject: [PATCH 0191/2998] run hooks regardless of detached mode --- tmuxp/cli.py | 76 ++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 6e798d3052..d42620c936 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -277,48 +277,48 @@ def reattach(session): else: sys.exit('Session created in detached state.') - if not detached: - - if has_gte_version('2.6'): - # tmuxp issue: https://github.com/tony/tmuxp/issues/309 - # tmux issue: https://github.com/tmux/tmux/issues/1106 - # - # tmux now requires that the window be viewed with the client - # before select-layout adjustments can be meaningful - # - # To handle this, let's create a temporary hook for this - # session to iterage and run select-layout on all windows - # after client attaches. - cmd = [ - 'set-hook', - '-t', builder.session.id, - 'client-attached' - ] - hook_cmd = [] - for window in builder.session.windows: - # unfortunately, select-layout won't work unless - # we've literally selected the window at least once - # with the client - hook_cmd.append('selectw -t {}'.format(window.id)) - # edit: removed -t, or else it won't respect main-pane-w/h - hook_cmd.append('selectl'.format(window.id)) - hook_cmd.append('selectw -p'.format(window.id)) - - # unset the hook immediately after executing - hook_cmd.append( - 'set-hook -u -t {target_session} client-attached'.format( - target_session=builder.session.id - ) + if has_gte_version('2.6'): + # tmuxp issue: https://github.com/tony/tmuxp/issues/309 + # tmux issue: https://github.com/tmux/tmux/issues/1106 + # + # tmux now requires that the window be viewed with the client + # before select-layout adjustments can be meaningful + # + # To handle this, let's create a temporary hook for this + # session to iterage and run select-layout on all windows + # after client attaches. + cmd = [ + 'set-hook', + '-t', builder.session.id, + 'client-attached' + ] + hook_cmd = [] + for window in builder.session.windows: + # unfortunately, select-layout won't work unless + # we've literally selected the window at least once + # with the client + hook_cmd.append('selectw -t {}'.format(window.id)) + # edit: removed -t, or else it won't respect main-pane-w/h + hook_cmd.append('selectl'.format(window.id)) + hook_cmd.append('selectw -p'.format(window.id)) + + # unset the hook immediately after executing + hook_cmd.append( + 'set-hook -u -t {target_session} client-attached'.format( + target_session=builder.session.id ) + ) + + # join the hook's commands with semicolons + hook_cmd = '{}'.format('; '.join(hook_cmd)) - # join the hook's commands with semicolons - hook_cmd = '{}'.format('; '.join(hook_cmd)) + # append the hook command + cmd.append(hook_cmd) - # append the hook command - cmd.append(hook_cmd) + # create the hook + builder.session.cmd(*cmd) - # create the hook - builder.session.cmd(*cmd) + if not detached: builder.session.attach_session() except exc.TmuxpException as e: From c2c8e7c571a9b39f006406b1d2e2a27e2ac44d7e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Nov 2017 07:22:38 -0600 Subject: [PATCH 0192/2998] split layout hook off into function, handle session scenarios related: https://github.com/tony/tmuxp/pull/312 --- tmuxp/cli.py | 120 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 40 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index d42620c936..bea820cb8c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -63,6 +63,68 @@ def func(value): return func +def set_layout_hook(session, hook_name): + """Set layout hooks to normalize layout. + + References: + + - tmuxp issue: https://github.com/tony/tmuxp/issues/309 + - tmux issue: https://github.com/tmux/tmux/issues/1106 + + tmux 2.6+ requires that the window be viewed with the client before + select-layout adjustments can take effect. + + To handle this, this function creates temporary hook for this session to + iterate through all windows and select the layout. + + In order for layout changes to take effect, a client must at the very + least be attached to the window (not just the session). + + hook_name is provided to allow this to set to multiple scenarios, such + as 'client-attached' (which the user attaches the session). You may + also want 'after-switch-client' for cases where the user loads tmuxp + sessions inside tmux since tmuxp offers to switch for them. + + Also, the hooks are set immediately unbind after they're invoked via -u. + + :param session: session to bind hook to + :type session: :class:`libtmux.session.Session` + :param hook_name: hook name to bind to, e.g. 'client-attached' + :type hook_name: str + """ + cmd = [ + 'set-hook', + '-t', session.id, + hook_name + ] + hook_cmd = [] + for window in session.windows: + # unfortunately, select-layout won't work unless + # we've literally selected the window at least once + # with the client + hook_cmd.append('selectw -t {}'.format(window.id)) + # edit: removed -t, or else it won't respect main-pane-w/h + hook_cmd.append('selectl'.format(window.id)) + hook_cmd.append('selectw -p'.format(window.id)) + + # unset the hook immediately after executing + hook_cmd.append( + 'set-hook -u -t {target_session} {hook_name}'.format( + target_session=session.id, + hook_name=hook_name + ) + ) + + # join the hook's commands with semicolons + hook_cmd = '{}'.format('; '.join(hook_cmd)) + + # append the hook command + cmd.append(hook_cmd) + + # create the hook + session.cmd(*cmd) + + def is_pure_name(path): """Return True if path is a name and not a file path.""" return ( @@ -265,58 +327,36 @@ def reattach(session): click.style(config_file, fg='blue', bold=True)) builder.build() - if 'TMUX' in os.environ: + if 'TMUX' in os.environ: # tmuxp ran from inside tmux if not detached and (answer_yes or click.confirm( 'Already inside TMUX, switch to session?' )): tmux_env = os.environ.pop('TMUX') + + if has_gte_version('2.6'): + # if using -d from inside tmux session + switching inside + # https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132 + set_layout_hook(builder.session, 'client-session-changed') + builder.session.switch_client() os.environ['TMUX'] = tmux_env return builder.session - else: - sys.exit('Session created in detached state.') + else: # session created in the background, from within tmux + if has_gte_version('2.6'): # prepare for both cases + set_layout_hook(builder.session, 'client-attached') + set_layout_hook(builder.session, 'client-session-changed') - if has_gte_version('2.6'): - # tmuxp issue: https://github.com/tony/tmuxp/issues/309 - # tmux issue: https://github.com/tmux/tmux/issues/1106 - # - # tmux now requires that the window be viewed with the client - # before select-layout adjustments can be meaningful - # - # To handle this, let's create a temporary hook for this - # session to iterage and run select-layout on all windows - # after client attaches. - cmd = [ - 'set-hook', - '-t', builder.session.id, - 'client-attached' - ] - hook_cmd = [] - for window in builder.session.windows: - # unfortunately, select-layout won't work unless - # we've literally selected the window at least once - # with the client - hook_cmd.append('selectw -t {}'.format(window.id)) - # edit: removed -t, or else it won't respect main-pane-w/h - hook_cmd.append('selectl'.format(window.id)) - hook_cmd.append('selectw -p'.format(window.id)) - - # unset the hook immediately after executing - hook_cmd.append( - 'set-hook -u -t {target_session} client-attached'.format( - target_session=builder.session.id - ) - ) + sys.exit('Session created in detached state.') - # join the hook's commands with semicolons - hook_cmd = '{}'.format('; '.join(hook_cmd)) + # below: tmuxp ran outside of tmux - # append the hook command - cmd.append(hook_cmd) + if has_gte_version('2.6'): + # if attaching for first time + set_layout_hook(builder.session, 'client-attached') - # create the hook - builder.session.cmd(*cmd) + # for cases where user switches client for first time + set_layout_hook(builder.session, 'client-session-changed') if not detached: builder.session.attach_session() From b01982c3d1789d3ca035620e230104afd368ee5e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Nov 2017 07:25:41 -0600 Subject: [PATCH 0193/2998] bump libtmux to 0.7.7 this has the fix for -x/-y when tmuxp is used inside tmux related: https://github.com/tony/tmuxp/pull/312 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 66992c8720..0412e3f064 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.5 # Updated from 0.7.4 +libtmux==0.7.7 # Updated from 0.7.6 click==6.7 colorama==0.3.9 From 294f956ddb1730e1f4cf8c377a625f5d1979d3cd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Nov 2017 07:29:43 -0600 Subject: [PATCH 0194/2998] update CHANGES --- CHANGES | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES b/CHANGES index 3d23fb9bf8..8b4407a72d 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,18 @@ Changelog Here you can find the recent changes to tmuxp +- :feature:`312` Support for tmux 2.6 layout setting (via hooks) in the + following scenarios: + + - loading outside tmux + - loading inside tmux, via switch-client + - loading inside tmux, with session in background (with -d), and + reattaching/switching to after + - loading session outside tmux in background with -d, and + reattaching/switching after +- :feature:`308` Fix bug where layouts don't correctly set on tmux 2.6 +- :support:`- backported` Upgrade libtmux to 0.7.7 + - :release:`1.3.4 <2017-10-12>` - :feature:`- backported` `before_script` now respects `start_directory` in the session root. This makes it easier to run things like `pipenv From 07ae8a446f180d1f6047ee747aee26977772f997 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Nov 2017 07:30:27 -0600 Subject: [PATCH 0195/2998] update to v1.3.5 --- CHANGES | 1 + tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 8b4407a72d..19e67836e6 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.3.5 <2017-11-10>` - :feature:`312` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 2a5b34917c..296ba477f0 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.4' +__version__ = '1.3.5' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 197ba7e81167f4a028a58838a4fe2a9221d3ae8d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Nov 2017 07:33:12 -0600 Subject: [PATCH 0196/2998] make sure changes show backported --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 19e67836e6..50e7718245 100644 --- a/CHANGES +++ b/CHANGES @@ -5,7 +5,7 @@ Changelog Here you can find the recent changes to tmuxp - :release:`1.3.5 <2017-11-10>` -- :feature:`312` Support for tmux 2.6 layout setting (via hooks) in the +- :feature:`312 backported` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: - loading outside tmux @@ -14,7 +14,7 @@ Here you can find the recent changes to tmuxp reattaching/switching to after - loading session outside tmux in background with -d, and reattaching/switching after -- :feature:`308` Fix bug where layouts don't correctly set on tmux 2.6 +- :feature:`308 backported` Fix bug where layouts don't correctly set on tmux 2.6 - :support:`- backported` Upgrade libtmux to 0.7.7 - :release:`1.3.4 <2017-10-12>` From 79ab459527150fbba505a9236af15baabcf8b561 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 11 Nov 2017 10:09:49 -0600 Subject: [PATCH 0197/2998] add bot configuration to prune stale issues --- .github/stale.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000..7ed957161f --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,29 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: | + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + + This bot is used to handle issues where the issue hasn't been discussed or + has gone out of date. If an issue isn't resolved and handled in a certain + period of time, it may be closed. If you would like your issue re-opened, + please create a fresh issue with the latest, up to date information and + mention this issue in it. +unmarkComment: | + Thank you for updating this issue. It is no longer marked as stale. + +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false + +# limit to only 'issues' or 'pulls' +only: issues From d0ea911767f5a2c2f5c58cef2038466196a37229 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 15 Nov 2017 17:00:12 -0600 Subject: [PATCH 0198/2998] Update pytest from 3.2.3 to 3.2.5 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 0d2c8ec392..b66a129cc2 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.2.3 # Updated from 3.0.4 +pytest==3.2.5 # Updated from 3.0.4 pytest-rerunfailures==3.1 # Updated from 2.0.1 From 812db0b5950be5b87ca7f9b99405c860d63acf21 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 28 Nov 2017 03:18:39 -0600 Subject: [PATCH 0199/2998] Update pytest from 3.2.5 to 3.3.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index b66a129cc2..1c546dbf4d 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.2.5 # Updated from 3.0.4 +pytest==3.3.0 # Updated from 3.0.4 pytest-rerunfailures==3.1 # Updated from 2.0.1 From a1b011b4036313359e9759a76b28d274054151ca Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 6 Dec 2017 06:24:56 -0600 Subject: [PATCH 0200/2998] Update pytest from 3.3.0 to 3.3.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 1c546dbf4d..09926828b3 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.3.0 # Updated from 3.0.4 +pytest==3.3.1 # Updated from 3.0.4 pytest-rerunfailures==3.1 # Updated from 2.0.1 From 63a509452a882026178c693ddbff7b11a8ca688f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 13 Dec 2017 06:43:15 -0600 Subject: [PATCH 0201/2998] Update alagitpull from 0.0.13 to 0.0.14 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 74e2db5ff8..9f7d8fd09e 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 sphinx==1.6.5 -alagitpull==0.0.13 # Updated from 0.0.12 +alagitpull==0.0.14 # Updated from 0.0.12 releases==1.4.0 # Updated from 1.3.1 aafigure==0.6 From 0a4c0ba7a2e50c27460ab38ad64def63c54e0a4e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 23 Dec 2017 04:53:39 -0600 Subject: [PATCH 0202/2998] Update pytest-rerunfailures from 3.1 to 4.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 09926828b3..61ebe2258b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.3.1 # Updated from 3.0.4 -pytest-rerunfailures==3.1 # Updated from 2.0.1 +pytest-rerunfailures==4.0 # Updated from 2.0.1 From f1933ce979f3f972caa8c431aef92bfccb5a3784 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 5 Jan 2018 05:17:19 -0600 Subject: [PATCH 0203/2998] Update pytest from 3.3.1 to 3.3.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 61ebe2258b..a49c40e86a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.3.1 # Updated from 3.0.4 +pytest==3.3.2 # Updated from 3.0.4 pytest-rerunfailures==4.0 # Updated from 2.0.1 From f3592c22cc18da3d6ef3458516decbc344d9065d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 8 Jan 2018 17:06:22 -0600 Subject: [PATCH 0204/2998] Update sphinx from 1.6.5 to 1.6.6 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 9f7d8fd09e..ba15b68715 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.6.5 +sphinx==1.6.6 alagitpull==0.0.14 # Updated from 0.0.12 releases==1.4.0 # Updated from 1.3.1 aafigure==0.6 From 7839ce7ecd28ba32538d00e6e8e1d1aab0d689c8 Mon Sep 17 00:00:00 2001 From: laixintao Date: Thu, 11 Jan 2018 13:57:44 +0800 Subject: [PATCH 0205/2998] bugfix bad assignment in hint --- tmuxp/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/util.py b/tmuxp/util.py index 18c8a084c4..cc5041ad26 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -70,7 +70,7 @@ def oh_my_zsh_auto_title(): os.environ.get('DISABLE_AUTO_TITLE') == "false" ): print('Please set:\n\n' - '\texport DISABLE_AUTO_TITLE = \'true\'\n\n' + '\texport DISABLE_AUTO_TITLE=\'true\'\n\n' 'in ~/.zshrc or where your zsh profile is stored.\n' 'Remember the "export" at the beginning!\n\n' 'Then create a new shell or type:\n\n' From 76549d5adece6951be504f57bb7ae7cb67a62562 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 16 Jan 2018 13:53:33 -0600 Subject: [PATCH 0206/2998] Update alagitpull from 0.0.14 to 0.0.15 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index ba15b68715..e09861b3cc 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 sphinx==1.6.6 -alagitpull==0.0.14 # Updated from 0.0.12 +alagitpull==0.0.15 # Updated from 0.0.12 releases==1.4.0 # Updated from 1.3.1 aafigure==0.6 From ce07a66eecfe122e6855eb6cedb1fd5c198be24b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 16 Jan 2018 14:30:49 -0600 Subject: [PATCH 0207/2998] bump alagitpull to v0.0.16 --- requirements/doc.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index e09861b3cc..58bacabb52 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 sphinx==1.6.6 -alagitpull==0.0.15 # Updated from 0.0.12 -releases==1.4.0 # Updated from 1.3.1 +alagitpull==0.0.16 +releases==1.4.0 aafigure==0.6 From b8d95dfdd1c3438c382b1c911fc5e3b5b42bc43b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 31 Jan 2018 05:56:56 -0600 Subject: [PATCH 0208/2998] Update pytest from 3.3.2 to 3.4.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index a49c40e86a..b3db6bb9fd 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.3.2 # Updated from 3.0.4 +pytest==3.4.0 # Updated from 3.0.4 pytest-rerunfailures==4.0 # Updated from 2.0.1 From 7d36925f4c81068edcc45c15ccb62d118dc932b8 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Feb 2018 11:12:20 -0600 Subject: [PATCH 0209/2998] Update isort from 4.2.15 to 4.3.4 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 1b3b15f981..77e130d5fe 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ -isort==4.2.15 +isort==4.3.4 flake8==3.5.0 vulture==0.26 From a848476149f2e08c86ae7b7e2b70032f944d0ca9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 12 Feb 2018 11:12:29 -0600 Subject: [PATCH 0210/2998] Update sphinx from 1.6.6 to 1.7.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 58bacabb52..abd5981348 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.6.6 +sphinx==1.7.0 alagitpull==0.0.16 releases==1.4.0 aafigure==0.6 From 7550c5383a2f5bd0fccba7ad355aa1a7fffe2946 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 16 Feb 2018 10:03:27 -0600 Subject: [PATCH 0211/2998] Update alagitpull from 0.0.16 to 0.0.19 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index abd5981348..0720c981e0 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 sphinx==1.7.0 -alagitpull==0.0.16 +alagitpull==0.0.19 releases==1.4.0 aafigure==0.6 From 929844b5c19de8d7d2a93e2d6a71b89eb92e8edc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 18 Feb 2018 23:02:21 -0600 Subject: [PATCH 0212/2998] update Pipenv --- Pipfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index 44b94b1a28..5c26e51990 100644 --- a/Pipfile +++ b/Pipfile @@ -21,9 +21,9 @@ libtmux = "==0.7.5" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" -alagitpull = "==0.0.13" +alagitpull = "==0.0.19" aafigure = "==0.6" pytest = "==3.2.3" "pytest-rerunfailures" = "==3.1" releases = "==1.4.0" -sphinx = "*" \ No newline at end of file +sphinx = "==1.7.0" From 12fca3969c534140c22907e4484cdfb6c958273b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 18 Feb 2018 23:05:49 -0600 Subject: [PATCH 0213/2998] update config for alagitpull, remove duplicate html_theme_path --- doc/conf.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 356df05c6a..cc1dcce670 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -52,6 +52,7 @@ html_theme_path = [alagitpull.get_path()] html_favicon = 'favicon.ico' html_theme = 'alagitpull' +html_static_path = ['_static'] html_sidebars = { '**': [ 'about.html', @@ -73,8 +74,11 @@ 'project_name': about['__title__'], } -html_theme_path = ['_themes'] -html_static_path = ['_static'] +alagitpull_internal_hosts = [ + 'tmuxp.git-pull.com', + '0.0.0.0', +] +alagitpull_external_hosts_new_window = True htmlhelp_basename = '%sdoc' % about['__title__'] From 103ab50ccad40204ffd3fc924e6845b81ca39f35 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 21 Feb 2018 05:24:35 -0600 Subject: [PATCH 0214/2998] Update pytest from 3.4.0 to 3.4.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index b3db6bb9fd..b41dff1365 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.4.0 # Updated from 3.0.4 +pytest==3.4.1 # Updated from 3.0.4 pytest-rerunfailures==4.0 # Updated from 2.0.1 From 6f291482fa1803b33de52d0b3e507417ec2c1d95 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 23 Feb 2018 19:54:09 -0600 Subject: [PATCH 0215/2998] Update sphinx from 1.7.0 to 1.7.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 0720c981e0..458a7cb402 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.0 +sphinx==1.7.1 alagitpull==0.0.19 releases==1.4.0 aafigure==0.6 From 4159cb1619bb1c4499205737e3276602b182c687 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 14:53:54 -0600 Subject: [PATCH 0216/2998] update LICENSE so it gets detected by GH/buttons --- LICENSE | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/LICENSE b/LICENSE index 11c0169026..f126c40163 100644 --- a/LICENSE +++ b/LICENSE @@ -1,29 +1,27 @@ -Copyright (c) 2013-2017 Tony Narlock and contributors (see AUTHORS file). +Copyright (c) 2013-2018, Tony Narlock All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -* The names of the contributors may not be used to endorse or promote - products derived from this software without specific prior written - permission. +* Neither the name of libtmux nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From d2841ac78f9b50e65adf44124dc49514ce7b3c7b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 14:56:39 -0600 Subject: [PATCH 0217/2998] update travis to trusty --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 54638cce38..3cb4969f90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: python -dist: precise +dist: trusty sudo: false python: - 2.7 From 7b7a993e41515757ea2f48f0abe440e46566b617 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 14:57:28 -0600 Subject: [PATCH 0218/2998] rm python testing from older 3 versions for speed --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3cb4969f90..3c21aba241 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,6 @@ dist: trusty sudo: false python: - 2.7 - - 3.3 - - 3.4 - - 3.5 - 3.6 - pypy3.5-5.8.0 - pypy-5.6.0 From a5a54f5137301e161b8af7f237e815f3d6f27cdc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 14:57:45 -0600 Subject: [PATCH 0219/2998] move 1.9a up --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c21aba241..01fa2a1c51 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ env: - TMUX_VERSION=2.2 - TMUX_VERSION=2.1 - TMUX_VERSION=2.0 - - TMUX_VERSION=1.8 - TMUX_VERSION=1.9a + - TMUX_VERSION=1.8 matrix: allow_failures: - env: TMUX_VERSION=master From fe62deea39dc63cef7762c9976a2972847ee60a4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:09:14 -0600 Subject: [PATCH 0220/2998] rm comments from requirements/test --- requirements/test.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/test.txt b/requirements/test.txt index b41dff1365..2c9d71008a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.4.1 # Updated from 3.0.4 -pytest-rerunfailures==4.0 # Updated from 2.0.1 +pytest==3.4.1 +pytest-rerunfailures==4.0 From 669aa3d7256af6f38ced075925eec144a6abe114 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:11:42 -0600 Subject: [PATCH 0221/2998] update codecov to new example format see: https://github.com/codecov/codecov-python/blob/a1ffe5a/.travis.yml --- .coveragerc | 2 ++ .travis.yml | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.coveragerc b/.coveragerc index 2784a20bef..dd73cf4003 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,4 +1,6 @@ [run] +branch = True +source = tmuxp omit = tests/* */_vendor/* diff --git a/.travis.yml b/.travis.yml index 01fa2a1c51..fcc7a0765e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,11 +20,12 @@ env: matrix: allow_failures: - env: TMUX_VERSION=master + before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 - pip install --upgrade pip wheel virtualenv setuptools - - pip install coveralls + - pip install pytest-cov python-coverage install: - pip install -e . before_script: @@ -36,11 +37,11 @@ before_script: - export PATH=$HOME/tmux/bin:$PATH - cd .. - tmux -V -script: coverage run --source=tmuxp setup.py test +script: py.test --cov=codecov addons: apt: packages: - libevent-dev - libncurses-dev after_success: - - bash <(curl -s https://codecov.io/bash) + - codecov From c9ce2239ff77fdb8f7745fb3e6b744d0d96cf287 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:12:45 -0600 Subject: [PATCH 0222/2998] update reruns pytest flag fixes error message: error: ambiguous option: --rerun could match --reruns, --reruns-delay --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 615899d1de..3aa7166ef6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,4 +3,4 @@ exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N [tool:pytest] -addopts = --rerun 5 +addopts = --reruns 5 From fba78804df7fa5723d0cf3162fd694296706dee8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:19:40 -0600 Subject: [PATCH 0223/2998] fix typo in package name --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fcc7a0765e..4c9b6c2bfc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 - pip install --upgrade pip wheel virtualenv setuptools - - pip install pytest-cov python-coverage + - pip install pytest-cov coverage install: - pip install -e . before_script: From 905e549b5f859cc9a0f1d4562bfc79589ca4207b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:33:38 -0600 Subject: [PATCH 0224/2998] try to get reruns to work in travis --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 3aa7166ef6..9cda12e03c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,4 +3,4 @@ exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N [tool:pytest] -addopts = --reruns 5 +addopts = --reruns=5 From a517edfaafce57c31458904b6aef82020b79f775 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 15:45:58 -0600 Subject: [PATCH 0225/2998] install test requirements --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 4c9b6c2bfc..ef7bc5af6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ before_install: - pip install pytest-cov coverage install: - pip install -e . + - pip install -r requirements/test.txt before_script: - git clone https://github.com/tmux/tmux.git tmux - cd tmux From 8fd410ad31f85ffa98d5bbcbf2229e732d9594a2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 16:35:18 -0600 Subject: [PATCH 0226/2998] try to improve reliability of test_window_options_after in CI --- tests/test_workspacebuilder.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 97ea40e955..ae903c07d7 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -293,15 +293,16 @@ def test_window_options_after(session): def assert_last_line(p, s): correct = False - for _ in range(10): + timeout = time.time() + 5 # 5 second timeout + while True: pane_out = p.cmd('capture-pane', '-p', '-J').stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break - - time.sleep(0.1) + elif time.time() > timeout: + break # Print output for easier debugging if assertion fails if not correct: From d11b720767b98d667d544571825866260d4ad26d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 17:57:26 -0600 Subject: [PATCH 0227/2998] add codecov to travis before_install, fix --cov argument --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ef7bc5af6b..1a2be5a9f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 - pip install --upgrade pip wheel virtualenv setuptools - - pip install pytest-cov coverage + - pip install pytest-cov coverage codecov install: - pip install -e . - pip install -r requirements/test.txt @@ -38,7 +38,7 @@ before_script: - export PATH=$HOME/tmux/bin:$PATH - cd .. - tmux -V -script: py.test --cov=codecov +script: py.test --cov addons: apt: packages: From 71c68a9912a45a7888d49ce0846d55b34383ca27 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 18:26:19 -0600 Subject: [PATCH 0228/2998] improve reliability of stubborn tests add RETRY_TIMEOUT_SECONDS setting, with default of 8 seconds for now it can be configured via environmental variables, add docs. --- doc/developing.rst | 8 ++++++++ tests/test_workspacebuilder.py | 25 ++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/doc/developing.rst b/doc/developing.rst index 9c8f58c7e8..55def7bfbc 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -187,6 +187,14 @@ tmuxp is tested against tmux 1.8 and the latest git source. Interpretters tested are 2.6, 2.7 and 3.3. The `travis build site`_ uses this `.travis.yml`_ configuration: +Testing options +--------------- + +``RETRY_TIMEOUT_SECONDS`` can be toggled if certain workspace builder +tests are being stubborn. + +e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test `` + .. literalinclude:: ../.travis.yml :language: yaml diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index ae903c07d7..2a3d234e39 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -22,6 +22,9 @@ from .fixtures._util import loadfixture +RETRY_TIMEOUT_SECONDS = int(os.getenv('RETRY_TIMEOUT_SECONDS', 8)) + + def test_split_windows(session): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") s = session @@ -293,7 +296,8 @@ def test_window_options_after(session): def assert_last_line(p, s): correct = False - timeout = time.time() + 5 # 5 second timeout + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: pane_out = p.cmd('capture-pane', '-p', '-J').stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 @@ -391,31 +395,38 @@ def test_automatic_rename_option(session): assert s.name != 'tmuxp' w = s.windows[0] - for _ in range(10): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: session.server._update_windows() if w.name != 'sh': break - time.sleep(.2) + elif time.time() > timeout: + break assert w.name != 'sh' pane_base_index = w.show_window_option('pane-base-index', g=True) w.select_pane(pane_base_index) - for _ in range(10): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: session.server._update_windows() if w.name == 'sh': break - time.sleep(.3) + elif time.time() > timeout: + break assert w.name == text_type('sh') w.select_pane('-D') - for _ in range(10): + + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: session.server._update_windows() if w['window_name'] != 'sh': break - time.sleep(.2) + elif time.time() > timeout: + break assert w.name != text_type('sh') From 66413687f00bb9ba71126cea5f826106492b7b97 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 19:30:23 -0600 Subject: [PATCH 0229/2998] set RETRY_TIMEOUT_SECONDS to 15 in travis --- .travis.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1a2be5a9f6..0fb0d3480f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,16 +7,19 @@ python: - pypy3.5-5.8.0 - pypy-5.6.0 env: - - TMUX_VERSION=master - - TMUX_VERSION=2.6 - - TMUX_VERSION=2.5 - - TMUX_VERSION=2.4 - - TMUX_VERSION=2.3 - - TMUX_VERSION=2.2 - - TMUX_VERSION=2.1 - - TMUX_VERSION=2.0 - - TMUX_VERSION=1.9a - - TMUX_VERSION=1.8 + global: + - RETRY_TIMEOUT_SECONDS=15 + matrix: + - TMUX_VERSION=master + - TMUX_VERSION=2.6 + - TMUX_VERSION=2.5 + - TMUX_VERSION=2.4 + - TMUX_VERSION=2.3 + - TMUX_VERSION=2.2 + - TMUX_VERSION=2.1 + - TMUX_VERSION=2.0 + - TMUX_VERSION=1.9a + - TMUX_VERSION=1.8 matrix: allow_failures: - env: TMUX_VERSION=master From 6ddd76016083ad1897747afece24579bfc3ce72b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 20:32:56 -0600 Subject: [PATCH 0230/2998] upgrade pypy versions for travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0fb0d3480f..39e25ab930 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ sudo: false python: - 2.7 - 3.6 - - pypy3.5-5.8.0 - - pypy-5.6.0 + - pypy3.5-5.9.0 + - pypy-5.7.1 env: global: - RETRY_TIMEOUT_SECONDS=15 From 1310ce6a0e1c07f372ff10024be6e3235b1236a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 20:47:27 -0600 Subject: [PATCH 0231/2998] try bumping up pypy even more --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 39e25ab930..5f298d4593 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ sudo: false python: - 2.7 - 3.6 - - pypy3.5-5.9.0 - - pypy-5.7.1 + - pypy3.5-5.10.1 + - pypy2.7-5.10.0 env: global: - RETRY_TIMEOUT_SECONDS=15 From 2717a9e75c4dde56fd53f58db1ccbd0e051c84dc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 3 Mar 2018 21:37:22 -0600 Subject: [PATCH 0232/2998] update Pipfile for local package, sphinx --- Pipfile | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Pipfile b/Pipfile index 5c26e51990..a3d2e8a61d 100644 --- a/Pipfile +++ b/Pipfile @@ -1,29 +1,25 @@ [[source]] + url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" -[packages] - - - - - - +[packages] [dev-packages] kaptan = ">=0.5.7" -libtmux = "==0.7.5" +libtmux = "==0.7.7" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.19" aafigure = "==0.6" pytest = "==3.2.3" -"pytest-rerunfailures" = "==3.1" +pytest-rerunfailures = "==3.1" releases = "==1.4.0" -sphinx = "==1.7.0" +sphinx = "==1.7.1" +"e1839a8" = {path = ".", editable = true} From 95780be3a140b93c500f7828ad2d8b749e1cea8f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 01:25:00 -0600 Subject: [PATCH 0233/2998] update .tmuxp.json file --- .tmuxp.json | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.tmuxp.json b/.tmuxp.json index be8694b309..c98c092189 100644 --- a/.tmuxp.json +++ b/.tmuxp.json @@ -1,5 +1,5 @@ { - "before_script": "./bootstrap_env.py", + "before_script": "pipenv install --dev --skip-lock", "windows": [ { "panes": [ @@ -9,13 +9,10 @@ "pane", "make watch_test" ], + "layout": "main-horizontal", "options": { "main-pane-height": 35 }, - "layout": "main-horizontal", - "shell_command_before": [ - "[ -d .venv -a -f .venv/bin/activate ] && source .venv/bin/activate" - ], "focus": true, "window_name": "tmuxp" }, @@ -30,15 +27,15 @@ ], "start_directory": "doc/", "layout": "main-horizontal", - "shell_command_before": [ - "[ -d ../.venv -a -f ../.venv/bin/activate ] && source ../.venv/bin/activate" - ], + "window_name": "docs", "options": { "main-pane-height": 35 - }, - "window_name": "docs" + } } ], "session_name": "tmuxp", - "start_directory": "./" + "start_directory": "./", + "shell_command_before": [ + "[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset" + ] } \ No newline at end of file From 8dd4e2ef8f571225f970501e21f0f4234ff85315 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 03:13:39 -0600 Subject: [PATCH 0234/2998] switch more workspace test to use timed retries --- tests/test_workspacebuilder.py | 39 ++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 2a3d234e39..bdfb5138aa 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -109,12 +109,16 @@ def test_focus_pane_index(session): assert w.name != 'man' pane_path = '/usr' - for _ in range(20): + + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + + while True: p = w.attached_pane p.server._update_panes() if p.current_path == pane_path: break - time.sleep(.4) + elif time.time() > timeout: + break assert p.current_path == pane_path @@ -127,12 +131,14 @@ def test_focus_pane_index(session): p = None pane_path = '/' - for _ in range(10): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: p = window3.attached_pane p.server._update_panes() if p.current_path == pane_path: break - time.sleep(.4) + elif time.time() > timeout: + break assert p.current_path == pane_path @@ -345,11 +351,13 @@ def test_window_shell(session): for w, wconf in builder.iter_create_windows(s): if 'window_shell' in wconf: assert wconf['window_shell'] == text_type('top') - for _ in range(10): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: session.server._update_windows() if w['window_name'] != 'top': break - time.sleep(.2) + elif time.time() > timeout: + break assert w.name != text_type('top') @@ -482,7 +490,8 @@ def test_start_directory(session, tmpdir): for path, window in zip(dirs, session.windows): for p in window.panes: - for _ in range(60): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: p.server._update_panes() pane_path = p.current_path if pane_path is None: @@ -496,7 +505,8 @@ def test_start_directory(session, tmpdir): path in pane_path ) break - time.sleep(.2) + elif time.time() > timeout: + break # handle case with OS X adding /private/ to /tmp/ paths assert result @@ -548,7 +558,8 @@ def test_start_directory_relative(session, tmpdir): for path, window in zip(dirs, session.windows): for p in window.panes: - for _ in range(60): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: p.server._update_panes() # Handle case where directories resolve to /private/ in OSX pane_path = p.current_path @@ -562,9 +573,9 @@ def test_start_directory_relative(session, tmpdir): path == pane_path or path in pane_path ) - break - time.sleep(.2) + elif time.time() > timeout: + break assert result @@ -618,11 +629,13 @@ def test_pane_order(session): # at 0 since python list. pane_path = pane_paths[p_index - pane_base_index] - for _ in range(60): + timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout + while True: p.server._update_panes() if p.current_path == pane_path: break - time.sleep(.2) + elif time.time() > timeout: + break assert p.current_path, pane_path From 056675aea6f3865275762475d77d89461594b3bd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 14:08:22 -0600 Subject: [PATCH 0235/2998] add flake8 to travis-ci --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5f298d4593..47cdd3f43d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 - pip install --upgrade pip wheel virtualenv setuptools - - pip install pytest-cov coverage codecov + - pip install pytest-cov coverage codecov flake8 install: - pip install -e . - pip install -r requirements/test.txt @@ -41,7 +41,9 @@ before_script: - export PATH=$HOME/tmux/bin:$PATH - cd .. - tmux -V -script: py.test --cov +script: + - py.test --cov + - make flake8 addons: apt: packages: From ad9ee052e24232f91c14973e698bc12328ec4e78 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 15:01:20 -0600 Subject: [PATCH 0236/2998] update CHANGES --- CHANGES | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGES b/CHANGES index 50e7718245..bbcbfcc3f3 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,19 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`348 backported` Continuous integration updates and fixes for Travis CI + + - Update builds to use trusty + - Remove older python 3 versions (before 3.6) + - Update pypy versions +- :support:`349 backported` flake8 via continuous integration +- :support:`- backported` Improve reliability of time-sensitive tests by + using ``while True`` with a timeout. +- :support:`- backported` Update sphinx to 1.7.1 +- :support:`- backported` Update alagitpull (sphinx theme) to 0.0.19. + External websites open in new window. +- :support:`- backported` Update pytest to 3.4.1 + - :release:`1.3.5 <2017-11-10>` - :feature:`312 backported` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: From f8fbaadddf0612a9dded982a2be7619f788f6a97 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 16:07:59 -0600 Subject: [PATCH 0237/2998] consolidate retry into retry wrapped lambda --- tests/test_workspacebuilder.py | 63 ++++++++++------------------------ 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index bdfb5138aa..4fde3d7f2d 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -9,22 +9,24 @@ import kaptan import pytest - -from . import fixtures_dir from libtmux import Window from libtmux.common import has_gte_version from libtmux.test import temp_session + from tmuxp import config, exc from tmuxp._compat import text_type from tmuxp.workspacebuilder import WorkspaceBuilder -from . import example_dir +from . import example_dir, fixtures_dir from .fixtures._util import loadfixture - RETRY_TIMEOUT_SECONDS = int(os.getenv('RETRY_TIMEOUT_SECONDS', 8)) +def retry(seconds=RETRY_TIMEOUT_SECONDS): + return (lambda: time.time() < time.time() + seconds)() + + def test_split_windows(session): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") s = session @@ -110,15 +112,11 @@ def test_focus_pane_index(session): pane_path = '/usr' - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - - while True: + while retry(): p = w.attached_pane p.server._update_panes() if p.current_path == pane_path: break - elif time.time() > timeout: - break assert p.current_path == pane_path @@ -131,14 +129,12 @@ def test_focus_pane_index(session): p = None pane_path = '/' - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + + while retry(): p = window3.attached_pane p.server._update_panes() if p.current_path == pane_path: break - elif time.time() > timeout: - break assert p.current_path == pane_path @@ -302,17 +298,14 @@ def test_window_options_after(session): def assert_last_line(p, s): correct = False - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): pane_out = p.cmd('capture-pane', '-p', '-J').stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: correct = True break - elif time.time() > timeout: - break # Print output for easier debugging if assertion fails if not correct: @@ -351,13 +344,11 @@ def test_window_shell(session): for w, wconf in builder.iter_create_windows(s): if 'window_shell' in wconf: assert wconf['window_shell'] == text_type('top') - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + + while retry(): session.server._update_windows() if w['window_name'] != 'top': break - elif time.time() > timeout: - break assert w.name != text_type('top') @@ -403,38 +394,29 @@ def test_automatic_rename_option(session): assert s.name != 'tmuxp' w = s.windows[0] - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): session.server._update_windows() if w.name != 'sh': break - elif time.time() > timeout: - break assert w.name != 'sh' pane_base_index = w.show_window_option('pane-base-index', g=True) w.select_pane(pane_base_index) - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): session.server._update_windows() if w.name == 'sh': break - elif time.time() > timeout: - break assert w.name == text_type('sh') w.select_pane('-D') - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): session.server._update_windows() if w['window_name'] != 'sh': break - elif time.time() > timeout: - break assert w.name != text_type('sh') @@ -490,8 +472,7 @@ def test_start_directory(session, tmpdir): for path, window in zip(dirs, session.windows): for p in window.panes: - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): p.server._update_panes() pane_path = p.current_path if pane_path is None: @@ -505,8 +486,6 @@ def test_start_directory(session, tmpdir): path in pane_path ) break - elif time.time() > timeout: - break # handle case with OS X adding /private/ to /tmp/ paths assert result @@ -558,8 +537,7 @@ def test_start_directory_relative(session, tmpdir): for path, window in zip(dirs, session.windows): for p in window.panes: - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): p.server._update_panes() # Handle case where directories resolve to /private/ in OSX pane_path = p.current_path @@ -574,8 +552,6 @@ def test_start_directory_relative(session, tmpdir): path in pane_path ) break - elif time.time() > timeout: - break assert result @@ -629,13 +605,10 @@ def test_pane_order(session): # at 0 since python list. pane_path = pane_paths[p_index - pane_base_index] - timeout = time.time() + RETRY_TIMEOUT_SECONDS # seconds timeout - while True: + while retry(): p.server._update_panes() if p.current_path == pane_path: break - elif time.time() > timeout: - break assert p.current_path, pane_path From 99b65503f7016b53600a2a4232fdac02bf02b46e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 16:57:29 -0600 Subject: [PATCH 0238/2998] add some docstring --- tests/test_workspacebuilder.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 4fde3d7f2d..79a89f9b2d 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -24,6 +24,24 @@ def retry(seconds=RETRY_TIMEOUT_SECONDS): + """Retry a block of code until a time limit or ``break``. + + .. code-block:: python + + while retry(): + p = w.attached_pane + p.server._update_panes() + if p.current_path == pane_path: + break + + + :param seconds: Seconds to retry, defaults to ``RETRY_TIMEOUT_SECONDS``, + which is configurable via environmental variables. + :type seconds: int + :rtype: void + + :todo: Move to libtmux.test + """ return (lambda: time.time() < time.time() + seconds)() From 9cae75072a3993af0797d71be8d909bd090b5921 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 4 Mar 2018 17:16:17 -0600 Subject: [PATCH 0239/2998] update libtmux to 0.7.8, fixes #354 --- Pipfile | 2 +- requirements/base.txt | 2 +- tests/test_workspacebuilder.py | 30 ++---------------------------- 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/Pipfile b/Pipfile index a3d2e8a61d..916ce96c32 100644 --- a/Pipfile +++ b/Pipfile @@ -12,7 +12,7 @@ name = "pypi" [dev-packages] kaptan = ">=0.5.7" -libtmux = "==0.7.7" +libtmux = "==0.7.8" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" diff --git a/requirements/base.txt b/requirements/base.txt index 0412e3f064..43f84451a9 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.7 # Updated from 0.7.6 +libtmux==0.7.8 click==6.7 colorama==0.3.9 diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 79a89f9b2d..959ae3d2ac 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -5,13 +5,12 @@ unicode_literals, with_statement) import os -import time import kaptan import pytest from libtmux import Window from libtmux.common import has_gte_version -from libtmux.test import temp_session +from libtmux.test import temp_session, retry from tmuxp import config, exc from tmuxp._compat import text_type @@ -20,30 +19,6 @@ from . import example_dir, fixtures_dir from .fixtures._util import loadfixture -RETRY_TIMEOUT_SECONDS = int(os.getenv('RETRY_TIMEOUT_SECONDS', 8)) - - -def retry(seconds=RETRY_TIMEOUT_SECONDS): - """Retry a block of code until a time limit or ``break``. - - .. code-block:: python - - while retry(): - p = w.attached_pane - p.server._update_panes() - if p.current_path == pane_path: - break - - - :param seconds: Seconds to retry, defaults to ``RETRY_TIMEOUT_SECONDS``, - which is configurable via environmental variables. - :type seconds: int - :rtype: void - - :todo: Move to libtmux.test - """ - return (lambda: time.time() < time.time() + seconds)() - def test_split_windows(session): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") @@ -199,8 +174,7 @@ def assertIsMissing(cmd, hist): p.cmd('send-keys', 'Enter') buffer_name = 'test' - for _ in range(10): - time.sleep(0.1) + while retry(): # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. From 97345ad8e0ec5f5690462c60738c95aac5e8acb0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 6 Mar 2018 07:33:23 -0600 Subject: [PATCH 0240/2998] Update pytest from 3.4.1 to 3.4.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 2c9d71008a..aa2ce80f60 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.4.1 +pytest==3.4.2 pytest-rerunfailures==4.0 From bf9d05d8b42ae579637e0a9dc8719eb14119775e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 10 Mar 2018 11:38:55 -0600 Subject: [PATCH 0241/2998] update url to new org --- CHANGES | 2 +- README.rst | 36 +++++++++---------- doc/about.rst | 6 ++-- doc/conf.py | 6 ++-- doc/developing.rst | 8 ++--- doc/examples.rst | 4 +-- setup.py | 4 +-- .../regression_00132_dots.yaml | 2 +- tests/test_workspacebuilder.py | 4 +-- tmuxp/cli.py | 2 +- 10 files changed, 37 insertions(+), 37 deletions(-) diff --git a/CHANGES b/CHANGES index bbcbfcc3f3..7e352d98fd 100644 --- a/CHANGES +++ b/CHANGES @@ -761,6 +761,6 @@ Here you can find the recent changes to tmuxp .. _.where(): http://underscorejs.org/#where .. _.findWhere(): http://underscorejs.org/#findWhere -.. _libtmux: https://github.com/tony/libtmux +.. _libtmux: https://github.com/tmux-python/libtmux .. # vim: set filetype=rst: diff --git a/README.rst b/README.rst index 877e548ac0..c815cc61d4 100644 --- a/README.rst +++ b/README.rst @@ -70,7 +70,7 @@ loading tmux. See the `bootstrap_env.py`_ and `before_script`_ example You can also load sessions in the background by passing ``-d`` flag -.. image:: https://raw.github.com/tony/tmuxp/master/doc/_static/tmuxp-demo.gif +.. image:: https://raw.github.com/tmux-python/tmuxp/master/doc/_static/tmuxp-demo.gif :scale: 100% :width: 45% :align: center @@ -96,14 +96,14 @@ See the `Quickstart`_. Want to learn more about tmux itself? `Read The Tao of Tmux online`_. -.. _tmuxp on Travis CI: http://travis-ci.org/tony/tmuxp +.. _tmuxp on Travis CI: http://travis-ci.org/tmux-python/tmuxp .. _Documentation: http://tmuxp.git-pull.com -.. _Source: https://github.com/tony/tmuxp +.. _Source: https://github.com/tmux-python/tmuxp .. _中文: http://tmuxp-zh.rtfd.org/ .. _before_script: http://tmuxp.git-pull.com/en/latest/examples.html#bootstrap-project-before-launch .. _virtualenv: https://virtualenv.git-pull.com/en/latest/ .. _Read The Tao of tmux online: http://tmuxp.git-pull.com/en/latest/about_tmux.html -.. _author's tmuxp configs: https://github.com/tony/tmuxp-config +.. _author's tmuxp configs: https://github.com/tmux-python/tmuxp-config .. _python library: https://tmuxp.git-pull.com/en/latest/api.html .. _python API quickstart: https://tmuxp.git-pull.com/en/latest/quickstart_python.html .. _tmux(1): http://tmux.sourceforge.net/ @@ -111,16 +111,16 @@ Want to learn more about tmux itself? `Read The Tao of Tmux online`_. .. _teamocil: https://github.com/remiprev/teamocil .. _Examples: http://tmuxp.git-pull.com/en/latest/examples.html .. _freezing tmux: http://tmuxp.git-pull.com/en/latest/cli.html#freeze-sessions -.. _bootstrap_env.py: https://github.com/tony/tmuxp/blob/master/bootstrap_env.py +.. _bootstrap_env.py: https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py .. _travis.yml: http://tmuxp.git-pull.com/en/latest/developing.html#travis-ci .. _testing: http://tmuxp.git-pull.com/en/latest/developing.html#test-runner .. _python objects: http://tmuxp.git-pull.com/en/latest/api.html#api -.. _tmuxp.yaml: https://github.com/tony/tmuxp/blob/master/.tmuxp.yaml +.. _tmuxp.yaml: https://github.com/tmux-python/tmuxp/blob/master/.tmuxp.yaml .. _simple: http://tmuxp.git-pull.com/en/latest/examples.html#short-hand-inline .. _very elaborate: http://tmuxp.git-pull.com/en/latest/examples.html#super-advanced-dev-environment .. _Quickstart: http://tmuxp.git-pull.com/en/latest/quickstart.html .. _Commands: http://tmuxp.git-pull.com/en/latest/cli.html -.. _libtmux: https://github.com/tony/libtmux +.. _libtmux: https://github.com/tmux-python/libtmux .. _on the web: https://leanpub.com/the-tao-of-tmux/read Donations @@ -140,25 +140,25 @@ Project details tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 python support 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict -Source https://github.com/tony/tmuxp +Source https://github.com/tmux-python/tmuxp Docs http://tmuxp.git-pull.com API http://tmuxp.git-pull.com/en/latest/api.html Changelog http://tmuxp.git-pull.com/en/latest/history.html -Issues https://github.com/tony/tmuxp/issues -Travis http://travis-ci.org/tony/tmuxp -Test Coverage https://codecov.io/gh/tony/tmuxp +Issues https://github.com/tmux-python/tmuxp/issues +Travis http://travis-ci.org/tmux-python/tmuxp +Test Coverage https://codecov.io/gh/tmux-python/tmuxp pypi https://pypi.python.org/pypi/tmuxp Open Hub https://www.openhub.net/p/tmuxp License `BSD`_. git repo .. code-block:: bash - $ git clone https://github.com/tony/tmuxp.git + $ git clone https://github.com/tmux-python/tmuxp.git install stable .. code-block:: bash $ pip install --user tmuxp install dev .. code-block:: bash - $ git clone https://github.com/tony/tmuxp.git tmuxp + $ git clone https://github.com/tmux-python/tmuxp.git tmuxp $ cd ./tmuxp $ virtualenv .venv $ source .venv/bin/activate @@ -179,15 +179,15 @@ tests .. code-block:: bash :alt: Python Package :target: http://badge.fury.io/py/tmuxp -.. |build-status| image:: https://img.shields.io/travis/tony/tmuxp.svg +.. |build-status| image:: https://img.shields.io/travis/tmux-python/tmuxp.svg :alt: Build Status - :target: https://travis-ci.org/tony/tmuxp + :target: https://travis-ci.org/tmux-python/tmuxp -.. |coverage| image:: https://codecov.io/gh/tony/tmuxp/branch/master/graph/badge.svg +.. |coverage| image:: https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg :alt: Code Coverage - :target: https://codecov.io/gh/tony/tmuxp + :target: https://codecov.io/gh/tmux-python/tmuxp -.. |license| image:: https://img.shields.io/github/license/tony/tmuxp.svg +.. |license| image:: https://img.shields.io/github/license/tmux-python/tmuxp.svg :alt: License .. |docs| image:: https://readthedocs.org/projects/tmuxp/badge/?version=latest diff --git a/doc/about.rst b/doc/about.rst index f3e6cb2487..b89cb4f3ab 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -21,7 +21,7 @@ Interested in some kung-fu or joining the effort? :ref:`api` and :ref:`developing`. `BSD-licensed`_. Code on `github -`_. +`_. .. _Bugsnag: https://blog.bugsnag.com/benefits-of-using-tmux/ .. _Pragmatic Coders: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ @@ -106,10 +106,10 @@ Minor tweaks - ``$ tmuxp -L``, ``$ tmuxp -S`` for sockets and ``$ tmuxp -f`` for config file. -.. _attempt at 1.7 test: https://travis-ci.org/tony/tmuxp/jobs/12348263 +.. _attempt at 1.7 test: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 .. _kaptan: https://github.com/emre/kaptan .. _BSD-licensed: http://opensource.org/licenses/BSD-3-Clause .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil .. _ERB: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html -.. _edit this page: https://github.com/tony/tmuxp/edit/master/doc/about.rst +.. _edit this page: https://github.com/tmux-python/tmuxp/edit/master/doc/about.rst diff --git a/doc/conf.py b/doc/conf.py index cc1dcce670..6e1f599cc9 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -30,8 +30,8 @@ releases_unstable_prehistory = True releases_document_name = "history" -releases_issue_uri = "https://github.com/tony/tmuxp/issues/%s" -releases_release_uri = "https://github.com/tony/tmuxp/tree/v%s" +releases_issue_uri = "https://github.com/tmux-python/tmuxp/issues/%s" +releases_release_uri = "https://github.com/tmux-python/tmuxp/tree/v%s" templates_path = ['_templates'] @@ -66,7 +66,7 @@ html_theme_options = { 'logo': 'img/tmuxp.svg', - 'github_user': 'tony', + 'github_user': 'tmux-python', 'github_repo': 'tmuxp', 'github_type': 'star', 'github_banner': True, diff --git a/doc/developing.rst b/doc/developing.rst index 55def7bfbc..9ba99712f7 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -26,7 +26,7 @@ To begin developing, check out the code from github: .. code-block:: bash - $ git clone git@github.com:tony/tmuxp.git + $ git clone git@github.com:tmux-python/tmuxp.git $ cd tmuxp Now create a virtualenv, if you don't know how to, you can create a @@ -201,6 +201,6 @@ e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test `` .. _py.test usage argument: https://pytest.org/latest/usage.html .. _entr: http://entrproject.org/ .. _travis-ci: http://www.travis-ci.org -.. _travis build site: http://www.travis-ci.org/tony/tmuxp -.. _.travis.yml: https://github.com/tony/tmuxp/blob/master/.travis.yml -.. _issue on github: https://github.com/tony/tmuxp/issues +.. _travis build site: http://www.travis-ci.org/tmux-python/tmuxp +.. _.travis.yml: https://github.com/tmux-python/tmuxp/blob/master/.travis.yml +.. _issue on github: https://github.com/tmux-python/tmuxp/issues diff --git a/doc/examples.rst b/doc/examples.rst index 04941b2998..4204a1ac5e 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -194,7 +194,7 @@ example. If you have a special case and would like to see behavior changed, please make a ticket on the `issue tracker`_. -.. _issue tracker: https://github.com/tony/tmuxp/issues +.. _issue tracker: https://github.com/tmux-python/tmuxp/issues YAML ~~~~ @@ -481,4 +481,4 @@ Kung fu Add yours? Submit a pull request to the `github`_ site! -.. _github: https://github.com/tony/tmuxp +.. _github: https://github.com/tmux-python/tmuxp diff --git a/setup.py b/setup.py index bfaf71dd57..6ca72dbc87 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -"""tmuxp lives at .""" +"""tmuxp lives at .""" import sys from setuptools import setup @@ -38,7 +38,7 @@ def run_tests(self): setup( name=about['__title__'], version=about['__version__'], - url='http://github.com/tony/tmuxp/', + url='http://github.com/tmux-python/tmuxp/', download_url='https://pypi.python.org/pypi/tmuxp', license=about['__license__'], author=about['__author__'], diff --git a/tests/fixtures/workspacebuilder/regression_00132_dots.yaml b/tests/fixtures/workspacebuilder/regression_00132_dots.yaml index c97e9514e0..d05857c38c 100644 --- a/tests/fixtures/workspacebuilder/regression_00132_dots.yaml +++ b/tests/fixtures/workspacebuilder/regression_00132_dots.yaml @@ -1,4 +1,4 @@ -# regression for https://github.com/tony/tmuxp/issues/132 +# regression for https://github.com/tmux-python/tmuxp/issues/132 session_name: dot.session-name windows: - layout: main-vertical diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 959ae3d2ac..66cd09e484 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -135,7 +135,7 @@ def test_focus_pane_index(session): @pytest.mark.skip( reason=''' Test needs to be rewritten, assertion not reliable across platforms -and CI. See https://github.com/tony/tmuxp/issues/310. +and CI. See https://github.com/tmux-python/tmuxp/issues/310. '''.strip() ) def test_suppress_history(session): @@ -551,7 +551,7 @@ def test_start_directory_relative(session, tmpdir): def test_pane_order(session): """Pane ordering based on position in config and ``pane_index``. - Regression test for https://github.com/tony/tmuxp/issues/15. + Regression test for https://github.com/tmux-python/tmuxp/issues/15. """ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index bea820cb8c..7c02385a93 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -68,7 +68,7 @@ def set_layout_hook(session, hook_name): References: - - tmuxp issue: https://github.com/tony/tmuxp/issues/309 + - tmuxp issue: https://github.com/tmux-python/tmuxp/issues/309 - tmux issue: https://github.com/tmux/tmux/issues/1106 tmux 2.6+ requires that the window be viewed with the client before From b9d2aff1dc61b6510a8c3a3e7414551a5893383d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 11 Mar 2018 17:09:35 -0500 Subject: [PATCH 0242/2998] Update libtmux from 0.7.8 to 0.8.0 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 43f84451a9..8cb8739ae7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 -libtmux==0.7.8 +libtmux==0.8.0 click==6.7 colorama==0.3.9 From a5f04e15ee88736bc52f9d2ca1de0298396c0a7d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 18:14:33 -0500 Subject: [PATCH 0243/2998] update Pipfile pins for libtmux and pytest --- Pipfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index 916ce96c32..b52f94b6b5 100644 --- a/Pipfile +++ b/Pipfile @@ -12,14 +12,14 @@ name = "pypi" [dev-packages] kaptan = ">=0.5.7" -libtmux = "==0.7.8" +libtmux = "==0.8.0" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.19" aafigure = "==0.6" -pytest = "==3.2.3" -pytest-rerunfailures = "==3.1" +pytest = "==3.4.2" +pytest-rerunfailures = "==4.0" releases = "==1.4.0" sphinx = "==1.7.1" "e1839a8" = {path = ".", editable = true} From 1fbb4f14779f8a5cf2f2e525491a12c171fab59f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 18:15:16 -0500 Subject: [PATCH 0244/2998] update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 7e352d98fd..75cd00c00f 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`-` Bump libtmux to 0.8.0 - :support:`348 backported` Continuous integration updates and fixes for Travis CI - Update builds to use trusty From 2368e54167b6265ee8ef20a7f0b0ecc7083f0dfe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 18:48:55 -0500 Subject: [PATCH 0245/2998] add .pytest_cache/ to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c6bbbb131a..b9fb00920e 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ nosetests.xml coverage.xml *,cover .hypothesis/ +.pytest_cache/ # Translations *.mo From d3014be0932d3cb499ab4d867f88f9804fa7c694 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 20:14:04 -0500 Subject: [PATCH 0246/2998] Revert "Add tmux 1.8 installation instructions for Ubuntu 12.04/12.10/13.04." This reverts commit acd882cf182b9ec98b9f592a6b89c7101eeba4a6. --- doc/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 7c58ccdbe0..380c8edae1 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -7,7 +7,7 @@ Quickstart Installation ------------ -Assure you have at least tmux **>= 1.8** and python **>= 2.6**. For Ubuntu 12.04/12.10/13.04 users, you can download the tmux 1.8 package for Ubuntu 13.10 from `https://launchpad.net/ubuntu/+source/tmux `_ and install it using dpkg. +Assure you have at least tmux **>= 1.8** and python **>= 2.6**. .. code-block:: bash From 4de5480bbfe1079126fc7a201fc8c969a326fae6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 20:22:37 -0500 Subject: [PATCH 0247/2998] lowercase t in tmux --- doc/about_tmux.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 9fe7433f57..150353f357 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -18,7 +18,7 @@ In the world of computers, there are 2 realms: 1. The text realm 2. The graphical realm -Tmux resides in the text realm. This is about fixed-width fonts and that +tmux resides in the text realm. This is about fixed-width fonts and that old fashioned black terminal. tmux is to the console what a desktop is to gui apps. It's a world inside @@ -216,7 +216,7 @@ Multitasking. Preserving the thinking you have. Installing tmux =============== -Tmux is packaged on most Linux and BSD systems. +tmux is packaged on most Linux and BSD systems. For the freshest results on how to get tmux installed on your system, "How to install tmux on " will do, as directions change and are From a6cc92e172ce9f4e23bc95170aa8b0ce3fd580cc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 20:24:29 -0500 Subject: [PATCH 0248/2998] update LICENSE to MIT, copyright year 2018, fixes #264 --- LICENSE | 40 +++++++++++++++++----------------------- README.rst | 4 ++-- doc/about.rst | 4 ++-- setup.py | 2 +- tmuxp/__about__.py | 4 ++-- tmuxp/__init__.py | 4 ++-- 6 files changed, 26 insertions(+), 32 deletions(-) diff --git a/LICENSE b/LICENSE index f126c40163..cb72c79135 100644 --- a/LICENSE +++ b/LICENSE @@ -1,27 +1,21 @@ -Copyright (c) 2013-2018, Tony Narlock -All rights reserved. +MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2013-2018 tmuxp contributors -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -* Neither the name of libtmux nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.rst b/README.rst index c815cc61d4..931ef83795 100644 --- a/README.rst +++ b/README.rst @@ -149,7 +149,7 @@ Travis http://travis-ci.org/tmux-python/tmuxp Test Coverage https://codecov.io/gh/tmux-python/tmuxp pypi https://pypi.python.org/pypi/tmuxp Open Hub https://www.openhub.net/p/tmuxp -License `BSD`_. +License `MIT`_. git repo .. code-block:: bash $ git clone https://github.com/tmux-python/tmuxp.git @@ -171,7 +171,7 @@ tests .. code-block:: bash $ make test ============== ========================================================== -.. _BSD: http://opensource.org/licenses/BSD-3-Clause +.. _MIT: http://opensource.org/licenses/MIT .. _developing and testing: http://tmuxp.git-pull.com/en/latest/developing.html .. _Amazon Kindle: http://amzn.to/2gPfRhC diff --git a/doc/about.rst b/doc/about.rst index b89cb4f3ab..06fc9297ee 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -20,7 +20,7 @@ To jump right in, see :ref:`quickstart` and :ref:`examples`. Interested in some kung-fu or joining the effort? :ref:`api` and :ref:`developing`. -`BSD-licensed`_. Code on `github +`MIT-licensed`_. Code on `github `_. .. _Bugsnag: https://blog.bugsnag.com/benefits-of-using-tmux/ @@ -108,7 +108,7 @@ Minor tweaks .. _attempt at 1.7 test: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 .. _kaptan: https://github.com/emre/kaptan -.. _BSD-licensed: http://opensource.org/licenses/BSD-3-Clause +.. _MIT-licensed: http://opensource.org/licenses/MIT .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil .. _ERB: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html diff --git a/setup.py b/setup.py index 6ca72dbc87..169c329a38 100644 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ def run_tests(self): entry_points=dict(console_scripts=['tmuxp=tmuxp:cli.cli']), classifiers=[ 'Development Status :: 5 - Production/Stable', - "License :: OSI Approved :: BSD License", + "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", 'Environment :: Web Environment', diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 296ba477f0..95d387b487 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -4,5 +4,5 @@ __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' -__license__ = 'BSD' -__copyright__ = 'Copyright 2013-2017 Tony Narlock' +__license__ = 'MIT' +__copyright__ = 'Copyright 2013-2018 Tony Narlock' diff --git a/tmuxp/__init__.py b/tmuxp/__init__.py index ebbc66ee45..ec29bc8e68 100644 --- a/tmuxp/__init__.py +++ b/tmuxp/__init__.py @@ -5,8 +5,8 @@ tmuxp ~~~~~ -:copyright: Copyright 2013-2017 Tony Narlock. -:license: BSD, see LICENSE for details +:copyright: Copyright 2013-2018 Tony Narlock. +:license: MIT, see LICENSE for details """ from __future__ import absolute_import, division, print_function, \ From 17c3f759358ceeb9286272e9e19c402c1d28b5c1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 20:25:12 -0500 Subject: [PATCH 0249/2998] update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 75cd00c00f..0a54450a9a 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ Changelog Here you can find the recent changes to tmuxp - :support:`-` Bump libtmux to 0.8.0 +- :support:`264` Update license from BSD to MIT - :support:`348 backported` Continuous integration updates and fixes for Travis CI - Update builds to use trusty From daa2352882e604913448c85737ad902cf33060b4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 11 Mar 2018 20:25:52 -0500 Subject: [PATCH 0250/2998] release v1.4.0 --- CHANGES | 1 + tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 0a54450a9a..88161fd2e6 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.4.0 <2018-03-11>` - :support:`-` Bump libtmux to 0.8.0 - :support:`264` Update license from BSD to MIT - :support:`348 backported` Continuous integration updates and fixes for Travis CI diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 95d387b487..8b6fddfc48 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.3.5' +__version__ = '1.4.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From b404dab8a69f6114ac4415bd035c205b53162b06 Mon Sep 17 00:00:00 2001 From: Anton Backer Date: Sun, 25 Mar 2018 14:02:46 -0700 Subject: [PATCH 0251/2998] Fix the --help string for `tmuxp freeze -S` and `tmux load -S` --- tmuxp/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7c02385a93..d206c76a6e 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -444,7 +444,7 @@ def startup(config_dir): @cli.command(name='freeze') @click.argument('session_name', nargs=1) -@click.option('-S', 'socket_path', help='pass-through for tmux -L') +@click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') def command_freeze(session_name, socket_name, socket_path): """Snapshot a session into a config. @@ -537,7 +537,7 @@ def command_freeze(session_name, socket_name, socket_path): @click.pass_context @click.argument('config', click.Path(exists=True), nargs=-1, callback=scan_config_argument) -@click.option('-S', 'socket_path', help='pass-through for tmux -L') +@click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option('-d', 'detached', From c5f3f8a323d005cfa168e4400b3b6fd339587cd8 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 23 Mar 2018 09:34:57 -0500 Subject: [PATCH 0252/2998] Update pytest from 3.4.2 to 3.5.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index aa2ce80f60..f728f12f6e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.4.2 +pytest==3.5.0 pytest-rerunfailures==4.0 From d0345b735c786b6b786f94866e701e1120425c0b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 21 Mar 2018 18:32:55 -0500 Subject: [PATCH 0253/2998] Update sphinx from 1.7.1 to 1.7.2 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 458a7cb402..c4a4b8d92c 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.1 +sphinx==1.7.2 alagitpull==0.0.19 releases==1.4.0 aafigure==0.6 From 48bfc7c1c6423d89ccf67e932b00f8a425a880af Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 28 Mar 2018 14:34:09 -0500 Subject: [PATCH 0254/2998] Update releases from 1.4.0 to 1.4.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index c4a4b8d92c..337b37a639 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,5 +2,5 @@ docutils==0.14 sphinx==1.7.2 alagitpull==0.0.19 -releases==1.4.0 +releases==1.4.1 aafigure==0.6 From e9c125542ba248e632cf5dd57a5ab067c89be3a2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 07:53:40 -0500 Subject: [PATCH 0255/2998] update Pipfile dependencies with requirements/ --- Pipfile | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index b52f94b6b5..e9a8338907 100644 --- a/Pipfile +++ b/Pipfile @@ -1,16 +1,11 @@ [[source]] - url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" - [packages] - - [dev-packages] - kaptan = ">=0.5.7" libtmux = "==0.8.0" click = "==6.7" @@ -18,8 +13,11 @@ colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.19" aafigure = "==0.6" -pytest = "==3.4.2" +pytest = "==3.5.0" pytest-rerunfailures = "==4.0" -releases = "==1.4.0" -sphinx = "==1.7.1" +releases = "==1.4.1" +Sphinx = "==1.7.2" "e1839a8" = {path = ".", editable = true} +isort = "==4.3.4" +"flake8" = "==3.5.0" +vulture = "==0.26" From 16490ba9ba157acbed9e5a391d52d50f476f2191 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 08:30:07 -0500 Subject: [PATCH 0256/2998] docs: update sphinx output with python files updated --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 8b553a7897..cf76db1b3d 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,6 +1,6 @@ # Makefile for Sphinx documentation # -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py\|.*[.]py$$' 2> /dev/null PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8031 From b8d66f08d4c12ce21527d0befc6ddfafb9e06485 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 08:31:50 -0500 Subject: [PATCH 0257/2998] add sphinxcontrib-napoleon package --- Pipfile | 1 + requirements/doc.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/Pipfile b/Pipfile index e9a8338907..f91c748b97 100644 --- a/Pipfile +++ b/Pipfile @@ -21,3 +21,4 @@ Sphinx = "==1.7.2" isort = "==4.3.4" "flake8" = "==3.5.0" vulture = "==0.26" +sphinxcontrib-napoleon = "==0.6.1" diff --git a/requirements/doc.txt b/requirements/doc.txt index 337b37a639..d2cadc5fc8 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,3 +4,4 @@ sphinx==1.7.2 alagitpull==0.0.19 releases==1.4.1 aafigure==0.6 +sphinxcontrib-napoleon==0.6.1 From 6d0ada58ee19339837404f57f2b0f10bbe77a258 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 08:53:23 -0500 Subject: [PATCH 0258/2998] add sphinxcontrib.napoleon to sphinx config --- doc/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/conf.py b/doc/conf.py index 6e1f599cc9..7388b63697 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -23,6 +23,7 @@ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', + 'sphinxcontrib.napoleon', 'aafig', 'releases', 'alagitpull', From 972058f3033c921eada1cdd1eb12d76f4464f009 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 08:56:51 -0500 Subject: [PATCH 0259/2998] move cli.load_workspace to numpy format --- tmuxp/cli.py | 150 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 125 insertions(+), 25 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index d206c76a6e..167686caae 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -270,47 +270,146 @@ def scan_config(config, config_dir=None): return config +def _reattach(session): + """ + Reattach session (depending on env being inside tmux already or not) + + Parameters + ---------- + session : :class:`libtmux.Session` + + Notes + ----- + If ``TMUX`` environmental variable exists in the environment this script is + running, that means we're in a tmux client. So ``tmux switch-client`` will + load the session. + + If not, ``tmux attach-session`` loads the client to the target session. + """ + if 'TMUX' in os.environ: + session.switch_client() + + else: + session.attach_session() + + def load_workspace( config_file, socket_name=None, socket_path=None, colors=None, - attached=None, detached=None, answer_yes=False + detached=False, answer_yes=False ): - """Build config workspace. - - :param config_file: full path to config file - :param type: str - + """ + Load a tmux "workspace" session via tmuxp file. + + Parameters + ---------- + config_file : str + absolute path to config file + socket_name : str, optional + ``tmux -L `` + socket_path: str, optional + ``tmux -S `` + colors : str, optional + '-2' + Force tmux to support 256 colors + detached : bool + Force detached state. default False. + answer_yes : bool + Assume yes when given prompt. default False. + + Notes + ----- + + tmuxp will check and load a configuration file. The file will use kaptan + to load a JSON/YAML into a :py:obj:`dict`. Then :func:`config.expand` and + :func:`config.trickle` will be used to expand any shorthands, template + variables, or file paths relative to where the config/script is executed + from. + + :func:`config.expand` accepts the directory of the config file, so the + user's configuration can resolve absolute paths relative to where the + config file is. In otherwords, if a config file at */var/moo/hi.yaml* + has *./* in its configs, we want to be sure any file path with *./* is + relative to */var/moo*, not the user's PWD. + + A :class:`libtmux.Server` object is created. No tmux server is started yet, + just the object. + + The prepared configuration and the server object is passed into an instance + of :class:`tmuxp.WorkspaceBuilder`. + + A sanity check against :func:`libtmux.common.which` is ran. It will raise + an exception if tmux isn't found. + + If a tmux session under the same name as ``session_name`` in the tmuxp + configuration exists, tmuxp offers to attach the session. Currently, tmuxp + does not allow appending a workspace / incremental building on top of a + current session (pull requests are welcome!). + + :meth:`tmuxp.WorkspaceBuilder.build` will build the session in the + background via using tmux's detached state (``-d``). + + After the session (workspace) is built, unless the user decided to load + the session in the background via ``tmuxp -d`` (which is in the spirit + of tmux's ``-d``), we need to prompt the user to attach the session. + + If the user is already inside a tmux client, which we detect via the + ``TMUX`` environment variable bring present, we will prompt the user to + switch their current client to it. + + If they're outside of tmux client - in a plain-old PTY - we will + automatically ``attach``. + + If an exception is raised during the building of the workspace, tmuxp will + prompt to cleanup (``$ tmux kill-session``) the session on the user's + behalf. An exception raised during this process means it's not easy to + predict how broken the session is. + + .. versionchanged:: tmux 2.6+ + + In tmux 2.6, the way layout and proportion's work when interfacing + with tmux in a detached state (outside of a client) changed. Since + tmuxp builds workspaces in a detached state, the WorkspaceBuilder isn't + able to rely on functionality requiring awarness of session geometry, + e.g. ``set-layout``. + + Thankfully, tmux is able to defer commands to run after the user + performs certain actions, such as loading a client via + ``attach-session`` or ``switch-client``. + + Upon client switch, ``client-session-changed`` is triggered [1]_. + + References + ---------- + .. [1] cmd-switch-client.c hook. GitHub repo for tmux. + https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132. + Accessed April 8th, 2018. """ # get the canonical path, eliminating any symlinks config_file = os.path.realpath(config_file) + # kaptan allows us to open a yaml or json file as a dict sconfig = kaptan.Kaptan() sconfig = sconfig.import_config(config_file).get() - # expands configurations relative to config / profile file location + # shapes configurations relative to config / profile file location sconfig = config.expand(sconfig, os.path.dirname(config_file)) + # propagate config inheritance (e.g. session -> window, window -> pane) sconfig = config.trickle(sconfig) - t = Server( + t = Server( # create tmux server object socket_name=socket_name, socket_path=socket_path, colors=colors ) - try: + which('tmux') # raise exception if tmux not found + + try: # load WorkspaceBuilder object for tmuxp config / tmux server builder = WorkspaceBuilder(sconf=sconfig, server=t) except exc.EmptyConfigException: click.echo('%s is empty or parsed no config data' % config_file, err=True) return - which('tmux') - - def reattach(session): - if 'TMUX' in os.environ: - session.switch_client() - - else: - session.attach_session() - session_name = sconfig['session_name'] if builder.session_exists(session_name): if not detached and ( @@ -318,29 +417,30 @@ def reattach(session): '%s is already running. Attach?' % click.style(session_name, fg='green'), default=True) ): - reattach(builder.session) + _reattach(builder.session) return try: click.echo( click.style('[Loading] ', fg='green') + - click.style(config_file, fg='blue', bold=True)) - builder.build() + click.style(config_file, fg='blue', bold=True) + ) + + builder.build() # load tmux session via workspace builder if 'TMUX' in os.environ: # tmuxp ran from inside tmux if not detached and (answer_yes or click.confirm( 'Already inside TMUX, switch to session?' )): + # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' tmux_env = os.environ.pop('TMUX') if has_gte_version('2.6'): - # if using -d from inside tmux session + switching inside - # https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132 set_layout_hook(builder.session, 'client-session-changed') - builder.session.switch_client() + builder.session.switch_client() # switch client to new session - os.environ['TMUX'] = tmux_env + os.environ['TMUX'] = tmux_env # set TMUX back again return builder.session else: # session created in the background, from within tmux if has_gte_version('2.6'): # prepare for both cases From 79ecaf7ae0d3d31976f6be5cf60fa1322f2f4685 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 08:57:10 -0500 Subject: [PATCH 0260/2998] add tmuxp.load_workspace to api docs --- doc/api.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/api.rst b/doc/api.rst index b13db0ecdb..d9b875c03e 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -15,6 +15,11 @@ Internals .. automethod:: tmuxp.util.run_before_script +CLI +--- + +.. automethod:: tmuxp.cli._reattach +.. automethod:: tmuxp.cli.load_workspace Configuration ------------- From 7e6f2c938cd6e9ebbccafa72db5979df0a113b50 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:03:19 -0500 Subject: [PATCH 0261/2998] Fix api doc link, move conditional under else --- tmuxp/cli.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 167686caae..3036a487e7 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -337,7 +337,7 @@ def load_workspace( The prepared configuration and the server object is passed into an instance of :class:`tmuxp.WorkspaceBuilder`. - A sanity check against :func:`libtmux.common.which` is ran. It will raise + A sanity check against :meth:`libtmux.common.which` is ran. It will raise an exception if tmux isn't found. If a tmux session under the same name as ``session_name`` in the tmuxp @@ -411,6 +411,9 @@ def load_workspace( return session_name = sconfig['session_name'] + + # if the session already exists, prompt the user to attach. tmuxp doesn't + # support incremental session building or appending (yet, PR's welcome!) if builder.session_exists(session_name): if not detached and ( answer_yes or click.confirm( @@ -448,18 +451,16 @@ def load_workspace( set_layout_hook(builder.session, 'client-session-changed') sys.exit('Session created in detached state.') + else: # tmuxp ran from inside tmux + if has_gte_version('2.6'): + # if attaching for first time + set_layout_hook(builder.session, 'client-attached') - # below: tmuxp ran outside of tmux - - if has_gte_version('2.6'): - # if attaching for first time - set_layout_hook(builder.session, 'client-attached') + # for cases where user switches client for first time + set_layout_hook(builder.session, 'client-session-changed') - # for cases where user switches client for first time - set_layout_hook(builder.session, 'client-session-changed') - - if not detached: - builder.session.attach_session() + if not detached: + builder.session.attach_session() except exc.TmuxpException as e: import traceback From e30fdabca4eb6dfbbc0fb08b1e5a56b18f147b48 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:15:20 -0500 Subject: [PATCH 0262/2998] update CHANGES --- CHANGES | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES b/CHANGES index 88161fd2e6..906eed9431 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,18 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`-` Add sphinxcontrib-napoleon. +- :support:`-` Assure *requirements/dev.txt* dependencies are in *Pipfile* +- :support:`-` Update sphinx, releases to latest version +- :support:`-` Sync *requirements/\*.txt* dependencies with *Pipfile*. +- :support:`-` Update docstring style to use numpy-style documentation. + This enhances readability and plays nicely with sphinx documentation. +- :support:`-` Documentation overhaul. + + - Areas like :meth:`tmuxp.cli.load_workspace` are now documented verbosely. + This is so contributors helping on the project can more quickly gain + situational awareness in this tricky area of code. + - :release:`1.4.0 <2018-03-11>` - :support:`-` Bump libtmux to 0.8.0 - :support:`264` Update license from BSD to MIT From c0713a919b1c1b5445fc30035dd8c4fc5f6f8d80 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:18:21 -0500 Subject: [PATCH 0263/2998] add click to intersphinx --- doc/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 7388b63697..c10cecffd3 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -104,7 +104,8 @@ intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'libtmux': ('https://libtmux.readthedocs.io/en/latest', None) + 'libtmux': ('https://libtmux.readthedocs.io/en/latest', None), + 'click': ('http://click.pocoo.org/5', None) } # aafig format, try to get working with pdf From 68975eacf93d50709d56f773d39dae3907e47fe1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:20:41 -0500 Subject: [PATCH 0264/2998] move _validate_choices to numpy format --- tmuxp/cli.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3036a487e7..02a3e328d0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -46,12 +46,22 @@ def get_teamocil_dir(): def _validate_choices(options): - """Callback wrapper for validating click.prompt input. + """ + Callback wrapper for validating click.prompt input. + + Parameters + ---------- + options : list + List of allowed choices + + Returns + ------- + :func:`callable` + callback function for value_proc in :func:`click.prompt`. - :param options: List of allowed choices - :type options: list - :rtype: func - :returns: function for value_proc in :func:`click.prompt`. + Raises + ------ + :class:`click.BadParameter` """ def func(value): From 04ffd3f91ac6fa7263a5fe211f7027b5b971f2c8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:20:58 -0500 Subject: [PATCH 0265/2998] add _validate_choices to api docs --- doc/api.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/api.rst b/doc/api.rst index d9b875c03e..e486dc0ed2 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -20,6 +20,7 @@ CLI .. automethod:: tmuxp.cli._reattach .. automethod:: tmuxp.cli.load_workspace +.. automethod:: tmuxp.cli._validate_choices Configuration ------------- From 42284008a8e85513359d83a7ef197adeb9393c3d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:53:58 -0500 Subject: [PATCH 0266/2998] document get_*_dir, check for TMUXINATOR_CONFIG --- tmuxp/cli.py | 83 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 02a3e328d0..883902fb21 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -26,22 +26,61 @@ logger = logging.getLogger(__name__) +def get_cwd(): + return os.getcwd() + + def get_config_dir(): + """ + Return tmuxp configuration directory. + + Checks for ``TMUXP_CONFIGDIR`` environmental variable. + + Returns + ------- + str : + absolute path to tmuxp config directory + """ if 'TMUXP_CONFIGDIR' in os.environ: return os.path.expanduser(os.environ['TMUXP_CONFIGDIR']) return os.path.expanduser('~/.tmuxp/') -def get_cwd(): - return os.getcwd() +def get_tmuxinator_dir(): + """ + Return tmuxinator configuration directory. + Checks for ``TMUXINATOR_CONFIG`` environmental variable. + + Returns + ------- + str : + absolute path to tmuxinator config directory + + See Also + -------- + :meth:`tmuxp.config.import_tmuxinator` + """ + if 'TMUXINATOR_CONFIG' in os.environ: + return os.path.expanduser(os.environ['TMUXINATOR_CONFIG']) -def get_tmuxinator_dir(): return os.path.expanduser('~/.tmuxinator/') def get_teamocil_dir(): + """ + Return teamocil configuration directory. + + Returns + ------- + str : + absolute path to teamocil config directory + + See Also + -------- + :meth:`tmuxp.config.import_teamocil` + """ return os.path.expanduser('~/.teamocil/') @@ -197,13 +236,8 @@ def _resolve_path_no_overwrite(config): def scan_config(config, config_dir=None): - """Return the real config path or raise an exception. - - :param config: config file, valid examples: - - a file name, myconfig.yaml - - relative path, ../config.yaml or ../project - - a period, . - :type config: str + """ + Return the real config path or raise an exception. If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If one or more found, it will warn and pick the first. @@ -217,7 +251,18 @@ def scan_config(config, config_dir=None): it will scan for file name with yaml, yml and json. If multiple exist, it will warn and pick the first. - :raises: :class:`click.exceptions.FileError` + Parameters + ---------- + config : str + config file, valid examples: + + - a file name, myconfig.yaml + - relative path, ../config.yaml or ../project + - a period, . + + Raises + ------ + :class:`click.exceptions.FileError` """ if not config_dir: config_dir = get_config_dir() @@ -524,15 +569,21 @@ def cli(log_level): def setup_logger(logger=None, level='INFO'): - """Setup logging for CLI use. + """ + Setup logging for CLI use. - :param logger: instance of logger - :type logger: :py:class:`Logger` + Tries to do some conditionals to prevent handlers from being added twice. + Just to be safe. + Parameters + ---------- + logger : :py:class:`Logger` + logger instance for tmuxp """ - if not logger: + if not logger: # if no logger exists, make one logger = logging.getLogger() - if not logger.handlers: + + if not logger.handlers: # setup logger handlers channel = logging.StreamHandler() channel.setFormatter(log.DebugLogFormatter()) From 9e3b376963c84d8ab515071fdcdb20ceb661b551 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 09:55:29 -0500 Subject: [PATCH 0267/2998] add get_*_dir to documentation --- doc/api.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/api.rst b/doc/api.rst index e486dc0ed2..7be72acca0 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -19,6 +19,9 @@ CLI --- .. automethod:: tmuxp.cli._reattach +.. automethod:: tmuxp.cli.get_config_dir +.. automethod:: tmuxp.cli.get_teamocil_dir +.. automethod:: tmuxp.cli.get_tmuxinator_dir .. automethod:: tmuxp.cli.load_workspace .. automethod:: tmuxp.cli._validate_choices From 9e0981cd55c0437bec6e5da793b74e3cc09c1be3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 14:45:22 -0500 Subject: [PATCH 0268/2998] rm extra space in inline literal --- doc/developing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/developing.rst b/doc/developing.rst index 9ba99712f7..82c30e8489 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -193,7 +193,7 @@ Testing options ``RETRY_TIMEOUT_SECONDS`` can be toggled if certain workspace builder tests are being stubborn. -e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test `` +e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test`` .. literalinclude:: ../.travis.yml :language: yaml From b65c8af1b6a55b66554e7b05b991e6ed4d8fe083 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 14:55:10 -0500 Subject: [PATCH 0269/2998] manually enter dimensions for tao of tmux cover --- doc/about_tmux.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 150353f357..2840402548 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -4,7 +4,7 @@ The Tao of tmux ############### -.. figure:: _static/tao-tmux-screenshot.png +.. figure:: /_static/tao-tmux-screenshot.png :scale: 60% :align: center @@ -660,6 +660,8 @@ The Book .. figure:: https://s3.amazonaws.com/titlepages.leanpub.com/the-tao-of-tmux/large :scale: 100% + :width: 301 + :height: 390 :align: left :target: https://leanpub.com/the-tao-of-tmux :alt: The Tao of tmux From 1b13cf1b62d550a1e943eb8a249372d00bb9ad6e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 14:56:10 -0500 Subject: [PATCH 0270/2998] will this fix the favicon not found message? --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index c10cecffd3..69bf37d6f0 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -51,7 +51,7 @@ pygments_style = 'sphinx' html_theme_path = [alagitpull.get_path()] -html_favicon = 'favicon.ico' +html_favicon = '_static/favicon.ico' html_theme = 'alagitpull' html_static_path = ['_static'] html_sidebars = { From 13d042c08d0c5119f98c6caaa1842aff57c49624 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Apr 2018 14:58:01 -0500 Subject: [PATCH 0271/2998] rm deprecate ref --- CHANGES | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES b/CHANGES index 906eed9431..cac6ca36ae 100644 --- a/CHANGES +++ b/CHANGES @@ -444,7 +444,6 @@ Here you can find the recent changes to tmuxp autocompletion and when loading. Note, switching client into another socket may cause an error. - Documentation tweaking to :ref:`API`, :ref:`about_tmux`. -- New :ref:`roadmap`. - `pep257`_, `pep8`_. - :release:`0.1-dev <2013-11-04>` From c9dcb093540c1de5b980fec7fd0f61dedafea4c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Apr 2018 10:08:40 -0500 Subject: [PATCH 0272/2998] Port more docs to numpy format --- tmuxp/cli.py | 33 ++++++++++++++++++++++++--------- tmuxp/log.py | 13 ++++++++++--- tmuxp/workspacebuilder.py | 29 +++++++++++++++++------------ 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 883902fb21..264a05c022 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -136,10 +136,12 @@ def set_layout_hook(session, hook_name): Also, the hooks are set immediately unbind after they're invoked via -u. - :param session: session to bind hook to - :type session: :class:`libtmux.session.Session` - :param hook_name: hook name to bind to, e.g. 'client-attached' - :type hook_name: str + Parameters + ---------- + session : :class:`libtmux.session.Session` + session to bind hook to + hook_name : str + hook name to bind to, e.g. 'client-attached' """ cmd = [ 'set-hook', @@ -175,7 +177,19 @@ def set_layout_hook(session, hook_name): def is_pure_name(path): - """Return True if path is a name and not a file path.""" + """ + Return True if path is a name and not a file path. + + Parameters + ---------- + path : str + Path (can be absolute, relative, etc.) + + Returns + ------- + bool + True if path is a name of config in config dir, not file path. + """ return ( not os.path.isabs(path) and len(os.path.dirname(path)) == 0 and @@ -593,11 +607,12 @@ def setup_logger(logger=None, level='INFO'): def startup(config_dir): - """Initialize CLI. - - :param get_config_dir(): Config directory to search - :type get_config_dir(): string + """ + Initialize CLI. + Parameters + ---------- + str : get_config_dir(): Config directory to search """ if not os.path.exists(config_dir): diff --git a/tmuxp/log.py b/tmuxp/log.py index 7c7be63afc..a0eb4073b9 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -26,9 +26,16 @@ def default_log_template(self, record): """Return the prefix for the log message. Template for Formatter. - :param: record: :py:class:`logging.LogRecord` object. this is passed in - from inside the :py:meth:`logging.Formatter.format` record. - + Parameters + ---------- + :py:class:`logging.LogRecord` : + object. this is passed in from inside the + :py:meth:`logging.Formatter.format` record. + + Returns + ------- + str + template for logger message """ reset = Style.RESET_ALL diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 1b52a169f7..27fa06afd6 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -66,20 +66,23 @@ class WorkspaceBuilder(object): It handles the magic of cases where the user may want to start a session inside tmux (when `$TMUX` is in the env variables). - """ def __init__(self, sconf, server=None): - """Initialize workspace loading. - - :todo: initialize :class:`Session` from here, in ``self.session``. + """ + Initialize workspace loading. - :param sconf: session config, includes a :py:obj:`list` of ``windows``. - :type sconf: :py:obj:`dict` + Parameters + ---------- + sconf : dict + session config, includes a :py:obj:`list` of ``windows``. - :param server: - :type server: :class:`Server` + server : :class:`Server` + tmux server to build session in + Notes + ----- + TODO: Initialize :class:`Session` from here, in ``self.session``. """ if not sconf: @@ -107,16 +110,18 @@ def session_exists(self, session_name=None): return True def build(self, session=None): - """Build tmux workspace in session. + """ + Build tmux workspace in session. Optionally accepts ``session`` to build with only session object. Without ``session``, it will use :class:`Server` at ``self.server`` passed in on initialization to create a new Session object. - :param session: - session to build workspace in - :type session: :class:`Session` - + Parameters + ---------- + session : :class:`Session` + session to build workspace in """ if not session: From a5c4bd6ccd723ea3b0938ba569c87326b6b2d3e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Apr 2018 16:17:51 -0500 Subject: [PATCH 0273/2998] Move tmuxp.config over to numpy style docs --- tmuxp/config.py | 157 +++++++++++++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 56 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index c48f7aa01b..94b360620c 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -19,12 +19,17 @@ def validate_schema(sconf): - """Return True if config schema is correct. + """ + Return True if config schema is correct. - :param sconf: session configuration - :type sconf: dict - :rtype: bool + Parameters + ---------- + sconf : dict + session configuration + Returns + ------- + bool """ # verify session_name @@ -48,16 +53,20 @@ def validate_schema(sconf): def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): - """Return True if file has a valid config file type. - - :param filename: filename to check (e.g. ``mysession.json``). - :type filename: str - :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). - :type extensions: list or str - :rtype: bool - """ - + Return True if file has a valid config file type. + + Parameters + ---------- + filename : str + filename to check (e.g. ``mysession.json``). + extensions : str or list + filetypes to check (e.g. ``['.yaml', '.json']``). + + Returns + ------- + bool + """ extensions = [extensions] if isinstance( extensions, string_types) else extensions return any(filename.endswith(e) for e in extensions) @@ -67,14 +76,19 @@ def in_dir( config_dir=os.path.expanduser('~/.tmuxp'), extensions=['.yml', '.yaml', '.json'] ): - """Return a list of configs in ``config_dir``. - - :param config_dir: directory to search - :type config_dir: str - :param extensions: filetypes to check (e.g. ``['.yaml', '.json']``). - :type extensions: list - :rtype: list - + """ + Return a list of configs in ``config_dir``. + + Parameters + ---------- + config_dir : str + directory to search + extensions : list + filetypes to check (e.g. ``['.yaml', '.json']``). + + Returns + ------- + list """ configs = [] @@ -87,12 +101,15 @@ def in_dir( def in_cwd(): - """Return list of configs in current working directory. + """ + Return list of configs in current working directory. If filename is ``.tmuxp.py``, ``.tmuxp.json``, ``.tmuxp.yaml``. - :rtype: list - + Returns + ------- + list + configs in current working directory """ configs = [] @@ -104,26 +121,36 @@ def in_cwd(): def expandshell(_path): - """Return expanded path based on user's ``$HOME`` and ``env``. + """ + Return expanded path based on user's ``$HOME`` and ``env``. :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars` - :param _path: path to expand - :type _path: str - :returns: expanded path - :rtype: str + Parameters + ---------- + path : str + path to expand + Returns + ------- + str + path with shell variables expanded """ return os.path.expandvars(os.path.expanduser(_path)) def inline(sconf): - """ Return config in inline form, opposite of :meth:`config.expand`. + """ + Return config in inline form, opposite of :meth:`config.expand`. - :param sconf: unexpanded config file - :type sconf: dict - :rtype: dict + Parameters + ---------- + sconf : dict + Returns + ------- + dict + configuration with optional inlined configs. """ if ( @@ -170,16 +197,20 @@ def expand(sconf, cwd=None, parent=None): Kaptan will load JSON/YAML files into python dicts for you. - :param sconf: the configuration for the session - :type sconf: dict - :param cwd: directory to expand relative paths against. should be the dir - of the config directory. - :type cwd: str - :param parent: (used on recursive entries) start_directory of parent window - or session object. - :type parent: str - :rtype: dict - + Parameters + ---------- + sconf : dict + the configuration for the session + cwd : str + directory to expand relative paths against. should be the dir of the + config directory. + parent : str + (used on recursive entries) start_directory of parent window or session + object. + + Returns + ------- + dict """ # Note: cli.py will expand configs relative to project's config directory @@ -316,10 +347,14 @@ def trickle(sconf): level. shell_command_before trickles down and prepends the ``shell_command`` for the pane. - :param sconf: the session configuration - :type sconf: dict - :rtype: dict + Parameters + ---------- + sconf : dict + the session configuration. + Returns + ------- + dict """ # prepends a pane's ``shell_command`` list with the window and sessions' @@ -383,10 +418,14 @@ def import_tmuxinator(sconf): .. _tmuxinator: https://github.com/aziz/tmuxinator - :param sconf: python dict for session configuration - :type sconf: dict - :rtype: dict + Parameters + ---------- + sconf : dict + python dict for session configuration. + Returns + ------- + dict """ tmuxp_config = {} @@ -478,15 +517,21 @@ def import_teamocil(sconf): .. _teamocil: https://github.com/remiprev/teamocil - :todo: change 'root' to a cd or start_directory - :todo: width in pane -> main-pain-width - :todo: with_env_var - :todo: clear - :todo: cmd_separator + Parameters + ---------- + sconf : dict + python dict for session configuration + + Notes + ----- - :param sconf: python dict for session configuration - :type sconf: dict + Todos: + - change 'root' to a cd or start_directory + - width in pane -> main-pain-width + - with_env_var + - clear + - cmd_separator """ tmuxp_config = {} From 9c19086cc559a8ec0de310c5f1603f43ad3b16a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 08:56:50 -0500 Subject: [PATCH 0274/2998] add api doc for freeze function --- doc/api.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/api.rst b/doc/api.rst index 7be72acca0..4b16c10b22 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -58,6 +58,8 @@ Workspace Builder .. autoclass:: tmuxp.WorkspaceBuilder :members: +.. automethod:: tmuxp.workspacebuilder.freeze + Exceptions ---------- From a6d77924676152fd450f5a36f67335a93844cf7c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 08:57:30 -0500 Subject: [PATCH 0275/2998] update tmuxp.workspacebuilder to numpy-style --- tmuxp/workspacebuilder.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 27fa06afd6..1016f9edf3 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -337,12 +337,18 @@ def config_after_window(self, w, wconf): def freeze(session): - """Freeze live tmux session and Return session config :py:obj:`dict`. + """ + Freeze live tmux session and Return session config :py:obj:`dict`. - :param session: session object - :type session: :class:`Session` - :rtype: dict + Parameters + ---------- + session : :class:`Session` + session object + Returns + ------- + dict + tmuxp compatible workspace config """ sconf = {'session_name': session['session_name'], 'windows': []} From fbeac6862dd1437f7ad33a5d5dd94be806b9c7a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 09:03:54 -0500 Subject: [PATCH 0276/2998] update docs to link to libtmux objects --- tmuxp/workspacebuilder.py | 84 +++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 1016f9edf3..909013b0c9 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -32,37 +32,37 @@ class WorkspaceBuilder(object): The normal phase of loading is: - 1. :term:`kaptan` imports json/yaml/ini. ``.get()`` returns python - :class:`dict`:: + 1. :term:`kaptan` imports json/yaml/ini. ``.get()`` returns python + :class:`dict`:: - import kaptan - sconf = kaptan.Kaptan(handler='yaml') - sconf = sconfig.import_config(self.yaml_config).get() + import kaptan + sconf = kaptan.Kaptan(handler='yaml') + sconf = sconfig.import_config(self.yaml_config).get() - or from config file with extension:: + or from config file with extension:: - import kaptan - sconf = kaptan.Kaptan() - sconf = sconfig.import_config('path/to/config.yaml').get() + import kaptan + sconf = kaptan.Kaptan() + sconf = sconfig.import_config('path/to/config.yaml').get() - kaptan automatically detects the handler from filenames. + kaptan automatically detects the handler from filenames. - 2. :meth:`config.expand` sconf inline shorthand:: + 2. :meth:`config.expand` sconf inline shorthand:: - from tmuxp import config - sconf = config.expand(sconf) + from tmuxp import config + sconf = config.expand(sconf) - 3. :meth:`config.trickle` passes down default values from session - -> window -> pane if applicable:: + 3. :meth:`config.trickle` passes down default values from session + -> window -> pane if applicable:: - sconf = config.trickle(sconf) + sconf = config.trickle(sconf) - 4. (You are here) We will create a :class:`Session` (a real - ``tmux(1)`` session) and iterate through the list of windows, and - their panes, returning full :class:`Window` and :class:`Pane` - objects each step of the way:: + 4. (You are here) We will create a :class:`libtmux.Session` (a real + ``tmux(1)`` session) and iterate through the list of windows, and + their panes, returning full :class:`libtmux.Window` and + :class:`libtmux.Pane` objects each step of the way:: - workspace = WorkspaceBuilder(sconf=sconf) + workspace = WorkspaceBuilder(sconf=sconf) It handles the magic of cases where the user may want to start a session inside tmux (when `$TMUX` is in the env variables). @@ -77,12 +77,13 @@ def __init__(self, sconf, server=None): sconf : dict session config, includes a :py:obj:`list` of ``windows``. - server : :class:`Server` + server : :class:`libtmux.Server` tmux server to build session in Notes ----- - TODO: Initialize :class:`Session` from here, in ``self.session``. + TODO: Initialize :class:`libtmux.Session` from here, in + ``self.session``. """ if not sconf: @@ -115,12 +116,13 @@ def build(self, session=None): Optionally accepts ``session`` to build with only session object. - Without ``session``, it will use :class:`Server` at ``self.server`` - passed in on initialization to create a new Session object. + Without ``session``, it will use :class:`libmtux.Server` at + ``self.server`` passed in on initialization to create a new Session + object. Parameters ---------- - session : :class:`Session` + session : :class:`libtmux.Session` session to build workspace in """ @@ -211,15 +213,16 @@ def build(self, session=None): focus.select_window() def iter_create_windows(self, s): - """Return :class:`Window` iterating through session config dict. + """ + Return :class:`libtmux.Window` iterating through session config dict. - Generator yielding :class:`Window` by iterating through + Generator yielding :class:`libtmux.Window` by iterating through ``sconf['windows']``. Applies ``window_options`` to window. - :param session: :class:`Session` from the config - :rtype: tuple(:class:`Window`, ``wconf``) + :param session: :class:`libtmux.Session` from the config + :rtype: tuple(:class:`libtmux.Window`, ``wconf``) """ for i, wconf in enumerate(self.sconf['windows'], start=1): @@ -268,16 +271,21 @@ def iter_create_windows(self, s): yield w, wconf def iter_create_panes(self, w, wconf): - """Return :class:`Pane` iterating through window config dict. + """ + Return :class:`libtmux.Pane` iterating through window config dict. Run ``shell_command`` with ``$ tmux send-keys``. - :param w: window to create panes for - :type w: :class:`Window` - :param wconf: config section for window - :type wconf: :py:obj:`dict` - :rtype: tuple(:class:`Pane`, ``pconf``) - + Parameters + ---------- + w : :class:`libtmux.Window` + window to create panes for + wconf : dict + config section for window + + Returns + ------- + tuple of (:class:`libtmux.Pane`, ``pconf``) """ assert(isinstance(w, Window)) @@ -342,7 +350,7 @@ def freeze(session): Parameters ---------- - session : :class:`Session` + session : :class:`libtmux.Session` session object Returns From 7df46b988deabab659124e694abcaee06351addb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 09:09:51 -0500 Subject: [PATCH 0277/2998] clean up log docs, rm unusd imports --- tmuxp/log.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tmuxp/log.py b/tmuxp/log.py index a0eb4073b9..cadff857b3 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -6,8 +6,7 @@ ~~~~~~~~~ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import logging import time @@ -24,7 +23,8 @@ def default_log_template(self, record): - """Return the prefix for the log message. Template for Formatter. + """ + Return the prefix for the log message. Template for Formatter. Parameters ---------- @@ -81,11 +81,19 @@ def format(self, record): def debug_log_template(self, record): - """ Return the prefix for the log message. Template for Formatter. + """ + Return the prefix for the log message. Template for Formatter. - :param: record: :py:class:`logging.LogRecord` object. this is passed in - from inside the :py:meth:`logging.Formatter.format` record. + Parameters + ---------- + record : :py:class:`logging.LogRecord` + This is passed in from inside the :py:meth:`logging.Formatter.format` + record. + Returns + ------- + str + Log template. """ reset = Style.RESET_ALL From db6d39842c271b15131b0e6027536a216560c247 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 09:23:02 -0500 Subject: [PATCH 0278/2998] tweaks and updates to workspacebuilder docs --- tmuxp/workspacebuilder.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 909013b0c9..b3d97a29d6 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -25,7 +25,8 @@ class WorkspaceBuilder(object): - """Load workspace from session :py:obj:`dict`. + """ + Load workspace from session :py:obj:`dict`. Build tmux workspace from a configuration. Creates and names windows, sets options, splits windows into panes. @@ -221,9 +222,16 @@ def iter_create_windows(self, s): Applies ``window_options`` to window. - :param session: :class:`libtmux.Session` from the config - :rtype: tuple(:class:`libtmux.Window`, ``wconf``) + Parameters + ---------- + session : :class:`libtmux.Session` + session to create windows in + Returns + ------- + tuple of (:class:`libtmux.Window`, ``wconf``) + Newly created window, and the section from the tmuxp configuration + that was used to create the window. """ for i, wconf in enumerate(self.sconf['windows'], start=1): if 'window_name' not in wconf: @@ -286,6 +294,8 @@ def iter_create_panes(self, w, wconf): Returns ------- tuple of (:class:`libtmux.Pane`, ``pconf``) + Newly created pane, and the section from the tmuxp configuration + that was used to create the pane. """ assert(isinstance(w, Window)) @@ -332,10 +342,20 @@ def get_pane_start_directory(): yield p, pconf - """ - Applies window configurations relevant after window and pane creation. - """ def config_after_window(self, w, wconf): + """Actions to apply to window after window and pane finished. + + When building a tmux session, sometimes its easier to postpone things + like setting options until after things are already structurally + prepared. + + Parameters + ---------- + w : :class:`libtmux.Window` + window to create panes for + wconf : dict + config section for window + """ if ( 'options_after' in wconf and isinstance(wconf['options_after'], dict) From 18f7492891b8ae9dd6e0f9be9453560f26312f87 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Apr 2018 09:27:27 -0500 Subject: [PATCH 0279/2998] add help note --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 931ef83795..b03419aff1 100644 --- a/README.rst +++ b/README.rst @@ -2,6 +2,10 @@ tmuxp, tmux session manager. built on `libtmux`_. |pypi| |docs| |build-status| |coverage| |license| +**We need help!** tmuxp is a trusted session manager for tmux. If you +could lend your time to helping answer issues and QA pull requests, please +do! See `issue #290 `__! + **New to tmux?** `The Tao of tmux `_ is available on Leanpub and `Amazon Kindle`_. Read and browse the book for free `on the web`_. From 8623e44aaebf1337799897b02f4d3d95f259d34f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 21 Apr 2018 16:02:41 -0500 Subject: [PATCH 0280/2998] Update alagitpull from 0.0.19 to 0.0.20 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index d2cadc5fc8..4f4193c530 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.14 sphinx==1.7.2 -alagitpull==0.0.19 +alagitpull==0.0.20 releases==1.4.1 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From b540c2a6ca37559e0c62d03974a4dde9ef9bec91 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 22 Apr 2018 23:45:41 -0500 Subject: [PATCH 0281/2998] Update sphinx from 1.7.2 to 1.7.3 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 4f4193c530..1820a70737 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.2 +sphinx==1.7.3 alagitpull==0.0.20 releases==1.4.1 aafigure==0.6 From 9dcc42693cd012b0ae30c4bb0148bf521453f62b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 25 Apr 2018 08:33:49 -0500 Subject: [PATCH 0282/2998] Update pytest from 3.5.0 to 3.5.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index f728f12f6e..0513394815 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.5.0 +pytest==3.5.1 pytest-rerunfailures==4.0 From 7a81104b5e91bfed9b7d35a2b3987805cb5b870b Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 25 Apr 2018 18:46:18 -0500 Subject: [PATCH 0283/2998] Update sphinx from 1.7.3 to 1.7.4 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 1820a70737..9231858b1a 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.3 +sphinx==1.7.4 alagitpull==0.0.20 releases==1.4.1 aafigure==0.6 From 93e6ada13f349bf3e32e92245b0c0cd01a34a7ac Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 27 Apr 2018 12:19:52 -0500 Subject: [PATCH 0284/2998] Update releases from 1.4.1 to 1.4.2 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 9231858b1a..9096c186ea 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,6 +2,6 @@ docutils==0.14 sphinx==1.7.4 alagitpull==0.0.20 -releases==1.4.1 +releases==1.4.2 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From 2cbf6812f143c9aafe17ae5d0a3ac633f3e12c11 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Apr 2018 08:26:32 -0500 Subject: [PATCH 0285/2998] update Pipfile --- Pipfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index f91c748b97..d68610dfc4 100644 --- a/Pipfile +++ b/Pipfile @@ -11,12 +11,12 @@ libtmux = "==0.8.0" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" -alagitpull = "==0.0.19" +alagitpull = "==0.0.20" aafigure = "==0.6" pytest = "==3.5.0" pytest-rerunfailures = "==4.0" -releases = "==1.4.1" -Sphinx = "==1.7.2" +releases = "==1.4.2" +Sphinx = "==1.7.4" "e1839a8" = {path = ".", editable = true} isort = "==4.3.4" "flake8" = "==3.5.0" From 9c9100e5e5912514666a1b67631b01f9135021ea Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Apr 2018 09:11:21 -0500 Subject: [PATCH 0286/2998] add isort to Makefile --- Makefile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index c69297fd1a..76c78ee112 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,22 @@ -WATCH_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null +PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null -test: - py.test $(test) - entr_warn: @echo "----------------------------------------------------------" @echo " ! File watching functionality non-operational ! " - @echo "" + @echo " " @echo "Install entr(1) to automatically run tasks on file change." - @echo "See http://entrproject.org/" + @echo "See http://entrproject.org/ " @echo "----------------------------------------------------------" +isort: + isort `${PY_FILES}` + +test: + py.test $(test) watch_test: - if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi + if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: cd doc && $(MAKE) html @@ -26,4 +28,4 @@ flake8: flake8 tmuxp tests watch_flake8: - if command -v entr > /dev/null; then ${WATCH_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi + if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi From 658897de816636cf821a0382d7e802b0d54fe39c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Apr 2018 09:11:29 -0500 Subject: [PATCH 0287/2998] add isort config --- setup.cfg | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/setup.cfg b/setup.cfg index 9cda12e03c..85965d473f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,3 +4,15 @@ select = E,W,F,N [tool:pytest] addopts = --reruns=5 + +[isort] +combine_as_imports= true +default_section = THIRDPARTY +include_trailing_comma = true +multi_line_output = 3 +known_pytest = pytest,py +known_first_party = libtmux,tmuxp +split_before_closing_bracket = true +sections = FUTURE,STDLIB,PYTEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER +line_length = 79 +not_skip = __init__.py From 3928d1c2e39db09d85fec205a9939ccf2e001fd8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Apr 2018 09:19:11 -0500 Subject: [PATCH 0288/2998] Sort imports, remove unused __future__ imports Some of these imports aren't necessary since we're only supporting Python 2.7 and up. See https://docs.python.org/2/library/__future__.html Also, keep unicode_literals out of cli.py for now. I don't understand why click has an issue with it fully, even now. --- doc/conf.py | 2 +- tests/__init__.py | 3 +-- tests/fixtures/config/__init__.py | 11 +++++++++-- tests/fixtures/config_teamocil/__init__.py | 2 +- tests/fixtures/config_tmuxinator/test1.py | 1 - tests/fixtures/config_tmuxinator/test2.py | 1 - tests/fixtures/config_tmuxinator/test3.py | 1 - tests/test_cli.py | 13 ++++++------- tests/test_config.py | 6 +++--- tests/test_config_teamocil.py | 6 +++--- tests/test_config_tmuxinator.py | 6 +++--- tests/test_util.py | 3 +-- tests/test_workspacebuilder.py | 10 +++++----- tests/test_workspacefreezer.py | 3 +-- tests/tests/test_helpers.py | 3 +-- tmuxp/__init__.py | 20 ++++++++++++-------- tmuxp/cli.py | 9 +++++---- tmuxp/config.py | 3 +-- tmuxp/exc.py | 3 +-- tmuxp/util.py | 3 +-- tmuxp/workspacebuilder.py | 3 +-- 21 files changed, 56 insertions(+), 56 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 69bf37d6f0..2346927d38 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -2,8 +2,8 @@ import os import sys -import alagitpull +import alagitpull # Get the project root dir, which is the parent dir of this cwd = os.getcwd() diff --git a/tests/__init__.py b/tests/__init__.py index 9216f1bba1..ce09160529 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -5,8 +5,7 @@ ~~~~~~~~~~~ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os diff --git a/tests/fixtures/config/__init__.py b/tests/fixtures/config/__init__.py index 2c908611bf..ce1f06197e 100644 --- a/tests/fixtures/config/__init__.py +++ b/tests/fixtures/config/__init__.py @@ -1,2 +1,9 @@ -from . import (expand1, expand2, expand_blank, sampleconfig, # noqa - shell_command_before, shell_command_before_session, trickle) +from . import ( # noqa + expand1, + expand2, + expand_blank, + sampleconfig, + shell_command_before, + shell_command_before_session, + trickle, +) diff --git a/tests/fixtures/config_teamocil/__init__.py b/tests/fixtures/config_teamocil/__init__.py index 822441fa3e..7fe671395a 100644 --- a/tests/fixtures/config_teamocil/__init__.py +++ b/tests/fixtures/config_teamocil/__init__.py @@ -1 +1 @@ -from . import test1, test2, test3, test4, layouts # noqa +from . import layouts, test1, test2, test3, test4 # noqa diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index 46fb53296d..fa4f365755 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,6 +1,5 @@ from .._util import loadfixture - tmuxinator_yaml = loadfixture('config_tmuxinator/test1.yaml') tmuxinator_dict = { 'windows': [ diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index 535d7ddddf..c773346791 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,6 +1,5 @@ from .._util import loadfixture - tmuxinator_yaml = loadfixture('config_tmuxinator/test2.yaml') tmuxinator_dict = { diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index 601f862095..530db661b4 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,6 +1,5 @@ from .._util import loadfixture - tmuxinator_yaml = loadfixture('config_tmuxinator/test3.yaml') tmuxinator_dict = { diff --git a/tests/test_cli.py b/tests/test_cli.py index beba8db9b8..f74eb7ecf2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,21 +1,20 @@ # -*- coding: utf-8 -*- """Test for tmuxp command line interface.""" -from __future__ import absolute_import, print_function, with_statement +from __future__ import absolute_import -import os import json -import libtmux +import os + import pytest + import click from click.testing import CliRunner +import libtmux from libtmux.common import has_lt_version - from tmuxp import cli, config -from tmuxp.cli import ( - is_pure_name, load_workspace, scan_config, get_config_dir -) +from tmuxp.cli import get_config_dir, is_pure_name, load_workspace, scan_config from .fixtures._util import curjoin, loadfixture diff --git a/tests/test_config.py b/tests/test_config.py index c45a27706b..dfa9fb1c78 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- """Test for tmuxp configuration import, inlining, expanding and export.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os -import kaptan import pytest +import kaptan + from tmuxp import config, exc from . import example_dir diff --git a/tests/test_config_teamocil.py b/tests/test_config_teamocil.py index 0cfddd5546..6e21572403 100644 --- a/tests/test_config_teamocil.py +++ b/tests/test_config_teamocil.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- """Test for tmuxp teamocil configuration.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os -import kaptan import pytest +import kaptan + from tmuxp import config from .fixtures import config_teamocil as fixtures diff --git a/tests/test_config_tmuxinator.py b/tests/test_config_tmuxinator.py index 640946cd89..a541ca358e 100644 --- a/tests/test_config_tmuxinator.py +++ b/tests/test_config_tmuxinator.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- """Test for tmuxp tmuxinator configuration.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os -import kaptan import pytest +import kaptan + from tmuxp import config from .fixtures import config_tmuxinator as fixtures diff --git a/tests/test_util.py b/tests/test_util.py index 407615890c..6f3d33b16a 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- """Tests for utility functions in tmux.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 66cd09e484..040396990a 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- """Test for tmuxp workspacebuilder.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import os -import kaptan import pytest + +import kaptan + from libtmux import Window from libtmux.common import has_gte_version -from libtmux.test import temp_session, retry - +from libtmux.test import retry, temp_session from tmuxp import config, exc from tmuxp._compat import text_type from tmuxp.workspacebuilder import WorkspaceBuilder diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index c40c456771..1f9315a1a1 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- """Test for tmuxp workspacefreezer.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import time diff --git a/tests/tests/test_helpers.py b/tests/tests/test_helpers.py index 288bedc88d..dd8e75478d 100644 --- a/tests/tests/test_helpers.py +++ b/tests/tests/test_helpers.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- """Tests for .'s helper and utility functions.""" -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import pytest diff --git a/tmuxp/__init__.py b/tmuxp/__init__.py index ec29bc8e68..3280528113 100644 --- a/tmuxp/__init__.py +++ b/tmuxp/__init__.py @@ -9,12 +9,16 @@ :license: MIT, see LICENSE for details """ -from __future__ import absolute_import, division, print_function, \ - with_statement, unicode_literals +from __future__ import absolute_import, unicode_literals -from .__about__ import __title__, __package_name__, __version__, \ - __description__, __email__, __author__, __license__, __copyright__ - -from .workspacebuilder import WorkspaceBuilder - -from . import config, util, cli +from . import cli, config, util +from .__about__ import ( + __author__, + __copyright__, + __description__, + __email__, + __license__, + __package_name__, + __title__, + __version__, +) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 264a05c022..2dbb4074f7 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -5,7 +5,7 @@ ~~~~~~~~~ """ -from __future__ import absolute_import, print_function, with_statement +from __future__ import absolute_import import logging import os @@ -14,14 +14,15 @@ import click import kaptan from click.exceptions import FileError -from libtmux.common import has_minimum_version, which, has_gte_version + +from libtmux.common import has_gte_version, has_minimum_version, which from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server -from . import WorkspaceBuilder, config, exc, log, util +from . import config, exc, log, util from .__about__ import __version__ from ._compat import string_types -from .workspacebuilder import freeze +from .workspacebuilder import WorkspaceBuilder, freeze logger = logging.getLogger(__name__) diff --git a/tmuxp/config.py b/tmuxp/config.py index 94b360620c..1ec27085a6 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -5,8 +5,7 @@ ~~~~~~~~~~~~ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import copy import logging diff --git a/tmuxp/exc.py b/tmuxp/exc.py index 0c9061d026..8ff649a936 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -6,8 +6,7 @@ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals from ._compat import implements_to_string diff --git a/tmuxp/util.py b/tmuxp/util.py index cc5041ad26..7056c9ff47 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -5,8 +5,7 @@ ~~~~~~~~~~ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import logging import os diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index b3d97a29d6..85aed916b0 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -6,8 +6,7 @@ """ -from __future__ import (absolute_import, division, print_function, - unicode_literals, with_statement) +from __future__ import absolute_import, unicode_literals import logging From e3c61dc29db487a65780e28e4dd5ac8d5ee5a84f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Apr 2018 09:21:18 -0500 Subject: [PATCH 0289/2998] update CHANGES --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index cac6ca36ae..54d3863534 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`-` Remove unused ``__future__`` imports +- :support:`-` Sort imports +- :support:`-` Add configuration and make command for isort. - :support:`-` Add sphinxcontrib-napoleon. - :support:`-` Assure *requirements/dev.txt* dependencies are in *Pipfile* - :support:`-` Update sphinx, releases to latest version From a1c27672b05bc44047c5cd42b3855aeb03aecc0e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 2 May 2018 17:50:02 -0500 Subject: [PATCH 0290/2998] Update releases from 1.4.2 to 1.5.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 9096c186ea..47b9326243 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,6 +2,6 @@ docutils==0.14 sphinx==1.7.4 alagitpull==0.0.20 -releases==1.4.2 +releases==1.5.0 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From c6e6973112280e8755c4863dba3e038b4ffe012e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 5 May 2018 21:20:59 -0500 Subject: [PATCH 0291/2998] bump releases to 1.5.0 in Pipfile --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index d68610dfc4..ee12cb3ce5 100644 --- a/Pipfile +++ b/Pipfile @@ -15,7 +15,7 @@ alagitpull = "==0.0.20" aafigure = "==0.6" pytest = "==3.5.0" pytest-rerunfailures = "==4.0" -releases = "==1.4.2" +releases = "==1.5.0" Sphinx = "==1.7.4" "e1839a8" = {path = ".", editable = true} isort = "==4.3.4" From 0079e6d2bf243c0fd3fef9f32b23187f922e7da9 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 23 May 2018 17:45:45 +0200 Subject: [PATCH 0292/2998] Update pytest from 3.5.1 to 3.6.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 0513394815..f385980b9e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.5.1 +pytest==3.6.0 pytest-rerunfailures==4.0 From b62d3798f5dbe55ca761f26a88f0398149a45c92 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 28 May 2018 13:02:21 -0500 Subject: [PATCH 0293/2998] Update sphinx from 1.7.4 to 1.7.5 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 47b9326243..518e6c35f5 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.4 +sphinx==1.7.5 alagitpull==0.0.20 releases==1.5.0 aafigure==0.6 From 3bca7d947abbd9ffc58ff3fea004a3b50d4e737f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 1 Jun 2018 19:37:42 -0500 Subject: [PATCH 0294/2998] Update pytest-rerunfailures from 4.0 to 4.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index f385980b9e..7747e69c88 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.6.0 -pytest-rerunfailures==4.0 +pytest-rerunfailures==4.1 From ee5f38cd18751b0c9572255a256d3f5f60def372 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 5 Jun 2018 07:25:09 -0500 Subject: [PATCH 0295/2998] Update vulture from 0.26 to 0.27 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 77e130d5fe..fafc6dcd2a 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ isort==4.3.4 flake8==3.5.0 -vulture==0.26 +vulture==0.27 From bcbe72a9e8fa1284593572dc5d3b7f05903193fe Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 5 Jun 2018 07:25:14 -0500 Subject: [PATCH 0296/2998] Update pytest from 3.6.0 to 3.6.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 7747e69c88..0107a1441c 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.6.0 +pytest==3.6.1 pytest-rerunfailures==4.1 From 7e9a0c2d93d6e871ad18de49578f1aa18f8355c6 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 20 Jun 2018 15:36:41 -0500 Subject: [PATCH 0297/2998] Update pytest from 3.6.1 to 3.6.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 0107a1441c..c7e097757a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.6.1 +pytest==3.6.2 pytest-rerunfailures==4.1 From c468de1dd7eb1bc9df85bd3f35066eb0844ab22a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 20 Jun 2018 15:36:37 -0500 Subject: [PATCH 0298/2998] Update releases from 1.5.0 to 1.6.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 518e6c35f5..4c90a05a0c 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,6 +2,6 @@ docutils==0.14 sphinx==1.7.5 alagitpull==0.0.20 -releases==1.5.0 +releases==1.6.0 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From 3c850289dc292d6bc691005f6982e5530a939f5c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Jun 2018 00:43:47 -0500 Subject: [PATCH 0299/2998] Sync Pipfile --- Pipfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Pipfile b/Pipfile index ee12cb3ce5..8c9ca8395b 100644 --- a/Pipfile +++ b/Pipfile @@ -13,12 +13,12 @@ colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.20" aafigure = "==0.6" -pytest = "==3.5.0" -pytest-rerunfailures = "==4.0" -releases = "==1.5.0" -Sphinx = "==1.7.4" +pytest = "==3.6.2" +pytest-rerunfailures = "==4.1" +releases = "==1.6.0" +Sphinx = "==1.7.5" "e1839a8" = {path = ".", editable = true} isort = "==4.3.4" "flake8" = "==3.5.0" -vulture = "==0.26" +vulture = "==0.27" sphinxcontrib-napoleon = "==0.6.1" From e7b7a48319bf2d6e37c1ef5b5e461beb6e89f544 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 23 Jun 2018 15:19:42 -0500 Subject: [PATCH 0300/2998] Update alagitpull from 0.0.20 to 0.0.21 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 4c90a05a0c..4dd2180b2b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils==0.14 sphinx==1.7.5 -alagitpull==0.0.20 +alagitpull==0.0.21 releases==1.6.0 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From 73eef3006faad6b408ea9cd2a8d236a027ba0efb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Jun 2018 13:47:07 -0500 Subject: [PATCH 0301/2998] Pin Pipfile dependencies --- Pipfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 8c9ca8395b..53d522c91a 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,10 @@ verify_ssl = true name = "pypi" [packages] +kaptan = ">=0.5.7" +libtmux = "==0.8.0" +click = "==6.7" +colorama = "==0.3.9" [dev-packages] kaptan = ">=0.5.7" @@ -11,7 +15,7 @@ libtmux = "==0.8.0" click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" -alagitpull = "==0.0.20" +alagitpull = "==0.0.21" aafigure = "==0.6" pytest = "==3.6.2" pytest-rerunfailures = "==4.1" From 16aef01a3c5be4dd3354e526b998b225ea439d77 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Jun 2018 13:47:33 -0500 Subject: [PATCH 0302/2998] Add sync_pipfile make command --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 76c78ee112..52618c9b8f 100644 --- a/Makefile +++ b/Makefile @@ -29,3 +29,9 @@ flake8: watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi + +sync_pipfile: + pipenv install --skip-lock --dev -r requirements/doc.txt && \ + pipenv install --skip-lock --dev -r requirements/dev.txt && \ + pipenv install --skip-lock --dev -r requirements/test.txt && \ + pipenv install --skip-lock -r requirements/base.txt From f863506e8119f749dce52898c8a5aabf96ada580 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 5 Jul 2018 07:26:11 -0500 Subject: [PATCH 0303/2998] Update pytest from 3.6.2 to 3.6.3 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index c7e097757a..816755419c 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.6.2 +pytest==3.6.3 pytest-rerunfailures==4.1 From 04af1bf16e9162b71a0f3eb196c1cb8d9dcaebb2 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 5 Jul 2018 07:26:07 -0500 Subject: [PATCH 0304/2998] Update vulture from 0.27 to 0.28 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index fafc6dcd2a..9b2524ba64 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ isort==4.3.4 flake8==3.5.0 -vulture==0.27 +vulture==0.28 From b8a3d83a9c230bb818f8f2d51cd096752ba7c5be Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 2 Jul 2018 14:50:59 -0500 Subject: [PATCH 0305/2998] Update releases from 1.6.0 to 1.6.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 4dd2180b2b..878f7ec63b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,6 +2,6 @@ docutils==0.14 sphinx==1.7.5 alagitpull==0.0.21 -releases==1.6.0 +releases==1.6.1 aafigure==0.6 sphinxcontrib-napoleon==0.6.1 From bccdb49b5e3b7a9b5542bb2378550cb85c5490f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Jul 2018 14:50:00 -0500 Subject: [PATCH 0306/2998] sync_pipfile: Add editable package in dev mode --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 52618c9b8f..f126d9c725 100644 --- a/Makefile +++ b/Makefile @@ -34,4 +34,5 @@ sync_pipfile: pipenv install --skip-lock --dev -r requirements/doc.txt && \ pipenv install --skip-lock --dev -r requirements/dev.txt && \ pipenv install --skip-lock --dev -r requirements/test.txt && \ + pipenv install --skip-lock --dev -e . && \ pipenv install --skip-lock -r requirements/base.txt From d76551d459e27f588fe9ca7a950343388f7b6678 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Jul 2018 14:50:15 -0500 Subject: [PATCH 0307/2998] Recreate Pipfile --- Pipfile | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Pipfile b/Pipfile index 53d522c91a..4c9544ea84 100644 --- a/Pipfile +++ b/Pipfile @@ -1,14 +1,8 @@ [[source]] -url = "https://pypi.python.org/simple" +url = "https://pypi.org/simple" verify_ssl = true name = "pypi" -[packages] -kaptan = ">=0.5.7" -libtmux = "==0.8.0" -click = "==6.7" -colorama = "==0.3.9" - [dev-packages] kaptan = ">=0.5.7" libtmux = "==0.8.0" @@ -16,13 +10,22 @@ click = "==6.7" colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.21" +releases = "==1.6.1" aafigure = "==0.6" -pytest = "==3.6.2" -pytest-rerunfailures = "==4.1" -releases = "==1.6.0" +sphinxcontrib-napoleon = "==0.6.1" Sphinx = "==1.7.5" -"e1839a8" = {path = ".", editable = true} isort = "==4.3.4" "flake8" = "==3.5.0" -vulture = "==0.27" -sphinxcontrib-napoleon = "==0.6.1" +vulture = "==0.28" +pytest = "==3.6.3" +pytest-rerunfailures = "==4.1" +tmuxp = {path = ".", editable = true} + +[packages] +kaptan = ">=0.5.7" +libtmux = "==0.8.0" +click = "==6.7" +colorama = "==0.3.9" + +[requires] +python_version = "2.7" From f9fe048be6c800ea2c3bfd1a762507af5873680f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 17 Jul 2018 00:06:28 -0500 Subject: [PATCH 0308/2998] Update sphinx from 1.7.5 to 1.7.6 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 878f7ec63b..62650f3cd5 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.5 +sphinx==1.7.6 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From e9172944e47322c8889caa34b1904127e1b416a0 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 3 Aug 2018 07:43:58 -0500 Subject: [PATCH 0309/2998] Update pytest from 3.6.3 to 3.7.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 816755419c..1676642f02 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.6.3 +pytest==3.7.1 pytest-rerunfailures==4.1 From 0b83f506d0c5c2e433e5e60e4070ffd934d8ccda Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 31 Jul 2018 07:56:52 -0500 Subject: [PATCH 0310/2998] Update vulture from 0.28 to 0.29 --- requirements/dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index 9b2524ba64..10350b65df 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ isort==4.3.4 flake8==3.5.0 -vulture==0.28 +vulture==0.29 From 8de4766cab3e2b55d19bddecbc7b20c9d0d1ad12 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 19 Aug 2018 03:54:57 -0500 Subject: [PATCH 0311/2998] Update pytest from 3.7.1 to 3.7.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 1676642f02..80d8fc4b0e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.7.1 +pytest==3.7.2 pytest-rerunfailures==4.1 From 52532353f4caff039e67a9db745dd629a23091aa Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 19 Aug 2018 12:39:14 -0500 Subject: [PATCH 0312/2998] Update sphinx from 1.7.6 to 1.7.7 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 62650f3cd5..825f0179ee 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.6 +sphinx==1.7.7 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From d5afd5779097098f6f87a4730c179dd516576da9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 09:58:10 -0400 Subject: [PATCH 0313/2998] Add black Makefile task This is used for code formatting. --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index f126d9c725..f9625e60a1 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,6 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null - -entr_warn: - @echo "----------------------------------------------------------" +entr_warn: @echo "----------------------------------------------------------" @echo " ! File watching functionality non-operational ! " @echo " " @echo "Install entr(1) to automatically run tasks on file change." @@ -12,6 +10,9 @@ entr_warn: isort: isort `${PY_FILES}` +black: + black `${PY_FILES}` --skip-string-normalization + test: py.test $(test) From d977797652ec48eb43f51902be12c713d18ba6aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 09:58:40 -0400 Subject: [PATCH 0314/2998] Run code through black --- doc/_ext/aafig.py | 26 +- doc/conf.py | 49 ++-- setup.py | 1 + tests/conftest.py | 13 +- tests/fixtures/config/expand1.py | 107 ++----- tests/fixtures/config/expand_blank.py | 64 ++--- tests/fixtures/config/sampleconfig.py | 31 +- tests/fixtures/config/shell_command_before.py | 111 ++----- tests/fixtures/config/trickle.py | 48 +--- tests/fixtures/config_teamocil/layouts.py | 271 ++++++------------ tests/fixtures/config_teamocil/test1.py | 39 +-- tests/fixtures/config_teamocil/test2.py | 39 +-- tests/fixtures/config_teamocil/test3.py | 57 ++-- tests/fixtures/config_teamocil/test4.py | 22 +- tests/fixtures/config_tmuxinator/test1.py | 43 +-- tests/fixtures/config_tmuxinator/test2.py | 97 ++----- tests/fixtures/config_tmuxinator/test3.py | 102 ++----- tests/test_cli.py | 188 ++++++------ tests/test_config.py | 139 ++------- tests/test_config_teamocil.py | 76 ++--- tests/test_config_tmuxinator.py | 34 ++- tests/test_workspacebuilder.py | 143 +++------ tests/test_workspacefreezer.py | 12 +- tests/tests/test_helpers.py | 4 +- tmuxp/_compat.py | 6 +- tmuxp/cli.py | 237 +++++++-------- tmuxp/config.py | 77 ++--- tmuxp/exc.py | 5 +- tmuxp/log.py | 74 +++-- tmuxp/util.py | 24 +- tmuxp/workspacebuilder.py | 68 ++--- 31 files changed, 802 insertions(+), 1405 deletions(-) diff --git a/doc/_ext/aafig.py b/doc/_ext/aafig.py index 5ca510102b..7d49dbb111 100644 --- a/doc/_ext/aafig.py +++ b/doc/_ext/aafig.py @@ -61,6 +61,7 @@ class AafigDirective(images.Image): """ Directive to insert an ASCII art figure to be rendered by aafigure. """ + has_content = True required_arguments = 0 own_option_spec = dict( @@ -101,8 +102,10 @@ def render_aafig_images(app, doctree): format_map = app.builder.config.aafig_format merge_dict(format_map, DEFAULT_FORMATS) if aafigure is None: - app.builder.warn('aafigure module not installed, ASCII art images ' - 'will be redered as literal text') + app.builder.warn( + 'aafigure module not installed, ASCII art images ' + 'will be redered as literal text' + ) for img in doctree.traverse(nodes.image): if not hasattr(img, 'aafig'): continue @@ -115,9 +118,11 @@ def render_aafig_images(app, doctree): if format in format_map: options['format'] = format_map[format] else: - app.builder.warn('unsupported builder format "%s", please ' - 'add a custom entry in aafig_format config ' - 'option for this builder' % format) + app.builder.warn( + 'unsupported builder format "%s", please ' + 'add a custom entry in aafig_format config ' + 'option for this builder' % format + ) img.replace_self(nodes.literal_block(text, text)) continue if options['format'] is None: @@ -157,11 +162,12 @@ def render_aafigure(app, text, options): else: # Non-HTML if app.builder.format != 'latex': - app.builder.warn('aafig: the builder format %s is not officially ' - 'supported, aafigure images could not work. ' - 'Please report problems and working builder to ' - 'avoid this warning inthe future' % - app.builder.format) + app.builder.warn( + 'aafig: the builder format %s is not officially ' + 'supported, aafigure images could not work. ' + 'Please report problems and working builder to ' + 'avoid this warning inthe future' % app.builder.format + ) relfn = fname outfn = path.join(app.builder.outdir, fname) metadata_fname = '%s.aafig' % outfn diff --git a/doc/conf.py b/doc/conf.py index 2346927d38..ba185e3021 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -10,8 +10,7 @@ project_root = os.path.dirname(cwd) sys.path.insert(0, project_root) -sys.path.append(os.path.abspath( - os.path.join(os.path.dirname(__file__), "_ext"))) +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext"))) # package data about = {} @@ -75,44 +74,50 @@ 'project_name': about['__title__'], } -alagitpull_internal_hosts = [ - 'tmuxp.git-pull.com', - '0.0.0.0', -] +alagitpull_internal_hosts = ['tmuxp.git-pull.com', '0.0.0.0'] alagitpull_external_hosts_new_window = True htmlhelp_basename = '%sdoc' % about['__title__'] latex_documents = [ - ('index', '{0}.tex'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], 'manual'), + ( + 'index', + '{0}.tex'.format(about['__package_name__']), + '{0} Documentation'.format(about['__title__']), + about['__author__'], + 'manual', + ) ] man_pages = [ - ('index', about['__package_name__'], - '{0} Documentation'.format(about['__title__']), - about['__author__'], 1), + ( + 'index', + about['__package_name__'], + '{0} Documentation'.format(about['__title__']), + about['__author__'], + 1, + ) ] texinfo_documents = [ - ('index', '{0}'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], about['__package_name__'], - about['__description__'], 'Miscellaneous'), + ( + 'index', + '{0}'.format(about['__package_name__']), + '{0} Documentation'.format(about['__title__']), + about['__author__'], + about['__package_name__'], + about['__description__'], + 'Miscellaneous', + ) ] intersphinx_mapping = { 'python': ('https://docs.python.org/', None), 'libtmux': ('https://libtmux.readthedocs.io/en/latest', None), - 'click': ('http://click.pocoo.org/5', None) + 'click': ('http://click.pocoo.org/5', None), } # aafig format, try to get working with pdf aafig_format = dict(latex='pdf', html='gif') -aafig_default_options = dict( - scale=.75, - aspect=0.5, - proportional=True, -) +aafig_default_options = dict(scale=.75, aspect=0.5, proportional=True) diff --git a/setup.py b/setup.py index 169c329a38..e346841f51 100644 --- a/setup.py +++ b/setup.py @@ -31,6 +31,7 @@ def initialize_options(self): def run_tests(self): import pytest + errno = pytest.main(self.pytest_args) sys.exit(errno) diff --git a/tests/conftest.py b/tests/conftest.py index ce364c6b1a..6f031fb112 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -18,6 +18,7 @@ def server(request): def fin(): t.kill_server() + request.addfinalizer(fin) return t @@ -32,16 +33,15 @@ def session(server): # find current sessions prefixed with tmuxp old_test_sessions = [ - s.get('session_name') for s in server._sessions + s.get('session_name') + for s in server._sessions if s.get('session_name').startswith(TEST_SESSION_PREFIX) ] TEST_SESSION_NAME = get_test_session_name(server=server) try: - session = server.new_session( - session_name=TEST_SESSION_NAME, - ) + session = server.new_session(session_name=TEST_SESSION_NAME) except exc.LibTmuxException as e: raise e @@ -57,10 +57,7 @@ def session(server): pass for old_test_session in old_test_sessions: - logger.debug( - 'Old test test session %s found. Killing it.' % - old_test_session - ) + logger.debug('Old test test session %s found. Killing it.' % old_test_session) server.kill_session(old_test_session) assert TEST_SESSION_NAME == session.get('session_name') assert TEST_SESSION_NAME != 'tmuxp' diff --git a/tests/fixtures/config/expand1.py b/tests/fixtures/config/expand1.py index 4c75c410bb..e5d536403c 100644 --- a/tests/fixtures/config/expand1.py +++ b/tests/fixtures/config/expand1.py @@ -7,63 +7,26 @@ { 'window_name': 'editor', 'panes': [ - { - 'shell_command': [ - 'vim', - 'top' - ] - }, - { - 'shell_command': ['vim'], - }, - { - 'shell_command': 'cowsay "hey"' - } + {'shell_command': ['vim', 'top']}, + {'shell_command': ['vim']}, + {'shell_command': 'cowsay "hey"'}, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], }, { 'start_directory': '/var/log', - 'options': {'automatic-rename': True, }, - 'panes': [ - { - 'shell_command': 'htop' - }, - 'vim', - ] - }, - { - 'start_directory': './', - 'panes': [ - 'pwd' - ] - }, - { - 'start_directory': './asdf/', - 'panes': [ - 'pwd' - ] - }, - { - 'start_directory': '../', - 'panes': [ - 'pwd' - ] + 'options': {'automatic-rename': True}, + 'panes': [{'shell_command': 'htop'}, 'vim'], }, - { - 'panes': [ - 'top' - ] - } - ] + {'start_directory': './', 'panes': ['pwd']}, + {'start_directory': './asdf/', 'panes': ['pwd']}, + {'start_directory': '../', 'panes': ['pwd']}, + {'panes': ['top']}, + ], } after_config = { @@ -73,63 +36,39 @@ { 'window_name': 'editor', 'panes': [ - { - 'shell_command': ['vim', 'top'], - }, - { - 'shell_command': ['vim'], - }, - { - 'shell_command': ['cowsay "hey"'] - }, + {'shell_command': ['vim', 'top']}, + {'shell_command': ['vim']}, + {'shell_command': ['cowsay "hey"']}, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], }, { 'start_directory': '/var/log', 'options': {'automatic-rename': True}, - 'panes': [ - {'shell_command': ['htop']}, - {'shell_command': ['vim']} - ] + 'panes': [{'shell_command': ['htop']}, {'shell_command': ['vim']}], }, { 'start_directory': os.path.normpath( os.path.join(os.path.expanduser('~'), './') ), - 'panes': [ - {'shell_command': ['pwd']} - ] + 'panes': [{'shell_command': ['pwd']}], }, { 'start_directory': os.path.normpath( os.path.join(os.path.expanduser('~'), './asdf') ), - 'panes': [ - {'shell_command': ['pwd']} - ] + 'panes': [{'shell_command': ['pwd']}], }, { 'start_directory': os.path.normpath( os.path.join(os.path.expanduser('~'), '../') ), - 'panes': [ - {'shell_command': ['pwd']} - ] + 'panes': [{'shell_command': ['pwd']}], }, - - { - 'panes': [ - {'shell_command': ['top']} - ] - } - ] + {'panes': [{'shell_command': ['top']}]}, + ], } diff --git a/tests/fixtures/config/expand_blank.py b/tests/fixtures/config/expand_blank.py index b1a62ee5cb..13d96e92fd 100644 --- a/tests/fixtures/config/expand_blank.py +++ b/tests/fixtures/config/expand_blank.py @@ -4,63 +4,33 @@ { 'window_name': 'Blank pane test', 'panes': [ - { - 'shell_command': [], - }, - { - 'shell_command': [], - }, - { - 'shell_command': [], - } - ] + {'shell_command': []}, + {'shell_command': []}, + {'shell_command': []}, + ], }, { 'window_name': 'More blank panes', 'panes': [ - { - 'shell_command': [], - }, - { - 'shell_command': [], - }, - { - 'shell_command': [], - } - ] + {'shell_command': []}, + {'shell_command': []}, + {'shell_command': []}, + ], }, { 'window_name': 'Empty string (return)', 'panes': [ - { - 'shell_command': [ - '' - ], - }, - { - 'shell_command': [ - '' - ], - }, - { - 'shell_command': [ - '' - ], - } - ] + {'shell_command': ['']}, + {'shell_command': ['']}, + {'shell_command': ['']}, + ], }, { 'window_name': 'Blank with options', 'panes': [ - { - 'shell_command': [], - 'focus': True, - }, - { - 'shell_command': [], - 'start_directory': '/tmp', - } - ] - } - ] + {'shell_command': [], 'focus': True}, + {'shell_command': [], 'start_directory': '/tmp'}, + ], + }, + ], } diff --git a/tests/fixtures/config/sampleconfig.py b/tests/fixtures/config/sampleconfig.py index 13ac219466..65aee3b87a 100644 --- a/tests/fixtures/config/sampleconfig.py +++ b/tests/fixtures/config/sampleconfig.py @@ -5,29 +5,20 @@ { 'window_name': 'editor', 'panes': [ - { - 'start_directory': '~', - 'shell_command': ['vim'], - }, { - 'shell_command': ['cowsay "hey"'] - }, + {'start_directory': '~', 'shell_command': ['vim']}, + {'shell_command': ['cowsay "hey"']}, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [{ - 'shell_command': ['tail -F /var/log/syslog'], - 'start_directory':'/var/log' - }] - }, - { - 'options': { - 'automatic_rename': True, - }, 'panes': [ - {'shell_command': ['htop']} - ] - } - ] + { + 'shell_command': ['tail -F /var/log/syslog'], + 'start_directory': '/var/log', + } + ], + }, + {'options': {'automatic_rename': True}, 'panes': [{'shell_command': ['htop']}]}, + ], } diff --git a/tests/fixtures/config/shell_command_before.py b/tests/fixtures/config/shell_command_before.py index caf9504b3f..7cc227dc05 100644 --- a/tests/fixtures/config/shell_command_before.py +++ b/tests/fixtures/config/shell_command_before.py @@ -9,26 +9,18 @@ 'start_directory': '~', 'shell_command_before': 'source .venv/bin/activate', 'panes': [ - { - 'shell_command': ['vim'], - }, + {'shell_command': ['vim']}, { 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['cowsay "hey"'] + 'shell_command': ['cowsay "hey"'], }, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'shell_command_before': 'rbenv local 2.0.0-p0', 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - }, - { - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}, {}], }, { 'window_name': 'shufu', @@ -37,18 +29,11 @@ 'shell_command_before': ['rbenv local 2.0.0-p0'], 'shell_command': ['htop'], } - ] - }, - { - 'options': {'automatic-rename': True, }, - 'panes': [ - {'shell_command': ['htop']} - ] + ], }, - { - 'panes': ['top'] - } - ] + {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {'panes': ['top']}, + ], } config_expanded = { # shell_command_before is string in some areas @@ -60,27 +45,21 @@ 'start_directory': os.path.expanduser('~'), 'shell_command_before': ['source .venv/bin/activate'], 'panes': [ - { - 'shell_command': ['vim'], - }, + {'shell_command': ['vim']}, { 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['cowsay "hey"'] + 'shell_command': ['cowsay "hey"'], }, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'shell_command_before': ['rbenv local 2.0.0-p0'], 'window_name': 'logging', 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - }, - { - 'shell_command': [] - } - ] + {'shell_command': ['tail -F /var/log/syslog']}, + {'shell_command': []}, + ], }, { 'window_name': 'shufu', @@ -89,20 +68,11 @@ 'shell_command_before': ['rbenv local 2.0.0-p0'], 'shell_command': ['htop'], } - ] - }, - { - 'options': {'automatic-rename': True, }, - 'panes': [ - {'shell_command': ['htop']} - ] - }, - { - 'panes': [{ - 'shell_command': ['top'] - }] + ], }, - ] + {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {'panes': [{'shell_command': ['top']}]}, + ], } config_after = { # shell_command_before is string in some areas @@ -114,34 +84,26 @@ 'start_directory': os.path.expanduser('~'), 'shell_command_before': ['source .venv/bin/activate'], 'panes': [ - { - 'shell_command': ['source .venv/bin/activate', 'vim'], - }, + {'shell_command': ['source .venv/bin/activate', 'vim']}, { 'shell_command_before': ['rbenv local 2.0.0-p0'], 'shell_command': [ 'source .venv/bin/activate', - 'rbenv local 2.0.0-p0', 'cowsay "hey"' - ] + 'rbenv local 2.0.0-p0', + 'cowsay "hey"', + ], }, ], - 'layout': 'main-verticle' + 'layout': 'main-verticle', }, { 'shell_command_before': ['rbenv local 2.0.0-p0'], 'start_directory': '/', 'window_name': 'logging', 'panes': [ - { - 'shell_command': [ - 'rbenv local 2.0.0-p0', - 'tail -F /var/log/syslog' - ], - }, - { - 'shell_command': ['rbenv local 2.0.0-p0'] - } - ] + {'shell_command': ['rbenv local 2.0.0-p0', 'tail -F /var/log/syslog']}, + {'shell_command': ['rbenv local 2.0.0-p0']}, + ], }, { 'start_directory': '/', @@ -151,24 +113,13 @@ 'shell_command_before': ['rbenv local 2.0.0-p0'], 'shell_command': ['rbenv local 2.0.0-p0', 'htop'], } - ] + ], }, { 'start_directory': '/', - 'options': {'automatic-rename': True, }, - 'panes': [ - { - 'shell_command': ['htop'] - } - ] + 'options': {'automatic-rename': True}, + 'panes': [{'shell_command': ['htop']}], }, - { - 'start_directory': '/', - 'panes': [ - { - 'shell_command': ['top'] - } - ] - } - ] + {'start_directory': '/', 'panes': [{'shell_command': ['top']}]}, + ], } diff --git a/tests/fixtures/config/trickle.py b/tests/fixtures/config/trickle.py index da67df5d1b..938d641684 100644 --- a/tests/fixtures/config/trickle.py +++ b/tests/fixtures/config/trickle.py @@ -5,29 +5,18 @@ { 'window_name': 'editor', 'start_directory': 'log', - 'panes': [ - { - 'shell_command': ['vim'], - }, - { - 'shell_command': ['cowsay "hey"'] - }, - ], - 'layout': 'main-verticle' + 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], + 'layout': 'main-verticle', }, { 'window_name': 'logging', 'start_directory': '~', 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - }, - { - 'shell_command': [] - } - ] + {'shell_command': ['tail -F /var/log/syslog']}, + {'shell_command': []}, + ], }, - ] + ], } expected = { # shell_command_before is string in some areas @@ -37,29 +26,16 @@ { 'window_name': 'editor', 'start_directory': '/var/log', - 'panes': [ - { - 'shell_command': ['vim'], - }, - { - 'shell_command': [ - 'cowsay "hey"' - ] - }, - ], - 'layout': 'main-verticle' + 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], + 'layout': 'main-verticle', }, { 'start_directory': '~', 'window_name': 'logging', 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - }, - { - 'shell_command': [] - } - ] + {'shell_command': ['tail -F /var/log/syslog']}, + {'shell_command': []}, + ], }, - ] + ], } diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index a40bcd3d7a..17803cf532 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -10,66 +10,37 @@ 'clear': True, 'root': '/foo', 'layout': 'tiled', - 'panes': [ - { - 'cmd': "echo 'foo'" - }, - { - 'cmd': "echo 'foo again'" - } - ] + 'panes': [{'cmd': "echo 'foo'"}, {'cmd': "echo 'foo again'"}], }, { 'name': 'bar', 'root': '/bar', 'splits': [ { - 'cmd': [ - "echo 'bar'", - "echo 'bar in an array'" - ], - 'target': 'bottom-right' + 'cmd': ["echo 'bar'", "echo 'bar in an array'"], + 'target': 'bottom-right', }, - { - 'cmd': "echo 'bar again'", - 'focus': True, - 'width': 50 - } - ] - - } + {'cmd': "echo 'bar again'", 'focus': True, 'width': 50}, + ], + }, ] }, - 'two-windows-with-filters': { 'windows': [ { 'name': 'foo', 'root': '/foo', - 'filters': - { - 'before': [ - 'echo first before filter', - 'echo second before filter' - ], - 'after': [ - 'echo first after filter', - 'echo second after filter', - ] + 'filters': { + 'before': ['echo first before filter', 'echo second before filter'], + 'after': ['echo first after filter', 'echo second after filter'], }, 'panes': [ - { - 'cmd': "echo 'foo'" - }, - { - 'cmd': "echo 'foo again'", - 'width': 50 - } - ] + {'cmd': "echo 'foo'"}, + {'cmd': "echo 'foo again'", 'width': 50}, + ], } ] }, - 'two-windows-with-custom-command-options': { 'windows': [ { @@ -79,133 +50,37 @@ 'clear': True, 'root': '/foo', 'layout': 'tiled', - 'panes': [ - { - 'cmd': "echo 'foo'" - }, - { - 'cmd': "echo 'foo again'" - } - ] - }, { + 'panes': [{'cmd': "echo 'foo'"}, {'cmd': "echo 'foo again'"}], + }, + { 'name': 'bar', 'cmd_separator': ' && ', 'with_env_var': True, 'root': '/bar', 'splits': [ { - 'cmd': [ - "echo 'bar'", - "echo 'bar in an array'" - ], - 'target': 'bottom-right' + 'cmd': ["echo 'bar'", "echo 'bar in an array'"], + 'target': 'bottom-right', }, - { - 'cmd': "echo 'bar again'", - 'focus': True, - 'width': 50 - } - ] - }] + {'cmd': "echo 'bar again'", 'focus': True, 'width': 50}, + ], + }, + ] }, - 'three-windows-within-a-session': { 'session': { 'name': 'my awesome session', 'windows': [ - { - 'name': 'first window', - 'panes': [ - { - 'cmd': "echo 'foo'" - } - ] - }, { - 'name': 'second window', - 'panes': [ - { - 'cmd': "echo 'foo'"} - ] - }, { - 'name': 'third window', - 'panes': [ - { - 'cmd': "echo 'foo'" - } - ] - } - ] + {'name': 'first window', 'panes': [{'cmd': "echo 'foo'"}]}, + {'name': 'second window', 'panes': [{'cmd': "echo 'foo'"}]}, + {'name': 'third window', 'panes': [{'cmd': "echo 'foo'"}]}, + ], } - } + }, } -two_windows = \ - { - 'session_name': None, - 'windows': [ - { - 'window_name': 'foo', - 'start_directory': '/foo', - 'clear': True, - 'layout': 'tiled', - 'panes': [ - { - 'shell_command': "echo 'foo'" - }, - { - 'shell_command': "echo 'foo again'" - } - ] - }, - { - 'window_name': 'bar', - 'start_directory': '/bar', - 'panes': [ - { - 'shell_command': [ - "echo 'bar'", - "echo 'bar in an array'" - ], - 'target': 'bottom-right' - }, - { - 'shell_command': "echo 'bar again'", - 'focus': True, - } - ] - } - ] - } - -two_windows_with_filters = \ - { - 'session_name': None, - 'windows': [ - { - 'window_name': 'foo', - 'start_directory': '/foo', - 'shell_command_before': [ - 'echo first before filter', - 'echo second before filter', - ], - 'shell_command_after': [ - 'echo first after filter', - 'echo second after filter', - ], - 'panes': [ - { - 'shell_command': "echo 'foo'" - }, - { - 'shell_command': "echo 'foo again'", - } - ] - } - ] - } - -two_windows_with_custom_command_options = { +two_windows = { 'session_name': None, 'windows': [ { @@ -214,62 +89,78 @@ 'clear': True, 'layout': 'tiled', 'panes': [ - { - 'shell_command': "echo 'foo'", - }, - { - 'shell_command': "echo 'foo again'", - } - ] + {'shell_command': "echo 'foo'"}, + {'shell_command': "echo 'foo again'"}, + ], }, { 'window_name': 'bar', 'start_directory': '/bar', 'panes': [ { - 'shell_command': [ - "echo 'bar'", - "echo 'bar in an array'" - ], - 'target': 'bottom-right' + 'shell_command': ["echo 'bar'", "echo 'bar in an array'"], + 'target': 'bottom-right', }, - { - 'shell_command': "echo 'bar again'", - 'focus': True, - } - ] - - } - ] - + {'shell_command': "echo 'bar again'", 'focus': True}, + ], + }, + ], } -three_windows_within_a_session = { - 'session_name': 'my awesome session', +two_windows_with_filters = { + 'session_name': None, 'windows': [ { - 'window_name': 'first window', + 'window_name': 'foo', + 'start_directory': '/foo', + 'shell_command_before': [ + 'echo first before filter', + 'echo second before filter', + ], + 'shell_command_after': [ + 'echo first after filter', + 'echo second after filter', + ], 'panes': [ - { - 'shell_command': "echo 'foo'" - }, - ] - }, + {'shell_command': "echo 'foo'"}, + {'shell_command': "echo 'foo again'"}, + ], + } + ], +} + +two_windows_with_custom_command_options = { + 'session_name': None, + 'windows': [ { - 'window_name': 'second window', + 'window_name': 'foo', + 'start_directory': '/foo', + 'clear': True, + 'layout': 'tiled', 'panes': [ - { - 'shell_command': "echo 'foo'" - }, - ] + {'shell_command': "echo 'foo'"}, + {'shell_command': "echo 'foo again'"}, + ], }, { - 'window_name': 'third window', + 'window_name': 'bar', + 'start_directory': '/bar', 'panes': [ { - 'shell_command': "echo 'foo'" + 'shell_command': ["echo 'bar'", "echo 'bar in an array'"], + 'target': 'bottom-right', }, - ] + {'shell_command': "echo 'bar again'", 'focus': True}, + ], }, - ] + ], +} + +three_windows_within_a_session = { + 'session_name': 'my awesome session', + 'windows': [ + {'window_name': 'first window', 'panes': [{'shell_command': "echo 'foo'"}]}, + {'window_name': 'second window', 'panes': [{'shell_command': "echo 'foo'"}]}, + {'window_name': 'third window', 'panes': [{'shell_command': "echo 'foo'"}]}, + ], } diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index f504344217..0ea0dfa73f 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -2,22 +2,14 @@ teamocil_yaml = loadfixture('config_teamocil/test1.yaml') teamocil_conf = { - 'windows': [{ - 'name': 'sample-two-panes', - 'root': '~/Code/sample/www', - 'layout': 'even-horizontal', - 'panes': [ - { - 'cmd': [ - 'pwd', - 'ls -la' - ] - }, - { - 'cmd': 'rails server --port 3000' - } - ] - }] + 'windows': [ + { + 'name': 'sample-two-panes', + 'root': '~/Code/sample/www', + 'layout': 'even-horizontal', + 'panes': [{'cmd': ['pwd', 'ls -la']}, {'cmd': 'rails server --port 3000'}], + } + ] } expected = { @@ -28,16 +20,9 @@ 'layout': 'even-horizontal', 'start_directory': '~/Code/sample/www', 'panes': [ - { - 'shell_command': [ - 'pwd', - 'ls -la' - ] - }, - { - 'shell_command': 'rails server --port 3000' - } - ] + {'shell_command': ['pwd', 'ls -la']}, + {'shell_command': 'rails server --port 3000'}, + ], } - ] + ], } diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index 7c9c083098..85ea65a82f 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -2,17 +2,14 @@ teamocil_yaml = loadfixture('config_teamocil/test2.yaml') teamocil_dict = { - 'windows': [{ - 'name': 'sample-four-panes', - 'root': '~/Code/sample/www', - 'layout': 'tiled', - 'panes': [ - {'cmd': 'pwd'}, - {'cmd': 'pwd'}, - {'cmd': 'pwd'}, - {'cmd': 'pwd'}, - ] - }] + 'windows': [ + { + 'name': 'sample-four-panes', + 'root': '~/Code/sample/www', + 'layout': 'tiled', + 'panes': [{'cmd': 'pwd'}, {'cmd': 'pwd'}, {'cmd': 'pwd'}, {'cmd': 'pwd'}], + } + ] } expected = { @@ -23,19 +20,11 @@ 'layout': 'tiled', 'start_directory': '~/Code/sample/www', 'panes': [ - { - 'shell_command': 'pwd' - }, - { - 'shell_command': 'pwd' - }, - { - 'shell_command': 'pwd' - }, - { - 'shell_command': 'pwd' - }, - ] + {'shell_command': 'pwd'}, + {'shell_command': 'pwd'}, + {'shell_command': 'pwd'}, + {'shell_command': 'pwd'}, + ], } - ] + ], } diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index 6a33d07e97..2406f2b0f5 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -3,24 +3,22 @@ teamocil_yaml = loadfixture('config_teamocil/test3.yaml') teamocil_dict = { - 'windows': [{ - 'name': 'my-first-window', - 'root': '~/Projects/foo-www', - 'layout': 'even-vertical', - 'filters': { - 'before': 'rbenv local 2.0.0-p0', - 'after': 'echo \'I am done initializing this pane.\'' - }, - 'panes': [ - {'cmd': 'git status'}, - {'cmd': 'bundle exec rails server --port 40', - 'focus': True}, - {'cmd': [ - 'sudo service memcached start', - 'sudo service mongodb start', - ]} - ] - }] + 'windows': [ + { + 'name': 'my-first-window', + 'root': '~/Projects/foo-www', + 'layout': 'even-vertical', + 'filters': { + 'before': 'rbenv local 2.0.0-p0', + 'after': 'echo \'I am done initializing this pane.\'', + }, + 'panes': [ + {'cmd': 'git status'}, + {'cmd': 'bundle exec rails server --port 40', 'focus': True}, + {'cmd': ['sudo service memcached start', 'sudo service mongodb start']}, + ], + } + ] } expected = { @@ -31,26 +29,17 @@ 'layout': 'even-vertical', 'start_directory': "~/Projects/foo-www", 'shell_command_before': 'rbenv local 2.0.0-p0', - 'shell_command_after': ( - 'echo ' - '\'I am done initializing this pane.\'' - ), + 'shell_command_after': ('echo ' '\'I am done initializing this pane.\''), 'panes': [ - { - 'shell_command': 'git status' - }, - { - 'shell_command': 'bundle exec rails server --port 40', - 'focus': True - }, + {'shell_command': 'git status'}, + {'shell_command': 'bundle exec rails server --port 40', 'focus': True}, { 'shell_command': [ 'sudo service memcached start', - 'sudo service mongodb start' + 'sudo service mongodb start', ] - } - ] + }, + ], } - - ] + ], } diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index 0ef912b574..b9b5f97a35 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -3,13 +3,13 @@ teamocil_yaml = loadfixture('config_teamocil/test4.yaml') teamocil_dict = { - 'windows': [{ - 'name': 'erb-example', - 'root': "<%= ENV['MY_PROJECT_ROOT'] %>", - 'panes': [ - {'cmd': 'pwd'} - ] - }] + 'windows': [ + { + 'name': 'erb-example', + 'root': "<%= ENV['MY_PROJECT_ROOT'] %>", + 'panes': [{'cmd': 'pwd'}], + } + ] } expected = { @@ -18,11 +18,7 @@ { 'window_name': 'erb-example', 'start_directory': "<%= ENV['MY_PROJECT_ROOT'] %>", - 'panes': [ - { - 'shell_command': 'pwd' - } - ] + 'panes': [{'shell_command': 'pwd'}], } - ] + ], } diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index fa4f365755..2fe873812d 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -3,46 +3,17 @@ tmuxinator_yaml = loadfixture('config_tmuxinator/test1.yaml') tmuxinator_dict = { 'windows': [ - { - 'editor': { - 'layout': 'main-vertical', - 'panes': [ - 'vim', - 'guard' - ] - } - }, - { - 'server': 'bundle exec rails s', - }, - { - 'logs': 'tail -f logs/development.log' - } + {'editor': {'layout': 'main-vertical', 'panes': ['vim', 'guard']}}, + {'server': 'bundle exec rails s'}, + {'logs': 'tail -f logs/development.log'}, ] } expected = { 'session_name': None, 'windows': [ - { - 'window_name': 'editor', - 'layout': 'main-vertical', - 'panes': [ - 'vim', - 'guard' - ] - }, - { - 'window_name': 'server', - 'panes': [ - 'bundle exec rails s' - ] - }, - { - 'window_name': 'logs', - 'panes': [ - 'tail -f logs/development.log' - ] - } - ] + {'window_name': 'editor', 'layout': 'main-vertical', 'panes': ['vim', 'guard']}, + {'window_name': 'server', 'panes': ['bundle exec rails s']}, + {'window_name': 'logs', 'panes': ['tail -f logs/development.log']}, + ], } diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index c773346791..fe32160f04 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -13,31 +13,22 @@ { 'editor': { 'pre': [ - 'echo "I get run in each pane, ' - 'before each pane command!"', - None + 'echo "I get run in each pane, ' 'before each pane command!"', + None, ], 'layout': 'main-vertical', - 'panes': [ - 'vim', - None, - 'top' - ] + 'panes': ['vim', None, 'top'], } }, - {'shell': 'git pull', }, + {'shell': 'git pull'}, { 'guard': { 'layout': 'tiled', 'pre': [ 'echo "I get run in each pane."', - 'echo "Before each pane command!"' + 'echo "Before each pane command!"', ], - 'panes': [ - None, - None, - None - ] + 'panes': [None, None, None], } }, {'database': 'bundle exec rails db'}, @@ -45,8 +36,8 @@ {'logs': 'tail -f log/development.log'}, {'console': 'bundle exec rails c'}, {'capistrano': None}, - {'server': 'ssh user@example.com'} - ] + {'server': 'ssh user@example.com'}, + ], } expected = { @@ -54,78 +45,32 @@ 'socket_name': 'foo', 'config': '~/.tmux.mac.conf', 'start_directory': '~/test', - 'shell_command_before': [ - 'sudo /etc/rc.d/mysqld start', - 'rbenv shell 2.0.0-p247' - ], + 'shell_command_before': ['sudo /etc/rc.d/mysqld start', 'rbenv shell 2.0.0-p247'], 'windows': [ { 'window_name': 'editor', 'shell_command_before': [ 'echo "I get run in each pane, before each pane command!"', - None + None, ], 'layout': 'main-vertical', - 'panes': [ - 'vim', - None, - 'top' - ] - }, - { - 'window_name': 'shell', - 'panes': [ - 'git pull' - ] + 'panes': ['vim', None, 'top'], }, + {'window_name': 'shell', 'panes': ['git pull']}, { 'window_name': 'guard', 'layout': 'tiled', 'shell_command_before': [ 'echo "I get run in each pane."', - 'echo "Before each pane command!"' + 'echo "Before each pane command!"', ], - 'panes': [ - None, - None, - None - ] + 'panes': [None, None, None], }, - { - 'window_name': 'database', - 'panes': [ - 'bundle exec rails db' - ] - }, - { - 'window_name': 'server', - 'panes': [ - 'bundle exec rails s' - ] - }, - { - 'window_name': 'logs', - 'panes': [ - 'tail -f log/development.log' - ] - }, - { - 'window_name': 'console', - 'panes': [ - 'bundle exec rails c' - ] - }, - { - 'window_name': 'capistrano', - 'panes': [ - None - ] - }, - { - 'window_name': 'server', - 'panes': [ - 'ssh user@example.com' - ] - } - ] + {'window_name': 'database', 'panes': ['bundle exec rails db']}, + {'window_name': 'server', 'panes': ['bundle exec rails s']}, + {'window_name': 'logs', 'panes': ['tail -f log/development.log']}, + {'window_name': 'console', 'panes': ['bundle exec rails c']}, + {'window_name': 'capistrano', 'panes': [None]}, + {'window_name': 'server', 'panes': ['ssh user@example.com']}, + ], } diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index 530db661b4..9e5698083d 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -13,37 +13,23 @@ { 'editor': { 'pre': [ - 'echo "I get run in each pane, ' - 'before each pane command!"', - None + 'echo "I get run in each pane, ' 'before each pane command!"', + None, ], 'layout': 'main-vertical', 'root': '~/test/editor', - 'panes': [ - 'vim', - None, - 'top' - ] + 'panes': ['vim', None, 'top'], } }, - { - 'shell': [ - 'git pull', - 'git merge' - ] - }, + {'shell': ['git pull', 'git merge']}, { 'guard': { 'layout': 'tiled', 'pre': [ 'echo "I get run in each pane."', - 'echo "Before each pane command!"' + 'echo "Before each pane command!"', ], - 'panes': [ - None, - None, - None - ] + 'panes': [None, None, None], } }, {'database': 'bundle exec rails db'}, @@ -51,8 +37,8 @@ {'logs': 'tail -f log/development.log'}, {'console': 'bundle exec rails c'}, {'capistrano': None}, - {'server': 'ssh user@example.com'} - ] + {'server': 'ssh user@example.com'}, + ], } expected = { @@ -61,79 +47,33 @@ 'start_directory': '~/test', 'config': '~/.tmux.mac.conf', 'shell_command': 'sudo /etc/rc.d/mysqld start', - 'shell_command_before': [ - 'rbenv shell 2.0.0-p247' - ], + 'shell_command_before': ['rbenv shell 2.0.0-p247'], 'windows': [ { 'window_name': 'editor', 'shell_command_before': [ 'echo "I get run in each pane, before each pane command!"', - None + None, ], 'layout': 'main-vertical', 'start_directory': '~/test/editor', - 'panes': [ - 'vim', - None, - 'top' - ] - }, - { - 'window_name': 'shell', - 'panes': [ - 'git pull', - 'git merge' - ] + 'panes': ['vim', None, 'top'], }, + {'window_name': 'shell', 'panes': ['git pull', 'git merge']}, { 'window_name': 'guard', 'layout': 'tiled', 'shell_command_before': [ 'echo "I get run in each pane."', - 'echo "Before each pane command!"' + 'echo "Before each pane command!"', ], - 'panes': [ - None, - None, - None - ] - }, - { - 'window_name': 'database', - 'panes': [ - 'bundle exec rails db' - ] - }, - { - 'window_name': 'server', - 'panes': [ - 'bundle exec rails s' - ] - }, - { - 'window_name': 'logs', - 'panes': [ - 'tail -f log/development.log' - ] + 'panes': [None, None, None], }, - { - 'window_name': 'console', - 'panes': [ - 'bundle exec rails c' - ] - }, - { - 'window_name': 'capistrano', - 'panes': [ - None - ] - }, - { - 'window_name': 'server', - 'panes': [ - 'ssh user@example.com' - ] - } - ] + {'window_name': 'database', 'panes': ['bundle exec rails db']}, + {'window_name': 'server', 'panes': ['bundle exec rails s']}, + {'window_name': 'logs', 'panes': ['tail -f log/development.log']}, + {'window_name': 'console', 'panes': ['bundle exec rails c']}, + {'window_name': 'capistrano', 'panes': [None]}, + {'window_name': 'server', 'panes': ['ssh user@example.com']}, + ], } diff --git a/tests/test_cli.py b/tests/test_cli.py index f74eb7ecf2..cf29a9db8c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -61,19 +61,22 @@ def test_get_configs_cwd(tmpdir): assert '.tmuxp.json' in configs_found -@pytest.mark.parametrize('path,expect', [ - ('.', False), - ('./', False), - ('', False), - ('.tmuxp.yaml', False), - ('../.tmuxp.yaml', False), - ('../', False), - ('/hello/world', False), - ('~/.tmuxp/hey', False), - ('~/work/c/tmux/', False), - ('~/work/c/tmux/.tmuxp.yaml', False), - ('myproject', True), -]) +@pytest.mark.parametrize( + 'path,expect', + [ + ('.', False), + ('./', False), + ('', False), + ('.tmuxp.yaml', False), + ('../.tmuxp.yaml', False), + ('../', False), + ('/hello/world', False), + ('~/.tmuxp/hey', False), + ('~/work/c/tmux/', False), + ('~/work/c/tmux/.tmuxp.yaml', False), + ('myproject', True), + ], +) def test_is_pure_name(path, expect): assert is_pure_name(path) == expect @@ -134,11 +137,11 @@ def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): assert scan_config('../project') == expect assert scan_config('../project/') == expect assert scan_config('.tmuxp.yaml') == expect - assert scan_config( - '../../.tmuxp/%s.yaml' % user_config_name) == str(user_config) + assert scan_config('../../.tmuxp/%s.yaml' % user_config_name) == str( + user_config + ) assert scan_config('myconfig') == str(user_config) - assert scan_config( - '~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): scan_config('.tmuxp.json') @@ -155,13 +158,10 @@ def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): assert scan_config('work/project/') == expect assert scan_config('./work/project') == expect assert scan_config('./work/project/') == expect - assert scan_config( - '.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert scan_config( - './.tmuxp/%s.yaml' % user_config_name) == str(user_config) + assert scan_config('.tmuxp/%s.yaml' % user_config_name) == str(user_config) + assert scan_config('./.tmuxp/%s.yaml' % user_config_name) == str(user_config) assert scan_config('myconfig') == str(user_config) - assert scan_config( - '~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): scan_config('') @@ -179,13 +179,10 @@ def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): assert scan_config('../work/project') == expect assert scan_config('../../home/work/project') == expect assert scan_config('../work/project/') == expect - assert scan_config( - '%s.yaml' % user_config_name) == str(user_config) - assert scan_config( - './%s.yaml' % user_config_name) == str(user_config) + assert scan_config('%s.yaml' % user_config_name) == str(user_config) + assert scan_config('./%s.yaml' % user_config_name) == str(user_config) assert scan_config('myconfig') == str(user_config) - assert scan_config( - '~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): scan_config('') @@ -202,13 +199,12 @@ def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): expect = project_config assert scan_config('home/work/project') == expect assert scan_config('./home/work/project/') == expect - assert scan_config( - 'home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert scan_config( - './home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) + assert scan_config('home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) + assert scan_config('./home/.tmuxp/%s.yaml' % user_config_name) == str( + user_config + ) assert scan_config('myconfig') == str(user_config) - assert scan_config( - '~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) with pytest.raises(Exception): scan_config('') @@ -227,8 +223,8 @@ def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): @click.command() @click.argument( - 'config', click.Path(exists=True), nargs=-1, - callback=cli.scan_config_argument) + 'config', click.Path(exists=True), nargs=-1, callback=cli.scan_config_argument + ) def config_cmd(config): click.echo(config) @@ -250,11 +246,9 @@ def check_cmd(config_arg): assert expect in check_cmd('../project') assert expect in check_cmd('../project/') assert expect in check_cmd('.tmuxp.yaml') - assert str(user_config) in check_cmd( - '../../.tmuxp/%s.yaml' % user_config_name) + assert str(user_config) in check_cmd('../../.tmuxp/%s.yaml' % user_config_name) assert user_config.purebasename in check_cmd('myconfig') - assert str(user_config) in check_cmd( - '~/.tmuxp/myconfig.yaml') + assert str(user_config) in check_cmd('~/.tmuxp/myconfig.yaml') assert 'file not found' in check_cmd('.tmuxp.json') assert 'file not found' in check_cmd('.tmuxp.ini') @@ -271,8 +265,7 @@ def test_load_workspace(server, monkeypatch): # open it detached session = load_workspace( - session_file, socket_name=server.socket_name, - detached=True + session_file, socket_name=server.socket_name, detached=True ) assert isinstance(session, libtmux.Session) @@ -288,8 +281,7 @@ def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): # open it detached session = load_workspace( - session_file, socket_name=server.socket_name, - detached=True + session_file, socket_name=server.socket_name, detached=True ) assert isinstance(session, libtmux.Session) @@ -297,18 +289,18 @@ def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): projfile = tmpdir.join('simple.yaml') - projfile.write(""" + projfile.write( + """ session_name: sampleconfi start_directory: './' windows: - panes: - - echo 'hey'""") + - echo 'hey'""" + ) # open it detached session = load_workspace( - projfile.strpath, - socket_name=server.socket_name, - detached=True + projfile.strpath, socket_name=server.socket_name, detached=True ) assert session.name == 'sampleconfi' @@ -324,18 +316,18 @@ def test_load_symlinked_workspace(server, tmpdir, monkeypatch): linktemp.mksymlinkto(realtemp) projfile = linktemp.join('simple.yaml') - projfile.write(""" + projfile.write( + """ session_name: samplesimple start_directory: './' windows: - panes: - - echo 'hey'""") + - echo 'hey'""" + ) # open it detached session = load_workspace( - projfile.strpath, - socket_name=server.socket_name, - detached=True + projfile.strpath, socket_name=server.socket_name, detached=True ) pane = session.attached_window.attached_pane @@ -350,16 +342,13 @@ def test_regression_00132_session_name_with_dots(tmpdir, server, session): inputs = [] runner = CliRunner() result = runner.invoke( - cli.command_load, cli_args, input=''.join(inputs), - standalone_mode=False) + cli.command_load, cli_args, input=''.join(inputs), standalone_mode=False + ) assert result.exception assert isinstance(result.exception, libtmux.exc.BadSessionName) -@pytest.mark.parametrize("cli_args", [ - (['load', '.']), - (['load', '.tmuxp.yaml']), -]) +@pytest.mark.parametrize("cli_args", [(['load', '.']), (['load', '.tmuxp.yaml'])]) def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at tmpdir.join('.tmuxp.yaml').ensure() @@ -388,15 +377,14 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output -@pytest.mark.parametrize("cli_args", [ - (['convert', '.']), - (['convert', '.tmuxp.yaml']), -]) +@pytest.mark.parametrize("cli_args", [(['convert', '.']), (['convert', '.tmuxp.yaml'])]) def test_convert(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join('.tmuxp.yaml').write(""" + tmpdir.join('.tmuxp.yaml').write( + """ session_name: hello - """) + """ + ) tmpdir.join('.oh-my-zsh').ensure(dir=True) monkeypatch.setenv('HOME', str(tmpdir)) @@ -405,13 +393,12 @@ def test_convert(cli_args, tmpdir, monkeypatch): runner.invoke(cli.cli, cli_args, input='y\ny\n') assert tmpdir.join('.tmuxp.json').check() - assert tmpdir.join('.tmuxp.json').open().read() == \ - json.dumps({'session_name': 'hello'}, indent=2) + assert tmpdir.join('.tmuxp.json').open().read() == json.dumps( + {'session_name': 'hello'}, indent=2 + ) -@pytest.mark.parametrize("cli_args", [ - (['import']), -]) +@pytest.mark.parametrize("cli_args", [(['import'])]) def test_import(cli_args, monkeypatch): runner = CliRunner() @@ -420,14 +407,23 @@ def test_import(cli_args, monkeypatch): assert 'teamocil' in result.output -@pytest.mark.parametrize("cli_args,inputs", [ - (['import', 'teamocil', './.teamocil/config.yaml'], - ['\n', 'y\n', './la.yaml\n', 'y\n']), - (['import', 'teamocil', './.teamocil/config.yaml'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), - (['import', 'teamocil', 'config'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), -]) +@pytest.mark.parametrize( + "cli_args,inputs", + [ + ( + ['import', 'teamocil', './.teamocil/config.yaml'], + ['\n', 'y\n', './la.yaml\n', 'y\n'], + ), + ( + ['import', 'teamocil', './.teamocil/config.yaml'], + ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ), + ( + ['import', 'teamocil', 'config'], + ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ), + ], +) def test_import_teamocil(cli_args, inputs, tmpdir, monkeypatch): teamocil_config = loadfixture('config_teamocil/test4.yaml') teamocil_dir = tmpdir.join('.teamocil').mkdir() @@ -441,14 +437,23 @@ def test_import_teamocil(cli_args, inputs, tmpdir, monkeypatch): assert tmpdir.join('la.yaml').check() -@pytest.mark.parametrize("cli_args,inputs", [ - (['import', 'tmuxinator', './.tmuxinator/config.yaml'], - ['\n', 'y\n', './la.yaml\n', 'y\n']), - (['import', 'tmuxinator', './.tmuxinator/config.yaml'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), - (['import', 'tmuxinator', 'config'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), -]) +@pytest.mark.parametrize( + "cli_args,inputs", + [ + ( + ['import', 'tmuxinator', './.tmuxinator/config.yaml'], + ['\n', 'y\n', './la.yaml\n', 'y\n'], + ), + ( + ['import', 'tmuxinator', './.tmuxinator/config.yaml'], + ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ), + ( + ['import', 'tmuxinator', 'config'], + ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ), + ], +) def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): tmuxinator_config = loadfixture('config_tmuxinator/test3.yaml') tmuxinator_dir = tmpdir.join('.tmuxinator').mkdir() @@ -518,8 +523,8 @@ def test_create_scan_config_arg(tmpdir): @click.command() @click.argument( - 'config', click.Path(exists=True), nargs=-1, - callback=my_scan_config) + 'config', click.Path(exists=True), nargs=-1, callback=my_scan_config + ) def config_cmd(config): click.echo(config) @@ -530,7 +535,6 @@ def check_cmd(config_arg): assert expect in check_cmd('myconfig') assert expect in check_cmd('myconfig.yaml') assert expect in check_cmd('./myconfig.yaml') - assert str(user_config) in check_cmd( - str(configdir.join('myconfig.yaml'))) + assert str(user_config) in check_cmd(str(configdir.join('myconfig.yaml'))) assert 'file not found' in check_cmd('.tmuxp.json') diff --git a/tests/test_config.py b/tests/test_config.py index dfa9fb1c78..c119047a0f 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -47,8 +47,7 @@ def test_export_yaml(tmpdir): sampleconfig = config.inline(fixtures.sampleconfig.sampleconfigdict) configparser.import_config(sampleconfig) - yaml_config_data = configparser.export( - 'yaml', indent=2, default_flow_style=False) + yaml_config_data = configparser.export('yaml', indent=2, default_flow_style=False) yaml_config_file.write(yaml_config_data) @@ -63,9 +62,7 @@ def test_scan_config(tmpdir): garbage_file.write('wat') for r, d, f in os.walk(str(tmpdir)): - for filela in ( - x for x in f if x.endswith(('.json', '.ini', 'yaml')) - ): + for filela in (x for x in f if x.endswith(('.json', '.ini', 'yaml'))): configs.append(str(tmpdir.join(filela))) files = 0 @@ -109,31 +106,15 @@ def test_config_expand2(): { 'shell_command': ['top'], 'window_name': 'editor', - 'panes': [ - { - 'shell_command': ['vim'], - }, - { - 'shell_command': ['cowsay "hey"'] - }, - ], - 'layout': 'main-verticle' + 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], }, - { - 'options': {'automatic-rename': True, }, - 'panes': [ - {'shell_command': ['htop']} - ] - } - ] + {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + ], } iafter_config = { @@ -143,28 +124,12 @@ def test_config_expand2(): { 'shell_command': 'top', 'window_name': 'editor', - 'panes': [ - 'vim', - 'cowsay "hey"' - ], - 'layout': 'main-verticle' - }, - { - 'window_name': 'logging', - 'panes': [ - 'tail -F /var/log/syslog', - ] + 'panes': ['vim', 'cowsay "hey"'], + 'layout': 'main-verticle', }, - { - 'options': { - 'automatic-rename': True, - }, - 'panes': [ - 'htop' - ] - }, - - ] + {'window_name': 'logging', 'panes': ['tail -F /var/log/syslog']}, + {'options': {'automatic-rename': True}, 'panes': ['htop']}, + ], } @@ -184,43 +149,16 @@ def test_inline_config(): { 'window_name': 'editor', 'start_directory': '~', - 'panes': [ - { - 'shell_command': ['vim'], - }, - { - 'shell_command': ['cowsay "hey"'] - }, - ], - 'layout': 'main-verticle' + 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], }, - { - 'window_name': 'shufu', - 'panes': [ - { - 'shell_command': ['htop'], - } - ] - }, - { - 'options': { - 'automatic-rename': True, - }, - 'panes': [ - { - 'shell_command': ['htop'] - } - ] - } - ] + {'window_name': 'shufu', 'panes': [{'shell_command': ['htop']}]}, + {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + ], } inheritance_config_after = { @@ -230,40 +168,16 @@ def test_inline_config(): { 'window_name': 'editor', 'start_directory': '~', - 'panes': [ - { - 'shell_command': ['vim'], - }, { - 'shell_command': ['cowsay "hey"'], - }, - ], - 'layout': 'main-verticle' + 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], + 'layout': 'main-verticle', }, { 'window_name': 'logging', - 'panes': [ - { - 'shell_command': ['tail -F /var/log/syslog'], - } - ] + 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], }, - { - 'window_name': 'shufu', - 'panes': [ - { - 'shell_command': ['htop'], - } - ] - }, - { - 'options': {'automatic-rename': True, }, - 'panes': [ - { - 'shell_command': ['htop'], - } - ] - } - ] + {'window_name': 'shufu', 'panes': [{'shell_command': ['htop']}]}, + {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + ], } @@ -312,8 +226,9 @@ def test_in_session_scope(): config.validate_schema(sconfig) assert config.expand(sconfig) == sconfig - assert config.expand(config.trickle(sconfig)) == \ - load_yaml(fixtures.shell_command_before_session.expected) + assert config.expand(config.trickle(sconfig)) == load_yaml( + fixtures.shell_command_before_session.expected + ) def test_trickle_relative_start_directory(): diff --git a/tests/test_config_teamocil.py b/tests/test_config_teamocil.py index 6e21572403..bd92ee9b9f 100644 --- a/tests/test_config_teamocil.py +++ b/tests/test_config_teamocil.py @@ -16,16 +16,31 @@ TMUXP_DIR = os.path.join(os.path.dirname(__file__), '.tmuxp') -@pytest.mark.parametrize("teamocil_yaml,teamocil_dict,tmuxp_dict", [ - (fixtures.test1.teamocil_yaml, fixtures.test1.teamocil_conf, - fixtures.test1.expected), - (fixtures.test2.teamocil_yaml, fixtures.test2.teamocil_dict, - fixtures.test2.expected), - (fixtures.test3.teamocil_yaml, fixtures.test3.teamocil_dict, - fixtures.test3.expected), - (fixtures.test4.teamocil_yaml, fixtures.test4.teamocil_dict, - fixtures.test4.expected), -]) +@pytest.mark.parametrize( + "teamocil_yaml,teamocil_dict,tmuxp_dict", + [ + ( + fixtures.test1.teamocil_yaml, + fixtures.test1.teamocil_conf, + fixtures.test1.expected, + ), + ( + fixtures.test2.teamocil_yaml, + fixtures.test2.teamocil_dict, + fixtures.test2.expected, + ), + ( + fixtures.test3.teamocil_yaml, + fixtures.test3.teamocil_dict, + fixtures.test3.expected, + ), + ( + fixtures.test4.teamocil_yaml, + fixtures.test4.teamocil_dict, + fixtures.test4.expected, + ), + ], +) def test_config_to_dict(teamocil_yaml, teamocil_dict, tmuxp_dict): configparser = kaptan.Kaptan(handler='yaml') test_config = configparser.import_config(teamocil_yaml) @@ -34,11 +49,7 @@ def test_config_to_dict(teamocil_yaml, teamocil_dict, tmuxp_dict): assert config.import_teamocil(teamocil_dict) == tmuxp_dict - config.validate_schema( - config.import_teamocil( - teamocil_dict - ) - ) + config.validate_schema(config.import_teamocil(teamocil_dict)) @pytest.fixture(scope='module') @@ -56,22 +67,23 @@ def multisession_config(): return teamocil_dict -@pytest.mark.parametrize("session_name,expected", [ - ('two-windows', fixtures.layouts.two_windows), - ('two-windows-with-filters', fixtures.layouts.two_windows_with_filters), - ('two-windows-with-custom-command-options', - fixtures.layouts.two_windows_with_custom_command_options), - ('three-windows-within-a-session', - fixtures.layouts.three_windows_within_a_session), -]) +@pytest.mark.parametrize( + "session_name,expected", + [ + ('two-windows', fixtures.layouts.two_windows), + ('two-windows-with-filters', fixtures.layouts.two_windows_with_filters), + ( + 'two-windows-with-custom-command-options', + fixtures.layouts.two_windows_with_custom_command_options, + ), + ( + 'three-windows-within-a-session', + fixtures.layouts.three_windows_within_a_session, + ), + ], +) def test_multisession_config(session_name, expected, multisession_config): # teamocil can fit multiple sessions in a config - assert config.import_teamocil( - multisession_config[session_name] - ) == expected - - config.validate_schema( - config.import_teamocil( - multisession_config[session_name] - ) - ) + assert config.import_teamocil(multisession_config[session_name]) == expected + + config.validate_schema(config.import_teamocil(multisession_config[session_name])) diff --git a/tests/test_config_tmuxinator.py b/tests/test_config_tmuxinator.py index a541ca358e..5701fac3d6 100644 --- a/tests/test_config_tmuxinator.py +++ b/tests/test_config_tmuxinator.py @@ -16,14 +16,26 @@ TMUXP_DIR = os.path.join(os.path.dirname(__file__), '.tmuxp') -@pytest.mark.parametrize("tmuxinator_yaml,tmuxinator_dict,tmuxp_dict", [ - (fixtures.test1.tmuxinator_yaml, fixtures.test1.tmuxinator_dict, - fixtures.test1.expected), - (fixtures.test2.tmuxinator_yaml, fixtures.test2.tmuxinator_dict, - fixtures.test2.expected), # older vers use `tabs` instead of `windows` - (fixtures.test3.tmuxinator_yaml, fixtures.test3.tmuxinator_dict, - fixtures.test3.expected), # Test importing -]) +@pytest.mark.parametrize( + "tmuxinator_yaml,tmuxinator_dict,tmuxp_dict", + [ + ( + fixtures.test1.tmuxinator_yaml, + fixtures.test1.tmuxinator_dict, + fixtures.test1.expected, + ), + ( + fixtures.test2.tmuxinator_yaml, + fixtures.test2.tmuxinator_dict, + fixtures.test2.expected, + ), # older vers use `tabs` instead of `windows` + ( + fixtures.test3.tmuxinator_yaml, + fixtures.test3.tmuxinator_dict, + fixtures.test3.expected, + ), # Test importing + ], +) def test_config_to_dict(tmuxinator_yaml, tmuxinator_dict, tmuxp_dict): configparser = kaptan.Kaptan(handler='yaml') test_config = configparser.import_config(tmuxinator_yaml) @@ -32,8 +44,4 @@ def test_config_to_dict(tmuxinator_yaml, tmuxinator_dict, tmuxp_dict): assert config.import_tmuxinator(tmuxinator_dict) == tmuxp_dict - config.validate_schema( - config.import_tmuxinator( - tmuxinator_dict - ) - ) + config.validate_schema(config.import_tmuxinator(tmuxinator_dict)) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 040396990a..0bfd24b547 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -77,13 +77,10 @@ def test_focus_pane_index(session): builder.build(session=session) - assert session.attached_window.name == \ - 'focused window' + assert session.attached_window.name == 'focused window' pane_base_index = int( - session.attached_window.show_window_option( - 'pane-base-index', g=True - ) + session.attached_window.show_window_option('pane-base-index', g=True) ) if not pane_base_index: @@ -148,10 +145,8 @@ def test_suppress_history(session): builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - inHistoryWindow = session.find_where( - {'window_name': 'inHistory'}) - isMissingWindow = session.find_where( - {'window_name': 'isMissing'}) + inHistoryWindow = session.find_where({'window_name': 'inHistory'}) + isMissingWindow = session.find_where({'window_name': 'isMissing'}) def assertHistory(cmd, hist): return 'inHistory' in cmd and cmd.endswith(hist) @@ -160,8 +155,8 @@ def assertIsMissing(cmd, hist): return 'isMissing' in cmd and not cmd.endswith(hist) for w, window_name, assertCase in [ - (inHistoryWindow, 'inHistory', assertHistory,), - (isMissingWindow, 'isMissing', assertIsMissing,) + (inHistoryWindow, 'inHistory', assertHistory), + (isMissingWindow, 'isMissing', assertIsMissing), ]: assert w.name == window_name correct = False @@ -181,9 +176,7 @@ def assertIsMissing(cmd, hist): # Get the contents of the pane p.cmd('capture-pane', '-b', buffer_name) - captured_pane = session.server.cmd( - 'show-buffer', '-b', buffer_name - ) + captured_pane = session.server.cmd('show-buffer', '-b', buffer_name) session.server.cmd('delete-buffer', '-b', buffer_name) # Parse the sent and last-in-history commands @@ -193,9 +186,7 @@ def assertIsMissing(cmd, hist): if assertCase(sent_cmd, history_cmd): correct = True break - assert correct, "Unknown sent command: [%s] in %s" % ( - sent_cmd, assertCase - ) + assert correct, "Unknown sent command: [%s] in %s" % (sent_cmd, assertCase) def test_session_options(session): @@ -245,8 +236,7 @@ def test_global_session_env_options(session, monkeypatch): assert visual_silence in s.show_option('visual-silence', g=True) assert repeat_time == s.show_option('repeat-time') - assert main_pane_height == \ - s.attached_window.show_window_option('main-pane-height') + assert main_pane_height == s.attached_window.show_window_option('main-pane-height') def test_window_options(session): @@ -306,22 +296,22 @@ def assert_last_line(p, s): return correct for i, pane in enumerate(session.attached_window.panes): - assert assert_last_line(pane, str(i)), ( - "Initial command did not execute properly/" + str(i) - ) + assert assert_last_line( + pane, str(i) + ), "Initial command did not execute properly/" + str(i) pane.cmd('send-keys', 'Up') # Will repeat echo - pane.enter() # in each iteration - assert assert_last_line(pane, str(i)), ( - "Repeated command did not execute properly/" + str(i) - ) + pane.enter() # in each iteration + assert assert_last_line( + pane, str(i) + ), "Repeated command did not execute properly/" + str(i) session.cmd('send-keys', ' echo moo') session.cmd('send-keys', 'Enter') for pane in session.attached_window.panes: - assert assert_last_line(pane, 'moo'), ( - "Synchronized command did not execute properly" - ) + assert assert_last_line( + pane, 'moo' + ), "Synchronized command did not execute properly" def test_window_shell(session): @@ -416,8 +406,7 @@ def test_automatic_rename_option(session): def test_blank_pane_count(session): """:todo: Verify blank panes of various types build into workspaces.""" yaml_config_file = os.path.join(example_dir, 'blank-panes.yaml') - test_config = kaptan.Kaptan().import_config( - yaml_config_file).get() + test_config = kaptan.Kaptan().import_config(yaml_config_file).get() test_config = config.expand(test_config) builder = WorkspaceBuilder(sconf=test_config) builder.build(session=session) @@ -430,9 +419,7 @@ def test_blank_pane_count(session): window2 = session.find_where({'window_name': 'More blank panes'}) assert len(window2._panes) == 3 - window3 = session.find_where( - {'window_name': 'Empty string (return)'} - ) + window3 = session.find_where({'window_name': 'Empty string (return)'}) assert len(window3._panes) == 3 window4 = session.find_where({'window_name': 'Blank with options'}) @@ -442,10 +429,7 @@ def test_blank_pane_count(session): def test_start_directory(session, tmpdir): yaml_config = loadfixture("workspacebuilder/start_directory.yaml") test_dir = str(tmpdir.mkdir('foo bar')) - test_config = yaml_config.format( - TMP_DIR=str(tmpdir), - TEST_DIR=test_dir - ) + test_config = yaml_config.format(TMP_DIR=str(tmpdir), TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() @@ -456,11 +440,7 @@ def test_start_directory(session, tmpdir): builder.build(session=session) assert session == builder.session - dirs = [ - '/usr/bin', '/dev', test_dir, - '/usr', - '/usr' - ] + dirs = ['/usr/bin', '/dev', test_dir, '/usr', '/usr'] for path, window in zip(dirs, session.windows): for p in window.panes: @@ -469,14 +449,8 @@ def test_start_directory(session, tmpdir): pane_path = p.current_path if pane_path is None: pass - elif ( - path in pane_path or - pane_path == path - ): - result = ( - path == pane_path or - path in pane_path - ) + elif path in pane_path or pane_path == path: + result = path == pane_path or path in pane_path break # handle case with OS X adding /private/ to /tmp/ paths @@ -495,14 +469,11 @@ def test_start_directory_relative(session, tmpdir): $ tmuxp load . """ - yaml_config = \ - loadfixture("workspacebuilder/start_directory_relative.yaml") + yaml_config = loadfixture("workspacebuilder/start_directory_relative.yaml") test_dir = str(tmpdir.mkdir('foo bar')) config_dir = str(tmpdir.mkdir('testRelConfigDir')) - test_config = yaml_config.format( - TEST_DIR=test_dir, - ) + test_config = yaml_config.format(TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(test_config).get() @@ -519,13 +490,7 @@ def test_start_directory_relative(session, tmpdir): assert session == builder.session - dirs = [ - '/usr/bin', - '/dev', - test_dir, - config_dir, - config_dir, - ] + dirs = ['/usr/bin', '/dev', test_dir, config_dir, config_dir] for path, window in zip(dirs, session.windows): for p in window.panes: @@ -535,14 +500,8 @@ def test_start_directory_relative(session, tmpdir): pane_path = p.current_path if pane_path is None: pass - elif ( - path in pane_path or - pane_path == path - ): - result = ( - path == pane_path or - path in pane_path - ) + elif path in pane_path or pane_path == path: + result = path == pane_path or path in pane_path break assert result @@ -564,7 +523,7 @@ def test_pane_order(session): '/usr/bin', '/usr', '/usr/sbin', - os.path.realpath(os.path.expanduser('~')) + os.path.realpath(os.path.expanduser('~')), ] s = session @@ -609,11 +568,7 @@ def test_window_index(session): yaml_config = loadfixture("workspacebuilder/window_index.yaml") proc = session.cmd('show-option', '-gv', 'base-index') base_index = int(proc.stdout[0]) - name_index_map = { - 'zero': 0 + base_index, - 'one': 1 + base_index, - 'five': 5, - } + name_index_map = {'zero': 0 + base_index, 'one': 1 + base_index, 'five': 5} sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(yaml_config).get() @@ -628,13 +583,11 @@ def test_window_index(session): def test_before_load_throw_error_if_retcode_error(server): - config_script_fails = loadfixture( - "workspacebuilder/config_script_fails.yaml" - ) + config_script_fails = loadfixture("workspacebuilder/config_script_fails.yaml") sconfig = kaptan.Kaptan(handler='yaml') yaml = config_script_fails.format( fixtures_dir=fixtures_dir, - script_failed=os.path.join(fixtures_dir, 'script_failed.sh') + script_failed=os.path.join(fixtures_dir, 'script_failed.sh'), ) sconfig = sconfig.import_config(yaml).get() @@ -650,8 +603,7 @@ def test_before_load_throw_error_if_retcode_error(server): builder.build(session=sess) result = server.has_session(session_name) - assert not result, \ - "Kills session if before_script exits with errcode" + assert not result, "Kills session if before_script exits with errcode" def test_before_load_throw_error_if_file_not_exists(server): @@ -661,9 +613,7 @@ def test_before_load_throw_error_if_file_not_exists(server): sconfig = kaptan.Kaptan(handler='yaml') yaml = config_script_not_exists.format( fixtures_dir=fixtures_dir, - script_not_exists=os.path.join( - fixtures_dir, 'script_not_exists.sh' - ) + script_not_exists=os.path.join(fixtures_dir, 'script_not_exists.sh'), ) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) @@ -673,13 +623,9 @@ def test_before_load_throw_error_if_file_not_exists(server): with temp_session(server) as sess: session_name = sess.name - temp_session_exists = server.has_session( - sess.name - ) + temp_session_exists = server.has_session(sess.name) assert temp_session_exists - with pytest.raises( - (exc.BeforeLoadScriptNotExists, OSError), - ) as excinfo: + with pytest.raises((exc.BeforeLoadScriptNotExists, OSError)) as excinfo: builder.build(session=sess) excinfo.match(r'No such file or directory') result = server.has_session(session_name) @@ -690,12 +636,11 @@ def test_before_load_true_if_test_passes(server): config_script_completes = loadfixture( "workspacebuilder/config_script_completes.yaml" ) - assert os.path.exists( - os.path.join(fixtures_dir, 'script_complete.sh')) + assert os.path.exists(os.path.join(fixtures_dir, 'script_complete.sh')) sconfig = kaptan.Kaptan(handler='yaml') yaml = config_script_completes.format( fixtures_dir=fixtures_dir, - script_complete=os.path.join(fixtures_dir, 'script_complete.sh') + script_complete=os.path.join(fixtures_dir, 'script_complete.sh'), ) sconfig = sconfig.import_config(yaml).get() @@ -713,15 +658,11 @@ def test_before_load_true_if_test_passes_with_args(server): "workspacebuilder/config_script_completes.yaml" ) - assert( - os.path.exists(os.path.join(fixtures_dir, 'script_complete.sh')) - ) + assert os.path.exists(os.path.join(fixtures_dir, 'script_complete.sh')) sconfig = kaptan.Kaptan(handler='yaml') yaml = config_script_completes.format( fixtures_dir=fixtures_dir, - script_complete=os.path.join( - fixtures_dir, 'script_complete.sh' - ) + ' -v' + script_complete=os.path.join(fixtures_dir, 'script_complete.sh') + ' -v', ) sconfig = sconfig.import_config(yaml).get() diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 1f9315a1a1..76439b1ca4 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -33,13 +33,5 @@ def test_freeze_config(session): kaptanconf = kaptan.Kaptan() kaptanconf = kaptanconf.import_config(sconf) - kaptanconf.export( - 'json', - indent=2 - ) - kaptanconf.export( - 'yaml', - indent=2, - default_flow_style=False, - safe=True - ) + kaptanconf.export('json', indent=2) + kaptanconf.export('yaml', indent=2, default_flow_style=False, safe=True) diff --git a/tests/tests/test_helpers.py b/tests/tests/test_helpers.py index dd8e75478d..17394a95f0 100644 --- a/tests/tests/test_helpers.py +++ b/tests/tests/test_helpers.py @@ -12,9 +12,7 @@ def test_kills_session(server): server = server session_name = get_test_session_name(server=server) - with temp_session( - server=server, session_name=session_name - ): + with temp_session(server=server, session_name=session_name): result = server.has_session(session_name) assert result diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index 2cbef62450..8cbcb0cdde 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -26,6 +26,7 @@ import ConfigParser as configparser from itertools import izip, imap + range_type = xrange cmp = cmp @@ -44,11 +45,12 @@ def implements_to_string(cls): def console_to_str(s): return s.decode('utf_8') + else: unichr = chr text_type = str string_types = (str,) - integer_types = (int, ) + integer_types = (int,) text_to_native = lambda s, enc: s @@ -85,7 +87,7 @@ def console_to_str(s): def reraise(tp, value, tb=None): if value.__traceback__ is not tb: - raise(value.with_traceback(tb)) + raise (value.with_traceback(tb)) raise value diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 2dbb4074f7..dffde56086 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -107,7 +107,8 @@ def _validate_choices(options): def func(value): if value not in options: raise click.BadParameter( - 'Possible choices are: {0}.'.format(', '.join(options))) + 'Possible choices are: {0}.'.format(', '.join(options)) + ) return value return func @@ -144,11 +145,7 @@ def set_layout_hook(session, hook_name): hook_name : str hook name to bind to, e.g. 'client-attached' """ - cmd = [ - 'set-hook', - '-t', session.id, - hook_name - ] + cmd = ['set-hook', '-t', session.id, hook_name] hook_cmd = [] for window in session.windows: # unfortunately, select-layout won't work unless @@ -162,8 +159,7 @@ def set_layout_hook(session, hook_name): # unset the hook immediately after executing hook_cmd.append( 'set-hook -u -t {target_session} {hook_name}'.format( - target_session=session.id, - hook_name=hook_name + target_session=session.id, hook_name=hook_name ) ) @@ -192,15 +188,17 @@ def is_pure_name(path): True if path is a name of config in config dir, not file path. """ return ( - not os.path.isabs(path) and - len(os.path.dirname(path)) == 0 and - not os.path.splitext(path)[1] and - path != '.' and path != '' + not os.path.isabs(path) + and len(os.path.dirname(path)) == 0 + and not os.path.splitext(path)[1] + and path != '.' + and path != '' ) def _create_scan_config_argument(config_dir): """For finding configurations in tmuxinator/teamocil""" + def func(ctx, param, value): return scan_config_argument(ctx, param, value, config_dir) @@ -223,8 +221,7 @@ def scan_config_argument(ctx, param, value, config_dir=None): value = scan_config(value, config_dir=config_dir) elif isinstance(value, tuple): - value = tuple( - [scan_config(v, config_dir=config_dir) for v in value]) + value = tuple([scan_config(v, config_dir=config_dir) for v in value]) return value @@ -245,8 +242,7 @@ def get_abs_path(config): def _resolve_path_no_overwrite(config): path = get_abs_path(config) if os.path.exists(path): - raise click.exceptions.UsageError( - '%s exists. Pick a new filename.' % path) + raise click.exceptions.UsageError('%s exists. Pick a new filename.' % path) return path @@ -293,8 +289,11 @@ def scan_config(config, config_dir=None): if is_pure_name(config): is_name = True elif ( - not isabs(config) or len(dirname(config)) > 1 or config == '.' or - config == "" or config == "./" + not isabs(config) + or len(dirname(config)) > 1 + or config == '.' + or config == "" + or config == "./" ): # if relative, fill in full path config = normpath(join(cwd, config)) @@ -302,31 +301,40 @@ def scan_config(config, config_dir=None): if not splitext(config)[1]: if is_name: candidates = [ - x for x in ['%s%s' % (join(config_dir, config), ext) - for ext in ['.yaml', '.yml', '.json'] - ] if exists(x) + x + for x in [ + '%s%s' % (join(config_dir, config), ext) + for ext in ['.yaml', '.yml', '.json'] + ] + if exists(x) ] if not len(candidates): file_error = ( 'config not found in config dir (yaml/yml/json) %s ' - 'for name' % (config_dir)) + 'for name' % (config_dir) + ) else: candidates = [ - x for x in [ - join(config, ext) for ext in - ['.tmuxp.yaml', '.tmuxp.yml', '.tmuxp.json'] - ] if exists(x) + x + for x in [ + join(config, ext) + for ext in ['.tmuxp.yaml', '.tmuxp.yml', '.tmuxp.json'] + ] + if exists(x) ] if len(candidates) > 1: click.secho( - 'Multiple .tmuxp.{yml,yaml,json} configs in %s' % - dirname(config), fg="red") - click.echo(click.wrap_text( - 'This is undefined behavior, use only one. ' - 'Use file names e.g. myproject.json, coolproject.yaml. ' - 'You can load them by filename.' - )) + 'Multiple .tmuxp.{yml,yaml,json} configs in %s' % dirname(config), + fg="red", + ) + click.echo( + click.wrap_text( + 'This is undefined behavior, use only one. ' + 'Use file names e.g. myproject.json, coolproject.yaml. ' + 'You can load them by filename.' + ) + ) elif not len(candidates): file_error = 'No tmuxp files found in directory' if len(candidates): @@ -364,8 +372,12 @@ def _reattach(session): def load_workspace( - config_file, socket_name=None, socket_path=None, colors=None, - detached=False, answer_yes=False + config_file, + socket_name=None, + socket_path=None, + colors=None, + detached=False, + answer_yes=False, ): """ Load a tmux "workspace" session via tmuxp file. @@ -466,9 +478,7 @@ def load_workspace( sconfig = config.trickle(sconfig) t = Server( # create tmux server object - socket_name=socket_name, - socket_path=socket_path, - colors=colors + socket_name=socket_name, socket_path=socket_path, colors=colors ) which('tmux') # raise exception if tmux not found @@ -476,8 +486,7 @@ def load_workspace( try: # load WorkspaceBuilder object for tmuxp config / tmux server builder = WorkspaceBuilder(sconf=sconfig, server=t) except exc.EmptyConfigException: - click.echo('%s is empty or parsed no config data' % - config_file, err=True) + click.echo('%s is empty or parsed no config data' % config_file, err=True) return session_name = sconfig['session_name'] @@ -486,25 +495,28 @@ def load_workspace( # support incremental session building or appending (yet, PR's welcome!) if builder.session_exists(session_name): if not detached and ( - answer_yes or click.confirm( - '%s is already running. Attach?' % - click.style(session_name, fg='green'), default=True) + answer_yes + or click.confirm( + '%s is already running. Attach?' + % click.style(session_name, fg='green'), + default=True, + ) ): _reattach(builder.session) return try: click.echo( - click.style('[Loading] ', fg='green') + - click.style(config_file, fg='blue', bold=True) + click.style('[Loading] ', fg='green') + + click.style(config_file, fg='blue', bold=True) ) builder.build() # load tmux session via workspace builder if 'TMUX' in os.environ: # tmuxp ran from inside tmux - if not detached and (answer_yes or click.confirm( - 'Already inside TMUX, switch to session?' - )): + if not detached and ( + answer_yes or click.confirm('Already inside TMUX, switch to session?') + ): # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' tmux_env = os.environ.pop('TMUX') @@ -541,7 +553,7 @@ def load_workspace( choice = click.prompt( 'Error loading workspace. (k)ill, (a)ttach, (d)etach?', value_proc=_validate_choices(['k', 'a', 'd']), - default='k' + default='k', ) if choice == 'k': @@ -559,11 +571,12 @@ def load_workspace( @click.group(context_settings={'obj': {}}) -@click.version_option( - __version__, '-V', '--version', message='%(prog)s %(version)s' +@click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') +@click.option( + '--log_level', + default='INFO', + help='Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)', ) -@click.option('--log_level', default='INFO', - help='Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)') def cli(log_level): """Manage tmux sessions. @@ -578,9 +591,7 @@ def cli(log_level): except exc.TmuxpException as e: click.echo(e, err=True) sys.exit() - setup_logger( - level=log_level.upper() - ) + setup_logger(level=log_level.upper()) def setup_logger(logger=None, level='INFO'): @@ -630,15 +641,10 @@ def command_freeze(session_name, socket_name, socket_path): If SESSION_NAME is provided, snapshot that session. Otherwise, use the current session.""" - t = Server( - socket_name=socket_name, - socket_path=socket_path, - ) + t = Server(socket_name=socket_name, socket_path=socket_path) try: - session = t.find_where({ - 'session_name': session_name - }) + session = t.find_where({'session_name': session_name}) if not session: raise exc.TmuxpException('Session not found.') @@ -651,9 +657,7 @@ def command_freeze(session_name, socket_name, socket_path): newconfig = config.inline(sconf) configparser.import_config(newconfig) config_format = click.prompt( - 'Convert to', - value_proc=_validate_choices(['yaml', 'json']), - default='yaml' + 'Convert to', value_proc=_validate_choices(['yaml', 'json']), default='yaml' ) if config_format == 'yaml': @@ -679,13 +683,15 @@ def command_freeze(session_name, socket_name, socket_path): save_to = os.path.abspath( os.path.join( get_config_dir(), - '%s.%s' % (sconf.get('session_name'), config_format) + '%s.%s' % (sconf.get('session_name'), config_format), ) ) dest_prompt = click.prompt( - 'Save to: %s' % - save_to, value_proc=get_abs_path, - default=save_to, confirmation_prompt=True) + 'Save to: %s' % save_to, + value_proc=get_abs_path, + default=save_to, + confirmation_prompt=True, + ) if os.path.exists(dest_prompt): print('%s exists. Pick a new filename.' % dest_prompt) continue @@ -713,21 +719,29 @@ def command_freeze(session_name, socket_name, socket_path): @cli.command(name='load', short_help='Load tmuxp workspaces.') @click.pass_context -@click.argument('config', click.Path(exists=True), nargs=-1, - callback=scan_config_argument) +@click.argument( + 'config', click.Path(exists=True), nargs=-1, callback=scan_config_argument +) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) -@click.option('-d', 'detached', - help='Load the session without attaching it', is_flag=True) @click.option( - '-2', 'colors', flag_value=256, default=True, - help='Force tmux to assume the terminal supports 256 colours.') + '-d', 'detached', help='Load the session without attaching it', is_flag=True +) +@click.option( + '-2', + 'colors', + flag_value=256, + default=True, + help='Force tmux to assume the terminal supports 256 colours.', +) @click.option( - '-8', 'colors', flag_value=88, - help='Like -2, but indicates that the terminal supports 88 colours.') -def command_load(ctx, config, socket_name, socket_path, answer_yes, - detached, colors): + '-8', + 'colors', + flag_value=88, + help='Like -2, but indicates that the terminal supports 88 colours.', +) +def command_load(ctx, config, socket_name, socket_path, answer_yes, detached, colors): """Load a tmux workspace from each CONFIG. CONFIG is a specifier for a configuration file. @@ -757,7 +771,7 @@ def command_load(ctx, config, socket_name, socket_path, answer_yes, 'socket_path': socket_path, 'answer_yes': answer_yes, 'colors': colors, - 'detached': detached + 'detached': detached, } if not config: @@ -794,23 +808,18 @@ def import_config(configfile, importfunc): configparser.import_config(newconfig) config_format = click.prompt( - 'Convert to', - value_proc=_validate_choices(['yaml', 'json']), - default='yaml' + 'Convert to', value_proc=_validate_choices(['yaml', 'json']), default='yaml' ) if config_format == 'yaml': - newconfig = configparser.export( - 'yaml', indent=2, default_flow_style=False - ) + newconfig = configparser.export('yaml', indent=2, default_flow_style=False) elif config_format == 'json': newconfig = configparser.export('json', indent=2) else: sys.exit('Unknown config format.') click.echo( - newconfig + - '---------------------------------------------------------------' + newconfig + '---------------------------------------------------------------' '\n' 'Configuration import does its best to convert files.\n' ) @@ -820,8 +829,8 @@ def import_config(configfile, importfunc): dest = None while not dest: dest_path = click.prompt( - 'Save to [%s]' % os.getcwd(), - value_proc=_resolve_path_no_overwrite,) + 'Save to [%s]' % os.getcwd(), value_proc=_resolve_path_no_overwrite + ) # dest = dest_prompt if click.confirm('Save to %s?' % dest_path): @@ -841,11 +850,14 @@ def import_config(configfile, importfunc): sys.exit() -@import_config_cmd.command(name='teamocil', - short_help='Convert and import a teamocil config.') +@import_config_cmd.command( + name='teamocil', short_help='Convert and import a teamocil config.' +) @click.argument( - 'configfile', click.Path(exists=True), nargs=1, - callback=_create_scan_config_argument(get_teamocil_dir) + 'configfile', + click.Path(exists=True), + nargs=1, + callback=_create_scan_config_argument(get_teamocil_dir), ) def command_import_teamocil(configfile): """Convert a teamocil config from CONFIGFILE to tmuxp format and import @@ -855,11 +867,13 @@ def command_import_teamocil(configfile): @import_config_cmd.command( - name='tmuxinator', - short_help='Convert and import a tmuxinator config.') + name='tmuxinator', short_help='Convert and import a tmuxinator config.' +) @click.argument( - 'configfile', click.Path(exists=True), nargs=1, - callback=_create_scan_config_argument(get_tmuxinator_dir) + 'configfile', + click.Path(exists=True), + nargs=1, + callback=_create_scan_config_argument(get_tmuxinator_dir), ) def command_import_tmuxinator(configfile): """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import @@ -868,41 +882,32 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') -@click.argument('config', click.Path(exists=True), nargs=1, - callback=scan_config_argument) +@click.argument( + 'config', click.Path(exists=True), nargs=1, callback=scan_config_argument +) def command_convert(config): """Convert a tmuxp config between JSON and YAML.""" _, ext = os.path.splitext(config) if 'json' in ext: - if click.confirm( - 'convert to <%s> to yaml?' % config - ): + if click.confirm('convert to <%s> to yaml?' % config): configparser = kaptan.Kaptan() configparser.import_config(config) newfile = config.replace(ext, '.yaml') - newconfig = configparser.export( - 'yaml', indent=2, default_flow_style=False - ) - if click.confirm( - 'Save config to %s?' % newfile - ): + newconfig = configparser.export('yaml', indent=2, default_flow_style=False) + if click.confirm('Save config to %s?' % newfile): buf = open(newfile, 'w') buf.write(newconfig) buf.close() print('New config saved to %s' % newfile) elif 'yaml' in ext: - if click.confirm( - 'convert to <%s> to json?' % config - ): + if click.confirm('convert to <%s> to json?' % config): configparser = kaptan.Kaptan() configparser.import_config(config) newfile = config.replace(ext, '.json') newconfig = configparser.export('json', indent=2) print(newconfig) - if click.confirm( - 'Save config to <%s>?' % newfile - ): + if click.confirm('Save config to <%s>?' % newfile): buf = open(newfile, 'w') buf.write(newconfig) buf.close() diff --git a/tmuxp/config.py b/tmuxp/config.py index 1ec27085a6..999ac9a14c 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -44,8 +44,7 @@ def validate_schema(sconf): if 'panes' not in window: raise exc.ConfigError( - 'config window %s requires list of panes' % - window['window_name'] + 'config window %s requires list of panes' % window['window_name'] ) return True @@ -66,14 +65,12 @@ def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): ------- bool """ - extensions = [extensions] if isinstance( - extensions, string_types) else extensions + extensions = [extensions] if isinstance(extensions, string_types) else extensions return any(filename.endswith(e) for e in extensions) def in_dir( - config_dir=os.path.expanduser('~/.tmuxp'), - extensions=['.yml', '.yaml', '.json'] + config_dir=os.path.expanduser('~/.tmuxp'), extensions=['.yml', '.yaml', '.json'] ): """ Return a list of configs in ``config_dir``. @@ -92,8 +89,7 @@ def in_dir( configs = [] for filename in os.listdir(config_dir): - if is_config_file(filename, extensions) and \ - not filename.startswith('.'): + if is_config_file(filename, extensions) and not filename.startswith('.'): configs.append(filename) return configs @@ -153,26 +149,24 @@ def inline(sconf): """ if ( - 'shell_command' in sconf and - isinstance(sconf['shell_command'], list) and - len(sconf['shell_command']) == 1 + 'shell_command' in sconf + and isinstance(sconf['shell_command'], list) + and len(sconf['shell_command']) == 1 ): sconf['shell_command'] = sconf['shell_command'][0] if len(sconf.keys()) == int(1): sconf = sconf['shell_command'] if ( - 'shell_command_before' in sconf and - isinstance(sconf['shell_command_before'], list) and - len(sconf['shell_command_before']) == 1 + 'shell_command_before' in sconf + and isinstance(sconf['shell_command_before'], list) + and len(sconf['shell_command_before']) == 1 ): sconf['shell_command_before'] = sconf['shell_command_before'][0] # recurse into window and pane config items if 'windows' in sconf: - sconf['windows'] = [ - inline(window) for window in sconf['windows'] - ] + sconf['windows'] = [inline(window) for window in sconf['windows']] if 'panes' in sconf: sconf['panes'] = [inline(pane) for pane in sconf['panes']] @@ -269,21 +263,16 @@ def expand(sconf, cwd=None, parent=None): os.path.join(cwd, sconf['before_script']) ) - if ( - 'shell_command' in sconf and - isinstance(sconf['shell_command'], string_types) - ): + if 'shell_command' in sconf and isinstance(sconf['shell_command'], string_types): sconf['shell_command'] = [sconf['shell_command']] - if ( - 'shell_command_before' in sconf and - isinstance(sconf['shell_command_before'], string_types) + if 'shell_command_before' in sconf and isinstance( + sconf['shell_command_before'], string_types ): sconf['shell_command_before'] = [sconf['shell_command_before']] - if ( - 'shell_command_before' in sconf and - isinstance(sconf['shell_command_before'], list) + if 'shell_command_before' in sconf and isinstance( + sconf['shell_command_before'], list ): sconf['shell_command_before'] = [ expandshell(scmd) for scmd in sconf['shell_command_before'] @@ -291,9 +280,7 @@ def expand(sconf, cwd=None, parent=None): # recurse into window and pane config items if 'windows' in sconf: - sconf['windows'] = [ - expand(window, parent=sconf) for window in sconf['windows'] - ] + sconf['windows'] = [expand(window, parent=sconf) for window in sconf['windows']] elif 'panes' in sconf: for pconf in sconf['panes']: @@ -302,13 +289,9 @@ def expand(sconf, cwd=None, parent=None): pconf = sconf['panes'][p_index] = {} if isinstance(p, string_types): - p = { - 'shell_command': [p] - } + p = {'shell_command': [p]} elif not p: - p = { - 'shell_command': [] - } + p = {'shell_command': []} assert isinstance(p, dict) if 'shell_command' in p: @@ -329,9 +312,7 @@ def expand(sconf, cwd=None, parent=None): p['shell_command'] = [] pconf.update(p) - sconf['panes'] = [ - expand(pane, parent=sconf) for pane in sconf['panes'] - ] + sconf['panes'] = [expand(pane, parent=sconf) for pane in sconf['panes']] return sconf @@ -377,12 +358,10 @@ def trickle(sconf): windowconfig['start_directory'] = session_start_directory else: if not any( - windowconfig['start_directory'].startswith(a) - for a in ['~', '/'] + windowconfig['start_directory'].startswith(a) for a in ['~', '/'] ): window_start_path = os.path.join( - session_start_directory, - windowconfig['start_directory'] + session_start_directory, windowconfig['start_directory'] ) windowconfig['start_directory'] = window_start_path @@ -445,16 +424,12 @@ def import_tmuxinator(sconf): tmuxp_config['config'] = sconf['cli_args'] if '-f' in tmuxp_config['config']: - tmuxp_config['config'] = tmuxp_config[ - 'config' - ].replace('-f', '').strip() + tmuxp_config['config'] = tmuxp_config['config'].replace('-f', '').strip() elif 'tmux_options' in sconf: tmuxp_config['config'] = sconf['tmux_options'] if '-f' in tmuxp_config['config']: - tmuxp_config['config'] = tmuxp_config[ - 'config' - ].replace('-f', '').strip() + tmuxp_config['config'] = tmuxp_config['config'].replace('-f', '').strip() if 'socket_name' in sconf: tmuxp_config['socket_name'] = sconf['socket_name'] @@ -480,9 +455,7 @@ def import_tmuxinator(sconf): if 'rbenv' in sconf: if 'shell_command_before' not in tmuxp_config: tmuxp_config['shell_command_before'] = [] - tmuxp_config['shell_command_before'].append( - 'rbenv shell %s' % sconf['rbenv'] - ) + tmuxp_config['shell_command_before'].append('rbenv shell %s' % sconf['rbenv']) for w in sconf['windows']: for k, v in w.items(): diff --git a/tmuxp/exc.py b/tmuxp/exc.py index 8ff649a936..82b908f799 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -31,13 +31,10 @@ class EmptyConfigException(ConfigError): class BeforeLoadScriptNotExists(OSError): - def __init__(self, *args, **kwargs): super(BeforeLoadScriptNotExists, self).__init__(*args, **kwargs) - self.strerror = ( - "before_script file '%s' doesn't exist." % self.strerror - ) + self.strerror = "before_script file '%s' doesn't exist." % self.strerror @implements_to_string diff --git a/tmuxp/log.py b/tmuxp/log.py index cadff857b3..561877835b 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -18,7 +18,7 @@ 'INFO': Fore.GREEN, # Green 'WARNING': Fore.YELLOW, 'ERROR': Fore.RED, - 'CRITICAL': Fore.RED + 'CRITICAL': Fore.RED, } @@ -40,16 +40,31 @@ def default_log_template(self, record): reset = Style.RESET_ALL levelname = ( - LEVEL_COLORS.get(record.levelname) + Style.BRIGHT + - '(%(levelname)s)' + Style.RESET_ALL + ' ' + LEVEL_COLORS.get(record.levelname) + + Style.BRIGHT + + '(%(levelname)s)' + + Style.RESET_ALL + + ' ' ) asctime = ( - '[' + Fore.BLACK + Style.DIM + Style.BRIGHT + - '%(asctime)s' + Fore.RESET + Style.RESET_ALL + ']' + '[' + + Fore.BLACK + + Style.DIM + + Style.BRIGHT + + '%(asctime)s' + + Fore.RESET + + Style.RESET_ALL + + ']' ) name = ( - ' ' + Fore.WHITE + Style.DIM + Style.BRIGHT + - '%(name)s' + Fore.RESET + Style.RESET_ALL + ' ' + ' ' + + Fore.WHITE + + Style.DIM + + Style.BRIGHT + + '%(name)s' + + Fore.RESET + + Style.RESET_ALL + + ' ' ) tpl = reset + levelname + asctime + name + reset @@ -70,9 +85,7 @@ def format(self, record): record.message = "Bad message (%r): %r" % (e, record.__dict__) date_format = '%H:%m:%S' - record.asctime = time.strftime( - date_format, self.converter(record.created) - ) + record.asctime = time.strftime(date_format, self.converter(record.created)) prefix = self.template(record) % record.__dict__ @@ -98,24 +111,41 @@ def debug_log_template(self, record): reset = Style.RESET_ALL levelname = ( - LEVEL_COLORS.get(record.levelname) + Style.BRIGHT + - '(%(levelname)1.1s)' + Style.RESET_ALL + ' ' + LEVEL_COLORS.get(record.levelname) + + Style.BRIGHT + + '(%(levelname)1.1s)' + + Style.RESET_ALL + + ' ' ) asctime = ( - '[' + Fore.BLACK + Style.DIM + Style.BRIGHT + - '%(asctime)s' + Fore.RESET + Style.RESET_ALL + ']' + '[' + + Fore.BLACK + + Style.DIM + + Style.BRIGHT + + '%(asctime)s' + + Fore.RESET + + Style.RESET_ALL + + ']' ) name = ( - ' ' + Fore.WHITE + Style.DIM + Style.BRIGHT + - '%(name)s' + Fore.RESET + Style.RESET_ALL + ' ' - ) - module_funcName = ( - Fore.GREEN + Style.BRIGHT + - '%(module)s.%(funcName)s()' + ' ' + + Fore.WHITE + + Style.DIM + + Style.BRIGHT + + '%(name)s' + + Fore.RESET + + Style.RESET_ALL + + ' ' ) + module_funcName = Fore.GREEN + Style.BRIGHT + '%(module)s.%(funcName)s()' lineno = ( - Fore.BLACK + Style.DIM + Style.BRIGHT + ':' + Style.RESET_ALL + - Fore.CYAN + '%(lineno)d' + Fore.BLACK + + Style.DIM + + Style.BRIGHT + + ':' + + Style.RESET_ALL + + Fore.CYAN + + '%(lineno)d' ) tpl = reset + levelname + asctime + name + module_funcName + lineno + reset diff --git a/tmuxp/util.py b/tmuxp/util.py index 7056c9ff47..5b7f3c73e6 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -28,7 +28,7 @@ def run_before_script(script_file, cwd=None): shlex.split(str(script_file)), stderr=subprocess.PIPE, stdout=subprocess.PIPE, - cwd=cwd + cwd=cwd, ) for line in iter(proc.stdout.readline, b''): sys.stdout.write(console_to_str(line)) @@ -47,9 +47,7 @@ def run_before_script(script_file, cwd=None): return proc.returncode except OSError as e: if e.errno == 2: - raise exc.BeforeLoadScriptNotExists( - e, os.path.abspath(script_file) - ) + raise exc.BeforeLoadScriptNotExists(e, os.path.abspath(script_file)) else: raise e @@ -65,12 +63,14 @@ def oh_my_zsh_auto_title(): if os.path.exists(os.path.expanduser('~/.oh-my-zsh')): # oh-my-zsh exists if ( - 'DISABLE_AUTO_TITLE' not in os.environ or - os.environ.get('DISABLE_AUTO_TITLE') == "false" + 'DISABLE_AUTO_TITLE' not in os.environ + or os.environ.get('DISABLE_AUTO_TITLE') == "false" ): - print('Please set:\n\n' - '\texport DISABLE_AUTO_TITLE=\'true\'\n\n' - 'in ~/.zshrc or where your zsh profile is stored.\n' - 'Remember the "export" at the beginning!\n\n' - 'Then create a new shell or type:\n\n' - '\t$ source ~/.zshrc') + print( + 'Please set:\n\n' + '\texport DISABLE_AUTO_TITLE=\'true\'\n\n' + 'in ~/.zshrc or where your zsh profile is stored.\n' + 'Remember the "export" at the beginning!\n\n' + 'Then create a new shell or type:\n\n' + '\t$ source ~/.zshrc' + ) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 85aed916b0..982db220ce 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -103,11 +103,7 @@ def session_exists(self, session_name=None): if not exists: return exists - self.session = self.server.find_where( - { - 'session_name': session_name - } - ) + self.session = self.server.find_where({'session_name': session_name}) return True def build(self, session=None): @@ -129,27 +125,24 @@ def build(self, session=None): if not session: if not self.server: raise exc.TmuxpException( - 'WorkspaceBuilder.build requires server to be passed ' + - 'on initialization, or pass in session object to here.' + 'WorkspaceBuilder.build requires server to be passed ' + + 'on initialization, or pass in session object to here.' ) if self.server.has_session(self.sconf['session_name']): self.session = self.server.find_where( - { - 'session_name': self.sconf['session_name'] - } + {'session_name': self.sconf['session_name']} ) raise TmuxSessionExists( - 'Session name %s is already running.' % - self.sconf['session_name'] + 'Session name %s is already running.' % self.sconf['session_name'] ) else: session = self.server.new_session( session_name=self.sconf['session_name'] ) - assert(self.sconf['session_name'] == session.name) - assert(len(self.sconf['session_name']) > 0) + assert self.sconf['session_name'] == session.name + assert len(self.sconf['session_name']) > 0 self.session = session self.server = session.server @@ -158,7 +151,7 @@ def build(self, session=None): assert self.server.has_session(session.name) assert session.id - assert(isinstance(session, Session)) + assert isinstance(session, Session) focus = None @@ -170,10 +163,7 @@ def build(self, session=None): # session start directory, if it exists. if 'start_directory' in self.sconf: cwd = self.sconf['start_directory'] - run_before_script( - self.sconf['before_script'], - cwd=cwd - ) + run_before_script(self.sconf['before_script'], cwd=cwd) except Exception as e: self.session.kill_session() raise e @@ -188,11 +178,11 @@ def build(self, session=None): self.session.set_environment(option, value) for w, wconf in self.iter_create_windows(session): - assert(isinstance(w, Window)) + assert isinstance(w, Window) focus_pane = None for p, pconf in self.iter_create_panes(w, wconf): - assert(isinstance(p, Pane)) + assert isinstance(p, Pane) p = p if 'layout' in wconf: @@ -264,7 +254,7 @@ def iter_create_windows(self, s): if i == int(1) and w1: # if first window, use window 1 w1.kill_window() - assert(isinstance(w, Window)) + assert isinstance(w, Window) s.server._update_windows() if 'options' in wconf and isinstance(wconf['options'], dict): for key, val in wconf['options'].items(): @@ -296,7 +286,7 @@ def iter_create_panes(self, w, wconf): Newly created pane, and the section from the tmuxp configuration that was used to create the pane. """ - assert(isinstance(w, Window)) + assert isinstance(w, Window) pane_base_index = int(w.show_window_option('pane-base-index', g=True)) @@ -306,6 +296,7 @@ def iter_create_panes(self, w, wconf): if pindex == int(pane_base_index): p = w.attached_pane else: + def get_pane_start_directory(): if 'start_directory' in pconf: @@ -314,13 +305,12 @@ def get_pane_start_directory(): return wconf['start_directory'] else: return None + p = w.split_window( - attach=True, - start_directory=get_pane_start_directory(), - target=p.id + attach=True, start_directory=get_pane_start_directory(), target=p.id ) - assert(isinstance(p, Pane)) + assert isinstance(p, Pane) if 'layout' in wconf: w.select_layout(wconf['layout']) @@ -355,10 +345,7 @@ def config_after_window(self, w, wconf): wconf : dict config section for window """ - if ( - 'options_after' in wconf and - isinstance(wconf['options_after'], dict) - ): + if 'options_after' in wconf and isinstance(wconf['options_after'], dict): for key, val in wconf['options_after'].items(): w.set_window_option(key, val) @@ -384,7 +371,7 @@ def freeze(session): 'options': w.show_window_options(), 'window_name': w.name, 'layout': w.layout, - 'panes': [] + 'panes': [], } if w.get('window_active', '0') == '1': wconf['focus'] = 'true' @@ -392,10 +379,7 @@ def freeze(session): # If all panes have same path, set 'start_directory' instead # of using 'cd' shell commands. def pane_has_same_path(p): - return ( - w.panes[0].current_path == - p.current_path - ) + return w.panes[0].current_path == p.current_path if all(pane_has_same_path(p) for p in w.panes): wconf['start_directory'] = w.panes[0].current_path @@ -404,9 +388,7 @@ def pane_has_same_path(p): pconf = {'shell_command': []} if 'start_directory' not in wconf: - pconf['shell_command'].append( - 'cd ' + p.current_path - ) + pconf['shell_command'].append('cd ' + p.current_path) if p.get('pane_active', '0') == '1': pconf['focus'] = 'true' @@ -414,12 +396,8 @@ def pane_has_same_path(p): current_cmd = p.current_command def filter_interpretters_and_shells(): - return ( - current_cmd.startswith('-') or - any( - current_cmd.endswith(cmd) - for cmd in ['python', 'ruby', 'node'] - ) + return current_cmd.startswith('-') or any( + current_cmd.endswith(cmd) for cmd in ['python', 'ruby', 'node'] ) if filter_interpretters_and_shells(): From bc9ce7c753b0c56eb0551c48ca4d73ab169d58a9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 10:55:44 -0400 Subject: [PATCH 0315/2998] Bump max line length to 100 Django allows up to 119 if it's reasonable. https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/ --- setup.cfg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 85965d473f..4efe35f762 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,7 @@ [flake8] exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N +max-line-length = 100 [tool:pytest] addopts = --reruns=5 @@ -14,5 +15,5 @@ known_pytest = pytest,py known_first_party = libtmux,tmuxp split_before_closing_bracket = true sections = FUTURE,STDLIB,PYTEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER -line_length = 79 +line_length = 100 not_skip = __init__.py From fa3272793248c1977c5f4d89b8e36d47160a0bf1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 10:57:16 -0400 Subject: [PATCH 0316/2998] Add flake8 ignores for black See also: - https://github.com/ambv/black/issues/429 - https://github.com/ambv/black/issues/52 (W503) --- setup.cfg | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/setup.cfg b/setup.cfg index 4efe35f762..9d27d28e6f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,6 +2,43 @@ exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N max-line-length = 100 +# Stuff we ignore thanks to black: https://github.com/ambv/black/issues/429 +ignore = E111, + E121, + E122, + E123, + E124, + E125, + E126, + E201, + E202, + E203, + E221, + E222, + E225, + E226, + E227, + E231, + E241, + E251, + E261, + E262, + E265, + E271, + E272, + E302, + E303, + E306, + E502, + E701, + E702, + E703, + E704, + W291, + W292, + W293, + W391, + W503 [tool:pytest] addopts = --reruns=5 From 830b5671cd8fd1b098aa54e22aeb0535fea01ccb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 12:31:45 -0400 Subject: [PATCH 0317/2998] Sync Pipfile --- Pipfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index 4c9544ea84..b1930df390 100644 --- a/Pipfile +++ b/Pipfile @@ -13,11 +13,11 @@ alagitpull = "==0.0.21" releases = "==1.6.1" aafigure = "==0.6" sphinxcontrib-napoleon = "==0.6.1" -Sphinx = "==1.7.5" +Sphinx = "==1.7.7" isort = "==4.3.4" "flake8" = "==3.5.0" -vulture = "==0.28" -pytest = "==3.6.3" +vulture = "==0.29" +pytest = "==3.7.2" pytest-rerunfailures = "==4.1" tmuxp = {path = ".", editable = true} From ecb9dbddaf0bcb48418b1b97d7567bf5d56d6412 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 12:33:16 -0400 Subject: [PATCH 0318/2998] Add vulture / watch_vulture make tasks --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index f9625e60a1..99fda18a8f 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,12 @@ test: watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi +vulture: + vulture tmuxp + +watch_vulture: + if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) vulture; else $(MAKE) vulture entr_warn; fi + build_docs: cd doc && $(MAKE) html From eff552923f882bb36a0159c90113c756143bfe72 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Aug 2018 12:42:42 -0400 Subject: [PATCH 0319/2998] Bump line-length 100 -> 88 It went from 79 -> 100 in an earlier commit today. Bring it down to 88, which is black's automatic setting. --- setup.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 9d27d28e6f..61d2927083 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [flake8] exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N -max-line-length = 100 +max-line-length = 88 # Stuff we ignore thanks to black: https://github.com/ambv/black/issues/429 ignore = E111, E121, @@ -52,5 +52,5 @@ known_pytest = pytest,py known_first_party = libtmux,tmuxp split_before_closing_bracket = true sections = FUTURE,STDLIB,PYTEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER -line_length = 100 +line_length = 88 not_skip = __init__.py From dafad2810186d89c25fa82c24489abc562f72312 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 30 Aug 2018 09:41:20 -0500 Subject: [PATCH 0320/2998] Update pytest from 3.7.2 to 3.7.4 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 80d8fc4b0e..15f6644111 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.7.2 +pytest==3.7.4 pytest-rerunfailures==4.1 From b60c24fee33e5dfdfc5084365151681ac045ce29 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 29 Aug 2018 01:09:19 -0500 Subject: [PATCH 0321/2998] Update sphinx from 1.7.7 to 1.7.8 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 825f0179ee..255c1bb1e9 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.7 +sphinx==1.7.8 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From 2e93d465da05913b3f950e531ffabc39c7d7ca28 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:27:14 -0500 Subject: [PATCH 0322/2998] doc: Fix link to WorkspaceBuilder --- doc/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api.rst b/doc/api.rst index 4b16c10b22..031e3d9f1b 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -55,7 +55,7 @@ Import and export Workspace Builder ----------------- -.. autoclass:: tmuxp.WorkspaceBuilder +.. autoclass:: tmuxp.workspacebuilder.WorkspaceBuilder :members: .. automethod:: tmuxp.workspacebuilder.freeze From 51d13d765bdeffe864c3355ed801e07ab36c5cff Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:27:33 -0500 Subject: [PATCH 0323/2998] Add __github__ and __pypi__ to metadata --- tmuxp/__about__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8b6fddfc48..d1f84c804a 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -4,5 +4,7 @@ __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' +__github__ = 'https://github.com/tmux-python/tmuxp' +__pypi__ = 'https://pypi.python.org/pypi/tmuxp' __license__ = 'MIT' __copyright__ = 'Copyright 2013-2018 Tony Narlock' From 5a8fb2dc1319196d2693a15284ce875a5d1cae21 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:27:53 -0500 Subject: [PATCH 0324/2998] Add metadata to setup.py --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index e346841f51..118410b816 100644 --- a/setup.py +++ b/setup.py @@ -39,8 +39,8 @@ def run_tests(self): setup( name=about['__title__'], version=about['__version__'], - url='http://github.com/tmux-python/tmuxp/', - download_url='https://pypi.python.org/pypi/tmuxp', + url=about['__github__'], + download_url=about['__pypi__'], license=about['__license__'], author=about['__author__'], author_email=about['__email__'], From 1890347d0dd5f831a8a9b4cd704dbdc0859d4997 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:28:10 -0500 Subject: [PATCH 0325/2998] Change __version__ to dev until we tag This is for sphinx linkcode links to work on our API page. --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index d1f84c804a..8b88235fec 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.4.0' +__version__ = 'dev' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 68d8c75fd5cd39d0a821d6a311ad584a605ebd2c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:29:49 -0500 Subject: [PATCH 0326/2998] Add linkcode to sphinx --- doc/conf.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index ba185e3021..84540425aa 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -1,10 +1,13 @@ # -*- coding: utf-8 -*- - +import inspect import os import sys +from os.path import dirname, relpath import alagitpull +import tmuxp + # Get the project root dir, which is the parent dir of this cwd = os.getcwd() project_root = os.path.dirname(cwd) @@ -23,6 +26,7 @@ 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinxcontrib.napoleon', + 'sphinx.ext.linkcode', 'aafig', 'releases', 'alagitpull', @@ -121,3 +125,74 @@ aafig_format = dict(latex='pdf', html='gif') aafig_default_options = dict(scale=.75, aspect=0.5, proportional=True) + + +def linkcode_resolve(domain, info): # NOQA: C901 + """ + Determine the URL corresponding to Python object + + Notes + ----- + From https://github.com/numpy/numpy/blob/v1.15.1/doc/source/conf.py, 7c49cfa + on Jul 31. License BSD-3. https://github.com/numpy/numpy/blob/v1.15.1/LICENSE.txt + """ + if domain != 'py': + return None + + modname = info['module'] + fullname = info['fullname'] + + submod = sys.modules.get(modname) + if submod is None: + return None + + obj = submod + for part in fullname.split('.'): + try: + obj = getattr(obj, part) + except Exception: + return None + + # strip decorators, which would resolve to the source of the decorator + # possibly an upstream bug in getsourcefile, bpo-1764286 + try: + unwrap = inspect.unwrap + except AttributeError: + pass + else: + obj = unwrap(obj) + + try: + fn = inspect.getsourcefile(obj) + except Exception: + fn = None + if not fn: + return None + + try: + source, lineno = inspect.getsourcelines(obj) + except Exception: + lineno = None + + if lineno: + linespec = "#L%d-L%d" % (lineno, lineno + len(source) - 1) + else: + linespec = "" + + fn = relpath(fn, start=dirname(tmuxp.__file__)) + + if 'dev' in about['__version__']: + return "%s/blob/master/%s/%s%s" % ( + about['__github__'], + about['__package_name__'], + fn, + linespec, + ) + else: + return "%s/blob/v%s/%s/%s%s" % ( + about['__github__'], + about['__version__'], + about['__package_name__'], + fn, + linespec, + ) From 3e296dae03409f1296990037f960c22c4aeabf15 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:32:13 -0500 Subject: [PATCH 0327/2998] docs: Fix links to WorkspaceBuilder --- doc/examples.rst | 4 ++-- tmuxp/cli.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index 4204a1ac5e..56a5895c99 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -476,8 +476,8 @@ Kung fu tmuxp sessions can be scripted in python. The first way is to use the ORM in the :ref:`API`. The second is to pass a :py:obj:`dict` into - :class:`tmuxp.WorkspaceBuilder` with a correct schema. See: - :meth:`tmuxp.config.validate_schema`. + :class:`~tmuxp.workspacebuilder.WorkspaceBuilder` with a correct schema. + See: :meth:`tmuxp.config.validate_schema`. Add yours? Submit a pull request to the `github`_ site! diff --git a/tmuxp/cli.py b/tmuxp/cli.py index dffde56086..412554ea01 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -417,7 +417,7 @@ def load_workspace( just the object. The prepared configuration and the server object is passed into an instance - of :class:`tmuxp.WorkspaceBuilder`. + of :class:`~tmuxp.workspacebuilder.WorkspaceBuilder`. A sanity check against :meth:`libtmux.common.which` is ran. It will raise an exception if tmux isn't found. @@ -427,8 +427,8 @@ def load_workspace( does not allow appending a workspace / incremental building on top of a current session (pull requests are welcome!). - :meth:`tmuxp.WorkspaceBuilder.build` will build the session in the - background via using tmux's detached state (``-d``). + :meth:`~tmuxp.workspacebuilder.WorkspaceBuilder.build` will build the session in + the background via using tmux's detached state (``-d``). After the session (workspace) is built, unless the user decided to load the session in the background via ``tmuxp -d`` (which is in the spirit From e734a919a81b9bda551a93e2f180060222ced145 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 3 Sep 2018 21:39:15 -0500 Subject: [PATCH 0328/2998] docs: Fix link to run_before_script --- tmuxp/exc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/exc.py b/tmuxp/exc.py index 82b908f799..fcf567796f 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -41,7 +41,7 @@ def __init__(self, *args, **kwargs): class BeforeLoadScriptError(Exception): """Exception replacing :py:class:`subprocess.CalledProcessError` for - :meth:`util.run_before_script`. + :meth:`tmuxp.util.run_before_script`. """ def __init__(self, returncode, cmd, output=None): From c0c63ad12b61b9d3cfffdf40d016c240d6dd357e Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Fri, 7 Sep 2018 02:13:37 -0500 Subject: [PATCH 0329/2998] Update pytest from 3.7.4 to 3.8.0 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 15f6644111..98b58e67e7 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.7.4 +pytest==3.8.0 pytest-rerunfailures==4.1 From a6546b26f40c44ea640fd3fbba958bf624da3a4a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 5 Sep 2018 23:16:32 -0500 Subject: [PATCH 0330/2998] Update sphinx from 1.7.8 to 1.7.9 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 255c1bb1e9..21bf2da60b 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.8 +sphinx==1.7.9 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From 7015d5f3ae86edba9313ac00b6f8f61b95b6e74a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Sep 2018 14:38:37 -0500 Subject: [PATCH 0331/2998] Update __pypi__ url --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8b88235fec..6e1eb51f2c 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -5,6 +5,6 @@ __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' __github__ = 'https://github.com/tmux-python/tmuxp' -__pypi__ = 'https://pypi.python.org/pypi/tmuxp' +__pypi__ = 'https://pypi.org/project/tmuxp/' __license__ = 'MIT' __copyright__ = 'Copyright 2013-2018 Tony Narlock' From c65166df5afa9c66bf8fe776a52c9e3964cbcbc9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Sep 2018 14:38:53 -0500 Subject: [PATCH 0332/2998] Sync Pipfile --- Pipfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index b1930df390..e8e8d68d05 100644 --- a/Pipfile +++ b/Pipfile @@ -13,11 +13,11 @@ alagitpull = "==0.0.21" releases = "==1.6.1" aafigure = "==0.6" sphinxcontrib-napoleon = "==0.6.1" -Sphinx = "==1.7.7" +Sphinx = "==1.7.9" isort = "==4.3.4" "flake8" = "==3.5.0" vulture = "==0.29" -pytest = "==3.7.2" +pytest = "==3.8.0" pytest-rerunfailures = "==4.1" tmuxp = {path = ".", editable = true} From 541c0447022a8b7b64f2eabe68b0cfdd97162ceb Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Thu, 13 Sep 2018 01:00:46 -0500 Subject: [PATCH 0333/2998] Update sphinx from 1.7.9 to 1.8.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 21bf2da60b..9032633855 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.9 +sphinx==1.8.0 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From 75d7813e3b3bffedd9c06b5a997b1073e9c46d19 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 22 Sep 2018 17:50:05 -0500 Subject: [PATCH 0334/2998] Update sphinx from 1.8.0 to 1.8.1 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 9032633855..3f52956516 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.8.0 +sphinx==1.8.1 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From 36d0de31c017b21b8af77f0715172a6d490ac0ff Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sat, 22 Sep 2018 17:50:09 -0500 Subject: [PATCH 0335/2998] Update pytest from 3.8.0 to 3.8.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 98b58e67e7..908c6b01d0 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.8.0 +pytest==3.8.1 pytest-rerunfailures==4.1 From 231cdab5699b812d3e198ecb0e1d6ccdb4ff5bd4 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 23 Sep 2018 09:35:09 -0500 Subject: [PATCH 0336/2998] Update sphinxcontrib-napoleon from 0.6.1 to 0.7 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 3f52956516..a89ae1585e 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -4,4 +4,4 @@ sphinx==1.8.1 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 -sphinxcontrib-napoleon==0.6.1 +sphinxcontrib-napoleon==0.7 From f3971e3cb9447bc82856d7ac4ed084c2cf2d350f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 26 Sep 2018 08:24:39 -0500 Subject: [PATCH 0337/2998] Keep click < 7 for now Issues with breakages downstream. --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 8cb8739ae7..eb2bb58869 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.8.0 -click==6.7 +click<7 colorama==0.3.9 From 382e47af45b991b8ea45e4f12248f8693be15442 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 26 Sep 2018 08:25:07 -0500 Subject: [PATCH 0338/2998] Sync Pipfile --- Pipfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Pipfile b/Pipfile index e8e8d68d05..71cc9cd1e1 100644 --- a/Pipfile +++ b/Pipfile @@ -6,25 +6,25 @@ name = "pypi" [dev-packages] kaptan = ">=0.5.7" libtmux = "==0.8.0" -click = "==6.7" +click = "<7" colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.21" releases = "==1.6.1" aafigure = "==0.6" -sphinxcontrib-napoleon = "==0.6.1" -Sphinx = "==1.7.9" +sphinxcontrib-napoleon = "==0.7" +Sphinx = "==1.8.1" isort = "==4.3.4" "flake8" = "==3.5.0" vulture = "==0.29" -pytest = "==3.8.0" +pytest = "==3.8.1" pytest-rerunfailures = "==4.1" tmuxp = {path = ".", editable = true} [packages] kaptan = ">=0.5.7" libtmux = "==0.8.0" -click = "==6.7" +click = "<7" colorama = "==0.3.9" [requires] From 6087fcdf8962edc28e2b4fe43be1088612913048 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Sep 2018 17:25:42 -0500 Subject: [PATCH 0339/2998] Include tests in pypi sdist (fix #431) --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 97af189183..678506f955 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include README.rst LICENSE CHANGES .tmuxp.yaml include requirements/*.txt recursive-include doc *.rst +recursive-include tests *.py *.yaml *.json From d6c7138cdb493311b5bdba0bf6ae4184d4da77dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 26 Sep 2018 21:51:06 -0500 Subject: [PATCH 0340/2998] Update CHANGES --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 54d3863534..37345088fb 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,9 @@ Here you can find the recent changes to tmuxp This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. +- :release:`1.4.1 <2018-09-26>` +- :support:`-` Loosen click restraint to <7 + - :release:`1.4.0 <2018-03-11>` - :support:`-` Bump libtmux to 0.8.0 - :support:`264` Update license from BSD to MIT From 73cfb72c69ba51c4c48c4509cd5e668f64d1c8d4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Sep 2018 09:27:39 -0500 Subject: [PATCH 0341/2998] Update changes --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 37345088fb..ff294b5c00 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,9 @@ Here you can find the recent changes to tmuxp This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. +- :release:`1.4.2 <2018-09-30>` +- :support:`431 backported` Include tests in source distribution + - :release:`1.4.1 <2018-09-26>` - :support:`-` Loosen click restraint to <7 From 1d77d69a94a44383b35efd5b00d827b2ac781996 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Sep 2018 09:40:14 -0500 Subject: [PATCH 0342/2998] Bump click to 7 (<8) --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index eb2bb58869..9909225b54 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.7 libtmux==0.8.0 -click<7 +click>=7<8 colorama==0.3.9 From a0a536df6989dcb4699825fd5d29d86012864dec Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Sep 2018 09:48:22 -0500 Subject: [PATCH 0343/2998] Fix click argument issue This seems to be raised because click.argument accepts click.Path as a type. --- tmuxp/cli.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 412554ea01..7001d6fdf0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -720,7 +720,7 @@ def command_freeze(session_name, socket_name, socket_path): @cli.command(name='load', short_help='Load tmuxp workspaces.') @click.pass_context @click.argument( - 'config', click.Path(exists=True), nargs=-1, callback=scan_config_argument + 'config', type=click.Path(exists=True), nargs=-1, callback=scan_config_argument ) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') @@ -729,15 +729,15 @@ def command_freeze(session_name, socket_name, socket_path): '-d', 'detached', help='Load the session without attaching it', is_flag=True ) @click.option( - '-2', 'colors', + '-2', flag_value=256, default=True, help='Force tmux to assume the terminal supports 256 colours.', ) @click.option( - '-8', 'colors', + '-8', flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) @@ -855,7 +855,7 @@ def import_config(configfile, importfunc): ) @click.argument( 'configfile', - click.Path(exists=True), + type=click.Path(exists=True), nargs=1, callback=_create_scan_config_argument(get_teamocil_dir), ) @@ -871,7 +871,7 @@ def command_import_teamocil(configfile): ) @click.argument( 'configfile', - click.Path(exists=True), + type=click.Path(exists=True), nargs=1, callback=_create_scan_config_argument(get_tmuxinator_dir), ) @@ -883,7 +883,7 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') @click.argument( - 'config', click.Path(exists=True), nargs=1, callback=scan_config_argument + 'config', type=click.Path(exists=True), nargs=1, callback=scan_config_argument ) def command_convert(config): """Convert a tmuxp config between JSON and YAML.""" From dbb07898e7a4b906b67748371a7c3b42aa58f42e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Sep 2018 09:53:18 -0500 Subject: [PATCH 0344/2998] Test updates for type= --- tests/test_cli.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index cf29a9db8c..6b2c9ea0e0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -223,7 +223,10 @@ def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): @click.command() @click.argument( - 'config', click.Path(exists=True), nargs=-1, callback=cli.scan_config_argument + 'config', + type=click.Path(exists=True), + nargs=-1, + callback=cli.scan_config_argument, ) def config_cmd(config): click.echo(config) @@ -523,7 +526,7 @@ def test_create_scan_config_arg(tmpdir): @click.command() @click.argument( - 'config', click.Path(exists=True), nargs=-1, callback=my_scan_config + 'config', type=click.Path(exists=True), nargs=-1, callback=my_scan_config ) def config_cmd(config): click.echo(config) From 089b464a81dfaa105538c6577f8143a6f2ae1091 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 10:45:59 -0500 Subject: [PATCH 0345/2998] Create ConfigPath to resolve paths during CLI callback is no longer resolved before type=, so do that checking by subclassing Click.Path --- tmuxp/cli.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7001d6fdf0..f2acd60d01 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -196,13 +196,18 @@ def is_pure_name(path): ) -def _create_scan_config_argument(config_dir): - """For finding configurations in tmuxinator/teamocil""" +class ConfigPath(click.Path): + def __init__(self, config_dir=None, *args, **kwargs): + super(ConfigPath, self).__init__(*args, **kwargs) + self.config_dir = config_dir - def func(ctx, param, value): - return scan_config_argument(ctx, param, value, config_dir) + def convert(self, value, param, ctx): + config_dir = self.config_dir + if callable(config_dir): + config_dir = config_dir() - return func + value = scan_config(value, config_dir=config_dir) + return super(ConfigPath, self).convert(value, param, ctx) def scan_config_argument(ctx, param, value, config_dir=None): @@ -719,9 +724,7 @@ def command_freeze(session_name, socket_name, socket_path): @cli.command(name='load', short_help='Load tmuxp workspaces.') @click.pass_context -@click.argument( - 'config', type=click.Path(exists=True), nargs=-1, callback=scan_config_argument -) +@click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @@ -854,10 +857,7 @@ def import_config(configfile, importfunc): name='teamocil', short_help='Convert and import a teamocil config.' ) @click.argument( - 'configfile', - type=click.Path(exists=True), - nargs=1, - callback=_create_scan_config_argument(get_teamocil_dir), + 'configfile', type=ConfigPath(exists=True, config_dir=get_teamocil_dir), nargs=1 ) def command_import_teamocil(configfile): """Convert a teamocil config from CONFIGFILE to tmuxp format and import @@ -870,10 +870,7 @@ def command_import_teamocil(configfile): name='tmuxinator', short_help='Convert and import a tmuxinator config.' ) @click.argument( - 'configfile', - type=click.Path(exists=True), - nargs=1, - callback=_create_scan_config_argument(get_tmuxinator_dir), + 'configfile', type=ConfigPath(exists=True, config_dir=get_tmuxinator_dir), nargs=1 ) def command_import_tmuxinator(configfile): """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import @@ -882,9 +879,7 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') -@click.argument( - 'config', type=click.Path(exists=True), nargs=1, callback=scan_config_argument -) +@click.argument('config', type=ConfigPath(exists=True), nargs=1) def command_convert(config): """Convert a tmuxp config between JSON and YAML.""" From 6ea8eb58f7079673c85aec06e6ca19180482f5d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 10:49:13 -0500 Subject: [PATCH 0346/2998] Update tests for ConfigPath --- tests/test_cli.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 6b2c9ea0e0..87920532b4 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -222,12 +222,7 @@ def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): runner = CliRunner() @click.command() - @click.argument( - 'config', - type=click.Path(exists=True), - nargs=-1, - callback=cli.scan_config_argument, - ) + @click.argument('config', type=cli.ConfigPath(exists=True), nargs=-1) def config_cmd(config): click.echo(config) @@ -466,7 +461,8 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): with tmpdir.as_cwd(): runner = CliRunner() - runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + print(out.output) assert tmpdir.join('la.yaml').check() @@ -513,20 +509,21 @@ def test_validate_choices(): assert validate('choice3') -def test_create_scan_config_arg(tmpdir): +def test_pass_config_dir_ClickPath(tmpdir): configdir = tmpdir.join('myconfigdir') configdir.mkdir() user_config_name = 'myconfig' user_config = configdir.join('%s.yaml' % user_config_name).ensure() expect = str(configdir.join('myconfig.yaml')) - my_scan_config = cli._create_scan_config_argument(str(configdir)) runner = CliRunner() @click.command() @click.argument( - 'config', type=click.Path(exists=True), nargs=-1, callback=my_scan_config + 'config', + type=cli.ConfigPath(exists=True, config_dir=(str(configdir))), + nargs=-1, ) def config_cmd(config): click.echo(config) From 50d13e0b2b317e515fa52bded7d46cf7490432e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:12:01 -0500 Subject: [PATCH 0347/2998] Update Pipfile --- Pipfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index 71cc9cd1e1..46cd5aa8d3 100644 --- a/Pipfile +++ b/Pipfile @@ -6,7 +6,7 @@ name = "pypi" [dev-packages] kaptan = ">=0.5.7" libtmux = "==0.8.0" -click = "<7" +click = ">=7<8" colorama = "==0.3.9" docutils = "==0.14" alagitpull = "==0.0.21" @@ -24,7 +24,7 @@ tmuxp = {path = ".", editable = true} [packages] kaptan = ">=0.5.7" libtmux = "==0.8.0" -click = "<7" +click = ">=7<8" colorama = "==0.3.9" [requires] From 2472f1757aa8275aee941024e845405f322acaab Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Tue, 2 Oct 2018 19:12:36 -0500 Subject: [PATCH 0348/2998] Update pytest from 3.8.1 to 3.8.2 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 908c6b01d0..e21e5c153b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.8.1 +pytest==3.8.2 pytest-rerunfailures==4.1 From 677961ac1cf3e74ba2a1dbe10544238c06b6fcea Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:17:12 -0500 Subject: [PATCH 0349/2998] Remove newlines --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index ff294b5c00..802cf7f2c3 100644 --- a/CHANGES +++ b/CHANGES @@ -14,7 +14,7 @@ Here you can find the recent changes to tmuxp - :support:`-` Update docstring style to use numpy-style documentation. This enhances readability and plays nicely with sphinx documentation. - :support:`-` Documentation overhaul. - + - Areas like :meth:`tmuxp.cli.load_workspace` are now documented verbosely. This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. @@ -29,7 +29,7 @@ Here you can find the recent changes to tmuxp - :support:`-` Bump libtmux to 0.8.0 - :support:`264` Update license from BSD to MIT - :support:`348 backported` Continuous integration updates and fixes for Travis CI - + - Update builds to use trusty - Remove older python 3 versions (before 3.6) - Update pypy versions From 6f3a676b3d45d028bf847934d23edb1eb97b2d52 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:17:29 -0500 Subject: [PATCH 0350/2998] CHANGES: Add note about Click 7.0 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 802cf7f2c3..008dddec5d 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :feature:`-` Support Click 7.0 - :support:`-` Remove unused ``__future__`` imports - :support:`-` Sort imports - :support:`-` Add configuration and make command for isort. From b91b82a1ed3bd78730168fb3ae70aa4f00dc5084 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:17:43 -0500 Subject: [PATCH 0351/2998] Sync Pipfile --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 46cd5aa8d3..864fb31b63 100644 --- a/Pipfile +++ b/Pipfile @@ -17,7 +17,7 @@ Sphinx = "==1.8.1" isort = "==4.3.4" "flake8" = "==3.5.0" vulture = "==0.29" -pytest = "==3.8.1" +pytest = "==3.8.2" pytest-rerunfailures = "==4.1" tmuxp = {path = ".", editable = true} From bb6513d7df4bc65f8a8e648a4121d20f7170c7c3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:18:43 -0500 Subject: [PATCH 0352/2998] CHANGES: Add 1.5.0 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 008dddec5d..e843ec9b02 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.5.0 <2018-10-02>` - :feature:`-` Support Click 7.0 - :support:`-` Remove unused ``__future__`` imports - :support:`-` Sort imports From 7a42f1926d03c7f6fa4a48a227cfa1ee3b5b66cf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 2 Oct 2018 19:19:14 -0500 Subject: [PATCH 0353/2998] Ship v1.5.0 (alpha 1) Support for Click 7.0, lots of formatting changes. --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 6e1eb51f2c..62047c250e 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = 'dev' +__version__ = '1.5.0a1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From d706d5b291aa5b3b2f55fb9c80d188ccc2df3a24 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Thu, 4 Oct 2018 00:00:04 -0400 Subject: [PATCH 0354/2998] Add .vscode to .gitignore file. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b9fb00920e..d103c98ef8 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ target/ .idea .ropeproject *.swp +.vscode # docs doc/_build/ From 2e01c322061adfaecda9516da10a85aa9d7a0e14 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Thu, 4 Oct 2018 01:44:44 -0400 Subject: [PATCH 0355/2998] Unpin versions of most packages in Pipfile and commit Pipfile.lock for state management between releases. --- Pipfile | 32 ++-- Pipfile.lock | 470 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 485 insertions(+), 17 deletions(-) create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile index 864fb31b63..1f78e4f6e2 100644 --- a/Pipfile +++ b/Pipfile @@ -4,28 +4,26 @@ verify_ssl = true name = "pypi" [dev-packages] -kaptan = ">=0.5.7" -libtmux = "==0.8.0" -click = ">=7<8" -colorama = "==0.3.9" -docutils = "==0.14" -alagitpull = "==0.0.21" -releases = "==1.6.1" -aafigure = "==0.6" -sphinxcontrib-napoleon = "==0.7" -Sphinx = "==1.8.1" -isort = "==4.3.4" -"flake8" = "==3.5.0" -vulture = "==0.29" -pytest = "==3.8.2" -pytest-rerunfailures = "==4.1" +docutils = "*" +alagitpull = "*" +releases = "*" +aafigure = "*" +sphinxcontrib-napoleon = "*" +Sphinx = "*" +isort = "*" +"flake8" = "*" +vulture = "*" +pytest = "*" +pytest-rerunfailures = "*" tmuxp = {path = ".", editable = true} +"e1839a8" = {path = ".", editable = true} [packages] -kaptan = ">=0.5.7" +kaptan = "*" libtmux = "==0.8.0" click = ">=7<8" -colorama = "==0.3.9" +colorama = "*" +"e1839a8" = {path = ".", editable = true} [requires] python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000000..726e1e70ee --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,470 @@ +{ + "_meta": { + "hash": { + "sha256": "7e80b0d927e4962ad4087fb0619cfe11a0b15214d92d72aaab3b0afaf41584b3" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "2.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "click": { + "hashes": [ + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + ], + "index": "pypi", + "version": "==7.0" + }, + "colorama": { + "hashes": [ + "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", + "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" + ], + "index": "pypi", + "version": "==0.3.9" + }, + "e1839a8": { + "editable": true, + "path": "." + }, + "kaptan": { + "hashes": [ + "sha256:44df200d030975650a3a832c13b48cafdeb1a237b23de181d6a2346107e39da3" + ], + "index": "pypi", + "version": "==0.5.10" + }, + "libtmux": { + "hashes": [ + "sha256:2b969b507c26d9db08b85be4808d75774b6418ecf5a0f61956f7a1da44519585" + ], + "index": "pypi", + "version": "==0.8.0" + }, + "pyyaml": { + "hashes": [ + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + ], + "version": "==3.13" + } + }, + "develop": { + "aafigure": { + "hashes": [ + "sha256:49f2c1fd2b579c1fffbac1386a2670b3f6f475cc7ff6cc04d8b984888c2d9e1e", + "sha256:c7f9409eee58d8484696a1c9e75b4c6ceab9fd060223007a19dcc6f515a30696" + ], + "index": "pypi", + "version": "==0.6" + }, + "alabaster": { + "hashes": [ + "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", + "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" + ], + "version": "==0.7.12" + }, + "alagitpull": { + "hashes": [ + "sha256:ebcb77b0886432abc4f5db4c04b81d77b44ec8c3a44e24f08a427312eeacf920" + ], + "index": "pypi", + "version": "==0.0.21" + }, + "atomicwrites": { + "hashes": [ + "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", + "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + ], + "version": "==1.2.1" + }, + "attrs": { + "hashes": [ + "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", + "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + ], + "version": "==18.2.0" + }, + "babel": { + "hashes": [ + "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", + "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" + ], + "version": "==2.6.0" + }, + "certifi": { + "hashes": [ + "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", + "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" + ], + "version": "==2018.8.24" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "click": { + "hashes": [ + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + ], + "index": "pypi", + "version": "==7.0" + }, + "colorama": { + "hashes": [ + "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", + "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" + ], + "index": "pypi", + "version": "==0.3.9" + }, + "configparser": { + "hashes": [ + "sha256:5308b47021bc2340965c371f0f058cc6971a04502638d4244225c49d80db273a" + ], + "markers": "python_version < '3.2'", + "version": "==3.5.0" + }, + "docutils": { + "hashes": [ + "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", + "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", + "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" + ], + "index": "pypi", + "version": "==0.14" + }, + "e1839a8": { + "editable": true, + "path": "." + }, + "enum34": { + "hashes": [ + "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", + "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", + "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", + "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1" + ], + "markers": "python_version < '3.4'", + "version": "==1.1.6" + }, + "flake8": { + "hashes": [ + "sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0", + "sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37" + ], + "index": "pypi", + "version": "==3.5.0" + }, + "funcsigs": { + "hashes": [ + "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", + "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" + ], + "markers": "python_version < '3.0'", + "version": "==1.0.2" + }, + "futures": { + "hashes": [ + "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265", + "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1" + ], + "version": "==3.2.0" + }, + "idna": { + "hashes": [ + "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", + "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" + ], + "version": "==2.7" + }, + "imagesize": { + "hashes": [ + "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8", + "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5" + ], + "version": "==1.1.0" + }, + "isort": { + "hashes": [ + "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", + "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", + "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" + ], + "index": "pypi", + "version": "==4.3.4" + }, + "jinja2": { + "hashes": [ + "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", + "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + ], + "version": "==2.10" + }, + "kaptan": { + "hashes": [ + "sha256:44df200d030975650a3a832c13b48cafdeb1a237b23de181d6a2346107e39da3" + ], + "index": "pypi", + "version": "==0.5.10" + }, + "libtmux": { + "hashes": [ + "sha256:2b969b507c26d9db08b85be4808d75774b6418ecf5a0f61956f7a1da44519585" + ], + "index": "pypi", + "version": "==0.8.0" + }, + "markupsafe": { + "hashes": [ + "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" + ], + "version": "==1.0" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "more-itertools": { + "hashes": [ + "sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", + "sha256:c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e", + "sha256:fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d" + ], + "version": "==4.3.0" + }, + "packaging": { + "hashes": [ + "sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", + "sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9" + ], + "version": "==18.0" + }, + "pathlib2": { + "hashes": [ + "sha256:8eb170f8d0d61825e09a95b38be068299ddeda82f35e96c3301a8a5e7604cb83", + "sha256:d1aa2a11ba7b8f7b21ab852b1fb5afb277e1bb99d5dfc663380b5015c0d80c5a" + ], + "markers": "python_version < '3.6'", + "version": "==2.3.2" + }, + "pluggy": { + "hashes": [ + "sha256:6e3836e39f4d36ae72840833db137f7b7d35105079aee6ec4a62d9f80d594dd1", + "sha256:95eb8364a4708392bae89035f45341871286a333f749c3141c20573d2b3876e1" + ], + "version": "==0.7.1" + }, + "pockets": { + "hashes": [ + "sha256:109eb91588e9cf722de98c98d300e1c5896e877f5704dc61176fa09686ca635b", + "sha256:21a2405543c439ac091453ed187f558cf5294d3f85f15310f214ad4de057e0af" + ], + "version": "==0.7.2" + }, + "py": { + "hashes": [ + "sha256:06a30435d058473046be836d3fc4f27167fd84c45b99704f2fb5509ef61f9af1", + "sha256:50402e9d1c9005d759426988a492e0edaadb7f4e68bcddfea586bc7432d009c6" + ], + "version": "==1.6.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766", + "sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9" + ], + "version": "==2.3.1" + }, + "pyflakes": { + "hashes": [ + "sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f", + "sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805" + ], + "version": "==1.6.0" + }, + "pygments": { + "hashes": [ + "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", + "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + ], + "version": "==2.2.0" + }, + "pyparsing": { + "hashes": [ + "sha256:bc6c7146b91af3f567cf6daeaec360bc07d45ffec4cf5353f4d7a208ce7ca30a", + "sha256:d29593d8ebe7b57d6967b62494f8c72b03ac0262b1eed63826c6f788b3606401" + ], + "version": "==2.2.2" + }, + "pytest": { + "hashes": [ + "sha256:7e258ee50338f4e46957f9e09a0f10fb1c2d05493fa901d113a8dafd0790de4e", + "sha256:9332147e9af2dcf46cd7ceb14d5acadb6564744ddff1fe8c17f0ce60ece7d9a2" + ], + "index": "pypi", + "version": "==3.8.2" + }, + "pytest-rerunfailures": { + "hashes": [ + "sha256:be6bf93ed618c8899aeb6721c24f8009c769879a3b4931e05650f3c173ec17c5", + "sha256:deeecaa0765038107eccbdeacaacdff186331d4958f417d132c490735398ca22" + ], + "index": "pypi", + "version": "==4.1" + }, + "pytz": { + "hashes": [ + "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", + "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" + ], + "version": "==2018.5" + }, + "pyyaml": { + "hashes": [ + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + ], + "version": "==3.13" + }, + "releases": { + "hashes": [ + "sha256:16cc20a59bd00854a8c6070b5b5eb410b093cd59c69bc8feb0cbaadd4ae8bc23", + "sha256:7a1b3163ab062d41dc4e61d8f51df055756d146f1fb6e18ee5cf55d91c9cda54" + ], + "index": "pypi", + "version": "==1.6.1" + }, + "requests": { + "hashes": [ + "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", + "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" + ], + "version": "==2.19.1" + }, + "scandir": { + "hashes": [ + "sha256:04b8adb105f2ed313a7c2ef0f1cf7aff4871aa7a1883fa4d8c44b5551ab052d6", + "sha256:1444134990356c81d12f30e4b311379acfbbcd03e0bab591de2696a3b126d58e", + "sha256:1b5c314e39f596875e5a95dd81af03730b338c277c54a454226978d5ba95dbb6", + "sha256:346619f72eb0ddc4cf355ceffd225fa52506c92a2ff05318cfabd02a144e7c4e", + "sha256:44975e209c4827fc18a3486f257154d34ec6eaec0f90fef0cca1caa482db7064", + "sha256:61859fd7e40b8c71e609c202db5b0c1dbec0d5c7f1449dec2245575bdc866792", + "sha256:a5e232a0bf188362fa00123cc0bb842d363a292de7126126df5527b6a369586a", + "sha256:c14701409f311e7a9b7ec8e337f0815baf7ac95776cc78b419a1e6d49889a383", + "sha256:c7708f29d843fc2764310732e41f0ce27feadde453261859ec0fca7865dfc41b", + "sha256:c9009c527929f6e25604aec39b0a43c3f831d2947d89d6caaab22f057b7055c8", + "sha256:f5c71e29b4e2af7ccdc03a020c626ede51da471173b4a6ad1e904f2b2e04b4bd" + ], + "markers": "python_version < '3.5'", + "version": "==1.9.0" + }, + "semantic-version": { + "hashes": [ + "sha256:2a4328680073e9b243667b201119772aefc5fc63ae32398d6afafff07c4f54c0", + "sha256:2d06ab7372034bcb8b54f2205370f4aa0643c133b7e6dbd129c5200b83ab394b" + ], + "version": "==2.6.0" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" + }, + "snowballstemmer": { + "hashes": [ + "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128", + "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89" + ], + "version": "==1.2.1" + }, + "sphinx": { + "hashes": [ + "sha256:217a7705adcb573da5bbe1e0f5cab4fa0bd89fd9342c9159121746f593c2d5a4", + "sha256:a602513f385f1d5785ff1ca420d9c7eb1a1b63381733b2f0ea8188a391314a86" + ], + "index": "pypi", + "version": "==1.7.9" + }, + "sphinxcontrib-napoleon": { + "hashes": [ + "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8", + "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef" + ], + "index": "pypi", + "version": "==0.7" + }, + "sphinxcontrib-websupport": { + "hashes": [ + "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", + "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" + ], + "version": "==1.1.0" + }, + "tmuxp": { + "editable": true, + "path": "." + }, + "typing": { + "hashes": [ + "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", + "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", + "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" + ], + "markers": "python_version < '3.5'", + "version": "==3.6.6" + }, + "urllib3": { + "hashes": [ + "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", + "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" + ], + "version": "==1.23" + }, + "vulture": { + "hashes": [ + "sha256:79c89ef5e3f2365467bcf491f425f777ae8fd157584dcc550d4591920b00fe3f", + "sha256:e794345a19c76f93f48f4519653038df90ad468ddea7912e14b07a07f6412e32" + ], + "index": "pypi", + "version": "==0.29" + } + } +} From 0eb6287ebd0c0967e968492cf1f9b8251a50dbe1 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Thu, 4 Oct 2018 02:08:02 -0400 Subject: [PATCH 0356/2998] Update requirements files to match working installed packages and match Pipfile.lock entries. --- requirements/base.txt | 2 +- requirements/doc.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 9909225b54..de3a154283 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -kaptan>=0.5.7 +kaptan>=0.5.10 libtmux==0.8.0 click>=7<8 colorama==0.3.9 diff --git a/requirements/doc.txt b/requirements/doc.txt index a89ae1585e..964e5460ee 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.8.1 +sphinx==1.7.9 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 From ee0f139cd40abd9d59989a9efd57d9dd9ca34106 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 5 Oct 2018 00:59:44 -0400 Subject: [PATCH 0357/2998] Update Sphinx to the latest. --- Pipfile | 1 + Pipfile.lock | 158 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 151 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index 1f78e4f6e2..cff3c9e547 100644 --- a/Pipfile +++ b/Pipfile @@ -24,6 +24,7 @@ libtmux = "==0.8.0" click = ">=7<8" colorama = "*" "e1839a8" = {path = ".", editable = true} +sphinx = "*" [requires] python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock index 726e1e70ee..32253a1c2a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "7e80b0d927e4962ad4087fb0619cfe11a0b15214d92d72aaab3b0afaf41584b3" + "sha256": "2c486adaf98acf9e522cf764580b65347b68f94d41e1471c3e60d3ea6f92fcdf" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,34 @@ ] }, "default": { + "alabaster": { + "hashes": [ + "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", + "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" + ], + "version": "==0.7.12" + }, + "babel": { + "hashes": [ + "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", + "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" + ], + "version": "==2.6.0" + }, + "certifi": { + "hashes": [ + "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", + "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" + ], + "version": "==2018.8.24" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -32,10 +60,39 @@ "index": "pypi", "version": "==0.3.9" }, + "docutils": { + "hashes": [ + "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", + "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", + "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" + ], + "version": "==0.14" + }, "e1839a8": { "editable": true, "path": "." }, + "idna": { + "hashes": [ + "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", + "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" + ], + "version": "==2.7" + }, + "imagesize": { + "hashes": [ + "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8", + "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5" + ], + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", + "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + ], + "version": "==2.10" + }, "kaptan": { "hashes": [ "sha256:44df200d030975650a3a832c13b48cafdeb1a237b23de181d6a2346107e39da3" @@ -50,6 +107,40 @@ "index": "pypi", "version": "==0.8.0" }, + "markupsafe": { + "hashes": [ + "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" + ], + "version": "==1.0" + }, + "packaging": { + "hashes": [ + "sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", + "sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9" + ], + "version": "==18.0" + }, + "pygments": { + "hashes": [ + "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", + "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + ], + "version": "==2.2.0" + }, + "pyparsing": { + "hashes": [ + "sha256:bc6c7146b91af3f567cf6daeaec360bc07d45ffec4cf5353f4d7a208ce7ca30a", + "sha256:d29593d8ebe7b57d6967b62494f8c72b03ac0262b1eed63826c6f788b3606401" + ], + "version": "==2.2.2" + }, + "pytz": { + "hashes": [ + "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", + "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" + ], + "version": "==2018.5" + }, "pyyaml": { "hashes": [ "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", @@ -65,6 +156,58 @@ "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" ], "version": "==3.13" + }, + "requests": { + "hashes": [ + "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", + "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" + ], + "version": "==2.19.1" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" + }, + "snowballstemmer": { + "hashes": [ + "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128", + "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89" + ], + "version": "==1.2.1" + }, + "sphinx": { + "hashes": [ + "sha256:652eb8c566f18823a022bb4b6dbc868d366df332a11a0226b5bc3a798a479f17", + "sha256:d222626d8356de702431e813a05c68a35967e3d66c6cd1c2c89539bb179a7464" + ], + "index": "pypi", + "version": "==1.8.1" + }, + "sphinxcontrib-websupport": { + "hashes": [ + "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", + "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" + ], + "version": "==1.1.0" + }, + "typing": { + "hashes": [ + "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", + "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", + "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" + ], + "markers": "python_version < '3.5'", + "version": "==3.6.6" + }, + "urllib3": { + "hashes": [ + "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", + "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" + ], + "version": "==1.23" } }, "develop": { @@ -154,7 +297,6 @@ "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" ], - "index": "pypi", "version": "==0.14" }, "e1839a8": { @@ -333,11 +475,11 @@ }, "pytest-rerunfailures": { "hashes": [ - "sha256:be6bf93ed618c8899aeb6721c24f8009c769879a3b4931e05650f3c173ec17c5", - "sha256:deeecaa0765038107eccbdeacaacdff186331d4958f417d132c490735398ca22" + "sha256:97216f8a549f74da3cc786236d9093fbd43150a6fbe533ba622cb311f7431774", + "sha256:b6124f66a7a636ab5e0108281563165480a6d66ae84b7cdd8dc9146162a28499" ], "index": "pypi", - "version": "==4.1" + "version": "==4.2" }, "pytz": { "hashes": [ @@ -417,11 +559,11 @@ }, "sphinx": { "hashes": [ - "sha256:217a7705adcb573da5bbe1e0f5cab4fa0bd89fd9342c9159121746f593c2d5a4", - "sha256:a602513f385f1d5785ff1ca420d9c7eb1a1b63381733b2f0ea8188a391314a86" + "sha256:652eb8c566f18823a022bb4b6dbc868d366df332a11a0226b5bc3a798a479f17", + "sha256:d222626d8356de702431e813a05c68a35967e3d66c6cd1c2c89539bb179a7464" ], "index": "pypi", - "version": "==1.7.9" + "version": "==1.8.1" }, "sphinxcontrib-napoleon": { "hashes": [ From faef1a09337f6326fbec1e45ec6aebfc82d8c544 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 5 Oct 2018 01:06:08 -0400 Subject: [PATCH 0358/2998] Update requirement files based on Piplock.lock versions. --- requirements/doc.txt | 2 +- requirements/test.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 964e5460ee..a89ae1585e 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils==0.14 -sphinx==1.7.9 +sphinx==1.8.1 alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 diff --git a/requirements/test.txt b/requirements/test.txt index e21e5c153b..6ab3461d08 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest==3.8.2 -pytest-rerunfailures==4.1 +pytest-rerunfailures==4.2 From bf672934b4f662928722ba0788ae582386da1c0d Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 5 Oct 2018 02:08:48 -0400 Subject: [PATCH 0359/2998] Correct utf-8 enconding setting. --- tmuxp/workspacebuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 982db220ce..37df61850b 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -1,4 +1,4 @@ -# -*- coding: utf8 -*- +# -*- coding: utf-8 -*- """Create a tmux workspace from a configuration :py:obj:`dict`. tmuxp.workspacebuilder From c24c6423e5d77b6be7f2187b2a482e1829098395 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Sat, 6 Oct 2018 02:16:05 -0400 Subject: [PATCH 0360/2998] Include pipenv section and clean up document based on doc8 --- doc/developing.rst | 53 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/doc/developing.rst b/doc/developing.rst index 82c30e8489..3e72fcaa31 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -22,6 +22,9 @@ using ``$ tmux -L test_case``. Install the latest code from git -------------------------------- +Using pip +^^^^^^^^^ + To begin developing, check out the code from github: .. code-block:: bash @@ -56,6 +59,48 @@ adjust the code and the installed software will reflect the changes. $ tmuxp +Using pipenv +^^^^^^^^^^^^ + +To begin developing, check out the code from github: + +.. code-block:: bash + + $ git clone git@github.com:tmux-python/tmuxp.git + $ cd tmuxp + +You can create a virtualenv, and install all of the locked +packages as listed in Pipfile.lock: + +.. code-block:: bash + + $ pipenv install --ignore-pipfile --dev + +If you prefer to install updated packages based on Pipfile only, not being +bound by Pipfile.lock: + +.. code-block:: bash + + $ pipenv install --skip-lock --dev + +If you ever need to update packages during your development session, the +following command can be used to update all packages as per Pipfile settings or +individual package (second command): + +.. code-block:: bash + + $ pipenv update --dev + $ pipenv update requests + +Then activate it to your current tty / terminal session with: + +.. code-block:: bash + + $ pipenv shell + +That is it! You are now ready to code! + + Test Runner ----------- @@ -76,7 +121,7 @@ If you found a problem or are trying to write a test, you can file an .. _test_specific_tests: Test runner options -~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^ Test only a file: @@ -114,7 +159,7 @@ Create two terminals: version of tmuxp above. Then: .. code-block:: bash - + $ py.test tests/test_workspacebuilder.py Terminal 1 should have flickered and built the session before your eyes. @@ -147,7 +192,7 @@ argument`_: $ make watch_test test='-x tests/test_config.py tests/test_util.py' Rebuild sphinx docs on save -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------- Rebuild the documentation when an ``.rst`` file is edited: @@ -178,7 +223,7 @@ this will load the ``.tmuxp.yaml`` in the root of the project. .. _travis: Travis CI -~~~~~~~~~ +--------- tmuxp uses `travis-ci`_ for continuous integration / automatic unit testing. From 1e6eb33e01372eaae5db1771dbe162fccacd661e Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Sat, 6 Oct 2018 02:17:17 -0400 Subject: [PATCH 0361/2998] Install doc8 and its dependencies to help clean up docs. --- Pipfile | 4 ++-- Pipfile.lock | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Pipfile b/Pipfile index cff3c9e547..46e86dc2e5 100644 --- a/Pipfile +++ b/Pipfile @@ -9,7 +9,7 @@ alagitpull = "*" releases = "*" aafigure = "*" sphinxcontrib-napoleon = "*" -Sphinx = "*" +sphinx = "*" isort = "*" "flake8" = "*" vulture = "*" @@ -17,6 +17,7 @@ pytest = "*" pytest-rerunfailures = "*" tmuxp = {path = ".", editable = true} "e1839a8" = {path = ".", editable = true} +"doc8" = "*" [packages] kaptan = "*" @@ -24,7 +25,6 @@ libtmux = "==0.8.0" click = ">=7<8" colorama = "*" "e1839a8" = {path = ".", editable = true} -sphinx = "*" [requires] python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock index 32253a1c2a..2da28db5bc 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2c486adaf98acf9e522cf764580b65347b68f94d41e1471c3e60d3ea6f92fcdf" + "sha256": "e3efff75927fcb0d4465ec55eb7501a6ac906c336fca84920b9af28641a8350e" }, "pipfile-spec": 6, "requires": { @@ -291,6 +291,14 @@ "markers": "python_version < '3.2'", "version": "==3.5.0" }, + "doc8": { + "hashes": [ + "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", + "sha256:d12f08aa77a4a65eb28752f4bc78f41f611f9412c4155e2b03f1f5d4a45efe04" + ], + "index": "pypi", + "version": "==0.8.0" + }, "docutils": { "hashes": [ "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", @@ -416,6 +424,13 @@ "markers": "python_version < '3.6'", "version": "==2.3.2" }, + "pbr": { + "hashes": [ + "sha256:1be135151a0da949af8c5d0ee9013d9eafada71237eb80b3ba8896b4f12ec5dc", + "sha256:cf36765bf2218654ae824ec8e14257259ba44e43b117fd573c8d07a9895adbdd" + ], + "version": "==4.3.0" + }, "pluggy": { "hashes": [ "sha256:6e3836e39f4d36ae72840833db137f7b7d35105079aee6ec4a62d9f80d594dd1", @@ -519,6 +534,12 @@ ], "version": "==2.19.1" }, + "restructuredtext-lint": { + "hashes": [ + "sha256:c48ca9a84c312b262809f041fe47dcfaedc9ee4879b3e1f9532f745c182b4037" + ], + "version": "==1.1.3" + }, "scandir": { "hashes": [ "sha256:04b8adb105f2ed313a7c2ef0f1cf7aff4871aa7a1883fa4d8c44b5551ab052d6", @@ -580,6 +601,13 @@ ], "version": "==1.1.0" }, + "stevedore": { + "hashes": [ + "sha256:1e153545aca7a6a49d8337acca4f41c212fbfa60bf864ecd056df0cafb9627e8", + "sha256:c7eac1c0d95824c88b655273da5c17cdde6482b2739f47c30bf851dcc9d3c2c0" + ], + "version": "==1.29.0" + }, "tmuxp": { "editable": true, "path": "." From ee025d2149a7bdb53136c7691f473fcb168723e1 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Sat, 6 Oct 2018 02:27:05 -0400 Subject: [PATCH 0362/2998] Clean up docs with trailing while spaces, long lines and inconsistent section headers. --- doc/about.rst | 6 +++--- doc/about_tmux.rst | 14 +++++++------- doc/developing.rst | 2 +- doc/examples.rst | 11 ++++++----- doc/glossary.rst | 2 +- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/doc/about.rst b/doc/about.rst index 06fc9297ee..0b693e4759 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -12,7 +12,7 @@ Built on a object relational mapper for tmux. tmux users can reload common workspaces from YAML, JSON and :py:obj:`dict` configurations like `tmuxinator`_ and `teamocil`_. -tmuxp is used by developers for tmux automation at great companies like +tmuxp is used by developers for tmux automation at great companies like `Bugsnag`_, `Pragmatic Coders`_ and many others. To jump right in, see :ref:`quickstart` and :ref:`examples`. @@ -20,7 +20,7 @@ To jump right in, see :ref:`quickstart` and :ref:`examples`. Interested in some kung-fu or joining the effort? :ref:`api` and :ref:`developing`. -`MIT-licensed`_. Code on `github +`MIT-licensed`_. Code on `github `_. .. _Bugsnag: https://blog.bugsnag.com/benefits-of-using-tmux/ @@ -84,7 +84,7 @@ See :ref:`libtmux's internals `. **Conversion** ``$ tmuxp convert `` can convert files to and from JSON and YAML. -.. [1] While freezing and importing sessions is a great way to save time, +.. [1] While freezing and importing sessions is a great way to save time, tweaking will probably be required - There is no substitute to a config made with love. diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 2840402548..31b0b9ee66 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -154,10 +154,10 @@ sandwich, and re-(attach), all applications are still running! +--------+--------+ | $ bash | $ bash | | | | - | | | /------------\ - +--------+--------+ --> | detach | - | $ vim | $ bash | | 'Ctrl-b b' | - | | | \------------/ + | | | /------------\ + +--------+--------+ --> | detach | + | $ vim | $ bash | | 'Ctrl-b b' | + | | | \------------/ | | | | +--------+--------+ | /------------------/ @@ -208,7 +208,7 @@ Applications running on a remote server can be launched inside of a tmux session, detached, and reattached next timeyour `"train of thought"`_ and work. -Multitasking. Preserving the thinking you have. +Multitasking. Preserving the thinking you have. .. _"train of thought": http://en.wikipedia.org/wiki/Train_of_thought @@ -258,7 +258,7 @@ That's all it takes to launch yourself into a tmux session. Running ``$ tmux list-sessions`` or any other command for listing tmux entities (such as ``$ tmux list-windows`` or ``$ tmux list-panes``). This can generate the error "failed to connect to server". - + This could be because: - tmux server has killed its' last session, killing the server. @@ -633,7 +633,7 @@ Short cut Action ``M-o`` Rotate the panes in the current window backwards. ``M-p`` Move to the previous window with a bell or activity marker. -``C-Up, C-Down`` Resize the current pane in steps of one cell. +``C-Up, C-Down`` Resize the current pane in steps of one cell. ``C-Left, C-Right`` ``M-Up, M-Down`` Resize the current pane in steps of five cells. ``M-Left, M-Right`` diff --git a/doc/developing.rst b/doc/developing.rst index 3e72fcaa31..358a765c65 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -146,7 +146,7 @@ Multiple can be separated by spaces: .. _test_builder_visually: Visual testing -~~~~~~~~~~~~~~ +-------------- You can watch tmux testsuite build sessions visually by keeping a client open in a separate terminal. diff --git a/doc/examples.rst b/doc/examples.rst index 56a5895c99..6792d377e8 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -183,12 +183,12 @@ In this case of this example, assuming the username "user":: $ MY_ENV_VAR=foo tmuxp load examples/env-variables.yaml -and your session name will be ``session - user (foo)``. +and your session name will be ``session - user (foo)``. -Shell variables in ``shell_command`` do not support this type of +Shell variables in ``shell_command`` do not support this type of concatenation. ``shell_command`` and ``shell_command_before`` both support normal shell variables, since they are sent into panes -automatically via ``send-key`` in ``tmux(1)``. See ``ls $PWD`` in +automatically via ``send-key`` in ``tmux(1)``. See ``ls $PWD`` in example. If you have a special case and would like to see behavior changed, @@ -369,7 +369,7 @@ A successful script will exit with a status of ``0``. Important: the script file must be chmod executable ``+x`` or ``755``. Run a python script (and check for it's return code), the script is -*relative to the ``.tmuxp.yaml``'s root* (Windows and panes omitted in +*relative to the ``.tmuxp.yaml``'s root* (Windows and panes omitted in this example): .. code-block:: yaml @@ -450,7 +450,8 @@ packages are installed: - blank - pipenv run ./manage.py runserver -You can also source yourself into the virtual environment using ``shell_command_before``: +You can also source yourself into the virtual environment using +``shell_command_before``: .. code-block:: yaml diff --git a/doc/glossary.rst b/doc/glossary.rst index dcdea84f76..b30f406a2e 100644 --- a/doc/glossary.rst +++ b/doc/glossary.rst @@ -37,7 +37,7 @@ Glossary Session Inside a tmux :term:`server`. - + The session has 1 or more :term:`Window`. The bottom bar in tmux show a list of windows. Normally they can be navigated with ``Ctrl-a [0-9]``, ``Ctrl-a n`` and ``Ctrl-a p``. From 78c43ead4d77542909489a19b2ee17966182021f Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Sat, 6 Oct 2018 02:45:30 -0400 Subject: [PATCH 0363/2998] Include doc8 in doc.txt requirements file. --- requirements/doc.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/doc.txt b/requirements/doc.txt index a89ae1585e..2df461eb83 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -5,3 +5,4 @@ alagitpull==0.0.21 releases==1.6.1 aafigure==0.6 sphinxcontrib-napoleon==0.7 +doc8==0.8.0 From e048abfafc190326862cf1653283ba73fc67e75d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 13 Oct 2018 12:32:59 -0500 Subject: [PATCH 0364/2998] :art: Fix setenv encoding issues with py2 + unicode_literals This warning was introduced in pytest 3.8.2. For more information, see the pull request at https://github.com/pytest-dev/pytest/pull/4056. --- tests/test_cli.py | 7 +++---- tests/test_config.py | 2 +- tests/test_workspacebuilder.py | 6 +++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 87920532b4..b28b53c26e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- """Test for tmuxp command line interface.""" - from __future__ import absolute_import import json @@ -116,13 +115,13 @@ def projectdir(homedir): def test_tmuxp_configdir_env_var(tmpdir, monkeypatch): - monkeypatch.setenv('TMUXP_CONFIGDIR', tmpdir) + monkeypatch.setenv('TMUXP_CONFIGDIR', str(tmpdir)) assert get_config_dir() == tmpdir def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): - monkeypatch.setenv('HOME', homedir) + monkeypatch.setenv('HOME', str(homedir)) projectdir.join('.tmuxp.yaml').ensure() user_config_name = 'myconfig' user_config = configdir.join('%s.yaml' % user_config_name).ensure() @@ -226,7 +225,7 @@ def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): def config_cmd(config): click.echo(config) - monkeypatch.setenv('HOME', homedir) + monkeypatch.setenv('HOME', str(homedir)) projectdir.join('.tmuxp.yaml').ensure() user_config_name = 'myconfig' user_config = configdir.join('%s.yaml' % user_config_name).ensure() diff --git a/tests/test_config.py b/tests/test_config.py index c119047a0f..f8b13d9860 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -356,7 +356,7 @@ def test_replaces_env_variables(monkeypatch): sconfig = load_yaml(yaml_config) - monkeypatch.setenv(env_key, env_val) + monkeypatch.setenv(str(env_key), str(env_val)) sconfig = config.expand(sconfig) assert "%s/test" % env_val == sconfig['start_directory'] assert "%s/test2" % env_val in sconfig['shell_command_before'] diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 0bfd24b547..f25498eae7 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -219,11 +219,11 @@ def test_global_options(session): def test_global_session_env_options(session, monkeypatch): visual_silence = 'on' - monkeypatch.setenv('VISUAL_SILENCE', visual_silence) + monkeypatch.setenv(str('VISUAL_SILENCE'), str(visual_silence)) repeat_time = 738 - monkeypatch.setenv('REPEAT_TIME', repeat_time) + monkeypatch.setenv(str('REPEAT_TIME'), str(repeat_time)) main_pane_height = 8 - monkeypatch.setenv('MAIN_PANE_HEIGHT', main_pane_height) + monkeypatch.setenv(str('MAIN_PANE_HEIGHT'), str(main_pane_height)) yaml_config = loadfixture("workspacebuilder/env_var_options.yaml") s = session From ceec5f8309cf0e625815f233c5bdf8be99a093f9 Mon Sep 17 00:00:00 2001 From: Andrea D'Amore Date: Thu, 5 Jul 2018 11:44:26 +0200 Subject: [PATCH 0365/2998] Use XDG base directory specification for config files --- tmuxp/cli.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index f2acd60d01..92e0c5ca3b 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -35,17 +35,31 @@ def get_config_dir(): """ Return tmuxp configuration directory. - Checks for ``TMUXP_CONFIGDIR`` environmental variable. + ``TMUXP_CONFIGDIR`` environmental variable has precedence, then XDG default + directory is checked, either from XDG_CONFIG_HOME environmental variable or + its default, then the old default ~/.tmuxp is returned for compatibility. Returns ------- str : absolute path to tmuxp config directory """ - if 'TMUXP_CONFIGDIR' in os.environ: - return os.path.expanduser(os.environ['TMUXP_CONFIGDIR']) - return os.path.expanduser('~/.tmuxp/') + paths = [] + if 'TMUXP_CONFIGDIR' in os.environ: + paths.append(os.environ['TMUXP_CONFIGDIR']) + if 'XDG_CONFIG_HOME' in os.environ: + paths.append(os.environ['XDG_CONFIG_HOME']) + else: + paths.append('~/.config/tmuxp/') + paths.append('~/.tmuxp') + + for path in paths: + path = os.path.expanduser(path) + if os.path.isdir(path): + return path + # Return last path as default if none of the previous ones matched + return path def get_tmuxinator_dir(): From 950e88c772e1e60d0cc380f355d4f6471be1babe Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Mon, 15 Oct 2018 22:55:16 -0400 Subject: [PATCH 0366/2998] Confirm environment variables are empty before appending them. --- tmuxp/cli.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 92e0c5ca3b..91a1ac9b6b 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -35,9 +35,10 @@ def get_config_dir(): """ Return tmuxp configuration directory. - ``TMUXP_CONFIGDIR`` environmental variable has precedence, then XDG default - directory is checked, either from XDG_CONFIG_HOME environmental variable or - its default, then the old default ~/.tmuxp is returned for compatibility. + ``TMUXP_CONFIGDIR`` environmental variable has precedence if set and not + empty. We also honor XDG default directory, evaluating from XDG_CONFIG_HOME + environmental variable if set and not empty or its default. Then the old + default ~/.tmuxp is returned for compatibility. Returns ------- @@ -46,9 +47,9 @@ def get_config_dir(): """ paths = [] - if 'TMUXP_CONFIGDIR' in os.environ: + if 'TMUXP_CONFIGDIR' in os.environ and os.environ['TMUX_CONFIGDIR']: paths.append(os.environ['TMUXP_CONFIGDIR']) - if 'XDG_CONFIG_HOME' in os.environ: + if 'XDG_CONFIG_HOME' in os.environ and os.environ['XDG_CONFIG_HOME']: paths.append(os.environ['XDG_CONFIG_HOME']) else: paths.append('~/.config/tmuxp/') From ba22a66d0037eadaf17a1e5085a06f7015885e2f Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Mon, 15 Oct 2018 23:11:48 -0400 Subject: [PATCH 0367/2998] Fix check for empty variables as it broke tests and we later check if paths exist as directory. --- tmuxp/cli.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 91a1ac9b6b..82843b3ace 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -35,10 +35,10 @@ def get_config_dir(): """ Return tmuxp configuration directory. - ``TMUXP_CONFIGDIR`` environmental variable has precedence if set and not - empty. We also honor XDG default directory, evaluating from XDG_CONFIG_HOME - environmental variable if set and not empty or its default. Then the old - default ~/.tmuxp is returned for compatibility. + ``TMUXP_CONFIGDIR`` environmental variable has precedence if set. We also + evaluate XDG default directory from XDG_CONFIG_HOME environmental variable + if set or its default. Then the old default ~/.tmuxp is returned for + compatibility. Returns ------- @@ -47,9 +47,9 @@ def get_config_dir(): """ paths = [] - if 'TMUXP_CONFIGDIR' in os.environ and os.environ['TMUX_CONFIGDIR']: + if 'TMUXP_CONFIGDIR' in os.environ: paths.append(os.environ['TMUXP_CONFIGDIR']) - if 'XDG_CONFIG_HOME' in os.environ and os.environ['XDG_CONFIG_HOME']: + if 'XDG_CONFIG_HOME' in os.environ: paths.append(os.environ['XDG_CONFIG_HOME']) else: paths.append('~/.config/tmuxp/') From e692f77ab1000a2d8c80195c82857584254a0cdf Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Wed, 17 Oct 2018 11:17:55 -0500 Subject: [PATCH 0368/2998] Update pytest from 3.8.2 to 3.9.1 --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 6ab3461d08..8c2353afd5 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.8.2 +pytest==3.9.1 pytest-rerunfailures==4.2 From 31a63f0a36392ea905384c053d5b829dcca71849 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 19 Oct 2018 02:05:01 -0400 Subject: [PATCH 0369/2998] Add contrinuting details. --- CONTRIBUTING.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..33d32d21b6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,99 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change. + +Please note we have a code of conduct, please follow it in all your interactions with the project. + +## Pull Request Process + +1. Ensure any install or build dependencies are removed before the end of the layer when doing a + build. +2. This project uses flake8 to conform with common Python standards. Makse sure + to run your code through linter using latest version of flake8, before pull request. +3. Bad documnentation is a Bug. If your change demands documentation update, please do so. If you + find an issue with documentation, take the time to improve or fix it. +4. pytest is used for automated testing. Please make sure to update tests are needed, and to run + `make test`, before submitting your pull request. This should prevent issues with TravisCI and + make the review and merging process easier and faster. +5. Update the README.md with details of changes to the interface, this includes new environment + variables, exposed ports, useful file locations and container parameters. +6. Increase the version numbers in any examples files and the README.md to the new version that this + Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +7. You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. + +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [INSERT EMAIL ADDRESS]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file From e0573a65e34aced2027a258b237b4129d387932f Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 19 Oct 2018 02:10:54 -0400 Subject: [PATCH 0370/2998] Remove Code of Conduct from contributing.md file. --- CONTRIBUTING.md | 79 ++----------------------------------------------- 1 file changed, 2 insertions(+), 77 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 33d32d21b6..173b15ce0a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,80 +20,5 @@ Please note we have a code of conduct, please follow it in all your interactions variables, exposed ports, useful file locations and container parameters. 6. Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). -7. You may merge the Pull Request in once you have the sign-off of two other developers, or if you - do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [INSERT EMAIL ADDRESS]. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file +7. You may merge the Pull Request in once you have the sign-off of one other developer. If you + do not have permission to do that, you may request reviewer to merge it for you. From 2925726ac7f1c96b448469d1857b0b0bb601b272 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 19 Oct 2018 02:13:40 -0400 Subject: [PATCH 0371/2998] Add code of conduct file. --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..eecfdfa15d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at team@git-pull.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 6823e2f25c031826c556780274a5539538eef9b2 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 19 Oct 2018 02:19:30 -0400 Subject: [PATCH 0372/2998] Reference maintainers intead of owner. --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 173b15ce0a..9da680a3fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing When contributing to this repository, please first discuss the change you wish to make via issue, -email, or any other method with the owners of this repository before making a change. +email, or any other method with the maintainers of this repository before making a change. Please note we have a code of conduct, please follow it in all your interactions with the project. From b239cb6ff613adc7b715f597b92247001e35a9db Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 19 Oct 2018 02:38:56 -0400 Subject: [PATCH 0373/2998] Fix a few typos. --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9da680a3fc..ae2ca3ed0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,12 +9,12 @@ Please note we have a code of conduct, please follow it in all your interactions 1. Ensure any install or build dependencies are removed before the end of the layer when doing a build. -2. This project uses flake8 to conform with common Python standards. Makse sure +2. This project uses flake8 to conform with common Python standards. Make sure to run your code through linter using latest version of flake8, before pull request. 3. Bad documnentation is a Bug. If your change demands documentation update, please do so. If you find an issue with documentation, take the time to improve or fix it. -4. pytest is used for automated testing. Please make sure to update tests are needed, and to run - `make test`, before submitting your pull request. This should prevent issues with TravisCI and +4. pytest is used for automated testing. Please make sure to update tests that are needed, and to run + `make test` before submitting your pull request. This should prevent issues with TravisCI and make the review and merging process easier and faster. 5. Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. From a35a05a406d8c2c17b64bae6b1d4f40c6e3f359f Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Sat, 20 Oct 2018 03:34:03 -0400 Subject: [PATCH 0374/2998] Update Pipfiles to matchi this PR as well. --- Pipfile | 3 ++- Pipfile.lock | 62 ++++++++++++++++++++++++++-------------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Pipfile b/Pipfile index 46e86dc2e5..69369244ec 100644 --- a/Pipfile +++ b/Pipfile @@ -9,7 +9,7 @@ alagitpull = "*" releases = "*" aafigure = "*" sphinxcontrib-napoleon = "*" -sphinx = "*" +sphinx = ">=1.8.1" isort = "*" "flake8" = "*" vulture = "*" @@ -25,6 +25,7 @@ libtmux = "==0.8.0" click = ">=7<8" colorama = "*" "e1839a8" = {path = ".", editable = true} +sphinx = "*" [requires] python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock index 2da28db5bc..1fe2087c78 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e3efff75927fcb0d4465ec55eb7501a6ac906c336fca84920b9af28641a8350e" + "sha256": "18036229bd9861e2c9cf9501babe1ff58fc50a6c8d549876ddf1be378bf40c9a" }, "pipfile-spec": 6, "requires": { @@ -32,10 +32,10 @@ }, "certifi": { "hashes": [ - "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", - "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" + "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", + "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" ], - "version": "==2018.8.24" + "version": "==2018.10.15" }, "chardet": { "hashes": [ @@ -159,10 +159,10 @@ }, "requests": { "hashes": [ - "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", - "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" + "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", + "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" ], - "version": "==2.19.1" + "version": "==2.20.0" }, "six": { "hashes": [ @@ -204,10 +204,10 @@ }, "urllib3": { "hashes": [ - "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", - "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" + "sha256:41c3db2fc01e5b907288010dec72f9d0a74e37d6994e6eb56849f59fea2265ae", + "sha256:8819bba37a02d143296a4d032373c4dd4aca11f6d4c9973335ca75f9c8475f59" ], - "version": "==1.23" + "version": "==1.24" } }, "develop": { @@ -256,10 +256,10 @@ }, "certifi": { "hashes": [ - "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", - "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" + "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", + "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" ], - "version": "==2018.8.24" + "version": "==2018.10.15" }, "chardet": { "hashes": [ @@ -426,17 +426,17 @@ }, "pbr": { "hashes": [ - "sha256:1be135151a0da949af8c5d0ee9013d9eafada71237eb80b3ba8896b4f12ec5dc", - "sha256:cf36765bf2218654ae824ec8e14257259ba44e43b117fd573c8d07a9895adbdd" + "sha256:ab94783019179bf48f5784edc63f5bc8328ec5ff93f33591567f266d21ac7323", + "sha256:bfcff1a3878eebf559392c2130a17f612a03f96a0d44c3559d9c1e62a4235a2d" ], - "version": "==4.3.0" + "version": "==5.0.0" }, "pluggy": { "hashes": [ - "sha256:6e3836e39f4d36ae72840833db137f7b7d35105079aee6ec4a62d9f80d594dd1", - "sha256:95eb8364a4708392bae89035f45341871286a333f749c3141c20573d2b3876e1" + "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", + "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" ], - "version": "==0.7.1" + "version": "==0.8.0" }, "pockets": { "hashes": [ @@ -447,10 +447,10 @@ }, "py": { "hashes": [ - "sha256:06a30435d058473046be836d3fc4f27167fd84c45b99704f2fb5509ef61f9af1", - "sha256:50402e9d1c9005d759426988a492e0edaadb7f4e68bcddfea586bc7432d009c6" + "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", + "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" ], - "version": "==1.6.0" + "version": "==1.7.0" }, "pycodestyle": { "hashes": [ @@ -482,11 +482,11 @@ }, "pytest": { "hashes": [ - "sha256:7e258ee50338f4e46957f9e09a0f10fb1c2d05493fa901d113a8dafd0790de4e", - "sha256:9332147e9af2dcf46cd7ceb14d5acadb6564744ddff1fe8c17f0ce60ece7d9a2" + "sha256:10e59f84267370ab20cec9305bafe7505ba4d6b93ecbf66a1cce86193ed511d5", + "sha256:8c827e7d4816dfe13e9329c8226aef8e6e75d65b939bc74fda894143b6d1df59" ], "index": "pypi", - "version": "==3.8.2" + "version": "==3.9.1" }, "pytest-rerunfailures": { "hashes": [ @@ -529,10 +529,10 @@ }, "requests": { "hashes": [ - "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1", - "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a" + "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", + "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" ], - "version": "==2.19.1" + "version": "==2.20.0" }, "restructuredtext-lint": { "hashes": [ @@ -623,10 +623,10 @@ }, "urllib3": { "hashes": [ - "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", - "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" + "sha256:41c3db2fc01e5b907288010dec72f9d0a74e37d6994e6eb56849f59fea2265ae", + "sha256:8819bba37a02d143296a4d032373c4dd4aca11f6d4c9973335ca75f9c8475f59" ], - "version": "==1.23" + "version": "==1.24" }, "vulture": { "hashes": [ From eab92566c25b1a430553b95960367dd82b5ba69e Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 16 Nov 2018 01:22:09 -0500 Subject: [PATCH 0375/2998] Unpin specific versions od packages in requirements files to match Pipfille ones and prevent constant pyup-bot pull requests. --- requirements/base.txt | 2 +- requirements/dev.txt | 6 +++--- requirements/doc.txt | 14 +++++++------- requirements/test.txt | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index de3a154283..3d611d1b92 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 libtmux==0.8.0 click>=7<8 -colorama==0.3.9 +colorama>=0.3.9 diff --git a/requirements/dev.txt b/requirements/dev.txt index 10350b65df..a4ac53c113 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ -isort==4.3.4 -flake8==3.5.0 -vulture==0.29 +isort>=4.3.4 +flake8>=3.5.0 +vulture>=0.29 diff --git a/requirements/doc.txt b/requirements/doc.txt index 2df461eb83..caea6072ab 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,8 +1,8 @@ -r ./base.txt -docutils==0.14 -sphinx==1.8.1 -alagitpull==0.0.21 -releases==1.6.1 -aafigure==0.6 -sphinxcontrib-napoleon==0.7 -doc8==0.8.0 +docutils>=0.14 +sphinx>=1.8.1 +alagitpull>=0.0.21 +releases>=1.6.1 +aafigure>=0.6 +sphinxcontrib-napoleon>=0.7 +doc8>=0.8.0 diff --git a/requirements/test.txt b/requirements/test.txt index 8c2353afd5..e58adc6ecb 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest==3.9.1 -pytest-rerunfailures==4.2 +pytest>=3.9.1 +pytest-rerunfailures>=4.2 From 021043af6ef41f69bf50b0b813b32a089591a7a0 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 16 Nov 2018 02:25:04 -0500 Subject: [PATCH 0376/2998] Update conftest to raise e in compliance with flake8. --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6f031fb112..6826907a8c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -54,8 +54,8 @@ def session(server): pass except exc.LibTmuxException as e: # server.attach_session(session.get('session_id')) - pass - + raise e + for old_test_session in old_test_sessions: logger.debug('Old test test session %s found. Killing it.' % old_test_session) server.kill_session(old_test_session) From 8db531e767fb9e3e487310508092ca71605889ac Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 16 Nov 2018 02:45:42 -0500 Subject: [PATCH 0377/2998] Fix test issue, by removing execept as declaration to comply with flake8. --- tests/conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6826907a8c..143377957c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,9 +52,9 @@ def session(server): try: server.switch_client(session.get('session_id')) pass - except exc.LibTmuxException as e: + except exc.LibTmuxException: # server.attach_session(session.get('session_id')) - raise e + pass for old_test_session in old_test_sessions: logger.debug('Old test test session %s found. Killing it.' % old_test_session) From 4320ccc94d73761bf1e54fddafc2ef71cd81a883 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 30 Dec 2018 12:50:56 -0600 Subject: [PATCH 0378/2998] Remove vulture --- Makefile | 6 ------ Pipfile | 1 - requirements/dev.txt | 1 - 3 files changed, 8 deletions(-) diff --git a/Makefile b/Makefile index 99fda18a8f..f9625e60a1 100644 --- a/Makefile +++ b/Makefile @@ -19,12 +19,6 @@ test: watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi -vulture: - vulture tmuxp - -watch_vulture: - if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) vulture; else $(MAKE) vulture entr_warn; fi - build_docs: cd doc && $(MAKE) html diff --git a/Pipfile b/Pipfile index 69369244ec..47b7374dea 100644 --- a/Pipfile +++ b/Pipfile @@ -12,7 +12,6 @@ sphinxcontrib-napoleon = "*" sphinx = ">=1.8.1" isort = "*" "flake8" = "*" -vulture = "*" pytest = "*" pytest-rerunfailures = "*" tmuxp = {path = ".", editable = true} diff --git a/requirements/dev.txt b/requirements/dev.txt index a4ac53c113..0c8e676fdb 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,2 @@ isort>=4.3.4 flake8>=3.5.0 -vulture>=0.29 From b17dfa656e34868ab0255fd96b7e8d2f72b5d82e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 10:30:05 -0600 Subject: [PATCH 0379/2998] Update libtmux 0.8.0 -> 0.8.1 --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 3d611d1b92..9f971298a9 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux==0.8.0 +libtmux==0.8.1 click>=7<8 colorama>=0.3.9 From 0e2c83bcb189add3628222eb06fcbc77715d5d88 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 11:07:00 -0600 Subject: [PATCH 0380/2998] Update set_option params for 0.8.1 g -> _global --- tests/test_workspacebuilder.py | 6 +++--- tmuxp/workspacebuilder.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index f25498eae7..6085ea46d4 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -213,8 +213,8 @@ def test_global_options(session): builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - assert "top" in s.show_option('status-position', g=True) - assert 493 == s.show_option('repeat-time', g=True) + assert "top" in s.show_option('status-position', _global=True) + assert 493 == s.show_option('repeat-time', _global=True) def test_global_session_env_options(session, monkeypatch): @@ -234,7 +234,7 @@ def test_global_session_env_options(session, monkeypatch): builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - assert visual_silence in s.show_option('visual-silence', g=True) + assert visual_silence in s.show_option('visual-silence', _global=True) assert repeat_time == s.show_option('repeat-time') assert main_pane_height == s.attached_window.show_window_option('main-pane-height') diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 37df61850b..2cb3649260 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -172,7 +172,7 @@ def build(self, session=None): self.session.set_option(option, value) if 'global_options' in self.sconf: for option, value in self.sconf['global_options'].items(): - self.session.set_option(option, value, g=True) + self.session.set_option(option, value, _global=True) if 'environment' in self.sconf: for option, value in self.sconf['environment'].items(): self.session.set_environment(option, value) From abea068e520bb55f43434d2074cd0164198ece32 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 11:10:38 -0600 Subject: [PATCH 0381/2998] travis: add tmux 2.7 and 2.8 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 47cdd3f43d..953d6c6290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ env: - RETRY_TIMEOUT_SECONDS=15 matrix: - TMUX_VERSION=master + - TMUX_VERSION=2.8 + - TMUX_VERSION=2.7 - TMUX_VERSION=2.6 - TMUX_VERSION=2.5 - TMUX_VERSION=2.4 From 1d9b288a5c618eac8a6abc7cf0812337b15ee5c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:11:43 -0600 Subject: [PATCH 0382/2998] Update CHANGES for 1.5.0 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index e843ec9b02..8bb37ab270 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Here you can find the recent changes to tmuxp - :release:`1.5.0 <2018-10-02>` - :feature:`-` Support Click 7.0 - :support:`-` Remove unused ``__future__`` imports +- :libtmux:`471` Update libtmux 0.8.0 -> 0.8.1 - :support:`-` Sort imports - :support:`-` Add configuration and make command for isort. - :support:`-` Add sphinxcontrib-napoleon. From b4266b457b9ca7ac68337d3075647faac2737069 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:13:05 -0600 Subject: [PATCH 0383/2998] Update README for tmux versions --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b03419aff1..adb0fd2993 100644 --- a/README.rst +++ b/README.rst @@ -141,7 +141,7 @@ Project details --------------- ============== ========================================================== -tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 +tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7. 2.8 python support 2.7, >= 3.3, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tmux-python/tmuxp From 8bd8fe461fd8a1a3bad3613d073742ee7aa3e826 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:13:31 -0600 Subject: [PATCH 0384/2998] Add Python 3.7 to classifiers --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 118410b816..eec0927689 100644 --- a/setup.py +++ b/setup.py @@ -67,6 +67,7 @@ def run_tests(self): 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: Implementation :: PyPy', "Topic :: Utilities", "Topic :: System :: Shells", From 24f9801bd0c7d1442aab73989b3213392d9eaf6c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:13:56 -0600 Subject: [PATCH 0385/2998] Make copyright year perpetual --- LICENSE | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index cb72c79135..203c5d283f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2013-2018 tmuxp contributors +Copyright (c) 2013- tmuxp contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 62047c250e..ebfe9389a5 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -7,4 +7,4 @@ __github__ = 'https://github.com/tmux-python/tmuxp' __pypi__ = 'https://pypi.org/project/tmuxp/' __license__ = 'MIT' -__copyright__ = 'Copyright 2013-2018 Tony Narlock' +__copyright__ = 'Copyright 2013- Tony Narlock' From a95397153e3508236cee8b28997f917ab695406a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:14:14 -0600 Subject: [PATCH 0386/2998] :bookmark: Release 1.5.0 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index ebfe9389a5..8d62efadc3 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.0a1' +__version__ = '1.5.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 52762f31c2b1f2abfa5841211a402d5e100735e5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Jan 2019 12:15:59 -0600 Subject: [PATCH 0387/2998] Pipfile: Update libtmux to 0.8.1 --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 47b7374dea..3a6323285f 100644 --- a/Pipfile +++ b/Pipfile @@ -20,7 +20,7 @@ tmuxp = {path = ".", editable = true} [packages] kaptan = "*" -libtmux = "==0.8.0" +libtmux = "==0.8.1" click = ">=7<8" colorama = "*" "e1839a8" = {path = ".", editable = true} From 88f4e27d7cd3a6dfa96cfe972404670d18cb0948 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 01:55:51 -0500 Subject: [PATCH 0388/2998] Add twine to development packages in Pipfile. --- Pipfile | 1 + Pipfile.lock | 370 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 243 insertions(+), 128 deletions(-) diff --git a/Pipfile b/Pipfile index 3a6323285f..8630229ab5 100644 --- a/Pipfile +++ b/Pipfile @@ -17,6 +17,7 @@ pytest-rerunfailures = "*" tmuxp = {path = ".", editable = true} "e1839a8" = {path = ".", editable = true} "doc8" = "*" +twine = "*" [packages] kaptan = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 1fe2087c78..c0427b7132 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "18036229bd9861e2c9cf9501babe1ff58fc50a6c8d549876ddf1be378bf40c9a" + "sha256": "50d07e5914ff0c0ed6518c45453e8a9a270d71fb86452bca7c617752dcebe916" }, "pipfile-spec": 6, "requires": { @@ -30,12 +30,19 @@ ], "version": "==2.6.0" }, + "bleach": { + "hashes": [ + "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", + "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" + ], + "version": "==3.1.0" + }, "certifi": { "hashes": [ - "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", - "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" + "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", + "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" ], - "version": "==2018.10.15" + "version": "==2018.11.29" }, "chardet": { "hashes": [ @@ -54,11 +61,11 @@ }, "colorama": { "hashes": [ - "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", - "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" + "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", + "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48" ], "index": "pypi", - "version": "==0.3.9" + "version": "==0.4.1" }, "docutils": { "hashes": [ @@ -74,10 +81,10 @@ }, "idna": { "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" ], - "version": "==2.7" + "version": "==2.8" }, "imagesize": { "hashes": [ @@ -95,51 +102,85 @@ }, "kaptan": { "hashes": [ - "sha256:44df200d030975650a3a832c13b48cafdeb1a237b23de181d6a2346107e39da3" + "sha256:8403d6e48200c3f49cb6d6b3dcb5898aa5ab9d820831655bf9a2403e00cd4207" ], "index": "pypi", - "version": "==0.5.10" + "version": "==0.5.11" }, "libtmux": { "hashes": [ - "sha256:2b969b507c26d9db08b85be4808d75774b6418ecf5a0f61956f7a1da44519585" + "sha256:5d4963cc4af53046cabd0997152af05a0a419e4c63af6737389b50f637c3852a" ], "index": "pypi", - "version": "==0.8.0" + "version": "==0.8.1" }, "markupsafe": { "hashes": [ - "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" + "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", + "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", + "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", + "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", + "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", + "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", + "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", + "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", + "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", + "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", + "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", + "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", + "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", + "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", + "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", + "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", + "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", + "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", + "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", + "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", + "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", + "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", + "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", + "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", + "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", + "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", + "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", + "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" ], - "version": "==1.0" + "version": "==1.1.0" }, "packaging": { "hashes": [ - "sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", - "sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9" + "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af", + "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3" + ], + "version": "==19.0" + }, + "pkginfo": { + "hashes": [ + "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", + "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32" ], - "version": "==18.0" + "version": "==1.5.0.1" }, "pygments": { "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", + "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" ], - "version": "==2.2.0" + "version": "==2.3.1" }, "pyparsing": { "hashes": [ - "sha256:bc6c7146b91af3f567cf6daeaec360bc07d45ffec4cf5353f4d7a208ce7ca30a", - "sha256:d29593d8ebe7b57d6967b62494f8c72b03ac0262b1eed63826c6f788b3606401" + "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", + "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" ], - "version": "==2.2.2" + "version": "==2.3.1" }, "pytz": { "hashes": [ - "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", - "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.5" + "version": "==2018.9" }, "pyyaml": { "hashes": [ @@ -157,19 +198,33 @@ ], "version": "==3.13" }, + "readme-renderer": { + "hashes": [ + "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", + "sha256:c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d" + ], + "version": "==24.0" + }, "requests": { "hashes": [ - "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", - "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" + "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", + "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + ], + "version": "==2.21.0" + }, + "requests-toolbelt": { + "hashes": [ + "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", + "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" ], - "version": "==2.20.0" + "version": "==0.9.1" }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" }, "snowballstemmer": { "hashes": [ @@ -180,11 +235,11 @@ }, "sphinx": { "hashes": [ - "sha256:652eb8c566f18823a022bb4b6dbc868d366df332a11a0226b5bc3a798a479f17", - "sha256:d222626d8356de702431e813a05c68a35967e3d66c6cd1c2c89539bb179a7464" + "sha256:b53904fa7cb4b06a39409a492b949193a1b68cc7241a1a8ce9974f86f0d24287", + "sha256:c1c00fc4f6e8b101a0d037065043460dffc2d507257f2f11acaed71fd2b0c83c" ], "index": "pypi", - "version": "==1.8.1" + "version": "==1.8.4" }, "sphinxcontrib-websupport": { "hashes": [ @@ -193,6 +248,21 @@ ], "version": "==1.1.0" }, + "tqdm": { + "hashes": [ + "sha256:d385c95361699e5cf7622485d9b9eae2d4864b21cd5a2374a9c381ffed701021", + "sha256:e22977e3ebe961f72362f6ddfb9197cc531c9737aaf5f607ef09740c849ecd05" + ], + "version": "==4.31.1" + }, + "twine": { + "hashes": [ + "sha256:0fb0bfa3df4f62076cab5def36b1a71a2e4acb4d1fa5c97475b048117b1a6446", + "sha256:d6c29c933ecfc74e9b1d9fa13aa1f87c5d5770e119f5a4ce032092f0ff5b14dc" + ], + "index": "pypi", + "version": "==1.13.0" + }, "typing": { "hashes": [ "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", @@ -204,10 +274,17 @@ }, "urllib3": { "hashes": [ - "sha256:41c3db2fc01e5b907288010dec72f9d0a74e37d6994e6eb56849f59fea2265ae", - "sha256:8819bba37a02d143296a4d032373c4dd4aca11f6d4c9973335ca75f9c8475f59" + "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", + "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" ], - "version": "==1.24" + "version": "==1.24.1" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" } }, "develop": { @@ -228,17 +305,17 @@ }, "alagitpull": { "hashes": [ - "sha256:ebcb77b0886432abc4f5db4c04b81d77b44ec8c3a44e24f08a427312eeacf920" + "sha256:aacd8904bedfdac5277597759e31db9041d7ef3f11fb0697bc85697d962ff537" ], "index": "pypi", - "version": "==0.0.21" + "version": "==0.0.22" }, "atomicwrites": { "hashes": [ - "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", - "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" ], - "version": "==1.2.1" + "version": "==1.3.0" }, "attrs": { "hashes": [ @@ -256,10 +333,10 @@ }, "certifi": { "hashes": [ - "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", - "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" + "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", + "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" ], - "version": "==2018.10.15" + "version": "==2018.11.29" }, "chardet": { "hashes": [ @@ -278,18 +355,20 @@ }, "colorama": { "hashes": [ - "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", - "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" + "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", + "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48" ], "index": "pypi", - "version": "==0.3.9" + "version": "==0.4.1" }, "configparser": { "hashes": [ - "sha256:5308b47021bc2340965c371f0f058cc6971a04502638d4244225c49d80db273a" + "sha256:5bd5fa2a491dc3cfe920a3f2a107510d65eceae10e9c6e547b90261a4710df32", + "sha256:c114ff90ee2e762db972fa205f02491b1f5cf3ff950decd8542c62970c9bedac", + "sha256:df28e045fbff307a28795b18df6ac8662be3219435560ddb068c283afab1ea7a" ], - "markers": "python_version < '3.2'", - "version": "==3.5.0" + "markers": "python_version == '2.7'", + "version": "==3.7.1" }, "doc8": { "hashes": [ @@ -311,6 +390,13 @@ "editable": true, "path": "." }, + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "version": "==0.3" + }, "enum34": { "hashes": [ "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", @@ -323,11 +409,11 @@ }, "flake8": { "hashes": [ - "sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0", - "sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37" + "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", + "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" ], "index": "pypi", - "version": "==3.5.0" + "version": "==3.7.5" }, "funcsigs": { "hashes": [ @@ -337,6 +423,14 @@ "markers": "python_version < '3.0'", "version": "==1.0.2" }, + "functools32": { + "hashes": [ + "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", + "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d" + ], + "markers": "python_version < '3.2'", + "version": "==3.2.3.post2" + }, "futures": { "hashes": [ "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265", @@ -346,10 +440,10 @@ }, "idna": { "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" ], - "version": "==2.7" + "version": "==2.8" }, "imagesize": { "hashes": [ @@ -376,23 +470,50 @@ }, "kaptan": { "hashes": [ - "sha256:44df200d030975650a3a832c13b48cafdeb1a237b23de181d6a2346107e39da3" + "sha256:8403d6e48200c3f49cb6d6b3dcb5898aa5ab9d820831655bf9a2403e00cd4207" ], "index": "pypi", - "version": "==0.5.10" + "version": "==0.5.11" }, "libtmux": { "hashes": [ - "sha256:2b969b507c26d9db08b85be4808d75774b6418ecf5a0f61956f7a1da44519585" + "sha256:5d4963cc4af53046cabd0997152af05a0a419e4c63af6737389b50f637c3852a" ], "index": "pypi", - "version": "==0.8.0" + "version": "==0.8.1" }, "markupsafe": { "hashes": [ - "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" + "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", + "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", + "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", + "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", + "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", + "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", + "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", + "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", + "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", + "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", + "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", + "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", + "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", + "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", + "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", + "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", + "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", + "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", + "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", + "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", + "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", + "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", + "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", + "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", + "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", + "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", + "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", + "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" ], - "version": "==1.0" + "version": "==1.1.0" }, "mccabe": { "hashes": [ @@ -403,40 +524,41 @@ }, "more-itertools": { "hashes": [ - "sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", - "sha256:c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e", - "sha256:fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d" + "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", + "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", + "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" ], - "version": "==4.3.0" + "markers": "python_version <= '2.7'", + "version": "==5.0.0" }, "packaging": { "hashes": [ - "sha256:0886227f54515e592aaa2e5a553332c73962917f2831f1b0f9b9f4380a4b9807", - "sha256:f95a1e147590f204328170981833854229bb2912ac3d5f89e2a8ccd2834800c9" + "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af", + "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3" ], - "version": "==18.0" + "version": "==19.0" }, "pathlib2": { "hashes": [ - "sha256:8eb170f8d0d61825e09a95b38be068299ddeda82f35e96c3301a8a5e7604cb83", - "sha256:d1aa2a11ba7b8f7b21ab852b1fb5afb277e1bb99d5dfc663380b5015c0d80c5a" + "sha256:25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742", + "sha256:5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7" ], "markers": "python_version < '3.6'", - "version": "==2.3.2" + "version": "==2.3.3" }, "pbr": { "hashes": [ - "sha256:ab94783019179bf48f5784edc63f5bc8328ec5ff93f33591567f266d21ac7323", - "sha256:bfcff1a3878eebf559392c2130a17f612a03f96a0d44c3559d9c1e62a4235a2d" + "sha256:a7953f66e1f82e4b061f43096a4bcc058f7d3d41de9b94ac871770e8bdd831a2", + "sha256:d717573351cfe09f49df61906cd272abaa759b3e91744396b804965ff7bff38b" ], - "version": "==5.0.0" + "version": "==5.1.2" }, "pluggy": { "hashes": [ - "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", - "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" + "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", + "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" ], - "version": "==0.8.0" + "version": "==0.8.1" }, "pockets": { "hashes": [ @@ -454,54 +576,54 @@ }, "pycodestyle": { "hashes": [ - "sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766", - "sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9" + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" ], - "version": "==2.3.1" + "version": "==2.5.0" }, "pyflakes": { "hashes": [ - "sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f", - "sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805" + "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", + "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" ], - "version": "==1.6.0" + "version": "==2.1.0" }, "pygments": { "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", + "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" ], - "version": "==2.2.0" + "version": "==2.3.1" }, "pyparsing": { "hashes": [ - "sha256:bc6c7146b91af3f567cf6daeaec360bc07d45ffec4cf5353f4d7a208ce7ca30a", - "sha256:d29593d8ebe7b57d6967b62494f8c72b03ac0262b1eed63826c6f788b3606401" + "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", + "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" ], - "version": "==2.2.2" + "version": "==2.3.1" }, "pytest": { "hashes": [ - "sha256:10e59f84267370ab20cec9305bafe7505ba4d6b93ecbf66a1cce86193ed511d5", - "sha256:8c827e7d4816dfe13e9329c8226aef8e6e75d65b939bc74fda894143b6d1df59" + "sha256:80cfd9c8b9e93f419abcc0400e9f595974a98e44b6863a77d3e1039961bfc9c4", + "sha256:c2396a15726218a2dfef480861c4ba37bd3952ebaaa5b0fede3fc23fddcd7f8c" ], "index": "pypi", - "version": "==3.9.1" + "version": "==4.2.1" }, "pytest-rerunfailures": { "hashes": [ - "sha256:97216f8a549f74da3cc786236d9093fbd43150a6fbe533ba622cb311f7431774", - "sha256:b6124f66a7a636ab5e0108281563165480a6d66ae84b7cdd8dc9146162a28499" + "sha256:267e10c6aec4230bdee410fcb83901e4b41e4d7f53dff216c7f06c4c0dd6fd3f", + "sha256:978349ae00687504fd0f9d0970c37199ccd89cbdb0cb8c4ed7ee417ede582b40" ], "index": "pypi", - "version": "==4.2" + "version": "==6.0" }, "pytz": { "hashes": [ - "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", - "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.5" + "version": "==2018.9" }, "pyyaml": { "hashes": [ @@ -529,16 +651,16 @@ }, "requests": { "hashes": [ - "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", - "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" + "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", + "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" ], - "version": "==2.20.0" + "version": "==2.21.0" }, "restructuredtext-lint": { "hashes": [ - "sha256:c48ca9a84c312b262809f041fe47dcfaedc9ee4879b3e1f9532f745c182b4037" + "sha256:82880a8de8a41bfc84f533744091b1ead8e2ab9ad6c0a3f60f4750ef6c802350" ], - "version": "==1.1.3" + "version": "==1.2.2" }, "scandir": { "hashes": [ @@ -566,10 +688,10 @@ }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" }, "snowballstemmer": { "hashes": [ @@ -580,11 +702,11 @@ }, "sphinx": { "hashes": [ - "sha256:652eb8c566f18823a022bb4b6dbc868d366df332a11a0226b5bc3a798a479f17", - "sha256:d222626d8356de702431e813a05c68a35967e3d66c6cd1c2c89539bb179a7464" + "sha256:b53904fa7cb4b06a39409a492b949193a1b68cc7241a1a8ce9974f86f0d24287", + "sha256:c1c00fc4f6e8b101a0d037065043460dffc2d507257f2f11acaed71fd2b0c83c" ], "index": "pypi", - "version": "==1.8.1" + "version": "==1.8.4" }, "sphinxcontrib-napoleon": { "hashes": [ @@ -603,10 +725,10 @@ }, "stevedore": { "hashes": [ - "sha256:1e153545aca7a6a49d8337acca4f41c212fbfa60bf864ecd056df0cafb9627e8", - "sha256:c7eac1c0d95824c88b655273da5c17cdde6482b2739f47c30bf851dcc9d3c2c0" + "sha256:b92bc7add1a53fb76c634a178978d113330aaf2006f9498d9e2414b31fbfc104", + "sha256:c58b7c231a9c4890cd3c2b5d2b23bd63fa807ff934d68579e3f6c3a1735e8a7c" ], - "version": "==1.29.0" + "version": "==1.30.0" }, "tmuxp": { "editable": true, @@ -623,18 +745,10 @@ }, "urllib3": { "hashes": [ - "sha256:41c3db2fc01e5b907288010dec72f9d0a74e37d6994e6eb56849f59fea2265ae", - "sha256:8819bba37a02d143296a4d032373c4dd4aca11f6d4c9973335ca75f9c8475f59" + "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", + "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" ], - "version": "==1.24" - }, - "vulture": { - "hashes": [ - "sha256:79c89ef5e3f2365467bcf491f425f777ae8fd157584dcc550d4591920b00fe3f", - "sha256:e794345a19c76f93f48f4519653038df90ad468ddea7912e14b07a07f6412e32" - ], - "index": "pypi", - "version": "==0.29" + "version": "==1.24.1" } } } From 770970c6c4505b39f21dc4182455b156e409f726 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 02:05:34 -0500 Subject: [PATCH 0389/2998] Add twine to dev requirements file. --- requirements/dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/dev.txt b/requirements/dev.txt index 0c8e676fdb..f4075ad2f0 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,2 +1,3 @@ isort>=4.3.4 flake8>=3.5.0 +twine>=1.13.0 \ No newline at end of file From 146d8dcead6c1556ad12ebaafa28540f7a938917 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 02:10:39 -0500 Subject: [PATCH 0390/2998] Add tests/*.sh scripts to MANIFEST.in to include them in Pypi package. --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 678506f955..407717561a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ include README.rst LICENSE CHANGES .tmuxp.yaml include requirements/*.txt recursive-include doc *.rst -recursive-include tests *.py *.yaml *.json +recursive-include tests *.py *.yaml *.json *.sh From 1efff9645bc4012e2c99f27b0b82894034f9a480 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 02:21:40 -0500 Subject: [PATCH 0391/2998] Update CHANGES files with updates within 1.5.1a1. --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 8bb37ab270..fa480e982f 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ Changelog Here you can find the recent changes to tmuxp +- :support:`-` Add tests/*.sh scripts to MANIFEST.in to include them in Pypi package. +- :support:`-` Include twine to dev packages on requirements and Pipfile files. - :release:`1.5.0 <2018-10-02>` - :feature:`-` Support Click 7.0 - :support:`-` Remove unused ``__future__`` imports From c76a61d75b9b5bc3c46da884cde08d20f69848bf Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 02:22:19 -0500 Subject: [PATCH 0392/2998] Bump version to 1.5.1a1. --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8d62efadc3..2e917634cf 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.0' +__version__ = '1.5.1a1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 8e637e31efc9c47b5ca52e3b5cb94161c544e123 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Fri, 15 Feb 2019 03:03:10 -0500 Subject: [PATCH 0393/2998] Commit updated Pipfile.lock. --- Pipfile.lock | 104 +++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index c0427b7132..0b066cd443 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "50d07e5914ff0c0ed6518c45453e8a9a270d71fb86452bca7c617752dcebe916" + "sha256": "afbb995e541eb6d9d317996195fc7d8b33ca342729152caf8ef8d94777ebb871" }, "pipfile-spec": 6, "requires": { @@ -30,13 +30,6 @@ ], "version": "==2.6.0" }, - "bleach": { - "hashes": [ - "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", - "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" - ], - "version": "==3.1.0" - }, "certifi": { "hashes": [ "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", @@ -154,13 +147,6 @@ ], "version": "==19.0" }, - "pkginfo": { - "hashes": [ - "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", - "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32" - ], - "version": "==1.5.0.1" - }, "pygments": { "hashes": [ "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", @@ -198,13 +184,6 @@ ], "version": "==3.13" }, - "readme-renderer": { - "hashes": [ - "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", - "sha256:c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d" - ], - "version": "==24.0" - }, "requests": { "hashes": [ "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", @@ -212,13 +191,6 @@ ], "version": "==2.21.0" }, - "requests-toolbelt": { - "hashes": [ - "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", - "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" - ], - "version": "==0.9.1" - }, "six": { "hashes": [ "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", @@ -248,21 +220,6 @@ ], "version": "==1.1.0" }, - "tqdm": { - "hashes": [ - "sha256:d385c95361699e5cf7622485d9b9eae2d4864b21cd5a2374a9c381ffed701021", - "sha256:e22977e3ebe961f72362f6ddfb9197cc531c9737aaf5f607ef09740c849ecd05" - ], - "version": "==4.31.1" - }, - "twine": { - "hashes": [ - "sha256:0fb0bfa3df4f62076cab5def36b1a71a2e4acb4d1fa5c97475b048117b1a6446", - "sha256:d6c29c933ecfc74e9b1d9fa13aa1f87c5d5770e119f5a4ce032092f0ff5b14dc" - ], - "index": "pypi", - "version": "==1.13.0" - }, "typing": { "hashes": [ "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", @@ -278,13 +235,6 @@ "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" ], "version": "==1.24.1" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" } }, "develop": { @@ -331,6 +281,13 @@ ], "version": "==2.6.0" }, + "bleach": { + "hashes": [ + "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", + "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" + ], + "version": "==3.1.0" + }, "certifi": { "hashes": [ "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", @@ -367,7 +324,7 @@ "sha256:c114ff90ee2e762db972fa205f02491b1f5cf3ff950decd8542c62970c9bedac", "sha256:df28e045fbff307a28795b18df6ac8662be3219435560ddb068c283afab1ea7a" ], - "markers": "python_version == '2.7'", + "markers": "python_version < '3.2'", "version": "==3.7.1" }, "doc8": { @@ -553,6 +510,13 @@ ], "version": "==5.1.2" }, + "pkginfo": { + "hashes": [ + "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", + "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32" + ], + "version": "==1.5.0.1" + }, "pluggy": { "hashes": [ "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", @@ -641,6 +605,13 @@ ], "version": "==3.13" }, + "readme-renderer": { + "hashes": [ + "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", + "sha256:c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d" + ], + "version": "==24.0" + }, "releases": { "hashes": [ "sha256:16cc20a59bd00854a8c6070b5b5eb410b093cd59c69bc8feb0cbaadd4ae8bc23", @@ -656,6 +627,13 @@ ], "version": "==2.21.0" }, + "requests-toolbelt": { + "hashes": [ + "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", + "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" + ], + "version": "==0.9.1" + }, "restructuredtext-lint": { "hashes": [ "sha256:82880a8de8a41bfc84f533744091b1ead8e2ab9ad6c0a3f60f4750ef6c802350" @@ -734,6 +712,21 @@ "editable": true, "path": "." }, + "tqdm": { + "hashes": [ + "sha256:d385c95361699e5cf7622485d9b9eae2d4864b21cd5a2374a9c381ffed701021", + "sha256:e22977e3ebe961f72362f6ddfb9197cc531c9737aaf5f607ef09740c849ecd05" + ], + "version": "==4.31.1" + }, + "twine": { + "hashes": [ + "sha256:0fb0bfa3df4f62076cab5def36b1a71a2e4acb4d1fa5c97475b048117b1a6446", + "sha256:d6c29c933ecfc74e9b1d9fa13aa1f87c5d5770e119f5a4ce032092f0ff5b14dc" + ], + "index": "pypi", + "version": "==1.13.0" + }, "typing": { "hashes": [ "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", @@ -749,6 +742,13 @@ "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" ], "version": "==1.24.1" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" } } } From 2d8d3da7324b219718bd21a0642508a75422f9e9 Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Mon, 18 Feb 2019 01:55:10 -0500 Subject: [PATCH 0394/2998] Tag new release v1.5.1. --- CHANGES | 1 + tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index fa480e982f..741d284c2a 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Changelog Here you can find the recent changes to tmuxp +- :release:`1.5.1 <2019-02-18>` - :support:`-` Add tests/*.sh scripts to MANIFEST.in to include them in Pypi package. - :support:`-` Include twine to dev packages on requirements and Pipfile files. - :release:`1.5.0 <2018-10-02>` diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 2e917634cf..a59dbcf757 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.1a1' +__version__ = '1.5.1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 121c3a153db3db19f08773560bca8c180124d96c Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Tue, 19 Feb 2019 23:42:59 -0500 Subject: [PATCH 0395/2998] Add issue_template.md file. --- .github/issue_template.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/issue_template.md diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000000..3f4273b631 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,35 @@ +### Step 1: Provide a summary of your problem + * For general technical questions, problems or feature requests related to the code **in this repository** file an issue. + +### Step 2: Provide tmuxp details + * Python version + * system PATH + * tmux version + * tmuxp version + * tmux path + * tmuxp path, + * libtmux version + * shell + * output of `tmux list-sessions`, `tmux list-windows`, `tmux list-panes` + * output of `tmux show-options -g`, `tmux show-window-options -g` + * output of `tmuxp freeze ` + +### Step 2: Describe your environment + * Architecture: _____ + * OS version: _____ + +### Step 3: Describe the problem: +#### Steps to reproduce: + 1. _____ + 2. _____ + 3. _____ + +#### Observed Results: + * What happened? This could be a description, log output, etc. + +#### Expected Results: + * What did you expect to happen? + +#### Relevant Code: + ``` + // TODO(you): paste here tmuxp configuration (YAML / JSON) you are having issues with. \ No newline at end of file From f4aa2e26589a4311131898d2e4a85cb1876b5c9b Mon Sep 17 00:00:00 2001 From: Ricardo Oliva Date: Wed, 20 Feb 2019 00:10:37 -0500 Subject: [PATCH 0396/2998] Update issue_template.md --- .github/issue_template.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index 3f4273b631..5368bd0a61 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -14,11 +14,11 @@ * output of `tmux show-options -g`, `tmux show-window-options -g` * output of `tmuxp freeze ` -### Step 2: Describe your environment +### Step 3: Describe your environment * Architecture: _____ * OS version: _____ -### Step 3: Describe the problem: +### Step 4: Describe the problem: #### Steps to reproduce: 1. _____ 2. _____ @@ -32,4 +32,4 @@ #### Relevant Code: ``` - // TODO(you): paste here tmuxp configuration (YAML / JSON) you are having issues with. \ No newline at end of file + // TODO(you): paste here tmuxp configuration (YAML / JSON) you are having issues with. From 0c1038e766b4989278790b662a5b208d0a3b45f1 Mon Sep 17 00:00:00 2001 From: Georgy Komarov Date: Thu, 25 Apr 2019 10:04:33 +0300 Subject: [PATCH 0397/2998] Fix docs --- doc/cli.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/cli.rst b/doc/cli.rst index b3349b875d..9fc5ba7b07 100644 --- a/doc/cli.rst +++ b/doc/cli.rst @@ -10,12 +10,18 @@ Command Line Interface Completion ---------- -In zsh (``~/.zshrc``) or bash (``~/.bashrc``): +In bash (``~/.bashrc``): .. code-block:: sh eval "$(_TMUXP_COMPLETE=source tmuxp)" +In zsh (``~/.zshrc``): + +.. code-block:: sh + + eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" + .. _cli_freeze: Freeze sessions From ebfbb393d5f6ce6ec30710804347bc6e7d90d0d7 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 4 Apr 2019 12:00:51 +0000 Subject: [PATCH 0398/2998] Fix link to author's tmuxp configs --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index adb0fd2993..2af73a5993 100644 --- a/README.rst +++ b/README.rst @@ -107,7 +107,7 @@ Want to learn more about tmux itself? `Read The Tao of Tmux online`_. .. _before_script: http://tmuxp.git-pull.com/en/latest/examples.html#bootstrap-project-before-launch .. _virtualenv: https://virtualenv.git-pull.com/en/latest/ .. _Read The Tao of tmux online: http://tmuxp.git-pull.com/en/latest/about_tmux.html -.. _author's tmuxp configs: https://github.com/tmux-python/tmuxp-config +.. _author's tmuxp configs: https://github.com/tony/tmuxp-config .. _python library: https://tmuxp.git-pull.com/en/latest/api.html .. _python API quickstart: https://tmuxp.git-pull.com/en/latest/quickstart_python.html .. _tmux(1): http://tmux.sourceforge.net/ From 1309e26c6bee2b4685fa3dadd3fc67c0dddf3dfd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 May 2019 15:53:03 -0500 Subject: [PATCH 0399/2998] Remove releases-specific RST --- CHANGES | 923 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 507 insertions(+), 416 deletions(-) diff --git a/CHANGES b/CHANGES index 741d284c2a..557cef1a55 100644 --- a/CHANGES +++ b/CHANGES @@ -4,51 +4,58 @@ Changelog Here you can find the recent changes to tmuxp -- :release:`1.5.1 <2019-02-18>` -- :support:`-` Add tests/*.sh scripts to MANIFEST.in to include them in Pypi package. -- :support:`-` Include twine to dev packages on requirements and Pipfile files. -- :release:`1.5.0 <2018-10-02>` -- :feature:`-` Support Click 7.0 -- :support:`-` Remove unused ``__future__`` imports +1.5.1 <2019-02-18> +------------------ +- Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package. +- Include twine to dev packages on requirements and Pipfile files. + +1.5.0 <2018-10-02> +------------------ +- Support Click 7.0 +- Remove unused ``__future__`` imports - :libtmux:`471` Update libtmux 0.8.0 -> 0.8.1 -- :support:`-` Sort imports -- :support:`-` Add configuration and make command for isort. -- :support:`-` Add sphinxcontrib-napoleon. -- :support:`-` Assure *requirements/dev.txt* dependencies are in *Pipfile* -- :support:`-` Update sphinx, releases to latest version -- :support:`-` Sync *requirements/\*.txt* dependencies with *Pipfile*. -- :support:`-` Update docstring style to use numpy-style documentation. +- Sort imports +- Add configuration and make command for isort. +- Add sphinxcontrib-napoleon. +- Assure *requirements/dev.txt* dependencies are in *Pipfile* +- Update sphinx, releases to latest version +- Sync *requirements/\*.txt* dependencies with *Pipfile*. +- Update docstring style to use numpy-style documentation. This enhances readability and plays nicely with sphinx documentation. -- :support:`-` Documentation overhaul. +- Documentation overhaul. - Areas like :meth:`tmuxp.cli.load_workspace` are now documented verbosely. This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. -- :release:`1.4.2 <2018-09-30>` -- :support:`431 backported` Include tests in source distribution +1.4.2 <2018-09-30> +------------------ +- :issue:`431` Include tests in source distribution -- :release:`1.4.1 <2018-09-26>` -- :support:`-` Loosen click restraint to <7 +1.4.1 <2018-09-26> +------------------ +- Loosen click restraint to <7 -- :release:`1.4.0 <2018-03-11>` -- :support:`-` Bump libtmux to 0.8.0 -- :support:`264` Update license from BSD to MIT -- :support:`348 backported` Continuous integration updates and fixes for Travis CI +1.4.0 <2018-03-11> +------------------ +- Bump libtmux to 0.8.0 +- :issue:`264` Update license from BSD to MIT +- :issue:`348` Continuous integration updates and fixes for Travis CI - Update builds to use trusty - Remove older python 3 versions (before 3.6) - Update pypy versions -- :support:`349 backported` flake8 via continuous integration -- :support:`- backported` Improve reliability of time-sensitive tests by +- :issue:`349` flake8 via continuous integration +- Improve reliability of time-sensitive tests by using ``while True`` with a timeout. -- :support:`- backported` Update sphinx to 1.7.1 -- :support:`- backported` Update alagitpull (sphinx theme) to 0.0.19. +- Update sphinx to 1.7.1 +- Update alagitpull (sphinx theme) to 0.0.19. External websites open in new window. -- :support:`- backported` Update pytest to 3.4.1 +- Update pytest to 3.4.1 -- :release:`1.3.5 <2017-11-10>` -- :feature:`312 backported` Support for tmux 2.6 layout setting (via hooks) in the +1.3.5 <2017-11-10> +------------------ +- :issue:`312` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: - loading outside tmux @@ -57,169 +64,196 @@ Here you can find the recent changes to tmuxp reattaching/switching to after - loading session outside tmux in background with -d, and reattaching/switching after -- :feature:`308 backported` Fix bug where layouts don't correctly set on tmux 2.6 -- :support:`- backported` Upgrade libtmux to 0.7.7 +- :issue:`308` Fix bug where layouts don't correctly set on tmux 2.6 +- Upgrade libtmux to 0.7.7 -- :release:`1.3.4 <2017-10-12>` -- :feature:`- backported` `before_script` now respects `start_directory` +1.3.4 <2017-10-12> +------------------ +- :feature:`ge` `before_script` now respects `start_directory` in the session root. This makes it easier to run things like `pipenv install` as a `before_script`. -- :release:`1.3.3 <2017-10-07>` -- :support:`- backported` Update libtmux to 0.7.5 for tmux 2.6 hotfix +1.3.3 <2017-10-07> +------------------ +- Update libtmux to 0.7.5 for tmux 2.6 hotfix -- :release:`1.3.2 <2017-08-20>` -- :bug:`184` - update libtmux to fix environmental variables in the +1.3.2 <2017-08-20> +------------------ +- :issue:`184` - update libtmux to fix environmental variables in the session scope -- :support:`- backported` Update libtmux to 0.7.4 -- :support:`- backported` Updates to pytest and pytest-rerunfailures +- Update libtmux to 0.7.4 +- Updates to pytest and pytest-rerunfailures -- :release:`1.3.1 <2017-05-29>` -- :bug:`252 backported` Fix bug where loading a session with a name matching a subset +1.3.1 <2017-05-29> +------------------ +- :issue:`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. -- :support:`- backported` Update libtmux to 0.7.3 -- :support:`- backported` Switch theme to alagitpull (alabaster subtheme) -- :support:`- backported` Remove unneeded doc dependency packages +- Update libtmux to 0.7.3 +- Switch theme to alagitpull (alabaster subtheme) +- Remove unneeded doc dependency packages -- :release:`1.3.0 <2017-04-27>` -- :feature:`239` Improve support for formatted options when freezing and +1.3.0 <2017-04-27> +------------------ +- :issue:`239` Improve support for formatted options when freezing and using configs with them. -- :feature:`236` Support for symlinked directories, thanks @rafi. -- :feature:`235` Support for ``options_after``, for setting options like +- :issue:`236` Support for symlinked directories, thanks @rafi. +- :issue:`235` Support for ``options_after``, for setting options like ``synchronize-panes``. Thanks @sebastianst. -- :support:`248` Drop python 2.6 support -- :support:`248` Upgrade libtmux to 0.7.1 -- :support:`-` Upgrade colorama from 0.3.7 to 0.3.9 +- :issue:`248` Drop python 2.6 support +- :issue:`248` Upgrade libtmux to 0.7.1 +- Upgrade colorama from 0.3.7 to 0.3.9 -- :release:`1.2.8 <2017-04-02>` -- :support:`229 backported` More helpful error message on systems missing +1.2.8 <2017-04-02> +------------------ +- :issue:`229` More helpful error message on systems missing tmux. -- :support:`- backported` Update libtmux from 0.6.4 to 0.6.5. +- Update libtmux from 0.6.4 to 0.6.5. -- :release:`1.2.7 <2017-03-25>` -- :support:`- backported` Support for OpenBSD. +1.2.7 <2017-03-25> +------------------ +- Support for OpenBSD. -- :release:`1.2.6 <2017-02-24>` -- :support:`218 backported` Fix pane ordering by running ``select-layout`` before +1.2.6 <2017-02-24> +------------------ +- :issue:`218` Fix pane ordering by running ``select-layout`` before splits. -- :release:`1.2.5 <2017-02-08>` -- :feature:`207 backported` add custom tmuxp config directory via +1.2.5 <2017-02-08> +------------------ +- :issue:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` variable. -- :support:`199 backported` support for running tmuxp on tmux ``master``. -- :support:`- backported` update libtmux from 0.6.2 to 0.6.3. - -- :release:`1.2.4 <2017-01-13>` -- :bug:`198 backported` bump click from 6.6 to 6.7 -- :support:`195 backported` pin packages for colorama and doc requirements - -- :release:`1.2.3 <2016-12-21>` -- :support:`- backported` bump libtmux 0.6.0 to 0.6.1 -- :support:`193 backported` improve suppress history test, courtesy of @abeyer. -- :support:`191 backported` documentation typo from @modille -- :support:`186 backported` documentation typo from @joelwallis - -- :release:`1.2.2 <2016-09-16>` -- :bug:`181` Support tmux 2.3 - -- :release:`1.2.1 <2016-09-16>` -- :bug:`132` Handle cases with invalid session names -- :support:`- backported` update libtmux from 0.5.0 to 0.6.0 - -- :release:`1.2.0 <2016-06-16>` -- :feature:`65` Ability to specify ``options`` and ``global_options`` via +- :issue:`199` support for running tmuxp on tmux ``master``. +- update libtmux from 0.6.2 to 0.6.3. + +1.2.4 <2017-01-13> +------------------ +- :issue:`198` bump click from 6.6 to 6.7 +- :issue:`195` pin packages for colorama and doc requirements + +1.2.3 <2016-12-21> +------------------ +- bump libtmux 0.6.0 to 0.6.1 +- :issue:`193` improve suppress history test, courtesy of @abeyer. +- :issue:`191` documentation typo from @modille +- :issue:`186` documentation typo from @joelwallis + +1.2.2 <2016-09-16> +------------------ +- :issue:`181` Support tmux 2.3 + +1.2.1 <2016-09-16> +------------------ +- :issue:`132` Handle cases with invalid session names +- update libtmux from 0.5.0 to 0.6.0 + +1.2.0 <2016-06-16> +------------------ +- :issue:`65` Ability to specify ``options`` and ``global_options`` via configuration. Also you can specify environment variables via that. Include tests and add example. -- :release:`1.1.1 <2016-06-02>` -- :bug:`167 backported` fix attaching multiple sessions -- :bug:`165 backported` fix typo in error output, thanks @fpietka -- :support:`166 backported` add new docs on zsh/bash completion -- :feature:`- backported` Add back ``tmuxp -V`` for version info - -- :release:`1.1.0 <2016-06-01>` -- :feature:`160` load tmuxp configs by name -- :feature:`134` Use ``click`` for command-line completion, Rewrite command +1.1.1 <2016-06-02> +------------------ +- :issue:`167` fix attaching multiple sessions +- :issue:`165` fix typo in error output, thanks @fpietka +- :issue:`166` add new docs on zsh/bash completion +- :feature:`ge` Add back ``tmuxp -V`` for version info + +1.1.0 <2016-06-01> +------------------ +- :issue:`160` load tmuxp configs by name +- :issue:`134` Use ``click`` for command-line completion, Rewrite command line functionality for importing, config finding, conversion and prompts. -- :support:`-` Remove ``-l`` from ``tmuxp import tmuxinator|teamocil`` -- :bug:`158 major` argparse bug overcome by switch to click - - -- :release:`1.0.2 <2016-05-25>` -- :support:`163 backported` fix issue re-attaching sessions that are already loaded -- :feature:`159 backported` improved support for tmuxinator imports, from @fpietka. -- :support:`161 backported` readme link fixes from @Omeryl. - -- :release:`1.0.1 <2016-05-25>` -- :support:`- backported` switch to readthedocs.io for docs -- :support:`157 backported` bump libtmux to 0.4.1 - -- :release:`1.0.0-rc1 <2016-05-25>` -- :support:`-` version jump 0.11.1 to 1.0 -- :feature:`0 major` tests moved to py.test framework -- :feature:`0 major` `libtmux`_ core split into its own project -- :feature:`145` Add new-window command functionality, @ikirudennis -- :feature:`146` Optionally disable shell history suppression, @kmactavish -- :support:`147` Patching unittest timing for shell history suppression -- :support:`-` move doc building, tests and watcher to Makefile -- :support:`-` update .tmuxp.yaml and .tmuxp.json for Makefile change -- :support:`-` overhaul README - -- :release:`0.11.0 <2016-02-29>` -- :support:`137` Support for environment settings in configs, thanks +- Remove ``-l`` from ``tmuxp import tmuxinator|teamocil`` +- :issue:`158` argparse bug overcome by switch to click + + +1.0.2 <2016-05-25> +------------------ +- :issue:`163` fix issue re-attaching sessions that are already loaded +- :issue:`159` improved support for tmuxinator imports, from @fpietka. +- :issue:`161` readme link fixes from @Omeryl. + +1.0.1 <2016-05-25> +------------------ +- switch to readthedocs.io for docs +- :issue:`157` bump libtmux to 0.4.1 + +1.0.0-rc1 <2016-05-25> +---------------------- +- version jump 0.11.1 to 1.0 +- :issue:`0` tests moved to py.test framework +- :issue:`0` `libtmux`_ core split into its own project +- :issue:`145` Add new-window command functionality, @ikirudennis +- :issue:`146` Optionally disable shell history suppression, @kmactavish +- :issue:`147` Patching unittest timing for shell history suppression +- move doc building, tests and watcher to Makefile +- update .tmuxp.yaml and .tmuxp.json for Makefile change +- overhaul README + +0.11.0 <2016-02-29> +------------------- +- :issue:`137` Support for environment settings in configs, thanks `@tasdomas` -- :support:`-` Spelling correction, thanks `@sehe`_. +- Spelling correction, thanks `@sehe`_. -- :release:`0.10.0 <2016-01-30>` -- :support:`135` Load multiple tmux sessions at once, thanks `@madprog`_. -- :support:`131` :support:`133` README and Documentation fixes +0.10.0 <2016-01-30> +------------------- +- :issue:`135` Load multiple tmux sessions at once, thanks `@madprog`_. +- :issue:`131` :issue:`133` README and Documentation fixes -- :release:`0.9.3 <2016-01-06>` -- :support:`-` switch to ``.venv`` for virtualenv directory to not conflict +0.9.3 <2016-01-06> +------------------ +- switch to ``.venv`` for virtualenv directory to not conflict with ``.env`` (used by `autoenv`_). -- :support:`130` move to `entr(1)`_ for file watching in tests. update docs. +- :issue:`130` move to `entr(1)`_ for file watching in tests. update docs. - [compatibility] Support `Anaconda Python`_ 2 and 3 -- :release:`0.9.2 <2015-10-21>` -- :support:`122` Update to support tmux 2.1, thank you `@estin`_. -- :support:`-` use travis container infrastructure for faster tests -- :support:`-` change test in workspace builder test to use ``top(1)`` instead of +0.9.2 <2015-10-21> +------------------ +- :issue:`122` Update to support tmux 2.1, thank you `@estin`_. +- use travis container infrastructure for faster tests +- change test in workspace builder test to use ``top(1)`` instead of ``man(1)``. ``man(1)`` caused errors on some systems where ``PAGER`` is set. -- :release:`0.9.1 <2015-08-23>` -- :support:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. +0.9.1 <2015-08-23> +------------------ +- :issue:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. See GH issue 119 and `#201564`_ @ FreeBSD Bugzilla. Thanks Ruslan Makhmatkhanov. -- :release:`0.9.0 <2015-07-08>` -- :support:`-` Renamed ``config.expandpath`` to ``config.expandshell``. -- :support:`-` compat 2.7/3.3 wrapper for ``EnvironmentVarGuard`` for +0.9.0 <2015-07-08> +------------------ +- Renamed ``config.expandpath`` to ``config.expandshell``. +- compat 2.7/3.3 wrapper for ``EnvironmentVarGuard`` for testing. -- :feature:`-` You can now use environment variables inside of +- You can now use environment variables inside of ``start_directory``, ``before_script``, ``shell_command_before``, ``session_name`` and ``window_name``. -- :support:`-` [examples]: add example for environmental variables, +- [examples]: add example for environmental variables, ``examples/env-variables.json`` and ``examples/env-variables.yaml``. -- :support:`110` de-vendorize `colorama`_. Thanks `@marbu`_. -- :support:`109` fix failure of test_pane_order on fedora machines from +- :issue:`110` de-vendorize `colorama`_. Thanks `@marbu`_. +- :issue:`109` fix failure of test_pane_order on fedora machines from `@marbu`_ -- :support:`105` append ``.txt`` extension to manuals (repo ony) +- :issue:`105` append ``.txt`` extension to manuals (repo ony) from `@yegortimoshenko`_. -- :support:`107` Fix Server.attached_sessions return type by +- :issue:`107` Fix Server.attached_sessions return type by `@thomasballinger`_. -- :support:`-` update travis to use new tmux git repository. - -- :release:`0.8.1 <2015-05-09>` -- :support:`-` [testing]: fix sniffer test runner in python 3 -- :support:`-` new animated image demo for RTD and README - -- :release:`0.8.0 <2015-05-07>` -- :support:`-` version bump 0.1.13 -> 0.8.0 -- :support:`-` tmux 2.0 support -- :support:`-` Fix documentation for :meth:``Session.switch_client()``. -- :support:`-` Add ``--log-level`` argument. -- :support:`-` Refactor ``{Server,Session,Window,Pane}.tmux`` into: +- update travis to use new tmux git repository. + +0.8.1 <2015-05-09> +------------------ +- [testing]: fix sniffer test runner in python 3 +- new animated image demo for RTD and README + +0.8.0 <2015-05-07> +------------------ +- version bump 0.1.13 -> 0.8.0 +- tmux 2.0 support +- Fix documentation for :meth:``Session.switch_client()``. +- Add ``--log-level`` argument. +- Refactor ``{Server,Session,Window,Pane}.tmux`` into: - :meth:`Server.cmd()` - :meth:`Session.cmd()` @@ -227,31 +261,33 @@ Here you can find the recent changes to tmuxp - :meth:`Pane.cmd()` (See conversation at https://github.com/bitprophet/dotfiles/issues/5) -- :support:`-` Refactor ``util.tmux`` into :meth:`util.tmux_cmd`. +- Refactor ``util.tmux`` into :meth:`util.tmux_cmd`. -- :release:`0.1.13 <2015-03-25>` -- :support:`-` Remove ``package_metadata.py`` in favor of ``__about__.py``. -- :support:`-` ``scent.py`` for building docs -- :support:`-` docutils from 0.11 to 0.12 -- :support:`-` ``bootstrap_env.py`` will check for linux, darwin (OS X) and +0.1.13 <2015-03-25> +------------------- +- Remove ``package_metadata.py`` in favor of ``__about__.py``. +- ``scent.py`` for building docs +- docutils from 0.11 to 0.12 +- ``bootstrap_env.py`` will check for linux, darwin (OS X) and windows and install the correct `sniffer`_ file watcher plugin. -- :support:`-` testsuite for cli uses :py:func:`tempfile.mkdtemp()` instead +- testsuite for cli uses :py:func:`tempfile.mkdtemp()` instead ``TMP_DIR`` (which resolved to ``.tmuxp`` in the testsuite directory. -- :support:`-` replace `watchingtestrunner`_ with `sniffer`_ in examples. +- replace `watchingtestrunner`_ with `sniffer`_ in examples. ``.tmuxp.conf`` and ``.tmux.json`` updated -- :support:`-` updates to doc links -- :support:`-` ``make checkbuild`` for verifying internal / intersphinx doc +- updates to doc links +- ``make checkbuild`` for verifying internal / intersphinx doc references. -- :support:`-` Add Warning tmux versions less than 1.4 from `@techtonik`_. -- :support:`-` Add documentation on leading space in ``send_keys`` +- Add Warning tmux versions less than 1.4 from `@techtonik`_. +- Add documentation on leading space in ``send_keys`` from `@thomasballinger`_. -- :support:`-` Update about page from teamocil and erb support from `@raine`_. +- Update about page from teamocil and erb support from `@raine`_. -- :release:`0.1.12 <2014-08-06>` +0.1.12 <2014-08-06> +------------------- - [config] :meth:`config.expand` now resolves directories in configuration via :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars`. - [config] :meth:`config.expandpath` for helping resolve paths. -- :support:`-` :support:`-` improved support for loading tmuxp project files from +- improved support for loading tmuxp project files from outside current working directory. e.g. .. code-block:: bash @@ -260,169 +296,197 @@ Here you can find the recent changes to tmuxp Will behave better with relative directories. -- :release:`0.1.11 <2014-04-06>` -- :feature:`-` ``before_script`` now loads relative to project directory with +0.1.11 <2014-04-06> +------------------- +- ``before_script`` now loads relative to project directory with ``./``. -- :support:`-` Use ``bootstrap_env.py`` in tmuxp's ``.tmuxp.yaml`` and +- Use ``bootstrap_env.py`` in tmuxp's ``.tmuxp.yaml`` and ``.tmuxp.json`` project files. -- :support:`-` Improvements to :meth:`util.run_before_script()`, +- Improvements to :meth:`util.run_before_script()`, :class:`exc.BeforeLoadScriptFailed` behavior to print ``stdout`` and return ``stderr`` is a non-zero exit is returned. -- :support:`-` ``run_script_before`` has moved to ``util``. -- :support:`-` ``BeforeLoadScriptFailed`` and ``BeforeLoadScriptNotExists`` +- ``run_script_before`` has moved to ``util``. +- ``BeforeLoadScriptFailed`` and ``BeforeLoadScriptNotExists`` has moved to the ``exc`` module. -- :support:`-` Tests for ``run_script_before`` refactored. +- Tests for ``run_script_before`` refactored. -- :release:`0.1.10 <2014-04-02>` +0.1.10 <2014-04-02> +------------------- - 2 bug fixes and allow panes with no shell commands to accept options, thanks for these 3 patches, `@ThiefMaster`_: -- :bug:`73` Fix an error caused by spaces in +- :issue:`73` Fix an error caused by spaces in ``start_directory``. -- :bug:`77` Fix bug where having a ``-`` in a +- :issue:`77` Fix bug where having a ``-`` in a ``shell_command`` would cauesd a build error. -- :bug:`76` Don't require ``shell_command`` to +- :issue:`76` Don't require ``shell_command`` to pass options to panes (like ``focus: true``). -- :release:`0.1.9 <2014-04-01>` +0.1.9 <2014-04-01> +------------------ - The ``--force`` was not with us. -- :release:`0.1.8 <2014-03-30>` -- :support:`72` Create destination directory if it doesn't exist. Thanks +0.1.8 <2014-03-30> +------------------ +- :issue:`72` Create destination directory if it doesn't exist. Thanks `@ThiefMaster`_. -- :support:`-` New context manager for tests, ``temp_session``. -- :support:`-` New testsuite, ``testsuite.test_utils`` for testing testsuite +- New context manager for tests, ``temp_session``. +- New testsuite, ``testsuite.test_utils`` for testing testsuite tools. -- :support:`-` New command, ``before_script``, which is a file to +- New command, ``before_script``, which is a file to be executed with a return code. It can be a bash, perl, python etc. script. -- :support:`56` :ref:`python_api_quickstart ` +- :issue:`56` :ref:`python_api_quickstart ` -- :release:`0.1.7 <2014-02-25>` -- :support:`55` where tmuxp would crash with letter numbers in version. +0.1.7 <2014-02-25> +------------------ +- :issue:`55` where tmuxp would crash with letter numbers in version. Write tests. -- :release:`0.1.6 <2014-02-08>` -- :support:`-` :meth:`Window.split_window()` now allows ``-c +0.1.6 <2014-02-08> +------------------ +- :meth:`Window.split_window()` now allows ``-c start_directory``. -- :support:`35` Builder will now use ``-c start_directory`` to +- :issue:`35` Builder will now use ``-c start_directory`` to create new windows and panes. This removes a hack where ``default-path`` would be set for new pane and window creations. This would bleed into tmux user sessions after creations. -- :release:`0.1.5-1 <2014-02-05>` -- :bug:`49` bug where ``package_manifest.py`` missing +0.1.5-1 <2014-02-05> +-------------------- +- :issue:`49` bug where ``package_manifest.py`` missing from ``MANIFEST.in`` would cause error installing. -- :release:`0.1.5 <2014-02-05>` -- :support:`-` section heading normalization. -- :support:`-` tao of tmux section now treated as a chatper. tao of tmux may be +0.1.5 <2014-02-05> +------------------ +- section heading normalization. +- tao of tmux section now treated as a chatper. tao of tmux may be split off into its own project. -- :support:`-` use conventions from `tony/cookiecutter-pypackage`_. - -- :release:`0.1.4 <2014-02-02>` -- :support:`-` Fix ``$ tmuxp freeze`` CLI output. -- :support:`-` Update ``_compat`` support module. -- :support:`-` Fix extra space in `PEP 263`_. - -- :release:`0.1.3 <2014-01-29>` -- :bug:`48` Fix Python 3 CLI issue. -- :bug:`48` ``$ tmuxp`` without option raises an error. -- :support:`-` - Add space before send-keys to not populate bash and zsh +- use conventions from `tony/cookiecutter-pypackage`_. + +0.1.4 <2014-02-02> +------------------ +- Fix ``$ tmuxp freeze`` CLI output. +- Update ``_compat`` support module. +- Fix extra space in `PEP 263`_. + +0.1.3 <2014-01-29> +------------------ +- :issue:`48` Fix Python 3 CLI issue. +- :issue:`48` ``$ tmuxp`` without option raises an error. +- - Add space before send-keys to not populate bash and zsh history. -- :release:`0.1.2 <2014-01-08>` -- :support:`-` now using werkzeug / flask style testsuites. -- :support:`43` Merge ``tmuxp -d`` for loading in detached mode. +0.1.2 <2014-01-08> +------------------ +- now using werkzeug / flask style testsuites. +- :issue:`43` Merge ``tmuxp -d`` for loading in detached mode. Thanks `roxit`_. -- :release:`0.1.1 <2013-12-25>` -- :bug:`32` Fix bug where special characters caused unicode caused +0.1.1 <2013-12-25> +------------------ +- :issue:`32` Fix bug where special characters caused unicode caused unexpected outcomes loading and freezing sessions. -- :release:`0.1.0 <2013-12-18>` -- :support:`-` fix duplicate print out of filename with using ``tmuxp load .``. +0.1.0 <2013-12-18> +------------------ +- fix duplicate print out of filename with using ``tmuxp load .``. - version to 0.1. No ``--pre`` needed. Future versions will not use rc. -- :release:`0.1-rc8 <2013-12-17>` -- :support:`-` ``unicode_literals`` -- :support:`-` Move py2/py3 compliancy code to ``_compat``. +0.1-rc8 <2013-12-17> +-------------------- +- ``unicode_literals`` +- Move py2/py3 compliancy code to ``_compat``. -- :release:`0.1-rc7 <2013-12-07>` -- :bug:`33` Partial rewrite of :meth:`config.expand`. -- :support:`-` tmuxp will exit silently with ``Ctrl-c``. +0.1-rc7 <2013-12-07> +-------------------- +- :issue:`33` Partial rewrite of :meth:`config.expand`. +- tmuxp will exit silently with ``Ctrl-c``. -- :release:`0.1-rc6 <2013-12-06>` -- :support:`31` [examples] from stratoukos add ``window_index`` option, +0.1-rc6 <2013-12-06> +-------------------- +- :issue:`31` [examples] from stratoukos add ``window_index`` option, and example. -- :release:`0.1-rc5 <2013-12-04>` -- :support:`28` shell_command_before in session scope of config causing +0.1-rc5 <2013-12-04> +-------------------- +- :issue:`28` shell_command_before in session scope of config causing duplication. New test. -- :bug:`26` :bug:`29` for OS X tests. Thanks stratoukos. -- :bug:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't +- :issue:`26` :issue:`29` for OS X tests. Thanks stratoukos. +- :issue:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't exist. -- :release:`0.1-rc4 <2013-12-03>` -- :bug:`-` fix bug were ``focus: true`` would not launch sessions when using +0.1-rc4 <2013-12-03> +-------------------- +- fix bug were ``focus: true`` would not launch sessions when using ``$ tmuxp load`` in a tmux session. -- :release:`0.1-rc3 <2013-12-03>` -- :bug:`25` ``focus: true`` not working in panes. Add +0.1-rc3 <2013-12-03> +-------------------- +- :issue:`25` ``focus: true`` not working in panes. Add tests for focusing panes in config. -- :support:`-` :meth:`Pane.select_pane()`. -- :support:`-` add new example for ``focus: true``. +- :meth:`Pane.select_pane()`. +- add new example for ``focus: true``. -- :release:`0.1-rc2 <2013-11-23>` -- :bug:`23` fix bug where workspace would not build with pane-base-index +0.1-rc2 <2013-11-23> +-------------------- +- :issue:`23` fix bug where workspace would not build with pane-base-index set to 1. Update tests to fix if ``pane-base-index`` is not 0. -- :support:`-` - removed ``$ tmuxp load --list`` functionality. Update +- - removed ``$ tmuxp load --list`` functionality. Update :ref:`quickstart` accordingly. -- :release:`0.1-rc1 <2013-11-23>` -- :support:`-` `pep8`_ and `pep257`_ in unit tests. +0.1-rc1 <2013-11-23> +-------------------- +- `pep8`_ and `pep257`_ in unit tests. - Changelog will now be updated on a version basis, use `pep440`_ versioning. -- :release:`0.1-dev <2013-11-21>` -- :support:`-` :meth:`Session.show_options`, :meth:`Session.show_option` now +0.1-dev <2013-11-21> +-------------------- +- :meth:`Session.show_options`, :meth:`Session.show_option` now accept ``g`` to pass in ``-g``. -- :release:`0.1-dev <2013-11-20>` -- :support:`-` :meth:`Window.show_window_options`, +0.1-dev <2013-11-20> +-------------------- +- :meth:`Window.show_window_options`, :meth:`Window.show_window_option` now accept ``g`` to pass in ``-g``. -- :bug:`15` Behavioral changes in the WorkspaceBuilder to fix pane +- :issue:`15` Behavioral changes in the WorkspaceBuilder to fix pane ordering. -- :bug:`21` Error with unit testing python 2.6 python configuration tests. +- :issue:`21` Error with unit testing python 2.6 python configuration tests. Use :py:mod:`tempfile` instead. -- :support:`-` WorkspaceBuilder tests have been improved to use async better. +- WorkspaceBuilder tests have been improved to use async better. -- :release:`0.1-dev <2013-11-17>` -- :support:`-` fix a bug where missing tmux didn't show correct warning. +0.1-dev <2013-11-17> +-------------------- +- fix a bug where missing tmux didn't show correct warning. -- :release:`0.1-dev <2013-11-15>` -- :support:`-` Travis now tests python 2.6 as requirement and not allowed to +0.1-dev <2013-11-15> +-------------------- +- Travis now tests python 2.6 as requirement and not allowed to fail. -- :release:`0.1-dev <2013-11-13>` -- :support:`19` accept ``-y`` argument to answer yes to questions. -- :support:`-` :meth:`cli.SessionCompleter` no longer allows a duplicate session +0.1-dev <2013-11-13> +-------------------- +- :issue:`19` accept ``-y`` argument to answer yes to questions. +- :meth:`cli.SessionCompleter` no longer allows a duplicate session after one is added. -- :support:`-` ongoing work on :ref:`about_tmux`. +- ongoing work on :ref:`about_tmux`. -- :release:`0.1-dev <2013-11-09>` -- :support:`-` [translation] `documentation in Chinese`_ from `wrongwaycn`_. -- :support:`-` More work done on the :ref:`about_tmux` page. -- :support:`-` :meth:`Pane.split_window()` for splitting :class:`Window` at +0.1-dev <2013-11-09> +-------------------- +- [translation] `documentation in Chinese`_ from `wrongwaycn`_. +- More work done on the :ref:`about_tmux` page. +- :meth:`Pane.split_window()` for splitting :class:`Window` at ``target-pane`` location. -- :release:`0.1-dev <2013-11-08>` -- :support:`-` [freeze] - ``$ tmuxp freeze`` will now freeze a window with a +0.1-dev <2013-11-08> +-------------------- +- [freeze] - ``$ tmuxp freeze`` will now freeze a window with a ``start_directory`` when all panes in a window are inside the same directory. -- :support:`-` [config] :support:`-` :meth:`config.inline` will now turn panes with no +- [config] :meth:`config.inline` will now turn panes with no other attributes and 1 command into a single item value. .. code-block:: yaml @@ -437,174 +501,191 @@ Here you can find the recent changes to tmuxp This will improve ``$ tmuxp freeze`` -- :release:`0.1-dev <2013-11-07>` -- :support:`-` Remove old logger (based on `tornado's log.py`_), replace +0.1-dev <2013-11-07> +-------------------- +- Remove old logger (based on `tornado's log.py`_), replace with new, simpler one. -- :support:`-` fix `teamocil`_ import. -- :feature:`-` support import teamocil ``root`` to +- fix `teamocil`_ import. +- support import teamocil ``root`` to ``start_directory``. -- :release:`0.1-dev <2013-11-06>` -- :support:`-` tagged v0.0.37. Many fixes. Python 2.6 support. Will +0.1-dev <2013-11-06> +-------------------- +- tagged v0.0.37. Many fixes. Python 2.6 support. Will switch to per-version changelog after 0.1 release. -- :feature:`-` support for blank panes (null, ``pane``, ``blank``) and panes +- support for blank panes (null, ``pane``, ``blank``) and panes with empty strings. -- :feature:`-` tmuxp freeze supports exporting to blank panes. -- :feature:`-` tmuxp freeze will now return a blank pane for panes that would +- tmuxp freeze supports exporting to blank panes. +- tmuxp freeze will now return a blank pane for panes that would previously return a duplicate shell command, or generic python, node interpreter. -- :release:`0.1-dev <2013-11-05>` -- :support:`-` Support for ``[-L socket-name]`` and ``[-S socket-path]`` in +0.1-dev <2013-11-05> +-------------------- +- Support for ``[-L socket-name]`` and ``[-S socket-path]`` in autocompletion and when loading. Note, switching client into another socket may cause an error. - Documentation tweaking to :ref:`API`, :ref:`about_tmux`. - `pep257`_, `pep8`_. -- :release:`0.1-dev <2013-11-04>` -- :support:`-` `pep257`_, `pep8`_. +0.1-dev <2013-11-04> +-------------------- +- `pep257`_, `pep8`_. - tagged version ``v0.0.36``. -- :release:`0.1-dev <2013-11-02>` -- :support:`-` Many documentation, `pep257`_, `pep8`_ fixes -- :support:`-` move old :class:`Server` methods ``__list_panes()``, +0.1-dev <2013-11-02> +-------------------- +- Many documentation, `pep257`_, `pep8`_ fixes +- move old :class:`Server` methods ``__list_panes()``, ``__list_windows`` and ``__list_sessions`` into the single underscore. -- :support:`12` fix for ``$ tmuxp freeze`` by @finder. -- :support:`-` Support for spaces in ``$ tmuxp attach-session`` and +- :issue:`12` fix for ``$ tmuxp freeze`` by @finder. +- Support for spaces in ``$ tmuxp attach-session`` and ``$ tmuxp kill-session``, and ``$ tmuxp freeze``. -- [config] :support:`-` support for relative paths of ``start_directory``. Add an +- [config] support for relative paths of ``start_directory``. Add an update config in *Start Directory* on :ref:`examples`. -- :release:`0.1-dev <2013-11-01>` -- :support:`-` New servers for :class:`Server` arguments ``socket_name``, +0.1-dev <2013-11-01> +-------------------- +- New servers for :class:`Server` arguments ``socket_name``, ``socket_path``, ``config_file``. -- :support:`-` :class:`Server` support for ``-2`` with ``colors=256`` and +- :class:`Server` support for ``-2`` with ``colors=256`` and ``colors=8``. -- :support:`-` ``$ tmuxp -2`` for forcing 256 colors and ``tmuxp -8`` for forcing 88. -- [config] :support:`-` Concatenation with ``start_directory`` via +- ``$ tmuxp -2`` for forcing 256 colors and ``tmuxp -8`` for forcing 88. +- [config] Concatenation with ``start_directory`` via :meth:`config.trickle()` if window ``start_directory`` is alphanumeric / relative (doesn't start with ``/``). See :ref:`Examples` in *start directory*. -- :support:`-` Fix bug with import teamocil and tmuxinator -- :support:`-` Improve quality of tmuxinator imports. Especially ``session_name`` +- Fix bug with import teamocil and tmuxinator +- Improve quality of tmuxinator imports. Especially ``session_name`` and ``start_directory``. -- :support:`-` Allow saving with ``~`` in file destination. - -- :release:`0.1-dev <2013-10-31>` -- :support:`-` :meth:`util.is_version()` -- :support:`-` correctly :meth:`config.trickle()` the ``start_directory``. -- :support:`-` get ``start_directory`` working for configs -- :support:`-` fix :meth:``Window.kill_window()`` target to +- Allow saving with ``~`` in file destination. + +0.1-dev <2013-10-31> +-------------------- +- :meth:`util.is_version()` +- correctly :meth:`config.trickle()` the ``start_directory``. +- get ``start_directory`` working for configs +- fix :meth:``Window.kill_window()`` target to ``session_id:window_index`` for compatibility and pass tests. -- :support:`-` [examples]: Example for ``start_directory``. -- :support:`-` fix bug where first and second window would load in mixed order -- :support:`-` :class:`Window.move_window()` for moving window. -- :support:`-` major doc overhaul. front page, renamed orm_al.rst to internals.rst. - -- :release:`0.1-dev <2013-10-30>` -- :support:`-` fix bug where if inside tmux, loading a workspace via switch_client +- [examples]: Example for ``start_directory``. +- fix bug where first and second window would load in mixed order +- :class:`Window.move_window()` for moving window. +- doc overhaul. front page, renamed orm_al.rst to internals.rst. + +0.1-dev <2013-10-30> +-------------------- +- fix bug where if inside tmux, loading a workspace via switch_client wouldn't work. -- :support:`-` fix bug where ``tmuxp load .`` would return an error instead of a +- fix bug where ``tmuxp load .`` would return an error instead of a notice. -- :support:`-` ``tmuxp freeze `` experimental -- :feature:`-` tmuxp now has experimental support for freezing live +- ``tmuxp freeze `` experimental +- tmuxp now has experimental support for freezing live sessions. -- :support:`-` :meth:`Window.kill_window()` -- :support:`-` support for ``start_directory`` (work in progress) +- :meth:`Window.kill_window()` +- support for ``start_directory`` (work in progress) -- :release:`0.1-dev <2013-10-29>` -- :support:`-` :meth:`Window.select_pane` now accepts ``-l``, ``-U``, ``-D``, +0.1-dev <2013-10-29> +-------------------- +- :meth:`Window.select_pane` now accepts ``-l``, ``-U``, ``-D``, ``-L``, ``-R``. -- :support:`-` support for ``automatic-rename`` option. -- :support:`-` 3 new :ref:`examples`, 'main-pane-height', 'automatic-rename', and +- support for ``automatic-rename`` option. +- 3 new :ref:`examples`, 'main-pane-height', 'automatic-rename', and 'shorthands'. -- :support:`-` enhancements to prompts -- :support:`-` ``tmuxp import`` for teamocil and tmuxinator now has a wizard and offers +- enhancements to prompts +- ``tmuxp import`` for teamocil and tmuxinator now has a wizard and offers to save in JSON or YAML format. -- :bug:`-` [b6c2e84] Fix bug where tmuxp load w/ session already loaded would +- [b6c2e84] Fix bug where tmuxp load w/ session already loaded would switch/attach even if no was entered -- :support:`-` when workspace loader crashes, give option to kill session, attach it or +- when workspace loader crashes, give option to kill session, attach it or detach it. -- :support:`-` tmux 1.8 ``set-option`` / ``set-window-options`` command +- tmux 1.8 ``set-option`` / ``set-window-options`` command ``target-window`` fix. -- :support:`-` :class:`WorkspaceBuilder` now has ``.session`` attribute accessible +- :class:`WorkspaceBuilder` now has ``.session`` attribute accessible publicly. -- :support:`-` tmux will now use :meth:`Session.switch_client` and +- tmux will now use :meth:`Session.switch_client` and :meth:`Session.attach_session` to open new sessions instead of ``os.exec``. - [config] tmuxp now allows a new shorter form for panes. Panes can just be a string. See the shorthand form in the :ref:`examples` section. -- :support:`-` [config] support loading ``.yml``. - -- :release:`0.1-dev <2013-10-28>` -- :bug:`-` fix ``tmuxp load .`` fixed -- :bug:`-` fix ``tmuxp convert `` fixed. -- :support:`-` `pep257`_ fixes. -- :support:`-` :class:`Pane` now has :meth:`Pane.set_width` and +- [config] support loading ``.yml``. + +0.1-dev <2013-10-28> +-------------------- +- fix ``tmuxp load .`` fixed +- fix ``tmuxp convert `` fixed. +- `pep257`_ fixes. +- :class:`Pane` now has :meth:`Pane.set_width` and :meth:`Pane.set_height`. -- :support:`-` ``./run_tests.py --tests`` now automatically prepends +- ``./run_tests.py --tests`` now automatically prepends ``tmuxp.testsuite`` to names. -- :support:`-` :meth:`Window.tmux` and :meth:`Pane.tmux` will automatically add +- :meth:`Window.tmux` and :meth:`Pane.tmux` will automatically add their ``{window/pane}_id`` if one isn't specific. -- :release:`0.1-dev <2013-10-27>` -- :support:`-` `argcomplete`_ overhaul for CLI bash completion. -- :support:`-` ``tmuxp load``, ``tmuxp convert`` and ``tmuxp import`` now support +0.1-dev <2013-10-27> +-------------------- +- `argcomplete`_ overhaul for CLI bash completion. +- ``tmuxp load``, ``tmuxp convert`` and ``tmuxp import`` now support relative and full filenames in addition to searching the config directory. -- :release:`0.1-dev <2013-10-26>` -- :support:`-` initial version of `tmuxinator`_ and `teamocil`_ +0.1-dev <2013-10-26> +-------------------- +- initial version of `tmuxinator`_ and `teamocil`_ config importer. it does not support all options and it not guaranteed to fully convert window/pane size and state. -- :support:`-` :meth:`config.in_dir` supports a list of ``extensions`` for +- :meth:`config.in_dir` supports a list of ``extensions`` for filetypes to search, i.e. ``['.yaml', '.json']``. -- :support:`-` :meth:`config.is_config_file` now supports ``extensions`` +- :meth:`config.is_config_file` now supports ``extensions`` argument as a string also. -- :support:`-` fix ``$ tmuxp load -l`` to work correctly alongside +- fix ``$ tmuxp load -l`` to work correctly alongside ``$ tmuxp load filename``. -- :release:`0.1-dev <2013-10-25>` -- :support:`-` fix bug where ``-v`` and ``--version`` wouldn't print version. -- :support:`-` property handle case where no tmux server exists when +0.1-dev <2013-10-25> +-------------------- +- fix bug where ``-v`` and ``--version`` wouldn't print version. +- property handle case where no tmux server exists when ``attach-session`` or ``kill-session`` is used. -- :support:`-` test fixtures and inital work for importing +- test fixtures and inital work for importing `tmuxinator`_ and `teamocil`_ configs -- :release:`0.1-dev <2013-10-24>` -- :support:`-` clean out old code for ``automatic-rename`` option. it will +0.1-dev <2013-10-24> +-------------------- +- clean out old code for ``automatic-rename`` option. it will be reimplemented fresh. -- :support:`-` check for ``oh-my-zsh`` when using ``$SHELL`` ``zsh``. Prompt if +- check for ``oh-my-zsh`` when using ``$SHELL`` ``zsh``. Prompt if ``DISABLE_AUTO_TITLE`` is unset or set to ``true``. -- :support:`-` tmuxp can now ``$ tmuxp convert `` from JSON <=> YAML, back +- tmuxp can now ``$ tmuxp convert `` from JSON <=> YAML, back and forth. -- :support:`-` New examples in JSON. Update the :ref:`examples` page in the +- New examples in JSON. Update the :ref:`examples` page in the docs. - [dev] ``.tmuxp.json`` now exists as a config for tmuxp development and as an example. -- :support:`-` Fix bug where ``tmuxp kill-session`` would give bad output -- :support:`-` Fix bug in tab completion for listing sessions with no tmux server +- Fix bug where ``tmuxp kill-session`` would give bad output +- Fix bug in tab completion for listing sessions with no tmux server is active. -- :release:`0.1-dev <2013-10-23>` -- :support:`-` zsh/bash/tcsh completion improvements for tab-completion options -- :support:`-` tmuxp ``kill-session`` with tab-completion. -- :support:`-` tmuxp ``attach-session`` with tab-completion. Attach session will +0.1-dev <2013-10-23> +-------------------- +- zsh/bash/tcsh completion improvements for tab-completion options +- tmuxp ``kill-session`` with tab-completion. +- tmuxp ``attach-session`` with tab-completion. Attach session will ``switch-client`` for you if you are inside of of a tmux client. -- :support:`-` tmuxp ``load`` for loading configs. -- :support:`-` unit test fixes. +- tmuxp ``load`` for loading configs. +- unit test fixes. -- :release:`0.1-dev <2013-10-21>` -- :support:`-` Make 1.8 the official minimym version, give warning notice to +0.1-dev <2013-10-21> +-------------------- +- Make 1.8 the official minimym version, give warning notice to upgrade tmux if out of date - Fix regression causing unexpected build behavior due to unremoved code supporting old tmux versions. -- :support:`-` Added 2 new examples to the :ref:`examples` page. -- :support:`-` Examples now have graphics -- :support:`-` ``$ tmuxp -v`` will print the version info. +- Added 2 new examples to the :ref:`examples` page. +- Examples now have graphics +- ``$ tmuxp -v`` will print the version info. -- :release:`0.1-dev <2013-10-19>` -- :support:`-` tmuxp will now give warning and sys.exit() with a message if +0.1-dev <2013-10-19> +-------------------- +- tmuxp will now give warning and sys.exit() with a message if ``tmux`` not found in system PATH -- :support:`-` major internal overhaul of :class:`Server`, :class:`Session` +- internal overhaul of :class:`Server`, :class:`Session` , :class:`Window`, and :class:`Pane` continues. - :class:`Server` has @property :meth:`Server.sessions`, which is forward @@ -625,8 +706,9 @@ Here you can find the recent changes to tmuxp @property :meth:`Window._panes` to :meth:`Window._list_panes()` to return a list of dicts without making objects. -- :release:`0.1-dev <2013-10-18>` -- :support:`-` major internal overhaul of :class:`Server`, :class:`Session`, +0.1-dev <2013-10-18> +-------------------- +- internal overhaul of :class:`Server`, :class:`Session`, :class:`Window`, and :class:`Pane`. - ``Session``, ``Window`` and ``Pane`` now refer to a data object @@ -640,46 +722,49 @@ Here you can find the recent changes to tmuxp - ``Server`` object is what does the updating now. - [project] some research into supporting legacy tmux versions. tmux 1.6 and 1.7 support seem likely eventually if there is enough demand. -- :support:`-` python 3 support +- python 3 support -- :release:`0.1-dev <2013-10-17>` -- :support:`-` updated README docs with new project details, screenshots -- :support:`-` - new example ``.tmuxp.yaml`` file updated to include +0.1-dev <2013-10-17> +-------------------- +- updated README docs with new project details, screenshots +- new example ``.tmuxp.yaml`` file updated to include development workflow. Removed nodemon as the tool for checking files for now. -- :support:`-` Support for switching sessions from within tmux. In both cases +- Support for switching sessions from within tmux. In both cases after the the session is built and if session already exists. -- :release:`0.1-dev <2013-10-16>` -- :support:`-` use :meth:`util.which()` from salt.util to find tmux binary. -- :support:`-` add MANIFEST.in, fix issue where package would not +0.1-dev <2013-10-16> +-------------------- +- use :meth:`util.which()` from salt.util to find tmux binary. +- add MANIFEST.in, fix issue where package would not install because missing file -- :support:`-` bash / zsh completion. -- :support:`-` New page on :ref:`internals`. -- :support:`-` Updates to :ref:`about_tmux` page. -- :support:`-` add vim modeline for rst to bottom of this page -- :support:`-` Server is now a subclass of ``util.TmuxObject``. -- :support:`-` subclasses of :class:`util.TmuxRelationalObject`, +- bash / zsh completion. +- New page on :ref:`internals`. +- Updates to :ref:`about_tmux` page. +- add vim modeline for rst to bottom of this page +- Server is now a subclass of ``util.TmuxObject``. +- subclasses of :class:`util.TmuxRelationalObject`, :class:`Server`, :class:`Session`, :class:`Window`, :class:`Pane` now have :meth:`util.TmuxRelationalObject.getById` (similar to `.get()`_ in `backbone.js`_ collection), :meth:`util.TmuxRelationalObject.where` and :meth:`util.TmuxRelationalObject.findWhere` (`.where()`_ and `.findWhere()`_ in `underscore.js`_), to easily find child objects. -- :support:`-` tmux object mapping has been split into +- tmux object mapping has been split into :class:`util.TmuxMappingObject`. The mapping and the relational has been decoupled to allow :class:`Server` to have children while not being a dict-like object. -- :support:`-` :class:`Server`, :class:`Session`, :class:`Window`, +- :class:`Server`, :class:`Session`, :class:`Window`, :class:`Pane` now explicitly mixin subclasses. -- :release:`0.1-dev <2013-10-15>` -- :support:`-` new theme -- :support:`-` initial examples, misc. updates, front page update. -- :support:`-` support for ``$ tmux .`` to load ``.tmuxp.{yaml/json/py}`` in current +0.1-dev <2013-10-15> +-------------------- +- new theme +- initial examples, misc. updates, front page update. +- support for ``$ tmux .`` to load ``.tmuxp.{yaml/json/py}`` in current working directory. -- :support:`-` support for ``socket-name`` (``-L``) and ``socket-path`` +- support for ``socket-name`` (``-L``) and ``socket-path`` (``socket-path``) -- [config] :support:`-` Support for 1-command pane items. +- [config] Support for 1-command pane items. .. code-block:: yaml @@ -689,56 +774,62 @@ Here you can find the recent changes to tmuxp panes: - bash - htop -- :support:`-` If session name is already exists, prompt to attach. - -- :release:`0.1-dev <2013-10-14>` -- :support:`-` can now -l to list configs in current directory and $HOME/.tmuxp -- :support:`-` tmuxp can now launch configs and build sessions -- :support:`-` new exceptions -- :support:`-` :meth:`config.check_consistency()` to verify and diagnose +- If session name is already exists, prompt to attach. + +0.1-dev <2013-10-14> +-------------------- +- can now -l to list configs in current directory and $HOME/.tmuxp +- tmuxp can now launch configs and build sessions +- new exceptions +- :meth:`config.check_consistency()` to verify and diagnose issues with config files. -- :support:`-` :meth:`cli.startup()` -- :support:`-` :meth:`config.is_config_file()` -- :support:`-` :meth:`config.in_dir()` -- :support:`-` :meth:`config.in_cwd()` - -- :release:`0.1-dev <2013-10-13>` -- :support:`-` :meth:`config.inline()` to produce far far better looking +- :meth:`cli.startup()` +- :meth:`config.is_config_file()` +- :meth:`config.in_dir()` +- :meth:`config.in_cwd()` + +0.1-dev <2013-10-13> +-------------------- +- :meth:`config.inline()` to produce far far better looking config exports and tests. - :meth:`Pane.resize_pane()` and tests - documentation fixes and updates -- :support:`-` :meth:`Session.refresh()`, :meth:`Window.refresh()`, +- :meth:`Session.refresh()`, :meth:`Window.refresh()`, :meth:`Pane.refresh()`. -- :support:`-` :meth:`Server.find()`, :meth:`Session.find()`, +- :meth:`Server.find()`, :meth:`Session.find()`, :meth:`Window.find()`. -- :release:`0.1-dev <2013-10-12>` -- :support:`-` Test documentation updates -- :support:`-` Builder is now :class:`WorkspaceBuilder` + tests. +0.1-dev <2013-10-12> +-------------------- +- Test documentation updates +- Builder is now :class:`WorkspaceBuilder` + tests. - WorkspaceBuilder can build panes - WorkspaceBuilder can build windows and set options -- :support:`-` :meth:`Window.show_window_options()`, +- :meth:`Window.show_window_options()`, :meth:`Window.show_window_option()`, :meth:`Window.set_window_option()` -- :support:`-` :meth:`Session.show_options()`, +- :meth:`Session.show_options()`, :meth:`Session.show_option()`, :meth:`Session.set_option()` -- :release:`0.1-dev <2013-10-11>` -- :support:`-` More preparation for builder / session maker utility. -- :support:`-` Major test runner and test suite overhaul. -- :support:`-` Documentation for development environment and test runner updated. -- :support:`-` Travis now tests against tmux 1.8 and latest source. Door open for +0.1-dev <2013-10-11> +-------------------- +- More preparation for builder / session maker utility. +- test runner and test suite overhaul. +- Documentation for development environment and test runner updated. +- Travis now tests against tmux 1.8 and latest source. Door open for future testing against python 3 and earlier tmux versions in the future. -- :support:`-` Quiet logger down in some areas -- :support:`-` __future__ imports for future python 3 compatibility -- :support:`-` setup.py import __version__ via regex from tmuxp package -- :support:`-` move beginnings of cli to ``tmuxp.cli`` - -- :release:`0.1-dev <2013-10-09>` -- :support:`-` New logging module -- :support:`-` Removed dependency logutils -- :support:`-` Removed dependency sh - -- :release:`0.1-dev <2013-10-08>` +- Quiet logger down in some areas +- __future__ imports for future python 3 compatibility +- setup.py import __version__ via regex from tmuxp package +- move beginnings of cli to ``tmuxp.cli`` + +0.1-dev <2013-10-09> +-------------------- +- New logging module +- Removed dependency logutils +- Removed dependency sh + +0.1-dev <2013-10-08> +-------------------- - switch to semver .. _tmuxinator: https://github.com/aziz/tmuxinator From e0e882df0e49e59da61d96acaa1e9acdc02bd231 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 10:11:31 -0500 Subject: [PATCH 0400/2998] Fix releases_document_name --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 84540425aa..e132ffc7bb 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -33,7 +33,7 @@ ] releases_unstable_prehistory = True -releases_document_name = "history" +releases_document_name = ["history"] releases_issue_uri = "https://github.com/tmux-python/tmuxp/issues/%s" releases_release_uri = "https://github.com/tmux-python/tmuxp/tree/v%s" From a4ee24335bf05bfdb1ae87bb388a0275d493e0b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 10:17:38 -0500 Subject: [PATCH 0401/2998] Remove releases for sphinx --- Pipfile | 1 - doc/conf.py | 1 - requirements/doc.txt | 1 - 3 files changed, 3 deletions(-) diff --git a/Pipfile b/Pipfile index 8630229ab5..d020ef44dd 100644 --- a/Pipfile +++ b/Pipfile @@ -6,7 +6,6 @@ name = "pypi" [dev-packages] docutils = "*" alagitpull = "*" -releases = "*" aafigure = "*" sphinxcontrib-napoleon = "*" sphinx = ">=1.8.1" diff --git a/doc/conf.py b/doc/conf.py index e132ffc7bb..5c034a8e78 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -28,7 +28,6 @@ 'sphinxcontrib.napoleon', 'sphinx.ext.linkcode', 'aafig', - 'releases', 'alagitpull', ] diff --git a/requirements/doc.txt b/requirements/doc.txt index caea6072ab..036270a2d3 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,7 +2,6 @@ docutils>=0.14 sphinx>=1.8.1 alagitpull>=0.0.21 -releases>=1.6.1 aafigure>=0.6 sphinxcontrib-napoleon>=0.7 doc8>=0.8.0 From 71368d5bb4dc7c386667389a934b96fc97b5931a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 10:41:00 -0500 Subject: [PATCH 0402/2998] Remove sphinxcontrib-napolean, update packages --- Pipfile | 4 +--- requirements/doc.txt | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Pipfile b/Pipfile index d020ef44dd..a6eb63fc20 100644 --- a/Pipfile +++ b/Pipfile @@ -7,8 +7,7 @@ name = "pypi" docutils = "*" alagitpull = "*" aafigure = "*" -sphinxcontrib-napoleon = "*" -sphinx = ">=1.8.1" +sphinx = "*" isort = "*" "flake8" = "*" pytest = "*" @@ -24,7 +23,6 @@ libtmux = "==0.8.1" click = ">=7<8" colorama = "*" "e1839a8" = {path = ".", editable = true} -sphinx = "*" [requires] python_version = "2.7" diff --git a/requirements/doc.txt b/requirements/doc.txt index 036270a2d3..bee2ec1208 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -3,5 +3,4 @@ docutils>=0.14 sphinx>=1.8.1 alagitpull>=0.0.21 aafigure>=0.6 -sphinxcontrib-napoleon>=0.7 doc8>=0.8.0 From 79a168bfc1fd02836e379fd3a1a3d2efa3904a1f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 10:41:58 -0500 Subject: [PATCH 0403/2998] Update sphinx napoleon package for sphinx 2.0+ --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 5c034a8e78..819e52ef64 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,7 +25,7 @@ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', - 'sphinxcontrib.napoleon', + 'sphinx.ext.napoleon', 'sphinx.ext.linkcode', 'aafig', 'alagitpull', From ff4fcca906c86e736efc93666616c2b5401e6368 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 11:20:41 -0500 Subject: [PATCH 0404/2998] :fire: Remove duplicate dependency from Pipfile --- Pipfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Pipfile b/Pipfile index a6eb63fc20..fbc935e6ee 100644 --- a/Pipfile +++ b/Pipfile @@ -13,7 +13,6 @@ isort = "*" pytest = "*" pytest-rerunfailures = "*" tmuxp = {path = ".", editable = true} -"e1839a8" = {path = ".", editable = true} "doc8" = "*" twine = "*" From b0ab5d5e759cdeeb116aa2451e5bd7ae60d9cfa1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 11:23:31 -0500 Subject: [PATCH 0405/2998] Pipfile: Bump python version to 3 --- Pipfile | 2 +- Pipfile.lock | 559 +++++++++++++++------------------------------------ 2 files changed, 161 insertions(+), 400 deletions(-) diff --git a/Pipfile b/Pipfile index fbc935e6ee..0de42661c9 100644 --- a/Pipfile +++ b/Pipfile @@ -24,4 +24,4 @@ colorama = "*" "e1839a8" = {path = ".", editable = true} [requires] -python_version = "2.7" +python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index 0b066cd443..4abfe243d1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "afbb995e541eb6d9d317996195fc7d8b33ca342729152caf8ef8d94777ebb871" + "sha256": "8533bfc03a59c1ce06a307ba06ed29a4b52f566731773a17535ad604f4fa7f36" }, "pipfile-spec": 6, "requires": { - "python_version": "2.7" + "python_version": "3" }, "sources": [ { @@ -16,34 +16,6 @@ ] }, "default": { - "alabaster": { - "hashes": [ - "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", - "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" - ], - "version": "==0.7.12" - }, - "babel": { - "hashes": [ - "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", - "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" - ], - "version": "==2.6.0" - }, - "certifi": { - "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" - ], - "version": "==2018.11.29" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -60,45 +32,16 @@ "index": "pypi", "version": "==0.4.1" }, - "docutils": { - "hashes": [ - "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", - "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", - "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" - ], - "version": "==0.14" - }, "e1839a8": { "editable": true, "path": "." }, - "idna": { - "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" - ], - "version": "==2.8" - }, - "imagesize": { - "hashes": [ - "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8", - "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5" - ], - "version": "==1.1.0" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" - ], - "version": "==2.10" - }, "kaptan": { "hashes": [ - "sha256:8403d6e48200c3f49cb6d6b3dcb5898aa5ab9d820831655bf9a2403e00cd4207" + "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" ], "index": "pypi", - "version": "==0.5.11" + "version": "==0.5.12" }, "libtmux": { "hashes": [ @@ -107,134 +50,21 @@ "index": "pypi", "version": "==0.8.1" }, - "markupsafe": { - "hashes": [ - "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", - "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", - "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", - "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", - "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", - "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", - "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", - "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", - "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", - "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", - "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", - "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", - "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", - "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", - "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", - "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", - "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", - "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", - "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", - "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", - "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", - "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", - "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", - "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", - "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", - "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", - "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", - "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" - ], - "version": "==1.1.0" - }, - "packaging": { - "hashes": [ - "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af", - "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3" - ], - "version": "==19.0" - }, - "pygments": { - "hashes": [ - "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", - "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" - ], - "version": "==2.3.1" - }, - "pyparsing": { - "hashes": [ - "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", - "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" - ], - "version": "==2.3.1" - }, - "pytz": { - "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" - ], - "version": "==2018.9" - }, "pyyaml": { "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" - ], - "version": "==3.13" - }, - "requests": { - "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" - ], - "version": "==2.21.0" - }, - "six": { - "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" - ], - "version": "==1.12.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128", - "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89" - ], - "version": "==1.2.1" - }, - "sphinx": { - "hashes": [ - "sha256:b53904fa7cb4b06a39409a492b949193a1b68cc7241a1a8ce9974f86f0d24287", - "sha256:c1c00fc4f6e8b101a0d037065043460dffc2d507257f2f11acaed71fd2b0c83c" - ], - "index": "pypi", - "version": "==1.8.4" - }, - "sphinxcontrib-websupport": { - "hashes": [ - "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", - "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" - ], - "version": "==1.1.0" - }, - "typing": { - "hashes": [ - "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", - "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", - "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" - ], - "markers": "python_version < '3.5'", - "version": "==3.6.6" - }, - "urllib3": { - "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" - ], - "version": "==1.24.1" + "sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c", + "sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95", + "sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2", + "sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4", + "sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad", + "sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba", + "sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1", + "sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e", + "sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673", + "sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13", + "sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19" + ], + "version": "==5.1" } }, "develop": { @@ -269,10 +99,10 @@ }, "attrs": { "hashes": [ - "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", - "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", + "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" ], - "version": "==18.2.0" + "version": "==19.1.0" }, "babel": { "hashes": [ @@ -290,10 +120,10 @@ }, "certifi": { "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" ], - "version": "==2018.11.29" + "version": "==2019.3.9" }, "chardet": { "hashes": [ @@ -318,15 +148,6 @@ "index": "pypi", "version": "==0.4.1" }, - "configparser": { - "hashes": [ - "sha256:5bd5fa2a491dc3cfe920a3f2a107510d65eceae10e9c6e547b90261a4710df32", - "sha256:c114ff90ee2e762db972fa205f02491b1f5cf3ff950decd8542c62970c9bedac", - "sha256:df28e045fbff307a28795b18df6ac8662be3219435560ddb068c283afab1ea7a" - ], - "markers": "python_version < '3.2'", - "version": "==3.7.1" - }, "doc8": { "hashes": [ "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", @@ -341,12 +162,9 @@ "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" ], + "index": "pypi", "version": "==0.14" }, - "e1839a8": { - "editable": true, - "path": "." - }, "entrypoints": { "hashes": [ "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", @@ -354,46 +172,13 @@ ], "version": "==0.3" }, - "enum34": { - "hashes": [ - "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", - "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", - "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", - "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1" - ], - "markers": "python_version < '3.4'", - "version": "==1.1.6" - }, "flake8": { "hashes": [ - "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", - "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" ], "index": "pypi", - "version": "==3.7.5" - }, - "funcsigs": { - "hashes": [ - "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", - "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" - ], - "markers": "python_version < '3.0'", - "version": "==1.0.2" - }, - "functools32": { - "hashes": [ - "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", - "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d" - ], - "markers": "python_version < '3.2'", - "version": "==3.2.3.post2" - }, - "futures": { - "hashes": [ - "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265", - "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1" - ], - "version": "==3.2.0" + "version": "==3.7.7" }, "idna": { "hashes": [ @@ -411,26 +196,25 @@ }, "isort": { "hashes": [ - "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", - "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", - "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" + "sha256:1349c6f7c2a0f7539f5f2ace51a9a8e4a37086ce4de6f78f5f53fb041d0a3cd5", + "sha256:f09911f6eb114e5592abe635aded8bf3d2c3144ebcfcaf81ee32e7af7b7d1870" ], "index": "pypi", - "version": "==4.3.4" + "version": "==4.3.18" }, "jinja2": { "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", + "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b" ], - "version": "==2.10" + "version": "==2.10.1" }, "kaptan": { "hashes": [ - "sha256:8403d6e48200c3f49cb6d6b3dcb5898aa5ab9d820831655bf9a2403e00cd4207" + "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" ], "index": "pypi", - "version": "==0.5.11" + "version": "==0.5.12" }, "libtmux": { "hashes": [ @@ -441,36 +225,36 @@ }, "markupsafe": { "hashes": [ - "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", - "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", - "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", - "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", - "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", - "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", - "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", - "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", - "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", - "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", - "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", - "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", - "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", - "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", - "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", - "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", - "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", - "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", - "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", - "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", - "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", - "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", - "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", - "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", - "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", - "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", - "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", - "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" - ], - "version": "==1.1.0" + "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", + "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", + "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", + "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", + "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", + "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", + "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", + "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", + "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", + "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", + "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", + "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", + "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", + "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", + "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", + "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", + "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", + "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", + "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", + "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", + "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", + "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", + "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", + "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + ], + "version": "==1.1.1" }, "mccabe": { "hashes": [ @@ -481,12 +265,11 @@ }, "more-itertools": { "hashes": [ - "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", - "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", - "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" + "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", + "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" ], - "markers": "python_version <= '2.7'", - "version": "==5.0.0" + "markers": "python_version > '2.7'", + "version": "==7.0.0" }, "packaging": { "hashes": [ @@ -495,20 +278,12 @@ ], "version": "==19.0" }, - "pathlib2": { - "hashes": [ - "sha256:25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742", - "sha256:5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7" - ], - "markers": "python_version < '3.6'", - "version": "==2.3.3" - }, "pbr": { "hashes": [ - "sha256:a7953f66e1f82e4b061f43096a4bcc058f7d3d41de9b94ac871770e8bdd831a2", - "sha256:d717573351cfe09f49df61906cd272abaa759b3e91744396b804965ff7bff38b" + "sha256:6901995b9b686cb90cceba67a0f6d4d14ae003cd59bc12beb61549bdfbe3bc89", + "sha256:d950c64aeea5456bbd147468382a5bb77fe692c13c9f00f0219814ce5b642755" ], - "version": "==5.1.2" + "version": "==5.2.0" }, "pkginfo": { "hashes": [ @@ -519,24 +294,17 @@ }, "pluggy": { "hashes": [ - "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", - "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" - ], - "version": "==0.8.1" - }, - "pockets": { - "hashes": [ - "sha256:109eb91588e9cf722de98c98d300e1c5896e877f5704dc61176fa09686ca635b", - "sha256:21a2405543c439ac091453ed187f558cf5294d3f85f15310f214ad4de057e0af" + "sha256:25a1bc1d148c9a640211872b4ff859878d422bccb59c9965e04eed468a0aa180", + "sha256:964cedd2b27c492fbf0b7f58b3284a09cf7f99b0f715941fb24a439b3af1bd1a" ], - "version": "==0.7.2" + "version": "==0.11.0" }, "py": { "hashes": [ - "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", - "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" ], - "version": "==1.7.0" + "version": "==1.8.0" }, "pycodestyle": { "hashes": [ @@ -547,63 +315,63 @@ }, "pyflakes": { "hashes": [ - "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", - "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" ], - "version": "==2.1.0" + "version": "==2.1.1" }, "pygments": { "hashes": [ - "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", - "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" + "sha256:31cba6ffb739f099a85e243eff8cb717089fdd3c7300767d9fc34cb8e1b065f5", + "sha256:5ad302949b3c98dd73f8d9fcdc7e9cb592f120e32a18e23efd7f3dc51194472b" ], - "version": "==2.3.1" + "version": "==2.4.0" }, "pyparsing": { "hashes": [ - "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", - "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" + "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", + "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" ], - "version": "==2.3.1" + "version": "==2.4.0" }, "pytest": { "hashes": [ - "sha256:80cfd9c8b9e93f419abcc0400e9f595974a98e44b6863a77d3e1039961bfc9c4", - "sha256:c2396a15726218a2dfef480861c4ba37bd3952ebaaa5b0fede3fc23fddcd7f8c" + "sha256:1a8aa4fa958f8f451ac5441f3ac130d9fc86ea38780dd2715e6d5c5882700b24", + "sha256:b8bf138592384bd4e87338cb0f256bf5f615398a649d4bd83915f0e4047a5ca6" ], "index": "pypi", - "version": "==4.2.1" + "version": "==4.5.0" }, "pytest-rerunfailures": { "hashes": [ - "sha256:267e10c6aec4230bdee410fcb83901e4b41e4d7f53dff216c7f06c4c0dd6fd3f", - "sha256:978349ae00687504fd0f9d0970c37199ccd89cbdb0cb8c4ed7ee417ede582b40" + "sha256:1180a0f98975e1e1a2e055c87c1159cbd3bace8ceb71b1e7ffe4ace6121e7801", + "sha256:f3c9cf31339bf87b048c09dadb633a81156fa4899527fffc55cde105d04ed5fd" ], "index": "pypi", - "version": "==6.0" + "version": "==7.0" }, "pytz": { "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", + "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" ], - "version": "==2018.9" + "version": "==2019.1" }, "pyyaml": { "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + "sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c", + "sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95", + "sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2", + "sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4", + "sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad", + "sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba", + "sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1", + "sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e", + "sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673", + "sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13", + "sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19" ], - "version": "==3.13" + "version": "==5.1" }, "readme-renderer": { "hashes": [ @@ -612,14 +380,6 @@ ], "version": "==24.0" }, - "releases": { - "hashes": [ - "sha256:16cc20a59bd00854a8c6070b5b5eb410b093cd59c69bc8feb0cbaadd4ae8bc23", - "sha256:7a1b3163ab062d41dc4e61d8f51df055756d146f1fb6e18ee5cf55d91c9cda54" - ], - "index": "pypi", - "version": "==1.6.1" - }, "requests": { "hashes": [ "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", @@ -636,33 +396,9 @@ }, "restructuredtext-lint": { "hashes": [ - "sha256:82880a8de8a41bfc84f533744091b1ead8e2ab9ad6c0a3f60f4750ef6c802350" + "sha256:97b3da356d5b3a8514d8f1f9098febd8b41463bed6a1d9f126cf0a048b6fd908" ], - "version": "==1.2.2" - }, - "scandir": { - "hashes": [ - "sha256:04b8adb105f2ed313a7c2ef0f1cf7aff4871aa7a1883fa4d8c44b5551ab052d6", - "sha256:1444134990356c81d12f30e4b311379acfbbcd03e0bab591de2696a3b126d58e", - "sha256:1b5c314e39f596875e5a95dd81af03730b338c277c54a454226978d5ba95dbb6", - "sha256:346619f72eb0ddc4cf355ceffd225fa52506c92a2ff05318cfabd02a144e7c4e", - "sha256:44975e209c4827fc18a3486f257154d34ec6eaec0f90fef0cca1caa482db7064", - "sha256:61859fd7e40b8c71e609c202db5b0c1dbec0d5c7f1449dec2245575bdc866792", - "sha256:a5e232a0bf188362fa00123cc0bb842d363a292de7126126df5527b6a369586a", - "sha256:c14701409f311e7a9b7ec8e337f0815baf7ac95776cc78b419a1e6d49889a383", - "sha256:c7708f29d843fc2764310732e41f0ce27feadde453261859ec0fca7865dfc41b", - "sha256:c9009c527929f6e25604aec39b0a43c3f831d2947d89d6caaab22f057b7055c8", - "sha256:f5c71e29b4e2af7ccdc03a020c626ede51da471173b4a6ad1e904f2b2e04b4bd" - ], - "markers": "python_version < '3.5'", - "version": "==1.9.0" - }, - "semantic-version": { - "hashes": [ - "sha256:2a4328680073e9b243667b201119772aefc5fc63ae32398d6afafff07c4f54c0", - "sha256:2d06ab7372034bcb8b54f2205370f4aa0643c133b7e6dbd129c5200b83ab394b" - ], - "version": "==2.6.0" + "version": "==1.3.0" }, "six": { "hashes": [ @@ -680,33 +416,60 @@ }, "sphinx": { "hashes": [ - "sha256:b53904fa7cb4b06a39409a492b949193a1b68cc7241a1a8ce9974f86f0d24287", - "sha256:c1c00fc4f6e8b101a0d037065043460dffc2d507257f2f11acaed71fd2b0c83c" + "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", + "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" ], "index": "pypi", - "version": "==1.8.4" + "version": "==2.0.1" }, - "sphinxcontrib-napoleon": { + "sphinxcontrib-applehelp": { "hashes": [ - "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8", - "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef" + "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", + "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" ], - "index": "pypi", - "version": "==0.7" + "version": "==1.0.1" }, - "sphinxcontrib-websupport": { + "sphinxcontrib-devhelp": { "hashes": [ - "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", - "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" + "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", + "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" ], - "version": "==1.1.0" + "version": "==1.0.1" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", + "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", + "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", + "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" + ], + "version": "==1.1.3" }, "stevedore": { "hashes": [ - "sha256:b92bc7add1a53fb76c634a178978d113330aaf2006f9498d9e2414b31fbfc104", - "sha256:c58b7c231a9c4890cd3c2b5d2b23bd63fa807ff934d68579e3f6c3a1735e8a7c" + "sha256:7be098ff53d87f23d798a7ce7ae5c31f094f3deb92ba18059b1aeb1ca9fec0a0", + "sha256:7d1ce610a87d26f53c087da61f06f9b7f7e552efad2a7f6d2322632b5f932ea2" ], - "version": "==1.30.0" + "version": "==1.30.1" }, "tmuxp": { "editable": true, @@ -727,21 +490,19 @@ "index": "pypi", "version": "==1.13.0" }, - "typing": { + "urllib3": { "hashes": [ - "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", - "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", - "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" + "sha256:2393a695cd12afedd0dcb26fe5d50d0cf248e5a66f75dbd89a3d4eb333a61af4", + "sha256:a637e5fae88995b256e3409dc4d52c2e2e0ba32c42a6365fee8bbd2238de3cfb" ], - "markers": "python_version < '3.5'", - "version": "==3.6.6" + "version": "==1.24.3" }, - "urllib3": { + "wcwidth": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" ], - "version": "==1.24.1" + "version": "==0.1.7" }, "webencodings": { "hashes": [ From 90dd41340af2e4d77ca60dc4f1784d6d8915789e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 11:50:02 -0500 Subject: [PATCH 0406/2998] Add sphinx-issues --- Pipfile | 5 +++-- Pipfile.lock | 10 +++++++++- doc/conf.py | 3 +++ requirements/doc.txt | 3 ++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Pipfile b/Pipfile index 0de42661c9..22cb4c0ee9 100644 --- a/Pipfile +++ b/Pipfile @@ -12,16 +12,17 @@ isort = "*" "flake8" = "*" pytest = "*" pytest-rerunfailures = "*" -tmuxp = {path = ".", editable = true} +tmuxp = {path = ".",editable = true} "doc8" = "*" twine = "*" +sphinx-issues = "*" [packages] kaptan = "*" libtmux = "==0.8.1" click = ">=7<8" colorama = "*" -"e1839a8" = {path = ".", editable = true} +e1839a8 = {path = ".",editable = true} [requires] python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index 4abfe243d1..0fa1319b15 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8533bfc03a59c1ce06a307ba06ed29a4b52f566731773a17535ad604f4fa7f36" + "sha256": "57e7d1ec9c3e23d6de17fce655bce0fce063f18110afe155c0d5d34014f05027" }, "pipfile-spec": 6, "requires": { @@ -422,6 +422,14 @@ "index": "pypi", "version": "==2.0.1" }, + "sphinx-issues": { + "hashes": [ + "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22", + "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3" + ], + "index": "pypi", + "version": "==1.2.0" + }, "sphinxcontrib-applehelp": { "hashes": [ "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", diff --git a/doc/conf.py b/doc/conf.py index 819e52ef64..53fc86963a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -29,6 +29,7 @@ 'sphinx.ext.linkcode', 'aafig', 'alagitpull', + 'sphinx_issues', ] releases_unstable_prehistory = True @@ -36,6 +37,8 @@ releases_issue_uri = "https://github.com/tmux-python/tmuxp/issues/%s" releases_release_uri = "https://github.com/tmux-python/tmuxp/tree/v%s" +issues_github_path = about['__github__'] + templates_path = ['_templates'] source_suffix = '.rst' diff --git a/requirements/doc.txt b/requirements/doc.txt index bee2ec1208..8b3a4bd3d9 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,7 @@ -r ./base.txt docutils>=0.14 -sphinx>=1.8.1 +sphinx>=2.0.0 alagitpull>=0.0.21 +sphinx_issues aafigure>=0.6 doc8>=0.8.0 From 92b51eea018f5ec968c477068bd0077e021a3e16 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 12:04:27 -0500 Subject: [PATCH 0407/2998] Update aafig extension for sphinx 2+ --- doc/_ext/aafig.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/_ext/aafig.py b/doc/_ext/aafig.py index 7d49dbb111..ba8cfe3c0b 100644 --- a/doc/_ext/aafig.py +++ b/doc/_ext/aafig.py @@ -20,7 +20,7 @@ from docutils import nodes from docutils.parsers.rst.directives import flag, images, nonnegative_int from sphinx.errors import SphinxError -from sphinx.util import ensuredir, relative_uri +from sphinx.util import ensuredir, relative_uri, logging try: from hashlib import sha1 as sha @@ -34,6 +34,8 @@ aafigure = None +logger = logging.getLogger(__name__) + DEFAULT_FORMATS = dict(html='svg', latex='pdf', text=None) @@ -102,7 +104,7 @@ def render_aafig_images(app, doctree): format_map = app.builder.config.aafig_format merge_dict(format_map, DEFAULT_FORMATS) if aafigure is None: - app.builder.warn( + logger.warn( 'aafigure module not installed, ASCII art images ' 'will be redered as literal text' ) @@ -118,7 +120,7 @@ def render_aafig_images(app, doctree): if format in format_map: options['format'] = format_map[format] else: - app.builder.warn( + logger.warn( 'unsupported builder format "%s", please ' 'add a custom entry in aafig_format config ' 'option for this builder' % format @@ -131,7 +133,7 @@ def render_aafig_images(app, doctree): try: fname, outfn, id, extra = render_aafigure(app, text, options) except AafigError as exc: - app.builder.warn('aafigure error: ' + str(exc)) + logger.warn('aafigure error: ' + str(exc)) img.replace_self(nodes.literal_block(text, text)) continue img['uri'] = fname @@ -162,7 +164,7 @@ def render_aafigure(app, text, options): else: # Non-HTML if app.builder.format != 'latex': - app.builder.warn( + logger.warn( 'aafig: the builder format %s is not officially ' 'supported, aafigure images could not work. ' 'Please report problems and working builder to ' From a03514ebc5ad601045a581365e5bbc1b05ee648e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 12:12:35 -0500 Subject: [PATCH 0408/2998] :heavy_plus_sign: Add pillow to dependencies --- Pipfile | 1 + Pipfile.lock | 176 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 130 insertions(+), 47 deletions(-) diff --git a/Pipfile b/Pipfile index 22cb4c0ee9..e6a08eea18 100644 --- a/Pipfile +++ b/Pipfile @@ -16,6 +16,7 @@ tmuxp = {path = ".",editable = true} "doc8" = "*" twine = "*" sphinx-issues = "*" +pillow = "*" [packages] kaptan = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 0fa1319b15..28afe1493f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "57e7d1ec9c3e23d6de17fce655bce0fce063f18110afe155c0d5d34014f05027" + "sha256": "d14a3b3ff219d75ea3f8f128c01c15458ac31bb87c15af610ab147c3bb664145" }, "pipfile-spec": 6, "requires": { @@ -111,6 +111,14 @@ ], "version": "==2.6.0" }, + "backports.functools-lru-cache": { + "hashes": [ + "sha256:9d98697f088eb1b0fa451391f91afb5e3ebde16bbdb272819fd091151fda4f1a", + "sha256:f0b0e4eba956de51238e17573b7087e852dfe9854afd2e9c873f73fc0ca0a6dd" + ], + "markers": "python_version < '3.2'", + "version": "==1.5" + }, "bleach": { "hashes": [ "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", @@ -148,6 +156,14 @@ "index": "pypi", "version": "==0.4.1" }, + "configparser": { + "hashes": [ + "sha256:8be81d89d6e7b4c0d4e44bcc525845f6da25821de80cb5e06e7e0238a2899e32", + "sha256:da60d0014fd8c55eb48c1c5354352e363e2d30bbf7057e5e171a468390184c75" + ], + "markers": "python_version == '2.7'", + "version": "==3.7.4" + }, "doc8": { "hashes": [ "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", @@ -172,6 +188,16 @@ ], "version": "==0.3" }, + "enum34": { + "hashes": [ + "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", + "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", + "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", + "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1" + ], + "markers": "python_version < '3.4'", + "version": "==1.1.6" + }, "flake8": { "hashes": [ "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", @@ -180,6 +206,30 @@ "index": "pypi", "version": "==3.7.7" }, + "funcsigs": { + "hashes": [ + "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", + "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" + ], + "markers": "python_version < '3.0'", + "version": "==1.0.2" + }, + "functools32": { + "hashes": [ + "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", + "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d" + ], + "markers": "python_version < '3.2'", + "version": "==3.2.3.post2" + }, + "futures": { + "hashes": [ + "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265", + "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1" + ], + "markers": "python_version < '3.2'", + "version": "==3.2.0" + }, "idna": { "hashes": [ "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", @@ -265,11 +315,12 @@ }, "more-itertools": { "hashes": [ - "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", - "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" + "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", + "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", + "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" ], - "markers": "python_version > '2.7'", - "version": "==7.0.0" + "markers": "python_version <= '2.7'", + "version": "==5.0.0" }, "packaging": { "hashes": [ @@ -278,6 +329,14 @@ ], "version": "==19.0" }, + "pathlib2": { + "hashes": [ + "sha256:25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742", + "sha256:5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7" + ], + "markers": "python_version < '3.6'", + "version": "==2.3.3" + }, "pbr": { "hashes": [ "sha256:6901995b9b686cb90cceba67a0f6d4d14ae003cd59bc12beb61549bdfbe3bc89", @@ -285,6 +344,38 @@ ], "version": "==5.2.0" }, + "pillow": { + "hashes": [ + "sha256:15c056bfa284c30a7f265a41ac4cbbc93bdbfc0dfe0613b9cb8a8581b51a9e55", + "sha256:1a4e06ba4f74494ea0c58c24de2bb752818e9d504474ec95b0aa94f6b0a7e479", + "sha256:1c3c707c76be43c9e99cb7e3d5f1bee1c8e5be8b8a2a5eeee665efbf8ddde91a", + "sha256:1fd0b290203e3b0882d9605d807b03c0f47e3440f97824586c173eca0aadd99d", + "sha256:24114e4a6e1870c5a24b1da8f60d0ba77a0b4027907860188ea82bd3508c80eb", + "sha256:258d886a49b6b058cd7abb0ab4b2b85ce78669a857398e83e8b8e28b317b5abb", + "sha256:33c79b6dd6bc7f65079ab9ca5bebffb5f5d1141c689c9c6a7855776d1b09b7e8", + "sha256:367385fc797b2c31564c427430c7a8630db1a00bd040555dfc1d5c52e39fcd72", + "sha256:3c1884ff078fb8bf5f63d7d86921838b82ed4a7d0c027add773c2f38b3168754", + "sha256:44e5240e8f4f8861d748f2a58b3f04daadab5e22bfec896bf5434745f788f33f", + "sha256:46aa988e15f3ea72dddd81afe3839437b755fffddb5e173886f11460be909dce", + "sha256:74d90d499c9c736d52dd6d9b7221af5665b9c04f1767e35f5dd8694324bd4601", + "sha256:809c0a2ce9032cbcd7b5313f71af4bdc5c8c771cb86eb7559afd954cab82ebb5", + "sha256:85d1ef2cdafd5507c4221d201aaf62fc9276f8b0f71bd3933363e62a33abc734", + "sha256:8c3889c7681af77ecfa4431cd42a2885d093ecb811e81fbe5e203abc07e0995b", + "sha256:9218d81b9fca98d2c47d35d688a0cea0c42fd473159dfd5612dcb0483c63e40b", + "sha256:9aa4f3827992288edd37c9df345783a69ef58bd20cc02e64b36e44bcd157bbf1", + "sha256:9d80f44137a70b6f84c750d11019a3419f409c944526a95219bea0ac31f4dd91", + "sha256:b7ebd36128a2fe93991293f997e44be9286503c7530ace6a55b938b20be288d8", + "sha256:c4c78e2c71c257c136cdd43869fd3d5e34fc2162dc22e4a5406b0ebe86958239", + "sha256:c6a842537f887be1fe115d8abb5daa9bc8cc124e455ff995830cc785624a97af", + "sha256:cf0a2e040fdf5a6d95f4c286c6ef1df6b36c218b528c8a9158ec2452a804b9b8", + "sha256:cfd28aad6fc61f7a5d4ee556a997dc6e5555d9381d1390c00ecaf984d57e4232", + "sha256:dca5660e25932771460d4688ccbb515677caaf8595f3f3240ec16c117deff89a", + "sha256:de7aedc85918c2f887886442e50f52c1b93545606317956d65f342bd81cb4fc3", + "sha256:e6c0bbf8e277b74196e3140c35f9a1ae3eafd818f7f2d3a15819c49135d6c062" + ], + "index": "pypi", + "version": "==6.0.0" + }, "pkginfo": { "hashes": [ "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", @@ -400,6 +491,23 @@ ], "version": "==1.3.0" }, + "scandir": { + "hashes": [ + "sha256:2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e", + "sha256:2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022", + "sha256:2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f", + "sha256:2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f", + "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae", + "sha256:67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173", + "sha256:7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4", + "sha256:8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32", + "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188", + "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d", + "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac" + ], + "markers": "python_version < '3.5'", + "version": "==1.10.0" + }, "six": { "hashes": [ "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", @@ -416,11 +524,11 @@ }, "sphinx": { "hashes": [ - "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", - "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" + "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c", + "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08" ], "index": "pypi", - "version": "==2.0.1" + "version": "==1.8.5" }, "sphinx-issues": { "hashes": [ @@ -430,47 +538,12 @@ "index": "pypi", "version": "==1.2.0" }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", - "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" - ], - "version": "==1.0.1" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", - "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" - ], - "version": "==1.0.1" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", - "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", - "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-serializinghtml": { + "sphinxcontrib-websupport": { "hashes": [ - "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", - "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" + "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", + "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" ], - "version": "==1.1.3" + "version": "==1.1.0" }, "stevedore": { "hashes": [ @@ -498,6 +571,15 @@ "index": "pypi", "version": "==1.13.0" }, + "typing": { + "hashes": [ + "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", + "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", + "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" + ], + "markers": "python_version < '3.5'", + "version": "==3.6.6" + }, "urllib3": { "hashes": [ "sha256:2393a695cd12afedd0dcb26fe5d50d0cf248e5a66f75dbd89a3d4eb333a61af4", From e8e1eae2284a9f52b5ff5480949ece9f53243857 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 12:32:39 -0500 Subject: [PATCH 0409/2998] CHANGES: Fix glitch that broke docutils/sphinx-issues docutils 0.14 Sphinx 2.0.1 sphinx-issues 1.2.0 Exception occurred: File "~/.local/share/virtualenvs/tmuxp-UhdS5n5p/lib/python3.7/site-packages/docutils/nodes.py", line 93, in setup_child child.parent = self AttributeError: 'NoneType' object has no attribute 'parent' Source: 1.0.0-rc1 <2016-05-25> ---------------------- - version jump 0.11.1 to 1.0 - :issue:`0` tests moved to py.test framework - :issue:`0` `libtmux`_ core split into its own project .. _libtmux: https://github.com/tmux-python/libtmux --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 557cef1a55..0a1df90efe 100644 --- a/CHANGES +++ b/CHANGES @@ -183,8 +183,8 @@ Here you can find the recent changes to tmuxp 1.0.0-rc1 <2016-05-25> ---------------------- - version jump 0.11.1 to 1.0 -- :issue:`0` tests moved to py.test framework -- :issue:`0` `libtmux`_ core split into its own project +- tests moved to py.test framework +- `libtmux`_ core split into its own project - :issue:`145` Add new-window command functionality, @ikirudennis - :issue:`146` Optionally disable shell history suppression, @kmactavish - :issue:`147` Patching unittest timing for shell history suppression From 65107318cc43345bb64d8c877a8869cd47e79c6a Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Sun, 12 May 2019 15:09:37 -0500 Subject: [PATCH 0410/2998] Pin sphinx_issues to latest version 1.2.0 --- requirements/doc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index 8b3a4bd3d9..e0f7333f71 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -2,6 +2,6 @@ docutils>=0.14 sphinx>=2.0.0 alagitpull>=0.0.21 -sphinx_issues +sphinx_issues==1.2.0 aafigure>=0.6 doc8>=0.8.0 From b1abf6ad4f0da1b4a40777385f038da36bda9fbe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:11:24 -0500 Subject: [PATCH 0411/2998] Clean up duplicate leftover spaces --- CHANGES | 142 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/CHANGES b/CHANGES index 0a1df90efe..0496a7dc23 100644 --- a/CHANGES +++ b/CHANGES @@ -30,7 +30,7 @@ Here you can find the recent changes to tmuxp 1.4.2 <2018-09-30> ------------------ -- :issue:`431` Include tests in source distribution +- :issue:`431` Include tests in source distribution 1.4.1 <2018-09-26> ------------------ @@ -39,13 +39,13 @@ Here you can find the recent changes to tmuxp 1.4.0 <2018-03-11> ------------------ - Bump libtmux to 0.8.0 -- :issue:`264` Update license from BSD to MIT -- :issue:`348` Continuous integration updates and fixes for Travis CI +- :issue:`264` Update license from BSD to MIT +- :issue:`348` Continuous integration updates and fixes for Travis CI - Update builds to use trusty - Remove older python 3 versions (before 3.6) - Update pypy versions -- :issue:`349` flake8 via continuous integration +- :issue:`349` flake8 via continuous integration - Improve reliability of time-sensitive tests by using ``while True`` with a timeout. - Update sphinx to 1.7.1 @@ -55,7 +55,7 @@ Here you can find the recent changes to tmuxp 1.3.5 <2017-11-10> ------------------ -- :issue:`312` Support for tmux 2.6 layout setting (via hooks) in the +- :issue:`312` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: - loading outside tmux @@ -64,7 +64,7 @@ Here you can find the recent changes to tmuxp reattaching/switching to after - loading session outside tmux in background with -d, and reattaching/switching after -- :issue:`308` Fix bug where layouts don't correctly set on tmux 2.6 +- :issue:`308` Fix bug where layouts don't correctly set on tmux 2.6 - Upgrade libtmux to 0.7.7 1.3.4 <2017-10-12> @@ -79,14 +79,14 @@ Here you can find the recent changes to tmuxp 1.3.2 <2017-08-20> ------------------ -- :issue:`184` - update libtmux to fix environmental variables in the +- :issue:`184` - update libtmux to fix environmental variables in the session scope - Update libtmux to 0.7.4 - Updates to pytest and pytest-rerunfailures 1.3.1 <2017-05-29> ------------------ -- :issue:`252` Fix bug where loading a session with a name matching a subset +- :issue:`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. - Update libtmux to 0.7.3 - Switch theme to alagitpull (alabaster subtheme) @@ -94,18 +94,18 @@ Here you can find the recent changes to tmuxp 1.3.0 <2017-04-27> ------------------ -- :issue:`239` Improve support for formatted options when freezing and +- :issue:`239` Improve support for formatted options when freezing and using configs with them. -- :issue:`236` Support for symlinked directories, thanks @rafi. -- :issue:`235` Support for ``options_after``, for setting options like +- :issue:`236` Support for symlinked directories, thanks @rafi. +- :issue:`235` Support for ``options_after``, for setting options like ``synchronize-panes``. Thanks @sebastianst. -- :issue:`248` Drop python 2.6 support -- :issue:`248` Upgrade libtmux to 0.7.1 +- :issue:`248` Drop python 2.6 support +- :issue:`248` Upgrade libtmux to 0.7.1 - Upgrade colorama from 0.3.7 to 0.3.9 1.2.8 <2017-04-02> ------------------ -- :issue:`229` More helpful error message on systems missing +- :issue:`229` More helpful error message on systems missing tmux. - Update libtmux from 0.6.4 to 0.6.5. @@ -115,111 +115,111 @@ Here you can find the recent changes to tmuxp 1.2.6 <2017-02-24> ------------------ -- :issue:`218` Fix pane ordering by running ``select-layout`` before +- :issue:`218` Fix pane ordering by running ``select-layout`` before splits. 1.2.5 <2017-02-08> ------------------ -- :issue:`207` add custom tmuxp config directory via +- :issue:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` variable. -- :issue:`199` support for running tmuxp on tmux ``master``. +- :issue:`199` support for running tmuxp on tmux ``master``. - update libtmux from 0.6.2 to 0.6.3. 1.2.4 <2017-01-13> ------------------ -- :issue:`198` bump click from 6.6 to 6.7 -- :issue:`195` pin packages for colorama and doc requirements +- :issue:`198` bump click from 6.6 to 6.7 +- :issue:`195` pin packages for colorama and doc requirements 1.2.3 <2016-12-21> ------------------ - bump libtmux 0.6.0 to 0.6.1 -- :issue:`193` improve suppress history test, courtesy of @abeyer. -- :issue:`191` documentation typo from @modille -- :issue:`186` documentation typo from @joelwallis +- :issue:`193` improve suppress history test, courtesy of @abeyer. +- :issue:`191` documentation typo from @modille +- :issue:`186` documentation typo from @joelwallis 1.2.2 <2016-09-16> ------------------ -- :issue:`181` Support tmux 2.3 +- :issue:`181` Support tmux 2.3 1.2.1 <2016-09-16> ------------------ -- :issue:`132` Handle cases with invalid session names +- :issue:`132` Handle cases with invalid session names - update libtmux from 0.5.0 to 0.6.0 1.2.0 <2016-06-16> ------------------ -- :issue:`65` Ability to specify ``options`` and ``global_options`` via +- :issue:`65` Ability to specify ``options`` and ``global_options`` via configuration. Also you can specify environment variables via that. Include tests and add example. 1.1.1 <2016-06-02> ------------------ -- :issue:`167` fix attaching multiple sessions -- :issue:`165` fix typo in error output, thanks @fpietka -- :issue:`166` add new docs on zsh/bash completion +- :issue:`167` fix attaching multiple sessions +- :issue:`165` fix typo in error output, thanks @fpietka +- :issue:`166` add new docs on zsh/bash completion - :feature:`ge` Add back ``tmuxp -V`` for version info 1.1.0 <2016-06-01> ------------------ -- :issue:`160` load tmuxp configs by name -- :issue:`134` Use ``click`` for command-line completion, Rewrite command +- :issue:`160` load tmuxp configs by name +- :issue:`134` Use ``click`` for command-line completion, Rewrite command line functionality for importing, config finding, conversion and prompts. - Remove ``-l`` from ``tmuxp import tmuxinator|teamocil`` -- :issue:`158` argparse bug overcome by switch to click +- :issue:`158` argparse bug overcome by switch to click 1.0.2 <2016-05-25> ------------------ -- :issue:`163` fix issue re-attaching sessions that are already loaded -- :issue:`159` improved support for tmuxinator imports, from @fpietka. -- :issue:`161` readme link fixes from @Omeryl. +- :issue:`163` fix issue re-attaching sessions that are already loaded +- :issue:`159` improved support for tmuxinator imports, from @fpietka. +- :issue:`161` readme link fixes from @Omeryl. 1.0.1 <2016-05-25> ------------------ - switch to readthedocs.io for docs -- :issue:`157` bump libtmux to 0.4.1 +- :issue:`157` bump libtmux to 0.4.1 1.0.0-rc1 <2016-05-25> ---------------------- - version jump 0.11.1 to 1.0 - tests moved to py.test framework - `libtmux`_ core split into its own project -- :issue:`145` Add new-window command functionality, @ikirudennis -- :issue:`146` Optionally disable shell history suppression, @kmactavish -- :issue:`147` Patching unittest timing for shell history suppression +- :issue:`145` Add new-window command functionality, @ikirudennis +- :issue:`146` Optionally disable shell history suppression, @kmactavish +- :issue:`147` Patching unittest timing for shell history suppression - move doc building, tests and watcher to Makefile - update .tmuxp.yaml and .tmuxp.json for Makefile change - overhaul README 0.11.0 <2016-02-29> ------------------- -- :issue:`137` Support for environment settings in configs, thanks +- :issue:`137` Support for environment settings in configs, thanks `@tasdomas` - Spelling correction, thanks `@sehe`_. 0.10.0 <2016-01-30> ------------------- -- :issue:`135` Load multiple tmux sessions at once, thanks `@madprog`_. -- :issue:`131` :issue:`133` README and Documentation fixes +- :issue:`135` Load multiple tmux sessions at once, thanks `@madprog`_. +- :issue:`131` :issue:`133` README and Documentation fixes 0.9.3 <2016-01-06> ------------------ - switch to ``.venv`` for virtualenv directory to not conflict with ``.env`` (used by `autoenv`_). -- :issue:`130` move to `entr(1)`_ for file watching in tests. update docs. +- :issue:`130` move to `entr(1)`_ for file watching in tests. update docs. - [compatibility] Support `Anaconda Python`_ 2 and 3 0.9.2 <2015-10-21> ------------------ -- :issue:`122` Update to support tmux 2.1, thank you `@estin`_. +- :issue:`122` Update to support tmux 2.1, thank you `@estin`_. - use travis container infrastructure for faster tests - change test in workspace builder test to use ``top(1)`` instead of ``man(1)``. ``man(1)`` caused errors on some systems where ``PAGER`` is set. 0.9.1 <2015-08-23> ------------------ -- :issue:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. +- :issue:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. See GH issue 119 and `#201564`_ @ FreeBSD Bugzilla. Thanks Ruslan Makhmatkhanov. @@ -233,12 +233,12 @@ Here you can find the recent changes to tmuxp ``session_name`` and ``window_name``. - [examples]: add example for environmental variables, ``examples/env-variables.json`` and ``examples/env-variables.yaml``. -- :issue:`110` de-vendorize `colorama`_. Thanks `@marbu`_. -- :issue:`109` fix failure of test_pane_order on fedora machines from +- :issue:`110` de-vendorize `colorama`_. Thanks `@marbu`_. +- :issue:`109` fix failure of test_pane_order on fedora machines from `@marbu`_ -- :issue:`105` append ``.txt`` extension to manuals (repo ony) +- :issue:`105` append ``.txt`` extension to manuals (repo ony) from `@yegortimoshenko`_. -- :issue:`107` Fix Server.attached_sessions return type by +- :issue:`107` Fix Server.attached_sessions return type by `@thomasballinger`_. - update travis to use new tmux git repository. @@ -314,11 +314,11 @@ Here you can find the recent changes to tmuxp ------------------- - 2 bug fixes and allow panes with no shell commands to accept options, thanks for these 3 patches, `@ThiefMaster`_: -- :issue:`73` Fix an error caused by spaces in +- :issue:`73` Fix an error caused by spaces in ``start_directory``. -- :issue:`77` Fix bug where having a ``-`` in a +- :issue:`77` Fix bug where having a ``-`` in a ``shell_command`` would cauesd a build error. -- :issue:`76` Don't require ``shell_command`` to +- :issue:`76` Don't require ``shell_command`` to pass options to panes (like ``focus: true``). 0.1.9 <2014-04-01> @@ -327,7 +327,7 @@ Here you can find the recent changes to tmuxp 0.1.8 <2014-03-30> ------------------ -- :issue:`72` Create destination directory if it doesn't exist. Thanks +- :issue:`72` Create destination directory if it doesn't exist. Thanks `@ThiefMaster`_. - New context manager for tests, ``temp_session``. - New testsuite, ``testsuite.test_utils`` for testing testsuite @@ -335,18 +335,18 @@ Here you can find the recent changes to tmuxp - New command, ``before_script``, which is a file to be executed with a return code. It can be a bash, perl, python etc. script. -- :issue:`56` :ref:`python_api_quickstart ` +- :issue:`56` :ref:`python_api_quickstart ` 0.1.7 <2014-02-25> ------------------ -- :issue:`55` where tmuxp would crash with letter numbers in version. +- :issue:`55` where tmuxp would crash with letter numbers in version. Write tests. 0.1.6 <2014-02-08> ------------------ - :meth:`Window.split_window()` now allows ``-c start_directory``. -- :issue:`35` Builder will now use ``-c start_directory`` to +- :issue:`35` Builder will now use ``-c start_directory`` to create new windows and panes. This removes a hack where ``default-path`` would be set for new pane and @@ -355,7 +355,7 @@ Here you can find the recent changes to tmuxp 0.1.5-1 <2014-02-05> -------------------- -- :issue:`49` bug where ``package_manifest.py`` missing +- :issue:`49` bug where ``package_manifest.py`` missing from ``MANIFEST.in`` would cause error installing. 0.1.5 <2014-02-05> @@ -373,20 +373,20 @@ Here you can find the recent changes to tmuxp 0.1.3 <2014-01-29> ------------------ -- :issue:`48` Fix Python 3 CLI issue. -- :issue:`48` ``$ tmuxp`` without option raises an error. +- :issue:`48` Fix Python 3 CLI issue. +- :issue:`48` ``$ tmuxp`` without option raises an error. - - Add space before send-keys to not populate bash and zsh history. 0.1.2 <2014-01-08> ------------------ - now using werkzeug / flask style testsuites. -- :issue:`43` Merge ``tmuxp -d`` for loading in detached mode. +- :issue:`43` Merge ``tmuxp -d`` for loading in detached mode. Thanks `roxit`_. 0.1.1 <2013-12-25> ------------------ -- :issue:`32` Fix bug where special characters caused unicode caused +- :issue:`32` Fix bug where special characters caused unicode caused unexpected outcomes loading and freezing sessions. 0.1.0 <2013-12-18> @@ -401,20 +401,20 @@ Here you can find the recent changes to tmuxp 0.1-rc7 <2013-12-07> -------------------- -- :issue:`33` Partial rewrite of :meth:`config.expand`. +- :issue:`33` Partial rewrite of :meth:`config.expand`. - tmuxp will exit silently with ``Ctrl-c``. 0.1-rc6 <2013-12-06> -------------------- -- :issue:`31` [examples] from stratoukos add ``window_index`` option, +- :issue:`31` [examples] from stratoukos add ``window_index`` option, and example. 0.1-rc5 <2013-12-04> -------------------- -- :issue:`28` shell_command_before in session scope of config causing +- :issue:`28` shell_command_before in session scope of config causing duplication. New test. -- :issue:`26` :issue:`29` for OS X tests. Thanks stratoukos. -- :issue:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't +- :issue:`26` :issue:`29` for OS X tests. Thanks stratoukos. +- :issue:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't exist. 0.1-rc4 <2013-12-03> @@ -424,14 +424,14 @@ Here you can find the recent changes to tmuxp 0.1-rc3 <2013-12-03> -------------------- -- :issue:`25` ``focus: true`` not working in panes. Add +- :issue:`25` ``focus: true`` not working in panes. Add tests for focusing panes in config. - :meth:`Pane.select_pane()`. - add new example for ``focus: true``. 0.1-rc2 <2013-11-23> -------------------- -- :issue:`23` fix bug where workspace would not build with pane-base-index +- :issue:`23` fix bug where workspace would not build with pane-base-index set to 1. Update tests to fix if ``pane-base-index`` is not 0. - - removed ``$ tmuxp load --list`` functionality. Update :ref:`quickstart` accordingly. @@ -451,9 +451,9 @@ Here you can find the recent changes to tmuxp -------------------- - :meth:`Window.show_window_options`, :meth:`Window.show_window_option` now accept ``g`` to pass in ``-g``. -- :issue:`15` Behavioral changes in the WorkspaceBuilder to fix pane +- :issue:`15` Behavioral changes in the WorkspaceBuilder to fix pane ordering. -- :issue:`21` Error with unit testing python 2.6 python configuration tests. +- :issue:`21` Error with unit testing python 2.6 python configuration tests. Use :py:mod:`tempfile` instead. - WorkspaceBuilder tests have been improved to use async better. @@ -469,7 +469,7 @@ Here you can find the recent changes to tmuxp 0.1-dev <2013-11-13> -------------------- -- :issue:`19` accept ``-y`` argument to answer yes to questions. +- :issue:`19` accept ``-y`` argument to answer yes to questions. - :meth:`cli.SessionCompleter` no longer allows a duplicate session after one is added. - ongoing work on :ref:`about_tmux`. @@ -538,7 +538,7 @@ Here you can find the recent changes to tmuxp - Many documentation, `pep257`_, `pep8`_ fixes - move old :class:`Server` methods ``__list_panes()``, ``__list_windows`` and ``__list_sessions`` into the single underscore. -- :issue:`12` fix for ``$ tmuxp freeze`` by @finder. +- :issue:`12` fix for ``$ tmuxp freeze`` by @finder. - Support for spaces in ``$ tmuxp attach-session`` and ``$ tmuxp kill-session``, and ``$ tmuxp freeze``. - [config] support for relative paths of ``start_directory``. Add an From a6dfc31768876e9ec617737dc86dfc3b93b280a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:16:59 -0500 Subject: [PATCH 0412/2998] rST styling change --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 0496a7dc23..1499e3baf2 100644 --- a/CHANGES +++ b/CHANGES @@ -375,7 +375,7 @@ Here you can find the recent changes to tmuxp ------------------ - :issue:`48` Fix Python 3 CLI issue. - :issue:`48` ``$ tmuxp`` without option raises an error. -- - Add space before send-keys to not populate bash and zsh +- Add space before send-keys to not populate bash and zsh history. 0.1.2 <2014-01-08> @@ -433,7 +433,7 @@ Here you can find the recent changes to tmuxp -------------------- - :issue:`23` fix bug where workspace would not build with pane-base-index set to 1. Update tests to fix if ``pane-base-index`` is not 0. -- - removed ``$ tmuxp load --list`` functionality. Update +- removed ``$ tmuxp load --list`` functionality. Update :ref:`quickstart` accordingly. 0.1-rc1 <2013-11-23> From c64fc6bb41aa7581db9fbd03396bbeb0f290a846 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:20:48 -0500 Subject: [PATCH 0413/2998] More changelog fixes --- CHANGES | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 1499e3baf2..f4c9b716f8 100644 --- a/CHANGES +++ b/CHANGES @@ -13,7 +13,7 @@ Here you can find the recent changes to tmuxp ------------------ - Support Click 7.0 - Remove unused ``__future__`` imports -- :libtmux:`471` Update libtmux 0.8.0 -> 0.8.1 +- :issue:`471` Update libtmux 0.8.0 -> 0.8.1 - Sort imports - Add configuration and make command for isort. - Add sphinxcontrib-napoleon. @@ -69,7 +69,7 @@ Here you can find the recent changes to tmuxp 1.3.4 <2017-10-12> ------------------ -- :feature:`ge` `before_script` now respects `start_directory` +- `before_script` now respects `start_directory` in the session root. This makes it easier to run things like `pipenv install` as a `before_script`. @@ -158,7 +158,7 @@ Here you can find the recent changes to tmuxp - :issue:`167` fix attaching multiple sessions - :issue:`165` fix typo in error output, thanks @fpietka - :issue:`166` add new docs on zsh/bash completion -- :feature:`ge` Add back ``tmuxp -V`` for version info +- Add back ``tmuxp -V`` for version info 1.1.0 <2016-06-01> ------------------ From eb8d21292d42c46bf1c26b1bc92dd48fd9a28c7f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:30:22 -0500 Subject: [PATCH 0414/2998] Fix issue URLs --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 53fc86963a..04b6c3c059 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -37,7 +37,7 @@ releases_issue_uri = "https://github.com/tmux-python/tmuxp/issues/%s" releases_release_uri = "https://github.com/tmux-python/tmuxp/tree/v%s" -issues_github_path = about['__github__'] +issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] From 8e98400c406c701519e6e003da6a99d14bf8df2b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:44:06 -0500 Subject: [PATCH 0415/2998] :heavy_plus_sign: Add black to Pipfile --- Pipfile | 1 + Pipfile.lock | 160 +++++++++++++++++++++------------------------------ 2 files changed, 67 insertions(+), 94 deletions(-) diff --git a/Pipfile b/Pipfile index e6a08eea18..b7dd9f2495 100644 --- a/Pipfile +++ b/Pipfile @@ -17,6 +17,7 @@ tmuxp = {path = ".",editable = true} twine = "*" sphinx-issues = "*" pillow = "*" +black = "==19.3.0b" [packages] kaptan = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 28afe1493f..fbf2ef5cb6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d14a3b3ff219d75ea3f8f128c01c15458ac31bb87c15af610ab147c3bb664145" + "sha256": "64f1622343f676c24752c2070289e1e198f7de188a806c90df8c1f5345d5d672" }, "pipfile-spec": 6, "requires": { @@ -90,6 +90,13 @@ "index": "pypi", "version": "==0.0.22" }, + "appdirs": { + "hashes": [ + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + ], + "version": "==1.4.3" + }, "atomicwrites": { "hashes": [ "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", @@ -111,13 +118,13 @@ ], "version": "==2.6.0" }, - "backports.functools-lru-cache": { + "black": { "hashes": [ - "sha256:9d98697f088eb1b0fa451391f91afb5e3ebde16bbdb272819fd091151fda4f1a", - "sha256:f0b0e4eba956de51238e17573b7087e852dfe9854afd2e9c873f73fc0ca0a6dd" + "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf", + "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c" ], - "markers": "python_version < '3.2'", - "version": "==1.5" + "index": "pypi", + "version": "==19.3.0b0" }, "bleach": { "hashes": [ @@ -156,14 +163,6 @@ "index": "pypi", "version": "==0.4.1" }, - "configparser": { - "hashes": [ - "sha256:8be81d89d6e7b4c0d4e44bcc525845f6da25821de80cb5e06e7e0238a2899e32", - "sha256:da60d0014fd8c55eb48c1c5354352e363e2d30bbf7057e5e171a468390184c75" - ], - "markers": "python_version == '2.7'", - "version": "==3.7.4" - }, "doc8": { "hashes": [ "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", @@ -188,16 +187,6 @@ ], "version": "==0.3" }, - "enum34": { - "hashes": [ - "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850", - "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a", - "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79", - "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1" - ], - "markers": "python_version < '3.4'", - "version": "==1.1.6" - }, "flake8": { "hashes": [ "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", @@ -206,30 +195,6 @@ "index": "pypi", "version": "==3.7.7" }, - "funcsigs": { - "hashes": [ - "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", - "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" - ], - "markers": "python_version < '3.0'", - "version": "==1.0.2" - }, - "functools32": { - "hashes": [ - "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0", - "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d" - ], - "markers": "python_version < '3.2'", - "version": "==3.2.3.post2" - }, - "futures": { - "hashes": [ - "sha256:9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265", - "sha256:ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1" - ], - "markers": "python_version < '3.2'", - "version": "==3.2.0" - }, "idna": { "hashes": [ "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", @@ -315,12 +280,11 @@ }, "more-itertools": { "hashes": [ - "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", - "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", - "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" + "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", + "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" ], - "markers": "python_version <= '2.7'", - "version": "==5.0.0" + "markers": "python_version > '2.7'", + "version": "==7.0.0" }, "packaging": { "hashes": [ @@ -329,14 +293,6 @@ ], "version": "==19.0" }, - "pathlib2": { - "hashes": [ - "sha256:25199318e8cc3c25dcb45cbe084cc061051336d5a9ea2a12448d3d8cb748f742", - "sha256:5887121d7f7df3603bca2f710e7219f3eca0eb69e0b7cc6e0a022e155ac931a7" - ], - "markers": "python_version < '3.6'", - "version": "==2.3.3" - }, "pbr": { "hashes": [ "sha256:6901995b9b686cb90cceba67a0f6d4d14ae003cd59bc12beb61549bdfbe3bc89", @@ -491,23 +447,6 @@ ], "version": "==1.3.0" }, - "scandir": { - "hashes": [ - "sha256:2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e", - "sha256:2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022", - "sha256:2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f", - "sha256:2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f", - "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae", - "sha256:67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173", - "sha256:7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4", - "sha256:8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32", - "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188", - "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d", - "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac" - ], - "markers": "python_version < '3.5'", - "version": "==1.10.0" - }, "six": { "hashes": [ "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", @@ -524,11 +463,11 @@ }, "sphinx": { "hashes": [ - "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c", - "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08" + "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", + "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" ], "index": "pypi", - "version": "==1.8.5" + "version": "==2.0.1" }, "sphinx-issues": { "hashes": [ @@ -538,12 +477,47 @@ "index": "pypi", "version": "==1.2.0" }, - "sphinxcontrib-websupport": { + "sphinxcontrib-applehelp": { "hashes": [ - "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", - "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" + "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", + "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" ], - "version": "==1.1.0" + "version": "==1.0.1" + }, + "sphinxcontrib-devhelp": { + "hashes": [ + "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", + "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" + ], + "version": "==1.0.1" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", + "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", + "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", + "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" + ], + "version": "==1.1.3" }, "stevedore": { "hashes": [ @@ -556,6 +530,13 @@ "editable": true, "path": "." }, + "toml": { + "hashes": [ + "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", + "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + ], + "version": "==0.10.0" + }, "tqdm": { "hashes": [ "sha256:d385c95361699e5cf7622485d9b9eae2d4864b21cd5a2374a9c381ffed701021", @@ -571,15 +552,6 @@ "index": "pypi", "version": "==1.13.0" }, - "typing": { - "hashes": [ - "sha256:4027c5f6127a6267a435201981ba156de91ad0d1d98e9ddc2aa173453453492d", - "sha256:57dcf675a99b74d64dacf6fba08fb17cf7e3d5fdff53d4a30ea2a5e7e52543d4", - "sha256:a4c8473ce11a65999c8f59cb093e70686b6c84c98df58c1dae9b3b196089858a" - ], - "markers": "python_version < '3.5'", - "version": "==3.6.6" - }, "urllib3": { "hashes": [ "sha256:2393a695cd12afedd0dcb26fe5d50d0cf248e5a66f75dbd89a3d4eb333a61af4", From db7b9d4949b7ca98e9f7c0ce8de111a99f0ecf06 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 May 2019 15:44:17 -0500 Subject: [PATCH 0416/2998] :art: Run through black + isort Command: make black isort --- doc/_ext/aafig.py | 2 +- doc/conf.py | 2 +- tests/conftest.py | 2 +- tests/test_workspacefreezer.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/_ext/aafig.py b/doc/_ext/aafig.py index ba8cfe3c0b..8cb1a35ba8 100644 --- a/doc/_ext/aafig.py +++ b/doc/_ext/aafig.py @@ -20,7 +20,7 @@ from docutils import nodes from docutils.parsers.rst.directives import flag, images, nonnegative_int from sphinx.errors import SphinxError -from sphinx.util import ensuredir, relative_uri, logging +from sphinx.util import ensuredir, logging, relative_uri try: from hashlib import sha1 as sha diff --git a/doc/conf.py b/doc/conf.py index 04b6c3c059..2f8a77879a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -126,7 +126,7 @@ # aafig format, try to get working with pdf aafig_format = dict(latex='pdf', html='gif') -aafig_default_options = dict(scale=.75, aspect=0.5, proportional=True) +aafig_default_options = dict(scale=0.75, aspect=0.5, proportional=True) def linkcode_resolve(domain, info): # NOQA: C901 diff --git a/tests/conftest.py b/tests/conftest.py index 143377957c..eb2d34db82 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -55,7 +55,7 @@ def session(server): except exc.LibTmuxException: # server.attach_session(session.get('session_id')) pass - + for old_test_session in old_test_sessions: logger.debug('Old test test session %s found. Killing it.' % old_test_session) server.kill_session(old_test_session) diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 76439b1ca4..373b29b271 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -22,7 +22,7 @@ def test_freeze_config(session): builder.build(session=session) assert session == builder.session - time.sleep(.50) + time.sleep(0.50) session = session sconf = freeze(session) From 9e1212f3403a3f9acdf01a8c2844c8fb910b5be0 Mon Sep 17 00:00:00 2001 From: Kevin Stilwell Date: Sun, 12 May 2019 14:54:58 -0400 Subject: [PATCH 0417/2998] Fixes to address #170 - If window is specified in tmuxp configuration without panes assume that means one pane with no shell commands is intended --- tests/test_config.py | 18 ++++++++++++++++++ tmuxp/config.py | 10 +++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index f8b13d9860..f8f027e25c 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -236,6 +236,24 @@ def test_trickle_relative_start_directory(): assert test_config == fixtures.trickle.expected +def test_trickle_window_with_no_pane_config(): + test_yaml = """ + session_name: test_session + windows: + - window_name: test_1 + panes: + - shell_command: + - ls -l + - window_name: test_no_panes + """ + sconfig = load_yaml(test_yaml) + config.validate_schema(sconfig) + + assert config.expand(config.trickle(sconfig))['windows'][1]['panes'][0] == { + 'shell_command': [] + } + + def test_expands_blank_panes(): """Expand blank config into full form. diff --git a/tmuxp/config.py b/tmuxp/config.py index 999ac9a14c..bea1df0081 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -42,11 +42,6 @@ def validate_schema(sconf): if 'window_name' not in window: raise exc.ConfigError('config window is missing "window_name"') - if 'panes' not in window: - raise exc.ConfigError( - 'config window %s requires list of panes' % window['window_name'] - ) - return True @@ -370,6 +365,11 @@ def trickle(sconf): if 'suppress_history' not in windowconfig: windowconfig['suppress_history'] = suppress_history + # If panes were NOT specified for a window, assume that a single pane + # with no shell commands is desired + if 'panes' not in windowconfig: + windowconfig['panes'] = [{'shell_command': []}] + for paneconfig in windowconfig['panes']: commands_before = [] From 9e73aa3ca0277b353261eac9a1eb5ea815fab214 Mon Sep 17 00:00:00 2001 From: Kevin Stilwell Date: Tue, 14 May 2019 19:32:54 -0400 Subject: [PATCH 0418/2998] Set XDG_CONFIG_HOME tmux config path correctly if environment variable in use --- tests/test_cli.py | 7 +++++++ tmuxp/cli.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index b28b53c26e..e54db679e0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -120,6 +120,13 @@ def test_tmuxp_configdir_env_var(tmpdir, monkeypatch): assert get_config_dir() == tmpdir +def test_tmuxp_configdir_xdg_config_dir(tmpdir, monkeypatch): + monkeypatch.setenv('XDG_CONFIG_HOME', str(tmpdir)) + tmux_dir = tmpdir.mkdir("tmuxp") + + assert get_config_dir() == str(tmux_dir) + + def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): monkeypatch.setenv('HOME', str(homedir)) projectdir.join('.tmuxp.yaml').ensure() diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 82843b3ace..90f7fc433e 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -50,7 +50,7 @@ def get_config_dir(): if 'TMUXP_CONFIGDIR' in os.environ: paths.append(os.environ['TMUXP_CONFIGDIR']) if 'XDG_CONFIG_HOME' in os.environ: - paths.append(os.environ['XDG_CONFIG_HOME']) + paths.append(os.path.join(os.environ['XDG_CONFIG_HOME'], 'tmuxp')) else: paths.append('~/.config/tmuxp/') paths.append('~/.tmuxp') From cdb56187ceb4c72bfc9ceaa693044c4346b9a09d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 May 2019 13:00:43 -0500 Subject: [PATCH 0419/2998] :pushpin: Fix black package version --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index b7dd9f2495..8699414245 100644 --- a/Pipfile +++ b/Pipfile @@ -17,7 +17,7 @@ tmuxp = {path = ".",editable = true} twine = "*" sphinx-issues = "*" pillow = "*" -black = "==19.3.0b" +black = "==19.3b0" [packages] kaptan = "*" From b90f7ec0bf32d4736c86c44af76303c56435b7f4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 May 2019 13:06:41 -0500 Subject: [PATCH 0420/2998] Update Pipfile.lock --- Pipfile.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index fbf2ef5cb6..235fdd7374 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "64f1622343f676c24752c2070289e1e198f7de188a806c90df8c1f5345d5d672" + "sha256": "10daa99f9a94e456c4bf1025089ac97ecd72a3e669ff487f73e5700715581dd0" }, "pipfile-spec": 6, "requires": { @@ -124,7 +124,7 @@ "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c" ], "index": "pypi", - "version": "==19.3.0b0" + "version": "==19.3b0" }, "bleach": { "hashes": [ @@ -211,11 +211,11 @@ }, "isort": { "hashes": [ - "sha256:1349c6f7c2a0f7539f5f2ace51a9a8e4a37086ce4de6f78f5f53fb041d0a3cd5", - "sha256:f09911f6eb114e5592abe635aded8bf3d2c3144ebcfcaf81ee32e7af7b7d1870" + "sha256:c40744b6bc5162bbb39c1257fe298b7a393861d50978b565f3ccd9cb9de0182a", + "sha256:f57abacd059dc3bd666258d1efb0377510a89777fda3e3274e3c01f7c03ae22d" ], "index": "pypi", - "version": "==4.3.18" + "version": "==4.3.20" }, "jinja2": { "hashes": [ @@ -429,10 +429,10 @@ }, "requests": { "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" ], - "version": "==2.21.0" + "version": "==2.22.0" }, "requests-toolbelt": { "hashes": [ @@ -539,10 +539,10 @@ }, "tqdm": { "hashes": [ - "sha256:d385c95361699e5cf7622485d9b9eae2d4864b21cd5a2374a9c381ffed701021", - "sha256:e22977e3ebe961f72362f6ddfb9197cc531c9737aaf5f607ef09740c849ecd05" + "sha256:0a860bf2683fdbb4812fe539a6c22ea3f1777843ea985cb8c3807db448a0f7ab", + "sha256:e288416eecd4df19d12407d0c913cbf77aa8009d7fddb18f632aded3bdbdda6b" ], - "version": "==4.31.1" + "version": "==4.32.1" }, "twine": { "hashes": [ @@ -554,10 +554,10 @@ }, "urllib3": { "hashes": [ - "sha256:2393a695cd12afedd0dcb26fe5d50d0cf248e5a66f75dbd89a3d4eb333a61af4", - "sha256:a637e5fae88995b256e3409dc4d52c2e2e0ba32c42a6365fee8bbd2238de3cfb" + "sha256:a53063d8b9210a7bdec15e7b272776b9d42b2fd6816401a0d43006ad2f9902db", + "sha256:d363e3607d8de0c220d31950a8f38b18d5ba7c0830facd71a1c6b1036b7ce06c" ], - "version": "==1.24.3" + "version": "==1.25.2" }, "wcwidth": { "hashes": [ From 96fddc18ee7d7d3a1d54f51dd34b43722a4ff92e Mon Sep 17 00:00:00 2001 From: Kevin Stilwell Date: Fri, 17 May 2019 06:20:28 -0400 Subject: [PATCH 0421/2998] - Allow for session name to not be passed to `tmux freeze` - If session is not provided grab what is most likely the current session --- tmuxp/cli.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 90f7fc433e..add835bd03 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -652,7 +652,7 @@ def startup(config_dir): @cli.command(name='freeze') -@click.argument('session_name', nargs=1) +@click.argument('session_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') def command_freeze(session_name, socket_name, socket_path): @@ -664,7 +664,10 @@ def command_freeze(session_name, socket_name, socket_path): t = Server(socket_name=socket_name, socket_path=socket_path) try: - session = t.find_where({'session_name': session_name}) + if session_name: + session = t.find_where({'session_name': session_name}) + else: + session = t.list_sessions()[0] if not session: raise exc.TmuxpException('Session not found.') From 6f6279cd3d8fc16503e3cd657613595124a0a5da Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 15:09:51 -0500 Subject: [PATCH 0422/2998] :pushpin: Sync Pipfile.lock --- Pipfile.lock | 54 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 235fdd7374..00e9062364 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -85,10 +85,10 @@ }, "alagitpull": { "hashes": [ - "sha256:aacd8904bedfdac5277597759e31db9041d7ef3f11fb0697bc85697d962ff537" + "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a" ], "index": "pypi", - "version": "==0.0.22" + "version": "==0.0.23" }, "appdirs": { "hashes": [ @@ -113,10 +113,10 @@ }, "babel": { "hashes": [ - "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", - "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" + "sha256:af92e6106cb7c55286b25b38ad7695f8b4efb36a90ba483d7f7a6628c46158ab", + "sha256:e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28" ], - "version": "==2.6.0" + "version": "==2.7.0" }, "black": { "hashes": [ @@ -209,6 +209,13 @@ ], "version": "==1.1.0" }, + "importlib-metadata": { + "hashes": [ + "sha256:a9f185022cfa69e9ca5f7eabfd5a58b689894cb78a11e3c8c89398a8ccbb8e7f", + "sha256:df1403cd3aebeb2b1dcd3515ca062eecb5bd3ea7611f18cba81130c68707e879" + ], + "version": "==0.17" + }, "isort": { "hashes": [ "sha256:c40744b6bc5162bbb39c1257fe298b7a393861d50978b565f3ccd9cb9de0182a", @@ -295,10 +302,10 @@ }, "pbr": { "hashes": [ - "sha256:6901995b9b686cb90cceba67a0f6d4d14ae003cd59bc12beb61549bdfbe3bc89", - "sha256:d950c64aeea5456bbd147468382a5bb77fe692c13c9f00f0219814ce5b642755" + "sha256:0ce920b865091450bbcd452b35cf6d6eb8a6d9ce13ad2210d6e77557f85cf32b", + "sha256:93d2dc6ee0c9af4dbc70bc1251d0e545a9910ca8863774761f92716dece400b6" ], - "version": "==5.2.0" + "version": "==5.2.1" }, "pillow": { "hashes": [ @@ -341,10 +348,10 @@ }, "pluggy": { "hashes": [ - "sha256:25a1bc1d148c9a640211872b4ff859878d422bccb59c9965e04eed468a0aa180", - "sha256:964cedd2b27c492fbf0b7f58b3284a09cf7f99b0f715941fb24a439b3af1bd1a" + "sha256:0825a152ac059776623854c1543d65a4ad408eb3d33ee114dff91e57ec6ae6fc", + "sha256:b9817417e95936bf75d85d3f8767f7df6cdde751fc40aed3bb3074cbcb77757c" ], - "version": "==0.11.0" + "version": "==0.12.0" }, "py": { "hashes": [ @@ -369,10 +376,10 @@ }, "pygments": { "hashes": [ - "sha256:31cba6ffb739f099a85e243eff8cb717089fdd3c7300767d9fc34cb8e1b065f5", - "sha256:5ad302949b3c98dd73f8d9fcdc7e9cb592f120e32a18e23efd7f3dc51194472b" + "sha256:71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127", + "sha256:881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297" ], - "version": "==2.4.0" + "version": "==2.4.2" }, "pyparsing": { "hashes": [ @@ -383,11 +390,11 @@ }, "pytest": { "hashes": [ - "sha256:1a8aa4fa958f8f451ac5441f3ac130d9fc86ea38780dd2715e6d5c5882700b24", - "sha256:b8bf138592384bd4e87338cb0f256bf5f615398a649d4bd83915f0e4047a5ca6" + "sha256:52fa94b4ac81d2f063ee05e303acedf5c605e15dc0f4eef468b5c137f77241c3", + "sha256:5467f37a0d6bb0b4e684b71af268e005996b9eaaefe54e3d64d86afd90da8d78" ], "index": "pypi", - "version": "==4.5.0" + "version": "==4.6.0" }, "pytest-rerunfailures": { "hashes": [ @@ -554,10 +561,10 @@ }, "urllib3": { "hashes": [ - "sha256:a53063d8b9210a7bdec15e7b272776b9d42b2fd6816401a0d43006ad2f9902db", - "sha256:d363e3607d8de0c220d31950a8f38b18d5ba7c0830facd71a1c6b1036b7ce06c" + "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", + "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" ], - "version": "==1.25.2" + "version": "==1.25.3" }, "wcwidth": { "hashes": [ @@ -572,6 +579,13 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" + }, + "zipp": { + "hashes": [ + "sha256:8c1019c6aad13642199fbe458275ad6a84907634cc9f0989877ccc4a2840139d", + "sha256:ca943a7e809cc12257001ccfb99e3563da9af99d52f261725e96dfe0f9275bc3" + ], + "version": "==0.5.1" } } } From e16e63f83dc56aa0a61454a521e7ec3aac2510d1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 15:13:48 -0500 Subject: [PATCH 0423/2998] :wrench: Add docs/tracker url to metadata Re: #492 --- tmuxp/__about__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index a59dbcf757..84960ca298 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -5,6 +5,8 @@ __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' __github__ = 'https://github.com/tmux-python/tmuxp' +__docs__ = 'https://tmuxp.git-pull.com' +__tracker__ = 'https://github.com/tmux-python/tmuxp/issues' __pypi__ = 'https://pypi.org/project/tmuxp/' __license__ = 'MIT' __copyright__ = 'Copyright 2013- Tony Narlock' From bb984dd4ef15e9cac6e703b6e23f08ccfb9c7a8b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 15:14:44 -0500 Subject: [PATCH 0424/2998] :package: Add project_urls for pypi (Fixes #492) --- setup.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/setup.py b/setup.py index eec0927689..a4e2e5de1a 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ """tmuxp lives at .""" import sys +from collections import OrderedDict from setuptools import setup from setuptools.command.test import test as TestCommand @@ -40,6 +41,13 @@ def run_tests(self): name=about['__title__'], version=about['__version__'], url=about['__github__'], + project_urls=OrderedDict( + ( + ('Documentation', about['__docs__']), + ('Code', about['__github__']), + ('Issue tracker', about['__tracker__']), + ) + ), download_url=about['__pypi__'], license=about['__license__'], author=about['__author__'], From 7956070bb0325a02c6f49ac7303f0e94244d5dbd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 15:42:24 -0500 Subject: [PATCH 0425/2998] :white_check_mark: Add test for tmuxp freeze --- tests/test_cli.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index e54db679e0..e05986c75b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -472,6 +472,55 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): assert tmpdir.join('la.yaml').check() +@pytest.mark.parametrize( + "cli_args,inputs", + [ + (['freeze', 'mysession'], ['\n', 'y\n', './la.yaml\n', './la.yaml\n', 'y\n']), + ( # Exists + ['freeze', 'mysession'], + [ + '\n', + 'y\n', + './exists.yaml\n', + './exists.yaml\n', + './la.yaml\n', + './la.yaml\n', + 'y\n', + ], + ), + ( # Imply current session if not entered + ['freeze'], + ['\n', 'y\n', './la.yaml\n', './la.yaml\n', 'y\n'], + ), + ( + ['freeze'], + [ + '\n', + 'y\n', + './exists.yaml\n', + './exists.yaml\n', + './la.yaml\n', + './la.yaml\n', + 'y\n', + ], + ), # Exists + ], +) +def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): + monkeypatch.setenv('HOME', str(tmpdir)) + tmpdir.join('exists.yaml').ensure() + + server.new_session(session_name='mysession') + + with tmpdir.as_cwd(): + runner = CliRunner() + # Use tmux server (socket name) used in the test + cli_args = cli_args + ['-L', server.socket_name] + out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + print(out.output) + assert tmpdir.join('la.yaml').check() + + def test_get_abs_path(tmpdir): expect = str(tmpdir) with tmpdir.as_cwd(): From 7ee5c376b42b8e30ec0cd1ebbe3b47b809f6e323 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 22:39:26 -0500 Subject: [PATCH 0426/2998] Remove redundant confirmation from tmuxp freeze --- tmuxp/cli.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index add835bd03..f74b187c38 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -710,10 +710,7 @@ def command_freeze(session_name, socket_name, socket_path): ) ) dest_prompt = click.prompt( - 'Save to: %s' % save_to, - value_proc=get_abs_path, - default=save_to, - confirmation_prompt=True, + 'Save to: %s' % save_to, value_proc=get_abs_path, default=save_to ) if os.path.exists(dest_prompt): print('%s exists. Pick a new filename.' % dest_prompt) From 52f7b134e05ee95ec80b08c4eacf0b1a2073fc73 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 1 Jun 2019 22:39:45 -0500 Subject: [PATCH 0427/2998] Update tests for new prompt behavior --- tests/test_cli.py | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index e05986c75b..2e94efa151 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -475,35 +475,16 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): @pytest.mark.parametrize( "cli_args,inputs", [ - (['freeze', 'mysession'], ['\n', 'y\n', './la.yaml\n', './la.yaml\n', 'y\n']), + (['freeze', 'mysession'], ['\n', 'y\n', './la.yaml\n', 'y\n']), ( # Exists ['freeze', 'mysession'], - [ - '\n', - 'y\n', - './exists.yaml\n', - './exists.yaml\n', - './la.yaml\n', - './la.yaml\n', - 'y\n', - ], + ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], ), ( # Imply current session if not entered ['freeze'], - ['\n', 'y\n', './la.yaml\n', './la.yaml\n', 'y\n'], + ['\n', 'y\n', './la.yaml\n', 'y\n'], ), - ( - ['freeze'], - [ - '\n', - 'y\n', - './exists.yaml\n', - './exists.yaml\n', - './la.yaml\n', - './la.yaml\n', - 'y\n', - ], - ), # Exists + (['freeze'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists ], ) def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): From d73cc1299f9c83fb365e16c014b86eae450ef564 Mon Sep 17 00:00:00 2001 From: Julien <1444415+jstoja@users.noreply.github.com> Date: Wed, 6 Mar 2019 14:18:08 +0100 Subject: [PATCH 0428/2998] Remove duplicate kill-window documentation In this anchor: https://tmuxp.readthedocs.io/en/latest/about_tmux.html#kill-window `kill-window` is defined twice. --- doc/about_tmux.rst | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/doc/about_tmux.rst b/doc/about_tmux.rst index 31b0b9ee66..72dfee9929 100644 --- a/doc/about_tmux.rst +++ b/doc/about_tmux.rst @@ -449,7 +449,7 @@ Kill window .. code-block:: bash - $ tmux kill-window + $ tmux kill-window [-t target-window] =================== ==================================================== Short cut Action @@ -457,7 +457,6 @@ Short cut Action ``&`` Kill the current window. =================== ==================================================== - Kill pane --------- @@ -471,19 +470,6 @@ Short cut Action ``x`` Kill the current pane. =================== ==================================================== -Kill window ------------ - -.. code-block:: bash - - $ tmux kill-window [-t target-window] - -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``&`` Kill the current window. -=================== ==================================================== - Splitting windows into panes ---------------------------- From 9b11eae0171e65c391c280459e42eb2615c26933 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Jun 2019 12:19:59 -0500 Subject: [PATCH 0429/2998] Loosen libtmux version --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 9f971298a9..c0509baac4 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux==0.8.1 +libtmux>=0.8<0.9 click>=7<8 colorama>=0.3.9 From 248f489630b4f28e275c3ba55e131d86c618d3b0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Jun 2019 12:20:07 -0500 Subject: [PATCH 0430/2998] Sync Pipfile.lock --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 00e9062364..2a55339387 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -470,11 +470,11 @@ }, "sphinx": { "hashes": [ - "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", - "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" + "sha256:2c5becc0fd6706dc0aeb4703f9f1f8a1d1eecacf02e9ac5943cbae48b11e5e42", + "sha256:7a359a91fb04054ec77d68ff97cb8728f8cc322e25f22dc94299d67e0e6a7123" ], "index": "pypi", - "version": "==2.0.1" + "version": "==2.1.0" }, "sphinx-issues": { "hashes": [ From 0bbd0bcf93fab68cca64dd2049c9f387d0e49825 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Jun 2019 12:23:38 -0500 Subject: [PATCH 0431/2998] Update CHANGES for 1.5.2 --- CHANGES | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGES b/CHANGES index f4c9b716f8..b6adde3424 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,17 @@ Changelog Here you can find the recent changes to tmuxp +1.5.2 <2019-06-02> +------------------ +- Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2 + released today) +- :issue:`484` CHANGES converted to plain reStructuredText +- :issue:`491` ``tmuxp freeze`` will now infer active session with freezing +- :issue:`490` Fix XDG's ``$XDG_CONFIG_HOME`` behavior +- :issue:`483`, :issue:`482`, :issue:`480` Doc fixes +- :issue:`484` Simplifying handling of configs with no panes (Fixes + :issue:`470`) + 1.5.1 <2019-02-18> ------------------ - Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package. From 3b840765af0c02f50d27cb0a1a0fc6d5df8104a2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 2 Jun 2019 12:24:00 -0500 Subject: [PATCH 0432/2998] Tag v1.5.2 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 84960ca298..1adcdee264 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.1' +__version__ = '1.5.2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 11b06a4a8a153f1c89c7c34bc3df1aec51969980 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Jun 2019 12:50:40 -0500 Subject: [PATCH 0433/2998] :wrench: Include examples in source distribution (fixes #377) --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 407717561a..06fe340bec 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,3 +2,4 @@ include README.rst LICENSE CHANGES .tmuxp.yaml include requirements/*.txt recursive-include doc *.rst recursive-include tests *.py *.yaml *.json *.sh +recursive-include examples *.yaml *.json From 6a005f7cb975e2647bd5ee7361109bf97e3ca0fb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Jun 2019 12:51:15 -0500 Subject: [PATCH 0434/2998] Update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index b6adde3424..f5215dcffb 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +master +------ +- :issue:`377`: Include examples in source distribution package + 1.5.2 <2019-06-02> ------------------ - Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2 From 8447f0dafa80b63eb6d1146cff3a64b31f0ab3a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Jun 2019 12:51:34 -0500 Subject: [PATCH 0435/2998] :pushpin: Tag v1.5.3 --- CHANGES | 4 ++-- tmuxp/__about__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index f5215dcffb..bac8339690 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Changelog Here you can find the recent changes to tmuxp -master ------- +1.5.3 <2019-06-06> +------------------ - :issue:`377`: Include examples in source distribution package 1.5.2 <2019-06-02> diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 1adcdee264..37322d441f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.2' +__version__ = '1.5.3' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From b534cd37b833400f9c9c82505c7eeeb480443ea9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 17 Aug 2019 09:57:54 -0500 Subject: [PATCH 0436/2998] Remove OrderedDict from setup.py So we don't have to mess with collections.abc changing in python versions --- setup.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index a4e2e5de1a..6db23cdd3f 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ """tmuxp lives at .""" import sys -from collections import OrderedDict from setuptools import setup from setuptools.command.test import test as TestCommand @@ -41,13 +40,11 @@ def run_tests(self): name=about['__title__'], version=about['__version__'], url=about['__github__'], - project_urls=OrderedDict( - ( - ('Documentation', about['__docs__']), - ('Code', about['__github__']), - ('Issue tracker', about['__tracker__']), - ) - ), + project_urls={ + 'Documentation': about['__docs__'], + 'Code': about['__github__'], + 'Issue tracker': about['__tracker__'], + }, download_url=about['__pypi__'], license=about['__license__'], author=about['__author__'], From 27c87999447dc9480ec24e0a3c6525de59956421 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 17 Aug 2019 10:21:29 -0500 Subject: [PATCH 0437/2998] Update Pipfile.lock --- Pipfile.lock | 203 ++++++++++++++++++++++++++------------------------- 1 file changed, 103 insertions(+), 100 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 2a55339387..04bcd8bbcf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -52,19 +52,21 @@ }, "pyyaml": { "hashes": [ - "sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c", - "sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95", - "sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2", - "sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4", - "sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad", - "sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba", - "sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1", - "sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e", - "sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673", - "sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13", - "sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19" - ], - "version": "==5.1" + "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", + "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", + "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", + "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", + "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", + "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", + "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", + "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", + "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", + "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", + "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", + "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", + "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + ], + "version": "==5.1.2" } }, "develop": { @@ -135,10 +137,10 @@ }, "certifi": { "hashes": [ - "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", - "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" + "sha256:046832c04d4e752f37383b628bc601a7ea7211496b4638f6514d0e5b9acc4939", + "sha256:945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695" ], - "version": "==2019.3.9" + "version": "==2019.6.16" }, "chardet": { "hashes": [ @@ -173,12 +175,12 @@ }, "docutils": { "hashes": [ - "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", - "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", - "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" + "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", + "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", + "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" ], "index": "pypi", - "version": "==0.14" + "version": "==0.15.2" }, "entrypoints": { "hashes": [ @@ -189,11 +191,11 @@ }, "flake8": { "hashes": [ - "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", - "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" + "sha256:19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", + "sha256:8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696" ], "index": "pypi", - "version": "==3.7.7" + "version": "==3.7.8" }, "idna": { "hashes": [ @@ -211,18 +213,19 @@ }, "importlib-metadata": { "hashes": [ - "sha256:a9f185022cfa69e9ca5f7eabfd5a58b689894cb78a11e3c8c89398a8ccbb8e7f", - "sha256:df1403cd3aebeb2b1dcd3515ca062eecb5bd3ea7611f18cba81130c68707e879" + "sha256:23d3d873e008a513952355379d93cbcab874c58f4f034ff657c7a87422fa64e8", + "sha256:80d2de76188eabfbfcf27e6a37342c2827801e59c4cc14b0371c56fed43820e3" ], - "version": "==0.17" + "markers": "python_version < '3.8'", + "version": "==0.19" }, "isort": { "hashes": [ - "sha256:c40744b6bc5162bbb39c1257fe298b7a393861d50978b565f3ccd9cb9de0182a", - "sha256:f57abacd059dc3bd666258d1efb0377510a89777fda3e3274e3c01f7c03ae22d" + "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", + "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" ], "index": "pypi", - "version": "==4.3.20" + "version": "==4.3.21" }, "jinja2": { "hashes": [ @@ -287,57 +290,56 @@ }, "more-itertools": { "hashes": [ - "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", - "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" + "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", + "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" ], - "markers": "python_version > '2.7'", - "version": "==7.0.0" + "version": "==7.2.0" }, "packaging": { "hashes": [ - "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af", - "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3" + "sha256:a7ac867b97fdc07ee80a8058fe4435ccd274ecc3b0ed61d852d7d53055528cf9", + "sha256:c491ca87294da7cc01902edbe30a5bc6c4c28172b5138ab4e4aa1b9d7bfaeafe" ], - "version": "==19.0" + "version": "==19.1" }, "pbr": { "hashes": [ - "sha256:0ce920b865091450bbcd452b35cf6d6eb8a6d9ce13ad2210d6e77557f85cf32b", - "sha256:93d2dc6ee0c9af4dbc70bc1251d0e545a9910ca8863774761f92716dece400b6" + "sha256:56e52299170b9492513c64be44736d27a512fa7e606f21942160b68ce510b4bc", + "sha256:9b321c204a88d8ab5082699469f52cc94c5da45c51f114113d01b3d993c24cdf" ], - "version": "==5.2.1" + "version": "==5.4.2" }, "pillow": { "hashes": [ - "sha256:15c056bfa284c30a7f265a41ac4cbbc93bdbfc0dfe0613b9cb8a8581b51a9e55", - "sha256:1a4e06ba4f74494ea0c58c24de2bb752818e9d504474ec95b0aa94f6b0a7e479", - "sha256:1c3c707c76be43c9e99cb7e3d5f1bee1c8e5be8b8a2a5eeee665efbf8ddde91a", - "sha256:1fd0b290203e3b0882d9605d807b03c0f47e3440f97824586c173eca0aadd99d", - "sha256:24114e4a6e1870c5a24b1da8f60d0ba77a0b4027907860188ea82bd3508c80eb", - "sha256:258d886a49b6b058cd7abb0ab4b2b85ce78669a857398e83e8b8e28b317b5abb", - "sha256:33c79b6dd6bc7f65079ab9ca5bebffb5f5d1141c689c9c6a7855776d1b09b7e8", - "sha256:367385fc797b2c31564c427430c7a8630db1a00bd040555dfc1d5c52e39fcd72", - "sha256:3c1884ff078fb8bf5f63d7d86921838b82ed4a7d0c027add773c2f38b3168754", - "sha256:44e5240e8f4f8861d748f2a58b3f04daadab5e22bfec896bf5434745f788f33f", - "sha256:46aa988e15f3ea72dddd81afe3839437b755fffddb5e173886f11460be909dce", - "sha256:74d90d499c9c736d52dd6d9b7221af5665b9c04f1767e35f5dd8694324bd4601", - "sha256:809c0a2ce9032cbcd7b5313f71af4bdc5c8c771cb86eb7559afd954cab82ebb5", - "sha256:85d1ef2cdafd5507c4221d201aaf62fc9276f8b0f71bd3933363e62a33abc734", - "sha256:8c3889c7681af77ecfa4431cd42a2885d093ecb811e81fbe5e203abc07e0995b", - "sha256:9218d81b9fca98d2c47d35d688a0cea0c42fd473159dfd5612dcb0483c63e40b", - "sha256:9aa4f3827992288edd37c9df345783a69ef58bd20cc02e64b36e44bcd157bbf1", - "sha256:9d80f44137a70b6f84c750d11019a3419f409c944526a95219bea0ac31f4dd91", - "sha256:b7ebd36128a2fe93991293f997e44be9286503c7530ace6a55b938b20be288d8", - "sha256:c4c78e2c71c257c136cdd43869fd3d5e34fc2162dc22e4a5406b0ebe86958239", - "sha256:c6a842537f887be1fe115d8abb5daa9bc8cc124e455ff995830cc785624a97af", - "sha256:cf0a2e040fdf5a6d95f4c286c6ef1df6b36c218b528c8a9158ec2452a804b9b8", - "sha256:cfd28aad6fc61f7a5d4ee556a997dc6e5555d9381d1390c00ecaf984d57e4232", - "sha256:dca5660e25932771460d4688ccbb515677caaf8595f3f3240ec16c117deff89a", - "sha256:de7aedc85918c2f887886442e50f52c1b93545606317956d65f342bd81cb4fc3", - "sha256:e6c0bbf8e277b74196e3140c35f9a1ae3eafd818f7f2d3a15819c49135d6c062" + "sha256:0804f77cb1e9b6dbd37601cee11283bba39a8d44b9ddb053400c58e0c0d7d9de", + "sha256:0ab7c5b5d04691bcbd570658667dd1e21ca311c62dcfd315ad2255b1cd37f64f", + "sha256:0b3e6cf3ea1f8cecd625f1420b931c83ce74f00c29a0ff1ce4385f99900ac7c4", + "sha256:365c06a45712cd723ec16fa4ceb32ce46ad201eb7bbf6d3c16b063c72b61a3ed", + "sha256:38301fbc0af865baa4752ddae1bb3cbb24b3d8f221bf2850aad96b243306fa03", + "sha256:3aef1af1a91798536bbab35d70d35750bd2884f0832c88aeb2499aa2d1ed4992", + "sha256:3fe0ab49537d9330c9bba7f16a5f8b02da615b5c809cdf7124f356a0f182eccd", + "sha256:45a619d5c1915957449264c81c008934452e3fd3604e36809212300b2a4dab68", + "sha256:49f90f147883a0c3778fd29d3eb169d56416f25758d0f66775db9184debc8010", + "sha256:571b5a758baf1cb6a04233fb23d6cf1ca60b31f9f641b1700bfaab1194020555", + "sha256:5ac381e8b1259925287ccc5a87d9cf6322a2dc88ae28a97fe3e196385288413f", + "sha256:6153db744a743c0c8c91b8e3b9d40e0b13a5d31dbf8a12748c6d9bfd3ddc01ad", + "sha256:6fd63afd14a16f5d6b408f623cc2142917a1f92855f0df997e09a49f0341be8a", + "sha256:70acbcaba2a638923c2d337e0edea210505708d7859b87c2bd81e8f9902ae826", + "sha256:70b1594d56ed32d56ed21a7fbb2a5c6fd7446cdb7b21e749c9791eac3a64d9e4", + "sha256:76638865c83b1bb33bcac2a61ce4d13c17dba2204969dedb9ab60ef62bede686", + "sha256:7b2ec162c87fc496aa568258ac88631a2ce0acfe681a9af40842fc55deaedc99", + "sha256:7cee2cef07c8d76894ebefc54e4bb707dfc7f258ad155bd61d87f6cd487a70ff", + "sha256:7d16d4498f8b374fc625c4037742fbdd7f9ac383fd50b06f4df00c81ef60e829", + "sha256:b50bc1780681b127e28f0075dfb81d6135c3a293e0c1d0211133c75e2179b6c0", + "sha256:bd0582f831ad5bcad6ca001deba4568573a4675437db17c4031939156ff339fa", + "sha256:cfd40d8a4b59f7567620410f966bb1f32dc555b2b19f82a91b147fac296f645c", + "sha256:e3ae410089de680e8f84c68b755b42bc42c0ceb8c03dbea88a5099747091d38e", + "sha256:e9046e559c299b395b39ac7dbf16005308821c2f24a63cae2ab173bd6aa11616", + "sha256:ef6be704ae2bc8ad0ebc5cb850ee9139493b0fc4e81abcc240fb392a63ebc808", + "sha256:f8dc19d92896558f9c4317ee365729ead9d7bbcf2052a9a19a3ef17abbb8ac5b" ], "index": "pypi", - "version": "==6.0.0" + "version": "==6.1.0" }, "pkginfo": { "hashes": [ @@ -383,18 +385,18 @@ }, "pyparsing": { "hashes": [ - "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", - "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" + "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", + "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" ], - "version": "==2.4.0" + "version": "==2.4.2" }, "pytest": { "hashes": [ - "sha256:52fa94b4ac81d2f063ee05e303acedf5c605e15dc0f4eef468b5c137f77241c3", - "sha256:5467f37a0d6bb0b4e684b71af268e005996b9eaaefe54e3d64d86afd90da8d78" + "sha256:3805d095f1ea279b9870c3eeae5dddf8a81b10952c8835cd628cf1875b0ef031", + "sha256:abc562321c2d190dd63c2faadf70b86b7af21a553b61f0df5f5e1270717dc5a3" ], "index": "pypi", - "version": "==4.6.0" + "version": "==5.1.0" }, "pytest-rerunfailures": { "hashes": [ @@ -406,26 +408,28 @@ }, "pytz": { "hashes": [ - "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", - "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" + "sha256:26c0b32e437e54a18161324a2fca3c4b9846b74a8dccddd843113109e1116b32", + "sha256:c894d57500a4cd2d5c71114aaab77dbab5eabd9022308ce5ac9bb93a60a6f0c7" ], - "version": "==2019.1" + "version": "==2019.2" }, "pyyaml": { "hashes": [ - "sha256:1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c", - "sha256:436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95", - "sha256:460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2", - "sha256:5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4", - "sha256:7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad", - "sha256:9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba", - "sha256:a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1", - "sha256:aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e", - "sha256:c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673", - "sha256:c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13", - "sha256:e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19" - ], - "version": "==5.1" + "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", + "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", + "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", + "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", + "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", + "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", + "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", + "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", + "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", + "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", + "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", + "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", + "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + ], + "version": "==5.1.2" }, "readme-renderer": { "hashes": [ @@ -463,18 +467,17 @@ }, "snowballstemmer": { "hashes": [ - "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128", - "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89" + "sha256:9f3b9ffe0809d174f7047e121431acf99c89a7040f0ca84f94ba53a498e6d0c9" ], - "version": "==1.2.1" + "version": "==1.9.0" }, "sphinx": { "hashes": [ - "sha256:2c5becc0fd6706dc0aeb4703f9f1f8a1d1eecacf02e9ac5943cbae48b11e5e42", - "sha256:7a359a91fb04054ec77d68ff97cb8728f8cc322e25f22dc94299d67e0e6a7123" + "sha256:22538e1bbe62b407cf5a8aabe1bb15848aa66bb79559f42f5202bbce6b757a69", + "sha256:f9a79e746b87921cabc3baa375199c6076d1270cee53915dbd24fdbeaaacc427" ], "index": "pypi", - "version": "==2.1.0" + "version": "==2.1.2" }, "sphinx-issues": { "hashes": [ @@ -546,10 +549,10 @@ }, "tqdm": { "hashes": [ - "sha256:0a860bf2683fdbb4812fe539a6c22ea3f1777843ea985cb8c3807db448a0f7ab", - "sha256:e288416eecd4df19d12407d0c913cbf77aa8009d7fddb18f632aded3bdbdda6b" + "sha256:1dc82f87a8726602fa7177a091b5e8691d6523138a8f7acd08e58088f51e389f", + "sha256:47220a4f2aeebbc74b0ab317584264ea44c745e1fd5ff316b675cd0aff8afad8" ], - "version": "==4.32.1" + "version": "==4.33.0" }, "twine": { "hashes": [ @@ -582,10 +585,10 @@ }, "zipp": { "hashes": [ - "sha256:8c1019c6aad13642199fbe458275ad6a84907634cc9f0989877ccc4a2840139d", - "sha256:ca943a7e809cc12257001ccfb99e3563da9af99d52f261725e96dfe0f9275bc3" + "sha256:4970c3758f4e89a7857a973b1e2a5d75bcdc47794442f2e2dd4fe8e0466e809a", + "sha256:8a5712cfd3bb4248015eb3b0b3c54a5f6ee3f2425963ef2a0125b8bc40aafaec" ], - "version": "==0.5.1" + "version": "==0.5.2" } } } From 345a23cbc66cbe3f2a99840478c2f5d3a210d0aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 17 Aug 2019 16:03:42 -0500 Subject: [PATCH 0438/2998] Travis: Add 3.7, update pypy --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 953d6c6290..6a51b460e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,9 @@ sudo: false python: - 2.7 - 3.6 - - pypy3.5-5.10.1 - - pypy2.7-5.10.0 + - 3.7 + - pypy + - pypy3 env: global: - RETRY_TIMEOUT_SECONDS=15 From 9bf267a9871a2eae735bdb7832ef4ee12bfc9408 Mon Sep 17 00:00:00 2001 From: Nikos Vasilas Date: Tue, 2 Jul 2019 20:13:07 +0300 Subject: [PATCH 0439/2998] Fix window focus Save attached window before set_layout_hook actually execute the hooks and select the saved after the hooks. --- tmuxp/cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index f74b187c38..41a828a259 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -162,6 +162,7 @@ def set_layout_hook(session, hook_name): """ cmd = ['set-hook', '-t', session.id, hook_name] hook_cmd = [] + attached_window = session.attached_window for window in session.windows: # unfortunately, select-layout won't work unless # we've literally selected the window at least once @@ -177,6 +178,7 @@ def set_layout_hook(session, hook_name): target_session=session.id, hook_name=hook_name ) ) + hook_cmd.append('selectw -t {}'.format(attached_window.id)) # join the hook's commands with semicolons hook_cmd = '{}'.format('; '.join(hook_cmd)) From 7af7504178aa5286c95cb3cc07b120b45e267b11 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 17:57:31 -0600 Subject: [PATCH 0440/2998] Update CHANGES --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index bac8339690..5d6ba21f01 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +master +------ +- :issue:`500`: Fix window focus + 1.5.3 <2019-06-06> ------------------ - :issue:`377`: Include examples in source distribution package From 849c47a3d7bf0d7a1f814ce7d1630d88f2f87746 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 17:59:11 -0600 Subject: [PATCH 0441/2998] Remove old distribution from travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6a51b460e4..e24127dbe5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: python -dist: trusty sudo: false python: - 2.7 From f9c38e00de8f986707dbdd46e23e6a73f5de960f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:19:46 -0600 Subject: [PATCH 0442/2998] Pipfile: 0.8.1 to <0.9 (brings in 0.8.2) --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index 8699414245..b581cd4cba 100644 --- a/Pipfile +++ b/Pipfile @@ -21,7 +21,7 @@ black = "==19.3b0" [packages] kaptan = "*" -libtmux = "==0.8.1" +libtmux = "<0.9" click = ">=7<8" colorama = "*" e1839a8 = {path = ".",editable = true} From 2565e06d0b5078cc3c392061b1dcd1390ef11282 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:20:25 -0600 Subject: [PATCH 0443/2998] Sync Pipfile.lock --- Pipfile.lock | 181 ++++++++++++++++++++++++++------------------------- 1 file changed, 93 insertions(+), 88 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 04bcd8bbcf..fc29c7ae6f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "10daa99f9a94e456c4bf1025089ac97ecd72a3e669ff487f73e5700715581dd0" + "sha256": "88d81e0cc12fe717055c5e07d1f22e95cc972ac9252f81813a0185ce0e741f8a" }, "pipfile-spec": 6, "requires": { @@ -45,10 +45,10 @@ }, "libtmux": { "hashes": [ - "sha256:5d4963cc4af53046cabd0997152af05a0a419e4c63af6737389b50f637c3852a" + "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" ], "index": "pypi", - "version": "==0.8.1" + "version": "==0.8.2" }, "pyyaml": { "hashes": [ @@ -108,10 +108,10 @@ }, "attrs": { "hashes": [ - "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", - "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], - "version": "==19.1.0" + "version": "==19.3.0" }, "babel": { "hashes": [ @@ -137,10 +137,10 @@ }, "certifi": { "hashes": [ - "sha256:046832c04d4e752f37383b628bc601a7ea7211496b4638f6514d0e5b9acc4939", - "sha256:945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695" + "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", + "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" ], - "version": "==2019.6.16" + "version": "==2019.9.11" }, "chardet": { "hashes": [ @@ -191,11 +191,11 @@ }, "flake8": { "hashes": [ - "sha256:19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", - "sha256:8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696" + "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb", + "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca" ], "index": "pypi", - "version": "==3.7.8" + "version": "==3.7.9" }, "idna": { "hashes": [ @@ -213,11 +213,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:23d3d873e008a513952355379d93cbcab874c58f4f034ff657c7a87422fa64e8", - "sha256:80d2de76188eabfbfcf27e6a37342c2827801e59c4cc14b0371c56fed43820e3" + "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", + "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" ], "markers": "python_version < '3.8'", - "version": "==0.19" + "version": "==0.23" }, "isort": { "hashes": [ @@ -229,10 +229,10 @@ }, "jinja2": { "hashes": [ - "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", - "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b" + "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", + "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de" ], - "version": "==2.10.1" + "version": "==2.10.3" }, "kaptan": { "hashes": [ @@ -243,10 +243,10 @@ }, "libtmux": { "hashes": [ - "sha256:5d4963cc4af53046cabd0997152af05a0a419e4c63af6737389b50f637c3852a" + "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" ], "index": "pypi", - "version": "==0.8.1" + "version": "==0.8.2" }, "markupsafe": { "hashes": [ @@ -297,49 +297,53 @@ }, "packaging": { "hashes": [ - "sha256:a7ac867b97fdc07ee80a8058fe4435ccd274ecc3b0ed61d852d7d53055528cf9", - "sha256:c491ca87294da7cc01902edbe30a5bc6c4c28172b5138ab4e4aa1b9d7bfaeafe" + "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", + "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" ], - "version": "==19.1" + "version": "==19.2" }, "pbr": { "hashes": [ - "sha256:56e52299170b9492513c64be44736d27a512fa7e606f21942160b68ce510b4bc", - "sha256:9b321c204a88d8ab5082699469f52cc94c5da45c51f114113d01b3d993c24cdf" + "sha256:2c8e420cd4ed4cec4e7999ee47409e876af575d4c35a45840d59e8b5f3155ab8", + "sha256:b32c8ccaac7b1a20c0ce00ce317642e6cf231cf038f9875e0280e28af5bf7ac9" ], - "version": "==5.4.2" + "version": "==5.4.3" }, "pillow": { "hashes": [ - "sha256:0804f77cb1e9b6dbd37601cee11283bba39a8d44b9ddb053400c58e0c0d7d9de", - "sha256:0ab7c5b5d04691bcbd570658667dd1e21ca311c62dcfd315ad2255b1cd37f64f", - "sha256:0b3e6cf3ea1f8cecd625f1420b931c83ce74f00c29a0ff1ce4385f99900ac7c4", - "sha256:365c06a45712cd723ec16fa4ceb32ce46ad201eb7bbf6d3c16b063c72b61a3ed", - "sha256:38301fbc0af865baa4752ddae1bb3cbb24b3d8f221bf2850aad96b243306fa03", - "sha256:3aef1af1a91798536bbab35d70d35750bd2884f0832c88aeb2499aa2d1ed4992", - "sha256:3fe0ab49537d9330c9bba7f16a5f8b02da615b5c809cdf7124f356a0f182eccd", - "sha256:45a619d5c1915957449264c81c008934452e3fd3604e36809212300b2a4dab68", - "sha256:49f90f147883a0c3778fd29d3eb169d56416f25758d0f66775db9184debc8010", - "sha256:571b5a758baf1cb6a04233fb23d6cf1ca60b31f9f641b1700bfaab1194020555", - "sha256:5ac381e8b1259925287ccc5a87d9cf6322a2dc88ae28a97fe3e196385288413f", - "sha256:6153db744a743c0c8c91b8e3b9d40e0b13a5d31dbf8a12748c6d9bfd3ddc01ad", - "sha256:6fd63afd14a16f5d6b408f623cc2142917a1f92855f0df997e09a49f0341be8a", - "sha256:70acbcaba2a638923c2d337e0edea210505708d7859b87c2bd81e8f9902ae826", - "sha256:70b1594d56ed32d56ed21a7fbb2a5c6fd7446cdb7b21e749c9791eac3a64d9e4", - "sha256:76638865c83b1bb33bcac2a61ce4d13c17dba2204969dedb9ab60ef62bede686", - "sha256:7b2ec162c87fc496aa568258ac88631a2ce0acfe681a9af40842fc55deaedc99", - "sha256:7cee2cef07c8d76894ebefc54e4bb707dfc7f258ad155bd61d87f6cd487a70ff", - "sha256:7d16d4498f8b374fc625c4037742fbdd7f9ac383fd50b06f4df00c81ef60e829", - "sha256:b50bc1780681b127e28f0075dfb81d6135c3a293e0c1d0211133c75e2179b6c0", - "sha256:bd0582f831ad5bcad6ca001deba4568573a4675437db17c4031939156ff339fa", - "sha256:cfd40d8a4b59f7567620410f966bb1f32dc555b2b19f82a91b147fac296f645c", - "sha256:e3ae410089de680e8f84c68b755b42bc42c0ceb8c03dbea88a5099747091d38e", - "sha256:e9046e559c299b395b39ac7dbf16005308821c2f24a63cae2ab173bd6aa11616", - "sha256:ef6be704ae2bc8ad0ebc5cb850ee9139493b0fc4e81abcc240fb392a63ebc808", - "sha256:f8dc19d92896558f9c4317ee365729ead9d7bbcf2052a9a19a3ef17abbb8ac5b" + "sha256:047d9473cf68af50ac85f8ee5d5f21a60f849bc17d348da7fc85711287a75031", + "sha256:0f66dc6c8a3cc319561a633b6aa82c44107f12594643efa37210d8c924fc1c71", + "sha256:12c9169c4e8fe0a7329e8658c7e488001f6b4c8e88740e76292c2b857af2e94c", + "sha256:248cffc168896982f125f5c13e9317c059f74fffdb4152893339f3be62a01340", + "sha256:27faf0552bf8c260a5cee21a76e031acaea68babb64daf7e8f2e2540745082aa", + "sha256:285edafad9bc60d96978ed24d77cdc0b91dace88e5da8c548ba5937c425bca8b", + "sha256:384b12c9aa8ef95558abdcb50aada56d74bc7cc131dd62d28c2d0e4d3aadd573", + "sha256:38950b3a707f6cef09cd3cbb142474357ad1a985ceb44d921bdf7b4647b3e13e", + "sha256:4aad1b88933fd6dc2846552b89ad0c74ddbba2f0884e2c162aa368374bf5abab", + "sha256:4ac6148008c169603070c092e81f88738f1a0c511e07bd2bb0f9ef542d375da9", + "sha256:4deb1d2a45861ae6f0b12ea0a786a03d19d29edcc7e05775b85ec2877cb54c5e", + "sha256:59aa2c124df72cc75ed72c8d6005c442d4685691a30c55321e00ed915ad1a291", + "sha256:5a47d2123a9ec86660fe0e8d0ebf0aa6bc6a17edc63f338b73ea20ba11713f12", + "sha256:5cc901c2ab9409b4b7ac7b5bcc3e86ac14548627062463da0af3b6b7c555a871", + "sha256:6c1db03e8dff7b9f955a0fb9907eb9ca5da75b5ce056c0c93d33100a35050281", + "sha256:7ce80c0a65a6ea90ef9c1f63c8593fcd2929448613fc8da0adf3e6bfad669d08", + "sha256:809c19241c14433c5d6135e1b6c72da4e3b56d5c865ad5736ab99af8896b8f41", + "sha256:83792cb4e0b5af480588601467c0764242b9a483caea71ef12d22a0d0d6bdce2", + "sha256:846fa202bd7ee0f6215c897a1d33238ef071b50766339186687bd9b7a6d26ac5", + "sha256:9f5529fc02009f96ba95bea48870173426879dc19eec49ca8e08cd63ecd82ddb", + "sha256:a423c2ea001c6265ed28700df056f75e26215fd28c001e93ef4380b0f05f9547", + "sha256:ac4428094b42907aba5879c7c000d01c8278d451a3b7cccd2103e21f6397ea75", + "sha256:b1ae48d87f10d1384e5beecd169c77502fcc04a2c00a4c02b85f0a94b419e5f9", + "sha256:bf4e972a88f8841d8fdc6db1a75e0f8d763e66e3754b03006cbc3854d89f1cb1", + "sha256:c6414f6aad598364aaf81068cabb077894eb88fed99c6a65e6e8217bab62ae7a", + "sha256:c710fcb7ee32f67baf25aa9ffede4795fd5d93b163ce95fdc724383e38c9df96", + "sha256:c7be4b8a09852291c3c48d3c25d1b876d2494a0a674980089ac9d5e0d78bd132", + "sha256:c9e5ffb910b14f090ac9c38599063e354887a5f6d7e6d26795e916b4514f2c1a", + "sha256:e0697b826da6c2472bb6488db4c0a7fa8af0d52fa08833ceb3681358914b14e5", + "sha256:e9a3edd5f714229d41057d56ac0f39ad9bdba6767e8c888c951869f0bdd129b0" ], "index": "pypi", - "version": "==6.1.0" + "version": "==6.2.1" }, "pkginfo": { "hashes": [ @@ -350,10 +354,10 @@ }, "pluggy": { "hashes": [ - "sha256:0825a152ac059776623854c1543d65a4ad408eb3d33ee114dff91e57ec6ae6fc", - "sha256:b9817417e95936bf75d85d3f8767f7df6cdde751fc40aed3bb3074cbcb77757c" + "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", + "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" ], - "version": "==0.12.0" + "version": "==0.13.0" }, "py": { "hashes": [ @@ -385,18 +389,18 @@ }, "pyparsing": { "hashes": [ - "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", - "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" + "sha256:4acadc9a2b96c19fe00932a38ca63e601180c39a189a696abce1eaab641447e1", + "sha256:61b5ed888beab19ddccab3478910e2076a6b5a0295dffc43021890e136edf764" ], - "version": "==2.4.2" + "version": "==2.4.4" }, "pytest": { "hashes": [ - "sha256:3805d095f1ea279b9870c3eeae5dddf8a81b10952c8835cd628cf1875b0ef031", - "sha256:abc562321c2d190dd63c2faadf70b86b7af21a553b61f0df5f5e1270717dc5a3" + "sha256:27abc3fef618a01bebb1f0d6d303d2816a99aa87a5968ebc32fe971be91eb1e6", + "sha256:58cee9e09242937e136dbb3dab466116ba20d6b7828c7620f23947f37eb4dae4" ], "index": "pypi", - "version": "==5.1.0" + "version": "==5.2.2" }, "pytest-rerunfailures": { "hashes": [ @@ -408,10 +412,10 @@ }, "pytz": { "hashes": [ - "sha256:26c0b32e437e54a18161324a2fca3c4b9846b74a8dccddd843113109e1116b32", - "sha256:c894d57500a4cd2d5c71114aaab77dbab5eabd9022308ce5ac9bb93a60a6f0c7" + "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", + "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" ], - "version": "==2019.2" + "version": "==2019.3" }, "pyyaml": { "hashes": [ @@ -460,24 +464,25 @@ }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" ], - "version": "==1.12.0" + "version": "==1.13.0" }, "snowballstemmer": { "hashes": [ - "sha256:9f3b9ffe0809d174f7047e121431acf99c89a7040f0ca84f94ba53a498e6d0c9" + "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0", + "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52" ], - "version": "==1.9.0" + "version": "==2.0.0" }, "sphinx": { "hashes": [ - "sha256:22538e1bbe62b407cf5a8aabe1bb15848aa66bb79559f42f5202bbce6b757a69", - "sha256:f9a79e746b87921cabc3baa375199c6076d1270cee53915dbd24fdbeaaacc427" + "sha256:31088dfb95359384b1005619827eaee3056243798c62724fd3fa4b84ee4d71bd", + "sha256:52286a0b9d7caa31efee301ec4300dbdab23c3b05da1c9024b4e84896fb73d79" ], "index": "pypi", - "version": "==2.1.2" + "version": "==2.2.1" }, "sphinx-issues": { "hashes": [ @@ -531,10 +536,10 @@ }, "stevedore": { "hashes": [ - "sha256:7be098ff53d87f23d798a7ce7ae5c31f094f3deb92ba18059b1aeb1ca9fec0a0", - "sha256:7d1ce610a87d26f53c087da61f06f9b7f7e552efad2a7f6d2322632b5f932ea2" + "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730", + "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14" ], - "version": "==1.30.1" + "version": "==1.31.0" }, "tmuxp": { "editable": true, @@ -549,25 +554,25 @@ }, "tqdm": { "hashes": [ - "sha256:1dc82f87a8726602fa7177a091b5e8691d6523138a8f7acd08e58088f51e389f", - "sha256:47220a4f2aeebbc74b0ab317584264ea44c745e1fd5ff316b675cd0aff8afad8" + "sha256:94d2a64582150f503a294b3b8889413e7e56d6043473d6a5672d46185b043902", + "sha256:fca09992116d6dc3ad9789cf601a254081eb40d5c14c1863ab6cd10e15c2cb26" ], - "version": "==4.33.0" + "version": "==4.37.0" }, "twine": { "hashes": [ - "sha256:0fb0bfa3df4f62076cab5def36b1a71a2e4acb4d1fa5c97475b048117b1a6446", - "sha256:d6c29c933ecfc74e9b1d9fa13aa1f87c5d5770e119f5a4ce032092f0ff5b14dc" + "sha256:5319dd3e02ac73fcddcd94f035b9631589ab5d23e1f4699d57365199d85261e1", + "sha256:9fe7091715c7576df166df8ef6654e61bada39571783f2fd415bdcba867c6993" ], "index": "pypi", - "version": "==1.13.0" + "version": "==2.0.0" }, "urllib3": { "hashes": [ - "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", - "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" + "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", + "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" ], - "version": "==1.25.3" + "version": "==1.25.6" }, "wcwidth": { "hashes": [ @@ -585,10 +590,10 @@ }, "zipp": { "hashes": [ - "sha256:4970c3758f4e89a7857a973b1e2a5d75bcdc47794442f2e2dd4fe8e0466e809a", - "sha256:8a5712cfd3bb4248015eb3b0b3c54a5f6ee3f2425963ef2a0125b8bc40aafaec" + "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", + "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" ], - "version": "==0.5.2" + "version": "==0.6.0" } } } From 8f2b89abe25e5d4cf272c370f1742f4633767d63 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:21:27 -0600 Subject: [PATCH 0444/2998] Pipfile: Update black --- Pipfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index b581cd4cba..7fbc443978 100644 --- a/Pipfile +++ b/Pipfile @@ -17,7 +17,7 @@ tmuxp = {path = ".",editable = true} twine = "*" sphinx-issues = "*" pillow = "*" -black = "==19.3b0" +black = "==19.10b0" [packages] kaptan = "*" From e8143a06c7c62af3b4dc24dfeab8d459e2eb7073 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:21:48 -0600 Subject: [PATCH 0445/2998] Sync Pipfile.lock --- Pipfile.lock | 57 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index fc29c7ae6f..988d0a8918 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "88d81e0cc12fe717055c5e07d1f22e95cc972ac9252f81813a0185ce0e741f8a" + "sha256": "715e4d5ccbc37fb13f265a49ffa6dfe449d3f19a4a00a9e82907e058ec46d948" }, "pipfile-spec": 6, "requires": { @@ -122,11 +122,11 @@ }, "black": { "hashes": [ - "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf", - "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c" + "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", + "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539" ], "index": "pypi", - "version": "==19.3b0" + "version": "==19.10b0" }, "bleach": { "hashes": [ @@ -302,6 +302,12 @@ ], "version": "==19.2" }, + "pathspec": { + "hashes": [ + "sha256:e285ccc8b0785beadd4c18e5708b12bb8fcf529a1e61215b3feff1d1e559ea5c" + ], + "version": "==0.6.0" + }, "pbr": { "hashes": [ "sha256:2c8e420cd4ed4cec4e7999ee47409e876af575d4c35a45840d59e8b5f3155ab8", @@ -442,6 +448,24 @@ ], "version": "==24.0" }, + "regex": { + "hashes": [ + "sha256:15454b37c5a278f46f7aa2d9339bda450c300617ca2fca6558d05d870245edc7", + "sha256:1ad40708c255943a227e778b022c6497c129ad614bb7a2a2f916e12e8a359ee7", + "sha256:5e00f65cc507d13ab4dfa92c1232d004fa202c1d43a32a13940ab8a5afe2fb96", + "sha256:604dc563a02a74d70ae1f55208ddc9bfb6d9f470f6d1a5054c4bd5ae58744ab1", + "sha256:720e34a539a76a1fedcebe4397290604cc2bdf6f81eca44adb9fb2ea071c0c69", + "sha256:7caf47e4a9ac6ef08cabd3442cc4ca3386db141fb3c8b2a7e202d0470028e910", + "sha256:7faf534c1841c09d8fefa60ccde7b9903c9b528853ecf41628689793290ca143", + "sha256:b4e0406d822aa4993ac45072a584d57aa4931cf8288b5455bbf30c1d59dbad59", + "sha256:c31eaf28c6fe75ea329add0022efeed249e37861c19681960f99bbc7db981fb2", + "sha256:c7393597191fc2043c744db021643549061e12abe0b3ff5c429d806de7b93b66", + "sha256:d2b302f8cdd82c8f48e9de749d1d17f85ce9a0f082880b9a4859f66b07037dc6", + "sha256:e3d8dd0ec0ea280cf89026b0898971f5750a7bd92cb62c51af5a52abd020054a", + "sha256:ec032cbfed59bd5a4b8eab943c310acfaaa81394e14f44454ad5c9eba4f24a74" + ], + "version": "==2019.11.1" + }, "requests": { "hashes": [ "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", @@ -567,6 +591,31 @@ "index": "pypi", "version": "==2.0.0" }, + "typed-ast": { + "hashes": [ + "sha256:1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", + "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", + "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", + "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", + "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", + "sha256:48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", + "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", + "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", + "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", + "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", + "sha256:7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", + "sha256:838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", + "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", + "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", + "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", + "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", + "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", + "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", + "sha256:fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", + "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12" + ], + "version": "==1.4.0" + }, "urllib3": { "hashes": [ "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", From 02beadcb726179c23fef6debd935c22ef61db806 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:21:52 -0600 Subject: [PATCH 0446/2998] Add CHANGES to 1.5.4 (forthcoming release) --- CHANGES | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 5d6ba21f01..15a0552777 100644 --- a/CHANGES +++ b/CHANGES @@ -4,9 +4,10 @@ Changelog Here you can find the recent changes to tmuxp -master ------- +1.5.4 <2019-11-06> +------------------ - :issue:`500`: Fix window focus +- Fix travis CI builds for python 3.7 1.5.3 <2019-06-06> ------------------ From 12c9c0ceb0935d4af1bc14383a990591bb8767f3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Nov 2019 19:22:33 -0600 Subject: [PATCH 0447/2998] :package: Pin tmuxp v1.5.4 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 37322d441f..570f21eba6 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.3' +__version__ = '1.5.4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From c322104f2dfc97bdc3256bd4766da49b7f588dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Pfn=C3=BCr?= Date: Thu, 14 Nov 2019 16:47:23 +0100 Subject: [PATCH 0448/2998] fixed entr_warn make: *** No rule to make target `@echo', needed by `entr_warn'. Stop. --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f9625e60a1..65930cfcf2 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null -entr_warn: @echo "----------------------------------------------------------" +entr_warn: + @echo "----------------------------------------------------------" @echo " ! File watching functionality non-operational ! " @echo " " @echo "Install entr(1) to automatically run tasks on file change." From 04671d87d963ca1701079c1ef2797aa14a233368 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2019 07:08:06 +0000 Subject: [PATCH 0449/2998] Bump pytest from 5.2.2 to 5.2.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 5.2.2 to 5.2.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/5.2.2...5.2.3) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 64 ++++++++++------------------------------------------ 1 file changed, 12 insertions(+), 52 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 988d0a8918..ce96ffe2aa 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -157,14 +157,6 @@ "index": "pypi", "version": "==7.0" }, - "colorama": { - "hashes": [ - "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", - "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48" - ], - "index": "pypi", - "version": "==0.4.1" - }, "doc8": { "hashes": [ "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", @@ -234,20 +226,6 @@ ], "version": "==2.10.3" }, - "kaptan": { - "hashes": [ - "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" - ], - "index": "pypi", - "version": "==0.5.12" - }, - "libtmux": { - "hashes": [ - "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" - ], - "index": "pypi", - "version": "==0.8.2" - }, "markupsafe": { "hashes": [ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", @@ -395,18 +373,18 @@ }, "pyparsing": { "hashes": [ - "sha256:4acadc9a2b96c19fe00932a38ca63e601180c39a189a696abce1eaab641447e1", - "sha256:61b5ed888beab19ddccab3478910e2076a6b5a0295dffc43021890e136edf764" + "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", + "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a" ], - "version": "==2.4.4" + "version": "==2.4.5" }, "pytest": { "hashes": [ - "sha256:27abc3fef618a01bebb1f0d6d303d2816a99aa87a5968ebc32fe971be91eb1e6", - "sha256:58cee9e09242937e136dbb3dab466116ba20d6b7828c7620f23947f37eb4dae4" + "sha256:15837d2880cb94821087bc07476892ea740696b20e90288fd6c19e44b435abdb", + "sha256:b6cf7ad9064049ee486586b3a0ddd70dc5136c40e1147e7d286efd77ba66c5eb" ], "index": "pypi", - "version": "==5.2.2" + "version": "==5.2.3" }, "pytest-rerunfailures": { "hashes": [ @@ -423,24 +401,6 @@ ], "version": "==2019.3" }, - "pyyaml": { - "hashes": [ - "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", - "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", - "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", - "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", - "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", - "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", - "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", - "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", - "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", - "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", - "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", - "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", - "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" - ], - "version": "==5.1.2" - }, "readme-renderer": { "hashes": [ "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", @@ -578,10 +538,10 @@ }, "tqdm": { "hashes": [ - "sha256:94d2a64582150f503a294b3b8889413e7e56d6043473d6a5672d46185b043902", - "sha256:fca09992116d6dc3ad9789cf601a254081eb40d5c14c1863ab6cd10e15c2cb26" + "sha256:9de4722323451eb7818deb0161d9d5523465353a6707a9f500d97ee42919b902", + "sha256:c1d677f3a85fa291b34bdf8f770f877119b9754b32673699653556f85e2c2f13" ], - "version": "==4.37.0" + "version": "==4.38.0" }, "twine": { "hashes": [ @@ -618,10 +578,10 @@ }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", + "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" ], - "version": "==1.25.6" + "version": "==1.25.7" }, "wcwidth": { "hashes": [ From bce0eeab6486e2a34a1ef25983f096f0eecdb3e8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2019 06:57:10 +0000 Subject: [PATCH 0450/2998] Bump pytest from 5.2.3 to 5.3.1 Bumps [pytest](https://github.com/pytest-dev/pytest) from 5.2.3 to 5.3.1. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/5.2.3...5.3.1) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index ce96ffe2aa..a48925f21d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -99,13 +99,6 @@ ], "version": "==1.4.3" }, - "atomicwrites": { - "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" - ], - "version": "==1.3.0" - }, "attrs": { "hashes": [ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", @@ -288,10 +281,10 @@ }, "pbr": { "hashes": [ - "sha256:2c8e420cd4ed4cec4e7999ee47409e876af575d4c35a45840d59e8b5f3155ab8", - "sha256:b32c8ccaac7b1a20c0ce00ce317642e6cf231cf038f9875e0280e28af5bf7ac9" + "sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b", + "sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488" ], - "version": "==5.4.3" + "version": "==5.4.4" }, "pillow": { "hashes": [ @@ -338,10 +331,10 @@ }, "pluggy": { "hashes": [ - "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", - "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], - "version": "==0.13.0" + "version": "==0.13.1" }, "py": { "hashes": [ @@ -366,10 +359,10 @@ }, "pygments": { "hashes": [ - "sha256:71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127", - "sha256:881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297" + "sha256:83ec6c6133ca6b529b7ff5aa826328fd14b5bb02a58c37f4f06384e96a0f94ab", + "sha256:b7949de3d396836085fea596998b135a22610bbcc4f2abfe9e448e44cbc58388" ], - "version": "==2.4.2" + "version": "==2.5.1" }, "pyparsing": { "hashes": [ @@ -380,11 +373,11 @@ }, "pytest": { "hashes": [ - "sha256:15837d2880cb94821087bc07476892ea740696b20e90288fd6c19e44b435abdb", - "sha256:b6cf7ad9064049ee486586b3a0ddd70dc5136c40e1147e7d286efd77ba66c5eb" + "sha256:63344a2e3bce2e4d522fd62b4fdebb647c019f1f9e4ca075debbd13219db4418", + "sha256:f67403f33b2b1d25a6756184077394167fe5e2f9d8bdaab30707d19ccec35427" ], "index": "pypi", - "version": "==5.2.3" + "version": "==5.3.1" }, "pytest-rerunfailures": { "hashes": [ @@ -538,10 +531,10 @@ }, "tqdm": { "hashes": [ - "sha256:9de4722323451eb7818deb0161d9d5523465353a6707a9f500d97ee42919b902", - "sha256:c1d677f3a85fa291b34bdf8f770f877119b9754b32673699653556f85e2c2f13" + "sha256:5a1f3d58f3eb53264387394387fe23df469d2a3fab98c9e7f99d5c146c119873", + "sha256:f1a1613fee07cc30a253051617f2a219a785c58877f9f6bfa129446cbaf8b4c1" ], - "version": "==4.38.0" + "version": "==4.39.0" }, "twine": { "hashes": [ From 3f87c429932e7b8918450f4ffd22d25bf48f041f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2019 07:03:23 +0000 Subject: [PATCH 0451/2998] Bump pytest-rerunfailures from 7.0 to 8.0 Bumps [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) from 7.0 to 8.0. - [Release notes](https://github.com/pytest-dev/pytest-rerunfailures/releases) - [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst) - [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/7.0...8.0) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index a48925f21d..1c93192a39 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -381,11 +381,11 @@ }, "pytest-rerunfailures": { "hashes": [ - "sha256:1180a0f98975e1e1a2e055c87c1159cbd3bace8ceb71b1e7ffe4ace6121e7801", - "sha256:f3c9cf31339bf87b048c09dadb633a81156fa4899527fffc55cde105d04ed5fd" + "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812", + "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4" ], "index": "pypi", - "version": "==7.0" + "version": "==8.0" }, "pytz": { "hashes": [ From 496f6ba1843e49733c29b7839a2aedde0798767f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2019 06:54:30 +0000 Subject: [PATCH 0452/2998] Bump sphinx from 2.2.1 to 2.2.2 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.2.1...v2.2.2) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 73 ++++++++++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 45 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 1c93192a39..c06576f1db 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -52,21 +52,19 @@ }, "pyyaml": { "hashes": [ - "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", - "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", - "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", - "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", - "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", - "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", - "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", - "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", - "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", - "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", - "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", - "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", - "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" - ], - "version": "==5.1.2" + "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", + "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", + "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", + "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", + "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", + "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", + "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", + "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", + "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", + "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", + "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" + ], + "version": "==5.2" } }, "develop": { @@ -130,10 +128,10 @@ }, "certifi": { "hashes": [ - "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", - "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" + "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", + "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" ], - "version": "==2019.9.11" + "version": "==2019.11.28" }, "chardet": { "hashes": [ @@ -196,14 +194,6 @@ ], "version": "==1.1.0" }, - "importlib-metadata": { - "hashes": [ - "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", - "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" - ], - "markers": "python_version < '3.8'", - "version": "==0.23" - }, "isort": { "hashes": [ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", @@ -261,10 +251,10 @@ }, "more-itertools": { "hashes": [ - "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", - "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + "sha256:53ff73f186307d9c8ef17a9600309154a6ae27f25579e80af4db8f047ba14bc2", + "sha256:a0ea684c39bc4315ba7aae406596ef191fd84f873d2d2751f84d64e81a7a2d45" ], - "version": "==7.2.0" + "version": "==8.0.0" }, "packaging": { "hashes": [ @@ -359,10 +349,10 @@ }, "pygments": { "hashes": [ - "sha256:83ec6c6133ca6b529b7ff5aa826328fd14b5bb02a58c37f4f06384e96a0f94ab", - "sha256:b7949de3d396836085fea596998b135a22610bbcc4f2abfe9e448e44cbc58388" + "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", + "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" ], - "version": "==2.5.1" + "version": "==2.5.2" }, "pyparsing": { "hashes": [ @@ -455,11 +445,11 @@ }, "sphinx": { "hashes": [ - "sha256:31088dfb95359384b1005619827eaee3056243798c62724fd3fa4b84ee4d71bd", - "sha256:52286a0b9d7caa31efee301ec4300dbdab23c3b05da1c9024b4e84896fb73d79" + "sha256:3b16e48e791a322d584489ab28d8800652123d1fbfdd173e2965a31d40bf22d7", + "sha256:559c1a8ed1365a982f77650720b41114414139a635692a23c2990824d0a84cf2" ], "index": "pypi", - "version": "==2.2.1" + "version": "==2.2.2" }, "sphinx-issues": { "hashes": [ @@ -531,10 +521,10 @@ }, "tqdm": { "hashes": [ - "sha256:5a1f3d58f3eb53264387394387fe23df469d2a3fab98c9e7f99d5c146c119873", - "sha256:f1a1613fee07cc30a253051617f2a219a785c58877f9f6bfa129446cbaf8b4c1" + "sha256:156a0565f09d1f0ef8242932a0e1302462c93827a87ba7b4423d90f01befe94c", + "sha256:c0ffb55959ea5f3eaeece8d2db0651ba9ced9c72f40a6cce3419330256234289" ], - "version": "==4.39.0" + "version": "==4.40.0" }, "twine": { "hashes": [ @@ -589,13 +579,6 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" - }, - "zipp": { - "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" - ], - "version": "==0.6.0" } } } From 53c864c6f264a9219c542eeb9dc4eed4969aae65 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2019 07:01:27 +0000 Subject: [PATCH 0453/2998] Bump sphinx from 2.2.2 to 2.3.0 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.2.2 to 2.3.0. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.2.2...v2.3.0) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index c06576f1db..7976f909dc 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -251,10 +251,10 @@ }, "more-itertools": { "hashes": [ - "sha256:53ff73f186307d9c8ef17a9600309154a6ae27f25579e80af4db8f047ba14bc2", - "sha256:a0ea684c39bc4315ba7aae406596ef191fd84f873d2d2751f84d64e81a7a2d45" + "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d", + "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564" ], - "version": "==8.0.0" + "version": "==8.0.2" }, "packaging": { "hashes": [ @@ -393,21 +393,19 @@ }, "regex": { "hashes": [ - "sha256:15454b37c5a278f46f7aa2d9339bda450c300617ca2fca6558d05d870245edc7", - "sha256:1ad40708c255943a227e778b022c6497c129ad614bb7a2a2f916e12e8a359ee7", - "sha256:5e00f65cc507d13ab4dfa92c1232d004fa202c1d43a32a13940ab8a5afe2fb96", - "sha256:604dc563a02a74d70ae1f55208ddc9bfb6d9f470f6d1a5054c4bd5ae58744ab1", - "sha256:720e34a539a76a1fedcebe4397290604cc2bdf6f81eca44adb9fb2ea071c0c69", - "sha256:7caf47e4a9ac6ef08cabd3442cc4ca3386db141fb3c8b2a7e202d0470028e910", - "sha256:7faf534c1841c09d8fefa60ccde7b9903c9b528853ecf41628689793290ca143", - "sha256:b4e0406d822aa4993ac45072a584d57aa4931cf8288b5455bbf30c1d59dbad59", - "sha256:c31eaf28c6fe75ea329add0022efeed249e37861c19681960f99bbc7db981fb2", - "sha256:c7393597191fc2043c744db021643549061e12abe0b3ff5c429d806de7b93b66", - "sha256:d2b302f8cdd82c8f48e9de749d1d17f85ce9a0f082880b9a4859f66b07037dc6", - "sha256:e3d8dd0ec0ea280cf89026b0898971f5750a7bd92cb62c51af5a52abd020054a", - "sha256:ec032cbfed59bd5a4b8eab943c310acfaaa81394e14f44454ad5c9eba4f24a74" - ], - "version": "==2019.11.1" + "sha256:3dbd8333fd2ebd50977ac8747385a73aa1f546eb6b16fcd83d274470fe11f243", + "sha256:40b7d1291a56897927e08bb973f8c186c2feb14c7f708bfe7aaee09483e85a20", + "sha256:719978a9145d59fc78509ea1d1bb74243f93583ef2a34dcc5623cf8118ae9726", + "sha256:75cf3796f89f75f83207a5c6a6e14eaf57e0369ef0ffff8e22bf36bbcfa0f1de", + "sha256:77396cf80be8b2a35db863cca4c1a902d88ceeb183adab328b81184e71a5eafe", + "sha256:77a3799152951d6d14ae5720ca162c97c64f85d4755da585418eac216b736cad", + "sha256:91235c98283d2bddf1a588f0fbc2da8afa37959294bbd18b76297bdf316ba4d6", + "sha256:aaffd68c4c1ed891366d5c390081f4bf6337595e76a157baf453603d8e53fbcb", + "sha256:ad9e3c7260809c0d1ded100269f78ea0217c0704f1eaaf40a382008461848b45", + "sha256:c203c9ee755e9656d0af8fab82754d5a664ebaf707b3f883c7eff6a3dd5151cf", + "sha256:e865bc508e316a3a09d36c8621596e6599a203bc54f1cd41020a127ccdac468a" + ], + "version": "==2019.12.9" }, "requests": { "hashes": [ @@ -445,11 +443,11 @@ }, "sphinx": { "hashes": [ - "sha256:3b16e48e791a322d584489ab28d8800652123d1fbfdd173e2965a31d40bf22d7", - "sha256:559c1a8ed1365a982f77650720b41114414139a635692a23c2990824d0a84cf2" + "sha256:0a11e2fd31fe5c7e64b4fc53c2c022946512f021d603eb41ac6ae51d5fcbb574", + "sha256:138e39aa10f28d52aa5759fc6d1cba2be6a4b750010974047fa7d0e31addcf63" ], "index": "pypi", - "version": "==2.2.2" + "version": "==2.3.0" }, "sphinx-issues": { "hashes": [ @@ -521,10 +519,10 @@ }, "tqdm": { "hashes": [ - "sha256:156a0565f09d1f0ef8242932a0e1302462c93827a87ba7b4423d90f01befe94c", - "sha256:c0ffb55959ea5f3eaeece8d2db0651ba9ced9c72f40a6cce3419330256234289" + "sha256:7543892c59720e36e4212180274d8f58dde36803bc1f6370fd09afa20b8f5892", + "sha256:f0ab01cf3ae5673d18f918700c0165e5fad0f26b5ebe4b34f62ead92686b5340" ], - "version": "==4.40.0" + "version": "==4.40.2" }, "twine": { "hashes": [ From 32fb3fcb12ee46cf0defe46d04af68df527058f4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2019 07:00:01 +0000 Subject: [PATCH 0454/2998] Bump pytest from 5.3.1 to 5.3.2 Bumps [pytest](https://github.com/pytest-dev/pytest) from 5.3.1 to 5.3.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/5.3.1...5.3.2) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 7976f909dc..b158402470 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -363,11 +363,11 @@ }, "pytest": { "hashes": [ - "sha256:63344a2e3bce2e4d522fd62b4fdebb647c019f1f9e4ca075debbd13219db4418", - "sha256:f67403f33b2b1d25a6756184077394167fe5e2f9d8bdaab30707d19ccec35427" + "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", + "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" ], "index": "pypi", - "version": "==5.3.1" + "version": "==5.3.2" }, "pytest-rerunfailures": { "hashes": [ From fdb7c525c4e083ba01377f2964017ea42a72d5c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 18 Dec 2019 07:40:57 -0600 Subject: [PATCH 0455/2998] travis: Only test in master and PRs See also: https://stackoverflow.com/q/31882306 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e24127dbe5..b467b82305 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ python: - 3.7 - pypy - pypy3 +if: (type = push AND branch IN (master)) OR (type = pull_request) env: global: - RETRY_TIMEOUT_SECONDS=15 From ef64319ec31fbf03e2215198a4efa779cca3e312 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2019 13:40:33 +0000 Subject: [PATCH 0456/2998] Bump twine from 2.0.0 to 3.1.1 Bumps [twine](https://github.com/pypa/twine) from 2.0.0 to 3.1.1. - [Release notes](https://github.com/pypa/twine/releases) - [Changelog](https://github.com/pypa/twine/blob/master/docs/changelog.rst) - [Commits](https://github.com/pypa/twine/compare/2.0.0...3.1.1) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 134 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 118 insertions(+), 16 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index b158402470..bc73d5c841 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -133,6 +133,44 @@ ], "version": "==2019.11.28" }, + "cffi": { + "hashes": [ + "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42", + "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04", + "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5", + "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54", + "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba", + "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57", + "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396", + "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12", + "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97", + "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43", + "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db", + "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3", + "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b", + "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579", + "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346", + "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159", + "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652", + "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e", + "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a", + "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506", + "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f", + "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d", + "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c", + "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20", + "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858", + "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc", + "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a", + "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3", + "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e", + "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410", + "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25", + "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b", + "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d" + ], + "version": "==1.13.2" + }, "chardet": { "hashes": [ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", @@ -148,6 +186,32 @@ "index": "pypi", "version": "==7.0" }, + "cryptography": { + "hashes": [ + "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", + "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", + "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", + "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", + "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", + "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", + "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", + "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", + "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", + "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", + "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", + "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", + "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", + "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", + "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", + "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", + "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", + "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", + "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", + "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", + "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" + ], + "version": "==2.8" + }, "doc8": { "hashes": [ "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", @@ -202,6 +266,13 @@ "index": "pypi", "version": "==4.3.21" }, + "jeepney": { + "hashes": [ + "sha256:13806f91a96e9b2623fd2a81b950d763ee471454aafd9eb6d75dbe7afce428fb", + "sha256:f6a3f93464a0cf052f4e87da3c8b3ed1e27696758fb9739c63d3a74d9a1b6774" + ], + "version": "==0.4.1" + }, "jinja2": { "hashes": [ "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", @@ -209,6 +280,13 @@ ], "version": "==2.10.3" }, + "keyring": { + "hashes": [ + "sha256:a3f71fc0cf6b74e201e70532879ba1d15db25cb2c7407dce52fe52a6d5fc7b66", + "sha256:fc9cadedae35b77141f670f84c10a657147d2e526348698c93dd77f039979729" + ], + "version": "==20.0.0" + }, "markupsafe": { "hashes": [ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", @@ -340,6 +418,12 @@ ], "version": "==2.5.0" }, + "pycparser": { + "hashes": [ + "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + ], + "version": "==2.19" + }, "pyflakes": { "hashes": [ "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", @@ -393,19 +477,29 @@ }, "regex": { "hashes": [ - "sha256:3dbd8333fd2ebd50977ac8747385a73aa1f546eb6b16fcd83d274470fe11f243", - "sha256:40b7d1291a56897927e08bb973f8c186c2feb14c7f708bfe7aaee09483e85a20", - "sha256:719978a9145d59fc78509ea1d1bb74243f93583ef2a34dcc5623cf8118ae9726", - "sha256:75cf3796f89f75f83207a5c6a6e14eaf57e0369ef0ffff8e22bf36bbcfa0f1de", - "sha256:77396cf80be8b2a35db863cca4c1a902d88ceeb183adab328b81184e71a5eafe", - "sha256:77a3799152951d6d14ae5720ca162c97c64f85d4755da585418eac216b736cad", - "sha256:91235c98283d2bddf1a588f0fbc2da8afa37959294bbd18b76297bdf316ba4d6", - "sha256:aaffd68c4c1ed891366d5c390081f4bf6337595e76a157baf453603d8e53fbcb", - "sha256:ad9e3c7260809c0d1ded100269f78ea0217c0704f1eaaf40a382008461848b45", - "sha256:c203c9ee755e9656d0af8fab82754d5a664ebaf707b3f883c7eff6a3dd5151cf", - "sha256:e865bc508e316a3a09d36c8621596e6599a203bc54f1cd41020a127ccdac468a" - ], - "version": "==2019.12.9" + "sha256:0472acc4b6319801c1bc681d838c88ba1446f9ae199e01f6e41091c701fb3d42", + "sha256:16709434c4e2332ee8ba26ae339aceb8ab0b24b8398ebd0f52ebc943f45c4fc2", + "sha256:223fb63ec8dcab20b3318e93dcec4aee89e98b062934090bf29ffc374d2000a2", + "sha256:23c3ebf05d1cd3adb26723fd598e75724e0cdb7d6a35185ac0caf061cc6edb49", + "sha256:2404a50fb48badaf214b700f08822b68d93d79200e0aefd9569d0332d21fbfcb", + "sha256:2af3a7a16fed6eff85c25da106effa36f61cbbe801d00ade349b53ce7619eb15", + "sha256:37e018d3746baf159aedfc9773c3cafacbd10d354ba15484f5cfc8ed9da5748b", + "sha256:3c9c2988d02a9238a1975c70e87c6ce94e6f36dd8e372b66f468990cfe077434", + "sha256:47298bc8b89d1c747f0f5974aa528fc0b6b17396f1694136a224d51461279d83", + "sha256:4eeb0fe936797ae00a085f99802642bfc722b3b4ea557e9e7849cb621ea10c91", + "sha256:6881be0218b47ed76db033f252bab3f912dfe7ed1fe7baa9daebf51de08546a0", + "sha256:7ac08cee5055f548eed3889e9aaef15fd00172d037949496f1f0b34acb8a7c3e", + "sha256:7c5e2efcf079c35ff266c3f3a6708834f88f9fd04a3c16b855e036b2b7b1b543", + "sha256:8355eaa64724a0fdb010a1654b77cb3e375dc08b7f592cc4a1c05ac606aa481c", + "sha256:999a885f7f5194464238ad5d74b05982acee54002f3aa775d8e0e8c5fb74c06c", + "sha256:9fd2f4813eaa3e421e82819d38e5b634d900faff7ae5a80cd89ccff407175e69", + "sha256:a2e1e53df7dd27943da2b512895125b33fb20f81862c9fed7b3bab2a1de684d1", + "sha256:ab43bc0836820b7900dfffc025b996784aec26ec87dc1df4f95a40398760223f", + "sha256:ba449b56fa419fb19bf2a2438adbd2433f27087a6fe115917eaf9cfca684d5b6", + "sha256:d3f632cefad2cf247bd845794002585e3772288bfcb0dbac59fdecd32cd38b67", + "sha256:d51311496061863caae2cfe120cf1ef37900019b86c89c2d75f0918e0b4b8bf3" + ], + "version": "==2019.12.19" }, "requests": { "hashes": [ @@ -427,6 +521,14 @@ ], "version": "==1.3.0" }, + "secretstorage": { + "hashes": [ + "sha256:20c797ae48a4419f66f8d28fc221623f11fc45b6828f96bdb1ad9990acb59f92", + "sha256:7a119fb52a88e398dbb22a4b3eb39b779bfbace7e4153b7bc6e5954d86282a8a" + ], + "markers": "sys_platform == 'linux'", + "version": "==3.1.1" + }, "six": { "hashes": [ "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", @@ -526,11 +628,11 @@ }, "twine": { "hashes": [ - "sha256:5319dd3e02ac73fcddcd94f035b9631589ab5d23e1f4699d57365199d85261e1", - "sha256:9fe7091715c7576df166df8ef6654e61bada39571783f2fd415bdcba867c6993" + "sha256:c1af8ca391e43b0a06bbc155f7f67db0bf0d19d284bfc88d1675da497a946124", + "sha256:d561a5e511f70275e5a485a6275ff61851c16ffcb3a95a602189161112d9f160" ], "index": "pypi", - "version": "==2.0.0" + "version": "==3.1.1" }, "typed-ast": { "hashes": [ From 299407e59cf59ed1c0c10f5f5ac5e89be165bf85 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 22 Dec 2019 19:06:23 +0000 Subject: [PATCH 0457/2998] Bump colorama from 0.4.1 to 0.4.3 Bumps [colorama](https://github.com/tartley/colorama) from 0.4.1 to 0.4.3. - [Release notes](https://github.com/tartley/colorama/releases) - [Changelog](https://github.com/tartley/colorama/blob/master/CHANGELOG.rst) - [Commits](https://github.com/tartley/colorama/compare/0.4.1...0.4.3) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 58 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index bc73d5c841..434c1f29a5 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -26,11 +26,11 @@ }, "colorama": { "hashes": [ - "sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", - "sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48" + "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", + "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" ], "index": "pypi", - "version": "==0.4.1" + "version": "==0.4.3" }, "e1839a8": { "editable": true, @@ -477,29 +477,29 @@ }, "regex": { "hashes": [ - "sha256:0472acc4b6319801c1bc681d838c88ba1446f9ae199e01f6e41091c701fb3d42", - "sha256:16709434c4e2332ee8ba26ae339aceb8ab0b24b8398ebd0f52ebc943f45c4fc2", - "sha256:223fb63ec8dcab20b3318e93dcec4aee89e98b062934090bf29ffc374d2000a2", - "sha256:23c3ebf05d1cd3adb26723fd598e75724e0cdb7d6a35185ac0caf061cc6edb49", - "sha256:2404a50fb48badaf214b700f08822b68d93d79200e0aefd9569d0332d21fbfcb", - "sha256:2af3a7a16fed6eff85c25da106effa36f61cbbe801d00ade349b53ce7619eb15", - "sha256:37e018d3746baf159aedfc9773c3cafacbd10d354ba15484f5cfc8ed9da5748b", - "sha256:3c9c2988d02a9238a1975c70e87c6ce94e6f36dd8e372b66f468990cfe077434", - "sha256:47298bc8b89d1c747f0f5974aa528fc0b6b17396f1694136a224d51461279d83", - "sha256:4eeb0fe936797ae00a085f99802642bfc722b3b4ea557e9e7849cb621ea10c91", - "sha256:6881be0218b47ed76db033f252bab3f912dfe7ed1fe7baa9daebf51de08546a0", - "sha256:7ac08cee5055f548eed3889e9aaef15fd00172d037949496f1f0b34acb8a7c3e", - "sha256:7c5e2efcf079c35ff266c3f3a6708834f88f9fd04a3c16b855e036b2b7b1b543", - "sha256:8355eaa64724a0fdb010a1654b77cb3e375dc08b7f592cc4a1c05ac606aa481c", - "sha256:999a885f7f5194464238ad5d74b05982acee54002f3aa775d8e0e8c5fb74c06c", - "sha256:9fd2f4813eaa3e421e82819d38e5b634d900faff7ae5a80cd89ccff407175e69", - "sha256:a2e1e53df7dd27943da2b512895125b33fb20f81862c9fed7b3bab2a1de684d1", - "sha256:ab43bc0836820b7900dfffc025b996784aec26ec87dc1df4f95a40398760223f", - "sha256:ba449b56fa419fb19bf2a2438adbd2433f27087a6fe115917eaf9cfca684d5b6", - "sha256:d3f632cefad2cf247bd845794002585e3772288bfcb0dbac59fdecd32cd38b67", - "sha256:d51311496061863caae2cfe120cf1ef37900019b86c89c2d75f0918e0b4b8bf3" - ], - "version": "==2019.12.19" + "sha256:032fdcc03406e1a6485ec09b826eac78732943840c4b29e503b789716f051d8d", + "sha256:0e6cf1e747f383f52a0964452658c04300a9a01e8a89c55ea22813931b580aa8", + "sha256:106e25a841921d8259dcef2a42786caae35bc750fb996f830065b3dfaa67b77e", + "sha256:1768cf42a78a11dae63152685e7a1d90af7a8d71d2d4f6d2387edea53a9e0588", + "sha256:27d1bd20d334f50b7ef078eba0f0756a640fd25f5f1708d3b5bed18a5d6bced9", + "sha256:29b20f66f2e044aafba86ecf10a84e611b4667643c42baa004247f5dfef4f90b", + "sha256:4850c78b53acf664a6578bba0e9ebeaf2807bb476c14ec7e0f936f2015133cae", + "sha256:57eacd38a5ec40ed7b19a968a9d01c0d977bda55664210be713e750dd7b33540", + "sha256:724eb24b92fc5fdc1501a1b4df44a68b9c1dda171c8ef8736799e903fb100f63", + "sha256:77ae8d926f38700432807ba293d768ba9e7652df0cbe76df2843b12f80f68885", + "sha256:78b3712ec529b2a71731fbb10b907b54d9c53a17ca589b42a578bc1e9a2c82ea", + "sha256:7bbbdbada3078dc360d4692a9b28479f569db7fc7f304b668787afc9feb38ec8", + "sha256:8d9ef7f6c403e35e73b7fc3cde9f6decdc43b1cb2ff8d058c53b9084bfcb553e", + "sha256:a83049eb717ae828ced9cf607845929efcb086a001fc8af93ff15c50012a5716", + "sha256:adc35d38952e688535980ae2109cad3a109520033642e759f987cf47fe278aa1", + "sha256:c29a77ad4463f71a506515d9ec3a899ed026b4b015bf43245c919ff36275444b", + "sha256:cfd31b3300fefa5eecb2fe596c6dee1b91b3a05ece9d5cfd2631afebf6c6fadd", + "sha256:d3ee0b035816e0520fac928de31b6572106f0d75597f6fa3206969a02baba06f", + "sha256:d508875793efdf6bab3d47850df8f40d4040ae9928d9d80864c1768d6aeaf8e3", + "sha256:ef0b828a7e22e58e06a1cceddba7b4665c6af8afeb22a0d8083001330572c147", + "sha256:faad39fdbe2c2ccda9846cd21581063086330efafa47d87afea4073a08128656" + ], + "version": "==2019.12.20" }, "requests": { "hashes": [ @@ -621,10 +621,10 @@ }, "tqdm": { "hashes": [ - "sha256:7543892c59720e36e4212180274d8f58dde36803bc1f6370fd09afa20b8f5892", - "sha256:f0ab01cf3ae5673d18f918700c0165e5fad0f26b5ebe4b34f62ead92686b5340" + "sha256:166a82cdea964ae45528e0cc89436255ff2be73dc848bdf239f13c501cae5dc7", + "sha256:9036904496bd2afacf836a6f206c5a766ce11d3e9319d54a4e794c0f34b111dc" ], - "version": "==4.40.2" + "version": "==4.41.0" }, "twine": { "hashes": [ From 295ba0505b2c4b4c19b055d34fb06a95dd929298 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2019 07:03:58 +0000 Subject: [PATCH 0458/2998] Bump sphinx from 2.3.0 to 2.3.1 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.3.0 to 2.3.1. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.3.0...v2.3.1) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 434c1f29a5..a299507253 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -545,11 +545,11 @@ }, "sphinx": { "hashes": [ - "sha256:0a11e2fd31fe5c7e64b4fc53c2c022946512f021d603eb41ac6ae51d5fcbb574", - "sha256:138e39aa10f28d52aa5759fc6d1cba2be6a4b750010974047fa7d0e31addcf63" + "sha256:298537cb3234578b2d954ff18c5608468229e116a9757af3b831c2b2b4819159", + "sha256:e6e766b74f85f37a5f3e0773a1e1be8db3fcb799deb58ca6d18b70b0b44542a5" ], "index": "pypi", - "version": "==2.3.0" + "version": "==2.3.1" }, "sphinx-issues": { "hashes": [ From c8b247e8cc4b64c24607d9e284227dee2ad71b07 Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Wed, 4 Dec 2019 18:49:42 +1100 Subject: [PATCH 0459/2998] Fix small typo: mimicing -> mimicking Closes #518 --- tests/test_workspacebuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 6085ea46d4..4aab73dafe 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -458,7 +458,7 @@ def test_start_directory(session, tmpdir): def test_start_directory_relative(session, tmpdir): - """Same as above test, but with relative start directory, mimicing + """Same as above test, but with relative start directory, mimicking loading it from a location of project file. Like:: $ tmuxp load ~/workspace/myproject/.tmuxp.yaml From 9cb7e59e4cb842507e9c6cd70693a76151cf90b7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 16:08:00 -0600 Subject: [PATCH 0460/2998] Updates to CHANGES --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index 15a0552777..ec62760077 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,14 @@ Changelog Here you can find the recent changes to tmuxp +current +------- +- :issue:`519` Fix typo, thanks @timgates42 +- :issue:`506` Fix Makefile typo, thanks @wolfgangpfnuer +- Travis: Only run on master and PRs one time +- Travis: Add caching for tmux builds +- Travis: Test 2.9 and 3.0a + 1.5.4 <2019-11-06> ------------------ - :issue:`500`: Fix window focus From 8d796d6a2f7eb193042111c2cce3b67a1c775a8a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 10:14:06 -0600 Subject: [PATCH 0461/2998] travis: Upgrade from xenial, default (16.04) -> Bionic (18.04) See also: https://docs.travis-ci.com/user/reference/overview/ --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index b467b82305..860ca8d901 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: python sudo: false +dist: bionic # 18.04 python: - 2.7 - 3.6 From d51b9138cdb6ec1be01c7c5abdcc802a87513e8e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 10:21:47 -0600 Subject: [PATCH 0462/2998] travis: Add pip to cache --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 860ca8d901..41e6817523 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,8 @@ env: matrix: allow_failures: - env: TMUX_VERSION=master - +cache: + - pip before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 From a2537048aa7cac1838b786f16c4a4e7949236d4f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 10:35:12 -0600 Subject: [PATCH 0463/2998] travis: Remove pypy, keep pypy3 See also: https://docs.travis-ci.com/user/reference/bionic/ --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 41e6817523..c3be824e16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ python: - 2.7 - 3.6 - 3.7 - - pypy - pypy3 if: (type = push AND branch IN (master)) OR (type = pull_request) env: From a1041d34b43f1c2536f1d01012bddde62a4f0b50 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 10:43:46 -0600 Subject: [PATCH 0464/2998] travis: Cache directories for build --- .travis.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index c3be824e16..43c3fc7062 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,9 @@ matrix: - env: TMUX_VERSION=master cache: - pip + - directories: + - ~/source + - ~/build before_install: - export PIP_USE_MIRRORS=true - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 @@ -37,13 +40,15 @@ install: - pip install -e . - pip install -r requirements/test.txt before_script: - - git clone https://github.com/tmux/tmux.git tmux - - cd tmux + - mkdir -p ~/source + - mkdir -p ~/build/tmux-$TMUX_VERSION + - if [[ ! -d ~/source/tmux-$TMUX_VERSION ]]; then git clone https://github.com/tmux/tmux.git ~/source/tmux-$TMUX_VERSION; fi + - cd ~/source/tmux-$TMUX_VERSION - git checkout $TMUX_VERSION - - sh autogen.sh - - ./configure --prefix=$HOME/tmux && make && make install - - export PATH=$HOME/tmux/bin:$PATH - - cd .. + - export PATH=$HOME/build/tmux-$TMUX_VERSION/bin:$PATH + - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then sh autogen.sh; fi + - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then ./configure --prefix=$HOME/build/tmux-$TMUX_VERSION && make && make install; fi + - cd $TRAVIS_BUILD_DIR - tmux -V script: - py.test --cov From c667ab32a341bbd8da3450e5aa2b14429abc9acf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 15:58:06 -0600 Subject: [PATCH 0465/2998] travis: Add version 2.9, 3.0a --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 43c3fc7062..0d5aecb4b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,9 @@ env: - RETRY_TIMEOUT_SECONDS=15 matrix: - TMUX_VERSION=master + - TMUX_VERSION=3.0a + - TMUX_VERSION=2.9 + - TMUX_VERSION=2.8 - TMUX_VERSION=2.8 - TMUX_VERSION=2.7 - TMUX_VERSION=2.6 From 5822253f07c6842e1b8a9a63e9f2d97e9af3949a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 17:31:05 -0600 Subject: [PATCH 0466/2998] travis: Just test 2.7, 3.7 and pypy3 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0d5aecb4b7..d652101aff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ sudo: false dist: bionic # 18.04 python: - 2.7 - - 3.6 - 3.7 - pypy3 if: (type = push AND branch IN (master)) OR (type = pull_request) From df3f82eb4f22ae24352a87691fb3bdc44f238651 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 17:31:32 -0600 Subject: [PATCH 0467/2998] Remove python 3.3 and 3.4 from trove classifiers --- setup.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.py b/setup.py index 6db23cdd3f..870f59dafb 100644 --- a/setup.py +++ b/setup.py @@ -68,8 +68,6 @@ def run_tests(self): 'Intended Audience :: Developers', 'Programming Language :: Python', 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', From 44c1ff4be39c0a691bb811b5bf5ac5e5136f031e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 17:33:44 -0600 Subject: [PATCH 0468/2998] README: Update python versions --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 2af73a5993..222edf402f 100644 --- a/README.rst +++ b/README.rst @@ -142,7 +142,7 @@ Project details ============== ========================================================== tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7. 2.8 -python support 2.7, >= 3.3, pypy, pypy3 +python support 2.7, >= 3.5, pypy, pypy3 config support yaml, json, python dict Source https://github.com/tmux-python/tmuxp Docs http://tmuxp.git-pull.com From c168eca098871b555950bc68f54cb2dccaefe62a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Dec 2019 17:33:50 -0600 Subject: [PATCH 0469/2998] Developer docs: Update travis docs --- doc/developing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/developing.rst b/doc/developing.rst index 358a765c65..faa749bb2d 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -228,9 +228,9 @@ Travis CI tmuxp uses `travis-ci`_ for continuous integration / automatic unit testing. -tmuxp is tested against tmux 1.8 and the latest git source. Interpretters -tested are 2.6, 2.7 and 3.3. The `travis build site`_ uses this -`.travis.yml`_ configuration: +To view the tmux and python versions tested see the `.travis.yml`_. +Builds are done on ``master`` and pull requests and can be viewed on +the `travis build site`_. Testing options --------------- From e8a6e01712e6c134757ff1ba5785f59835174e3a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:07:00 -0600 Subject: [PATCH 0470/2998] Remove outdated setup.py test invocation for pytest See also: - http://doc.pytest.org/en/5.3.2/changelog.html#pytest-3-6-2-2018-06-20 - https://github.com/pytest-dev/pytest/pull/3552 --- setup.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/setup.py b/setup.py index 870f59dafb..170098ac5c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,6 @@ import sys from setuptools import setup -from setuptools.command.test import test as TestCommand about = {} with open("tmuxp/__about__.py") as fp: @@ -22,20 +21,6 @@ history = open('CHANGES').read().replace('.. :changelog:', '') -class PyTest(TestCommand): - user_options = [('pytest-args=', 'a', "Arguments to pass to py.test")] - - def initialize_options(self): - TestCommand.initialize_options(self) - self.pytest_args = [] - - def run_tests(self): - import pytest - - errno = pytest.main(self.pytest_args) - sys.exit(errno) - - setup( name=about['__title__'], version=about['__version__'], @@ -55,7 +40,6 @@ def run_tests(self): include_package_data=True, install_requires=install_reqs, tests_require=tests_reqs, - cmdclass={'test': PyTest}, zip_safe=False, keywords=about['__title__'], entry_points=dict(console_scripts=['tmuxp=tmuxp:cli.cli']), From 039628356ffbb577e5f65fc270a5b0c4bc7cb3cc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:47:48 -0600 Subject: [PATCH 0471/2998] flake8: Fix bare except in try/catch --- doc/_ext/aafig.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/_ext/aafig.py b/doc/_ext/aafig.py index 8cb1a35ba8..5b27529f2e 100644 --- a/doc/_ext/aafig.py +++ b/doc/_ext/aafig.py @@ -183,7 +183,7 @@ def render_aafigure(app, text, options): try: f = open(metadata_fname, 'r') extra = f.read() - except: + except Exception: raise AafigError() finally: if f is not None: From 05a3000e6ab381ca675f6ae7cd576cf4b0cd6bd3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:48:14 -0600 Subject: [PATCH 0472/2998] Loosen pytest constraint in test packages --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index e58adc6ecb..06639b1591 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ -pytest>=3.9.1 +pytest<6 pytest-rerunfailures>=4.2 From ce7731d166ef58d5f8e4c2346a464fb2dac1bbe3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:48:43 -0600 Subject: [PATCH 0473/2998] Loosen pytest-rerunfailures constraint --- requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/test.txt b/requirements/test.txt index 06639b1591..2d76479b4b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,2 @@ pytest<6 -pytest-rerunfailures>=4.2 +pytest-rerunfailures<9 From 42d849416f37061cbc382cfce0789c1bdddb4517 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:49:07 -0600 Subject: [PATCH 0474/2998] Add pytest-cov and coverage to test dependencies --- requirements/test.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements/test.txt b/requirements/test.txt index 2d76479b4b..28997fc3ad 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,2 +1,4 @@ pytest<6 pytest-rerunfailures<9 +pytest-cov +coverage From 91d60a0328499a5955b5ea9d4a612fe0b47a29f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:49:13 -0600 Subject: [PATCH 0475/2998] Pipfile: Add pytest-cov and coverage to dev dependencies --- Pipfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Pipfile b/Pipfile index 7fbc443978..2c234eba44 100644 --- a/Pipfile +++ b/Pipfile @@ -25,6 +25,8 @@ libtmux = "<0.9" click = ">=7<8" colorama = "*" e1839a8 = {path = ".",editable = true} +pytest-cov = "*" +coverage = "*" [requires] python_version = "3" From 2252dc82c457e43724ebbf5134e48b32c9fc19d7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:49:25 -0600 Subject: [PATCH 0476/2998] Sync Pipfile.lock --- Pipfile.lock | 185 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 180 insertions(+), 5 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index a299507253..8bceac7e35 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "715e4d5ccbc37fb13f265a49ffa6dfe449d3f19a4a00a9e82907e058ec46d948" + "sha256": "9e5a4630695d5ce7940ab7c373736999a1bf5d0376e1de6b5199099e3d8b2901" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,13 @@ ] }, "default": { + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "version": "==19.3.0" + }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -32,10 +39,55 @@ "index": "pypi", "version": "==0.4.3" }, + "coverage": { + "hashes": [ + "sha256:0101888bd1592a20ccadae081ba10e8b204d20235d18d05c6f7d5e904a38fc10", + "sha256:04b961862334687549eb91cd5178a6fbe977ad365bddc7c60f2227f2f9880cf4", + "sha256:1ca43dbd739c0fc30b0a3637a003a0d2c7edc1dd618359d58cc1e211742f8bd1", + "sha256:1cbb88b34187bdb841f2599770b7e6ff8e259dc3bb64fc7893acf44998acf5f8", + "sha256:232f0b52a5b978288f0bbc282a6c03fe48cd19a04202df44309919c142b3bb9c", + "sha256:24bcfa86fd9ce86b73a8368383c39d919c497a06eebb888b6f0c12f13e920b1a", + "sha256:25b8f60b5c7da71e64c18888f3067d5b6f1334b9681876b2fb41eea26de881ae", + "sha256:2714160a63da18aed9340c70ed514973971ee7e665e6b336917ff4cca81a25b1", + "sha256:2ca2cd5264e84b2cafc73f0045437f70c6378c0d7dbcddc9ee3fe192c1e29e5d", + "sha256:2cc707fc9aad2592fc686d63ef72dc0031fc98b6fb921d2f5395d9ab84fbc3ef", + "sha256:348630edea485f4228233c2f310a598abf8afa5f8c716c02a9698089687b6085", + "sha256:40fbfd6b044c9db13aeec1daf5887d322c710d811f944011757526ef6e323fd9", + "sha256:46c9c6a1d1190c0b75ec7c0f339088309952b82ae8d67a79ff1319eb4e749b96", + "sha256:591506e088901bdc25620c37aec885e82cc896528f28c57e113751e3471fc314", + "sha256:5ac71bba1e07eab403b082c4428f868c1c9e26a21041436b4905c4c3d4e49b08", + "sha256:5f622f19abda4e934938e24f1d67599249abc201844933a6f01aaa8663094489", + "sha256:65bead1ac8c8930cf92a1ccaedcce19a57298547d5d1db5c9d4d068a0675c38b", + "sha256:7362a7f829feda10c7265b553455de596b83d1623b3d436b6d3c51c688c57bf6", + "sha256:7f2675750c50151f806070ec11258edf4c328340916c53bac0adbc465abd6b1e", + "sha256:960d7f42277391e8b1c0b0ae427a214e1b31a1278de6b73f8807b20c2e913bba", + "sha256:a50b0888d8a021a3342d36a6086501e30de7d840ab68fca44913e97d14487dc1", + "sha256:b7dbc5e8c39ea3ad3db22715f1b5401cd698a621218680c6daf42c2f9d36e205", + "sha256:bb3d29df5d07d5399d58a394d0ef50adf303ab4fbf66dfd25b9ef258effcb692", + "sha256:c0fff2733f7c2950f58a4fd09b5db257b00c6fec57bf3f68c5bae004d804b407", + "sha256:c792d3707a86c01c02607ae74364854220fb3e82735f631cd0a345dea6b4cee5", + "sha256:c90bda74e16bcd03861b09b1d37c0a4158feda5d5a036bb2d6e58de6ff65793e", + "sha256:cfce79ce41cc1a1dc7fc85bb41eeeb32d34a4cf39a645c717c0550287e30ff06", + "sha256:eeafb646f374988c22c8e6da5ab9fb81367ecfe81c70c292623373d2a021b1a1", + "sha256:f425f50a6dd807cb9043d15a4fcfba3b5874a54d9587ccbb748899f70dc18c47", + "sha256:fcd4459fe35a400b8f416bc57906862693c9f88b66dc925e7f2a933e77f6b18b", + "sha256:ff3936dd5feaefb4f91c8c1f50a06c588b5dc69fba4f7d9c79a6617ad80bb7df" + ], + "index": "pypi", + "version": "==5.0.1" + }, "e1839a8": { "editable": true, "path": "." }, + "importlib-metadata": { + "hashes": [ + "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", + "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" + ], + "markers": "python_version < '3.8'", + "version": "==1.3.0" + }, "kaptan": { "hashes": [ "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" @@ -50,6 +102,56 @@ "index": "pypi", "version": "==0.8.2" }, + "more-itertools": { + "hashes": [ + "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d", + "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564" + ], + "version": "==8.0.2" + }, + "packaging": { + "hashes": [ + "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", + "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + ], + "version": "==19.2" + }, + "pluggy": { + "hashes": [ + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + ], + "version": "==0.13.1" + }, + "py": { + "hashes": [ + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + ], + "version": "==1.8.0" + }, + "pyparsing": { + "hashes": [ + "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", + "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a" + ], + "version": "==2.4.5" + }, + "pytest": { + "hashes": [ + "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", + "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" + ], + "version": "==5.3.2" + }, + "pytest-cov": { + "hashes": [ + "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b", + "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626" + ], + "index": "pypi", + "version": "==2.8.1" + }, "pyyaml": { "hashes": [ "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", @@ -65,6 +167,27 @@ "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" ], "version": "==5.2" + }, + "six": { + "hashes": [ + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + ], + "version": "==1.13.0" + }, + "wcwidth": { + "hashes": [ + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + ], + "version": "==0.1.7" + }, + "zipp": { + "hashes": [ + "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", + "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + ], + "version": "==0.6.0" } }, "develop": { @@ -186,6 +309,14 @@ "index": "pypi", "version": "==7.0" }, + "colorama": { + "hashes": [ + "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", + "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" + ], + "index": "pypi", + "version": "==0.4.3" + }, "cryptography": { "hashes": [ "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", @@ -258,6 +389,14 @@ ], "version": "==1.1.0" }, + "importlib-metadata": { + "hashes": [ + "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", + "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" + ], + "markers": "python_version < '3.8'", + "version": "==1.3.0" + }, "isort": { "hashes": [ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", @@ -280,12 +419,26 @@ ], "version": "==2.10.3" }, + "kaptan": { + "hashes": [ + "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" + ], + "index": "pypi", + "version": "==0.5.12" + }, "keyring": { "hashes": [ - "sha256:a3f71fc0cf6b74e201e70532879ba1d15db25cb2c7407dce52fe52a6d5fc7b66", - "sha256:fc9cadedae35b77141f670f84c10a657147d2e526348698c93dd77f039979729" + "sha256:5f5f92327b6c7432bebc18a1b60cb3797d99b08db1f5b919b8187c37a01f1ccc", + "sha256:ad84f7fe26ab51731f089eaf1c44ebf4c5fae323653c908888a3a6212ad0bbe7" + ], + "version": "==21.0.0" + }, + "libtmux": { + "hashes": [ + "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" ], - "version": "==20.0.0" + "index": "pypi", + "version": "==0.8.2" }, "markupsafe": { "hashes": [ @@ -450,7 +603,6 @@ "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" ], - "index": "pypi", "version": "==5.3.2" }, "pytest-rerunfailures": { @@ -468,6 +620,22 @@ ], "version": "==2019.3" }, + "pyyaml": { + "hashes": [ + "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", + "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", + "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", + "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", + "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", + "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", + "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", + "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", + "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", + "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", + "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" + ], + "version": "==5.2" + }, "readme-renderer": { "hashes": [ "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", @@ -679,6 +847,13 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" + }, + "zipp": { + "hashes": [ + "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", + "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + ], + "version": "==0.6.0" } } } From b616f76ee237dd2496e33755944edc9ae0ca42e6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:51:39 -0600 Subject: [PATCH 0477/2998] travis: Remove before_install stage --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d652101aff..15b553359f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,11 +33,6 @@ cache: - directories: - ~/source - ~/build -before_install: - - export PIP_USE_MIRRORS=true - - pip install --upgrade pytest # https://github.com/travis-ci/travis-ci/issues/4873 - - pip install --upgrade pip wheel virtualenv setuptools - - pip install pytest-cov coverage codecov flake8 install: - pip install -e . - pip install -r requirements/test.txt From 3725928d4a816b6f512a2cf89fa014dc9a3cbcf2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:51:44 -0600 Subject: [PATCH 0478/2998] Pipfile: Add codecov to dev dependencies --- Pipfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Pipfile b/Pipfile index 2c234eba44..7713933496 100644 --- a/Pipfile +++ b/Pipfile @@ -27,6 +27,7 @@ colorama = "*" e1839a8 = {path = ".",editable = true} pytest-cov = "*" coverage = "*" +codecov = "*" [requires] python_version = "3" From 38f46c1252eff7bc883c3769460aae3e3c7a8f12 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:52:03 -0600 Subject: [PATCH 0479/2998] Sync Pipfile.lock --- Pipfile.lock | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/Pipfile.lock b/Pipfile.lock index 8bceac7e35..39b1f57a0a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9e5a4630695d5ce7940ab7c373736999a1bf5d0376e1de6b5199099e3d8b2901" + "sha256": "16a8ddebb088222899af5b7b21f9f0341b0290822c2eb71836ac30ad38d5fc27" }, "pipfile-spec": 6, "requires": { @@ -23,6 +23,20 @@ ], "version": "==19.3.0" }, + "certifi": { + "hashes": [ + "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", + "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + ], + "version": "==2019.11.28" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -31,6 +45,14 @@ "index": "pypi", "version": "==7.0" }, + "codecov": { + "hashes": [ + "sha256:8ed8b7c6791010d359baed66f84f061bba5bd41174bf324c31311e8737602788", + "sha256:ae00d68e18d8a20e9c3288ba3875ae03db3a8e892115bf9b83ef20507732bed4" + ], + "index": "pypi", + "version": "==2.0.15" + }, "colorama": { "hashes": [ "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", @@ -80,6 +102,13 @@ "editable": true, "path": "." }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, "importlib-metadata": { "hashes": [ "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", @@ -168,6 +197,13 @@ ], "version": "==5.2" }, + "requests": { + "hashes": [ + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + ], + "version": "==2.22.0" + }, "six": { "hashes": [ "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", @@ -175,6 +211,13 @@ ], "version": "==1.13.0" }, + "urllib3": { + "hashes": [ + "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", + "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + ], + "version": "==1.25.7" + }, "wcwidth": { "hashes": [ "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", From bed25264e3a7e56d7d6a67e1c1f7708e03606918 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:56:59 -0600 Subject: [PATCH 0480/2998] Add codecov to test packages --- requirements/test.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/test.txt b/requirements/test.txt index 28997fc3ad..87f12558c3 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -2,3 +2,4 @@ pytest<6 pytest-rerunfailures<9 pytest-cov coverage +codecov From a3c3522811dc83e02f44c07f145de0c13029814f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 15:58:11 -0600 Subject: [PATCH 0481/2998] travis: Cache apt --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 15b553359f..eb943e48dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,7 @@ matrix: - env: TMUX_VERSION=master cache: - pip + - apt - directories: - ~/source - ~/build From 540e15b2d25f84d0ca9cca4d26fb3a1884ae427b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 16:03:00 -0600 Subject: [PATCH 0482/2998] Loosen dev dependencies (flake8, isort, twine) --- requirements/dev.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/dev.txt b/requirements/dev.txt index f4075ad2f0..7b832b3f25 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ -isort>=4.3.4 -flake8>=3.5.0 -twine>=1.13.0 \ No newline at end of file +isort<5 +flake8<4 +twine From 58e42836b40f171a282e022694dffdf4856368fa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Dec 2019 16:03:18 -0600 Subject: [PATCH 0483/2998] travis: Install dev dependencies --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index eb943e48dd..5db78b70c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,7 @@ cache: install: - pip install -e . - pip install -r requirements/test.txt + - pip install -r requirements/dev.txt before_script: - mkdir -p ~/source - mkdir -p ~/build/tmux-$TMUX_VERSION From f477325a60238cd8ef996e697c54bd9ce7c0694e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 26 Dec 2019 17:11:10 -0600 Subject: [PATCH 0484/2998] travis: finish_fast --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 5db78b70c0..9f99efa044 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ env: - TMUX_VERSION=1.9a - TMUX_VERSION=1.8 matrix: + finish_fast: true allow_failures: - env: TMUX_VERSION=master cache: From 20decf02b73c2c8b47ee3975d2f1a6eccb88abe4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2020 07:15:53 +0000 Subject: [PATCH 0485/2998] Bump docutils from 0.15.2 to 0.16 Bumps [docutils](http://docutils.sourceforge.net/) from 0.15.2 to 0.16. Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 247 +++++++++++++++++++-------------------------------- 1 file changed, 90 insertions(+), 157 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 39b1f57a0a..2ea85795bd 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -109,14 +109,6 @@ ], "version": "==2.8" }, - "importlib-metadata": { - "hashes": [ - "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", - "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" - ], - "markers": "python_version < '3.8'", - "version": "==1.3.0" - }, "kaptan": { "hashes": [ "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" @@ -133,17 +125,17 @@ }, "more-itertools": { "hashes": [ - "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d", - "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564" + "sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39", + "sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288" ], - "version": "==8.0.2" + "version": "==8.1.0" }, "packaging": { "hashes": [ - "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", - "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + "sha256:aec3fdbb8bc9e4bb65f0634b9f551ced63983a529d6a8931817d52fdd0816ddb", + "sha256:fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8" ], - "version": "==19.2" + "version": "==20.0" }, "pluggy": { "hashes": [ @@ -154,17 +146,17 @@ }, "py": { "hashes": [ - "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", - "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", + "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" ], - "version": "==1.8.0" + "version": "==1.8.1" }, "pyparsing": { "hashes": [ - "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", - "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a" + "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", + "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" ], - "version": "==2.4.5" + "version": "==2.4.6" }, "pytest": { "hashes": [ @@ -183,19 +175,19 @@ }, "pyyaml": { "hashes": [ - "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", - "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", - "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", - "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", - "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", - "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", - "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", - "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", - "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", - "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", - "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" + "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6", + "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf", + "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5", + "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e", + "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811", + "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e", + "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d", + "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20", + "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689", + "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994", + "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615" ], - "version": "==5.2" + "version": "==5.3" }, "requests": { "hashes": [ @@ -220,17 +212,10 @@ }, "wcwidth": { "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", + "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" ], - "version": "==0.1.7" - }, - "zipp": { - "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" - ], - "version": "==0.6.0" + "version": "==0.1.8" } }, "develop": { @@ -272,10 +257,10 @@ }, "babel": { "hashes": [ - "sha256:af92e6106cb7c55286b25b38ad7695f8b4efb36a90ba483d7f7a6628c46158ab", - "sha256:e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28" + "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38", + "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4" ], - "version": "==2.7.0" + "version": "==2.8.0" }, "black": { "hashes": [ @@ -352,14 +337,6 @@ "index": "pypi", "version": "==7.0" }, - "colorama": { - "hashes": [ - "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", - "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" - ], - "index": "pypi", - "version": "==0.4.3" - }, "cryptography": { "hashes": [ "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", @@ -396,12 +373,11 @@ }, "docutils": { "hashes": [ - "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", - "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", - "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" + "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af", + "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc" ], "index": "pypi", - "version": "==0.15.2" + "version": "==0.16" }, "entrypoints": { "hashes": [ @@ -427,18 +403,10 @@ }, "imagesize": { "hashes": [ - "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8", - "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5" + "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1", + "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1" ], - "version": "==1.1.0" - }, - "importlib-metadata": { - "hashes": [ - "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", - "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" - ], - "markers": "python_version < '3.8'", - "version": "==1.3.0" + "version": "==1.2.0" }, "isort": { "hashes": [ @@ -450,10 +418,11 @@ }, "jeepney": { "hashes": [ - "sha256:13806f91a96e9b2623fd2a81b950d763ee471454aafd9eb6d75dbe7afce428fb", - "sha256:f6a3f93464a0cf052f4e87da3c8b3ed1e27696758fb9739c63d3a74d9a1b6774" + "sha256:0ba6d8c597e9bef1ebd18aaec595f942a264e25c1a48f164d46120eacaa2e9bb", + "sha256:6f45dce1125cf6c58a1c88123d3831f36a789f9204fbad3172eac15f8ccd08d0" ], - "version": "==0.4.1" + "markers": "sys_platform == 'linux'", + "version": "==0.4.2" }, "jinja2": { "hashes": [ @@ -462,26 +431,12 @@ ], "version": "==2.10.3" }, - "kaptan": { - "hashes": [ - "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" - ], - "index": "pypi", - "version": "==0.5.12" - }, "keyring": { "hashes": [ - "sha256:5f5f92327b6c7432bebc18a1b60cb3797d99b08db1f5b919b8187c37a01f1ccc", - "sha256:ad84f7fe26ab51731f089eaf1c44ebf4c5fae323653c908888a3a6212ad0bbe7" + "sha256:1f393f7466314068961c7e1d508120c092bd71fa54e3d93b76180b526d4abc56", + "sha256:24ae23ab2d6adc59138339e56843e33ec7b0a6b2f06302662477085c6c0aca00" ], - "version": "==21.0.0" - }, - "libtmux": { - "hashes": [ - "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" - ], - "index": "pypi", - "version": "==0.8.2" + "version": "==21.1.0" }, "markupsafe": { "hashes": [ @@ -525,23 +480,24 @@ }, "more-itertools": { "hashes": [ - "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d", - "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564" + "sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39", + "sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288" ], - "version": "==8.0.2" + "version": "==8.1.0" }, "packaging": { "hashes": [ - "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", - "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + "sha256:aec3fdbb8bc9e4bb65f0634b9f551ced63983a529d6a8931817d52fdd0816ddb", + "sha256:fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8" ], - "version": "==19.2" + "version": "==20.0" }, "pathspec": { "hashes": [ - "sha256:e285ccc8b0785beadd4c18e5708b12bb8fcf529a1e61215b3feff1d1e559ea5c" + "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424", + "sha256:562aa70af2e0d434367d9790ad37aed893de47f1693e4201fd1d3dca15d19b96" ], - "version": "==0.6.0" + "version": "==0.7.0" }, "pbr": { "hashes": [ @@ -602,10 +558,10 @@ }, "py": { "hashes": [ - "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", - "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", + "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" ], - "version": "==1.8.0" + "version": "==1.8.1" }, "pycodestyle": { "hashes": [ @@ -636,10 +592,10 @@ }, "pyparsing": { "hashes": [ - "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", - "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a" + "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", + "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" ], - "version": "==2.4.5" + "version": "==2.4.6" }, "pytest": { "hashes": [ @@ -663,22 +619,6 @@ ], "version": "==2019.3" }, - "pyyaml": { - "hashes": [ - "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", - "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", - "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", - "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", - "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", - "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", - "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", - "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", - "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", - "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", - "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" - ], - "version": "==5.2" - }, "readme-renderer": { "hashes": [ "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", @@ -688,29 +628,29 @@ }, "regex": { "hashes": [ - "sha256:032fdcc03406e1a6485ec09b826eac78732943840c4b29e503b789716f051d8d", - "sha256:0e6cf1e747f383f52a0964452658c04300a9a01e8a89c55ea22813931b580aa8", - "sha256:106e25a841921d8259dcef2a42786caae35bc750fb996f830065b3dfaa67b77e", - "sha256:1768cf42a78a11dae63152685e7a1d90af7a8d71d2d4f6d2387edea53a9e0588", - "sha256:27d1bd20d334f50b7ef078eba0f0756a640fd25f5f1708d3b5bed18a5d6bced9", - "sha256:29b20f66f2e044aafba86ecf10a84e611b4667643c42baa004247f5dfef4f90b", - "sha256:4850c78b53acf664a6578bba0e9ebeaf2807bb476c14ec7e0f936f2015133cae", - "sha256:57eacd38a5ec40ed7b19a968a9d01c0d977bda55664210be713e750dd7b33540", - "sha256:724eb24b92fc5fdc1501a1b4df44a68b9c1dda171c8ef8736799e903fb100f63", - "sha256:77ae8d926f38700432807ba293d768ba9e7652df0cbe76df2843b12f80f68885", - "sha256:78b3712ec529b2a71731fbb10b907b54d9c53a17ca589b42a578bc1e9a2c82ea", - "sha256:7bbbdbada3078dc360d4692a9b28479f569db7fc7f304b668787afc9feb38ec8", - "sha256:8d9ef7f6c403e35e73b7fc3cde9f6decdc43b1cb2ff8d058c53b9084bfcb553e", - "sha256:a83049eb717ae828ced9cf607845929efcb086a001fc8af93ff15c50012a5716", - "sha256:adc35d38952e688535980ae2109cad3a109520033642e759f987cf47fe278aa1", - "sha256:c29a77ad4463f71a506515d9ec3a899ed026b4b015bf43245c919ff36275444b", - "sha256:cfd31b3300fefa5eecb2fe596c6dee1b91b3a05ece9d5cfd2631afebf6c6fadd", - "sha256:d3ee0b035816e0520fac928de31b6572106f0d75597f6fa3206969a02baba06f", - "sha256:d508875793efdf6bab3d47850df8f40d4040ae9928d9d80864c1768d6aeaf8e3", - "sha256:ef0b828a7e22e58e06a1cceddba7b4665c6af8afeb22a0d8083001330572c147", - "sha256:faad39fdbe2c2ccda9846cd21581063086330efafa47d87afea4073a08128656" - ], - "version": "==2019.12.20" + "sha256:07b39bf943d3d2fe63d46281d8504f8df0ff3fe4c57e13d1656737950e53e525", + "sha256:0932941cdfb3afcbc26cc3bcf7c3f3d73d5a9b9c56955d432dbf8bbc147d4c5b", + "sha256:0e182d2f097ea8549a249040922fa2b92ae28be4be4895933e369a525ba36576", + "sha256:10671601ee06cf4dc1bc0b4805309040bb34c9af423c12c379c83d7895622bb5", + "sha256:23e2c2c0ff50f44877f64780b815b8fd2e003cda9ce817a7fd00dea5600c84a0", + "sha256:26ff99c980f53b3191d8931b199b29d6787c059f2e029b2b0c694343b1708c35", + "sha256:27429b8d74ba683484a06b260b7bb00f312e7c757792628ea251afdbf1434003", + "sha256:3e77409b678b21a056415da3a56abfd7c3ad03da71f3051bbcdb68cf44d3c34d", + "sha256:4e8f02d3d72ca94efc8396f8036c0d3bcc812aefc28ec70f35bb888c74a25161", + "sha256:4eae742636aec40cf7ab98171ab9400393360b97e8f9da67b1867a9ee0889b26", + "sha256:6a6ae17bf8f2d82d1e8858a47757ce389b880083c4ff2498dba17c56e6c103b9", + "sha256:6a6ba91b94427cd49cd27764679024b14a96874e0dc638ae6bdd4b1a3ce97be1", + "sha256:7bcd322935377abcc79bfe5b63c44abd0b29387f267791d566bbb566edfdd146", + "sha256:98b8ed7bb2155e2cbb8b76f627b2fd12cf4b22ab6e14873e8641f266e0fb6d8f", + "sha256:bd25bb7980917e4e70ccccd7e3b5740614f1c408a642c245019cff9d7d1b6149", + "sha256:d0f424328f9822b0323b3b6f2e4b9c90960b24743d220763c7f07071e0778351", + "sha256:d58e4606da2a41659c84baeb3cfa2e4c87a74cec89a1e7c56bee4b956f9d7461", + "sha256:e3cd21cc2840ca67de0bbe4071f79f031c81418deb544ceda93ad75ca1ee9f7b", + "sha256:e6c02171d62ed6972ca8631f6f34fa3281d51db8b326ee397b9c83093a6b7242", + "sha256:e7c7661f7276507bce416eaae22040fd91ca471b5b33c13f8ff21137ed6f248c", + "sha256:ecc6de77df3ef68fee966bb8cb4e067e84d4d1f397d0ef6fce46913663540d77" + ], + "version": "==2020.1.8" }, "requests": { "hashes": [ @@ -734,11 +674,11 @@ }, "secretstorage": { "hashes": [ - "sha256:20c797ae48a4419f66f8d28fc221623f11fc45b6828f96bdb1ad9990acb59f92", - "sha256:7a119fb52a88e398dbb22a4b3eb39b779bfbace7e4153b7bc6e5954d86282a8a" + "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6", + "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b" ], "markers": "sys_platform == 'linux'", - "version": "==3.1.1" + "version": "==3.1.2" }, "six": { "hashes": [ @@ -832,10 +772,10 @@ }, "tqdm": { "hashes": [ - "sha256:166a82cdea964ae45528e0cc89436255ff2be73dc848bdf239f13c501cae5dc7", - "sha256:9036904496bd2afacf836a6f206c5a766ce11d3e9319d54a4e794c0f34b111dc" + "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23", + "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb" ], - "version": "==4.41.0" + "version": "==4.41.1" }, "twine": { "hashes": [ @@ -879,10 +819,10 @@ }, "wcwidth": { "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", + "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" ], - "version": "==0.1.7" + "version": "==0.1.8" }, "webencodings": { "hashes": [ @@ -890,13 +830,6 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" - }, - "zipp": { - "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" - ], - "version": "==0.6.0" } } } From 36b4e749276e45d814bf73b8ec33fbbc74e7aaad Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2020 06:59:44 +0000 Subject: [PATCH 0486/2998] Bump codecov from 2.0.15 to 2.0.16 Bumps [codecov](https://github.com/codecov/codecov-python) from 2.0.15 to 2.0.16. - [Release notes](https://github.com/codecov/codecov-python/releases) - [Changelog](https://github.com/codecov/codecov-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-python/compare/v2.0.15...v2.0.16) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 283 ++++++++++++++++++++++++++------------------------- 1 file changed, 142 insertions(+), 141 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 2ea85795bd..e0022e841c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -47,11 +47,11 @@ }, "codecov": { "hashes": [ - "sha256:8ed8b7c6791010d359baed66f84f061bba5bd41174bf324c31311e8737602788", - "sha256:ae00d68e18d8a20e9c3288ba3875ae03db3a8e892115bf9b83ef20507732bed4" + "sha256:38b32934e759a29313382287f59986f25613708f60760c88d31e956399bbeffe", + "sha256:4cf93c30cc1ddb6d7414fce0a45816889499c3febc8bbbc24f1cd1936a804087" ], "index": "pypi", - "version": "==2.0.15" + "version": "==2.0.16" }, "colorama": { "hashes": [ @@ -104,10 +104,10 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" + "version": "==2.9" }, "kaptan": { "hashes": [ @@ -125,17 +125,17 @@ }, "more-itertools": { "hashes": [ - "sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39", - "sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288" + "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", + "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" ], - "version": "==8.1.0" + "version": "==8.2.0" }, "packaging": { "hashes": [ - "sha256:aec3fdbb8bc9e4bb65f0634b9f551ced63983a529d6a8931817d52fdd0816ddb", - "sha256:fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8" + "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", + "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" ], - "version": "==20.0" + "version": "==20.1" }, "pluggy": { "hashes": [ @@ -160,10 +160,10 @@ }, "pytest": { "hashes": [ - "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", - "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" + "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", + "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" ], - "version": "==5.3.2" + "version": "==5.3.5" }, "pytest-cov": { "hashes": [ @@ -191,24 +191,24 @@ }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], - "version": "==2.22.0" + "version": "==2.23.0" }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.13.0" + "version": "==1.14.0" }, "urllib3": { "hashes": [ - "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", - "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "version": "==1.25.7" + "version": "==1.25.8" }, "wcwidth": { "hashes": [ @@ -272,10 +272,10 @@ }, "bleach": { "hashes": [ - "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", - "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" + "sha256:44f69771e2ac81ff30d929d485b7f9919f3ad6d019b6b20c74f3b8687c3f70df", + "sha256:aa8b870d0f46965bac2c073a93444636b0e1ca74e9777e34f03dd494b8a59d48" ], - "version": "==3.1.0" + "version": "==3.1.1" }, "certifi": { "hashes": [ @@ -286,41 +286,36 @@ }, "cffi": { "hashes": [ - "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42", - "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04", - "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5", - "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54", - "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba", - "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57", - "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396", - "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12", - "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97", - "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43", - "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db", - "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3", - "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b", - "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579", - "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346", - "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159", - "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652", - "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e", - "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a", - "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506", - "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f", - "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d", - "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c", - "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20", - "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858", - "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc", - "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a", - "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3", - "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e", - "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410", - "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25", - "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b", - "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d" - ], - "version": "==1.13.2" + "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", + "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", + "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", + "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", + "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", + "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", + "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", + "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", + "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", + "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", + "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", + "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", + "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", + "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", + "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", + "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", + "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", + "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", + "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", + "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", + "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", + "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", + "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", + "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", + "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", + "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", + "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", + "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + ], + "version": "==1.14.0" }, "chardet": { "hashes": [ @@ -396,10 +391,10 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], - "version": "==2.8" + "version": "==2.9" }, "imagesize": { "hashes": [ @@ -426,10 +421,10 @@ }, "jinja2": { "hashes": [ - "sha256:74320bb91f31270f9551d46522e33af46a80c3d619f4a4bf42b3164d30b5911f", - "sha256:9fe95f19286cfefaa917656583d020be14e7859c6b0252588391e47db34527de" + "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250", + "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49" ], - "version": "==2.10.3" + "version": "==2.11.1" }, "keyring": { "hashes": [ @@ -444,13 +439,16 @@ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", + "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", + "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", + "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", @@ -467,7 +465,9 @@ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" + "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", + "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", + "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" ], "version": "==1.1.1" }, @@ -480,17 +480,17 @@ }, "more-itertools": { "hashes": [ - "sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39", - "sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288" + "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", + "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" ], - "version": "==8.1.0" + "version": "==8.2.0" }, "packaging": { "hashes": [ - "sha256:aec3fdbb8bc9e4bb65f0634b9f551ced63983a529d6a8931817d52fdd0816ddb", - "sha256:fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8" + "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", + "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" ], - "version": "==20.0" + "version": "==20.1" }, "pathspec": { "hashes": [ @@ -599,10 +599,10 @@ }, "pytest": { "hashes": [ - "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa", - "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4" + "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", + "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" ], - "version": "==5.3.2" + "version": "==5.3.5" }, "pytest-rerunfailures": { "hashes": [ @@ -628,36 +628,36 @@ }, "regex": { "hashes": [ - "sha256:07b39bf943d3d2fe63d46281d8504f8df0ff3fe4c57e13d1656737950e53e525", - "sha256:0932941cdfb3afcbc26cc3bcf7c3f3d73d5a9b9c56955d432dbf8bbc147d4c5b", - "sha256:0e182d2f097ea8549a249040922fa2b92ae28be4be4895933e369a525ba36576", - "sha256:10671601ee06cf4dc1bc0b4805309040bb34c9af423c12c379c83d7895622bb5", - "sha256:23e2c2c0ff50f44877f64780b815b8fd2e003cda9ce817a7fd00dea5600c84a0", - "sha256:26ff99c980f53b3191d8931b199b29d6787c059f2e029b2b0c694343b1708c35", - "sha256:27429b8d74ba683484a06b260b7bb00f312e7c757792628ea251afdbf1434003", - "sha256:3e77409b678b21a056415da3a56abfd7c3ad03da71f3051bbcdb68cf44d3c34d", - "sha256:4e8f02d3d72ca94efc8396f8036c0d3bcc812aefc28ec70f35bb888c74a25161", - "sha256:4eae742636aec40cf7ab98171ab9400393360b97e8f9da67b1867a9ee0889b26", - "sha256:6a6ae17bf8f2d82d1e8858a47757ce389b880083c4ff2498dba17c56e6c103b9", - "sha256:6a6ba91b94427cd49cd27764679024b14a96874e0dc638ae6bdd4b1a3ce97be1", - "sha256:7bcd322935377abcc79bfe5b63c44abd0b29387f267791d566bbb566edfdd146", - "sha256:98b8ed7bb2155e2cbb8b76f627b2fd12cf4b22ab6e14873e8641f266e0fb6d8f", - "sha256:bd25bb7980917e4e70ccccd7e3b5740614f1c408a642c245019cff9d7d1b6149", - "sha256:d0f424328f9822b0323b3b6f2e4b9c90960b24743d220763c7f07071e0778351", - "sha256:d58e4606da2a41659c84baeb3cfa2e4c87a74cec89a1e7c56bee4b956f9d7461", - "sha256:e3cd21cc2840ca67de0bbe4071f79f031c81418deb544ceda93ad75ca1ee9f7b", - "sha256:e6c02171d62ed6972ca8631f6f34fa3281d51db8b326ee397b9c83093a6b7242", - "sha256:e7c7661f7276507bce416eaae22040fd91ca471b5b33c13f8ff21137ed6f248c", - "sha256:ecc6de77df3ef68fee966bb8cb4e067e84d4d1f397d0ef6fce46913663540d77" - ], - "version": "==2020.1.8" + "sha256:01b2d70cbaed11f72e57c1cfbaca71b02e3b98f739ce33f5f26f71859ad90431", + "sha256:046e83a8b160aff37e7034139a336b660b01dbfe58706f9d73f5cdc6b3460242", + "sha256:113309e819634f499d0006f6200700c8209a2a8bf6bd1bdc863a4d9d6776a5d1", + "sha256:200539b5124bc4721247a823a47d116a7a23e62cc6695744e3eb5454a8888e6d", + "sha256:25f4ce26b68425b80a233ce7b6218743c71cf7297dbe02feab1d711a2bf90045", + "sha256:269f0c5ff23639316b29f31df199f401e4cb87529eafff0c76828071635d417b", + "sha256:5de40649d4f88a15c9489ed37f88f053c15400257eeb18425ac7ed0a4e119400", + "sha256:7f78f963e62a61e294adb6ff5db901b629ef78cb2a1cfce3cf4eeba80c1c67aa", + "sha256:82469a0c1330a4beb3d42568f82dffa32226ced006e0b063719468dcd40ffdf0", + "sha256:8c2b7fa4d72781577ac45ab658da44c7518e6d96e2a50d04ecb0fd8f28b21d69", + "sha256:974535648f31c2b712a6b2595969f8ab370834080e00ab24e5dbb9d19b8bfb74", + "sha256:99272d6b6a68c7ae4391908fc15f6b8c9a6c345a46b632d7fdb7ef6c883a2bbb", + "sha256:9b64a4cc825ec4df262050c17e18f60252cdd94742b4ba1286bcfe481f1c0f26", + "sha256:9e9624440d754733eddbcd4614378c18713d2d9d0dc647cf9c72f64e39671be5", + "sha256:9ff16d994309b26a1cdf666a6309c1ef51ad4f72f99d3392bcd7b7139577a1f2", + "sha256:b33ebcd0222c1d77e61dbcd04a9fd139359bded86803063d3d2d197b796c63ce", + "sha256:bba52d72e16a554d1894a0cc74041da50eea99a8483e591a9edf1025a66843ab", + "sha256:bed7986547ce54d230fd8721aba6fd19459cdc6d315497b98686d0416efaff4e", + "sha256:c7f58a0e0e13fb44623b65b01052dae8e820ed9b8b654bb6296bc9c41f571b70", + "sha256:d58a4fa7910102500722defbde6e2816b0372a4fcc85c7e239323767c74f5cbc", + "sha256:f1ac2dc65105a53c1c2d72b1d3e98c2464a133b4067a51a3d2477b28449709a0" + ], + "version": "==2020.2.20" }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], - "version": "==2.22.0" + "version": "==2.23.0" }, "requests-toolbelt": { "hashes": [ @@ -682,10 +682,10 @@ }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.13.0" + "version": "==1.14.0" }, "snowballstemmer": { "hashes": [ @@ -726,10 +726,10 @@ }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", - "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" + "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f", + "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b" ], - "version": "==1.0.2" + "version": "==1.0.3" }, "sphinxcontrib-jsmath": { "hashes": [ @@ -754,10 +754,10 @@ }, "stevedore": { "hashes": [ - "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730", - "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14" + "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b", + "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b" ], - "version": "==1.31.0" + "version": "==1.32.0" }, "tmuxp": { "editable": true, @@ -772,10 +772,10 @@ }, "tqdm": { "hashes": [ - "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23", - "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb" + "sha256:0d8b5afb66e23d80433102e9bd8b5c8b65d34c2a2255b2de58d97bd2ea8170fd", + "sha256:f35fb121bafa030bd94e74fcfd44f3c2830039a2ddef7fc87ef1c2d205237b24" ], - "version": "==4.41.1" + "version": "==4.43.0" }, "twine": { "hashes": [ @@ -787,35 +787,36 @@ }, "typed-ast": { "hashes": [ - "sha256:1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", - "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", - "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", - "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", - "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", - "sha256:48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", - "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", - "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", - "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", - "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", - "sha256:7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", - "sha256:838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", - "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", - "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", - "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", - "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", - "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", - "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", - "sha256:fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", - "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12" - ], - "version": "==1.4.0" + "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", + "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", + "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", + "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", + "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", + "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", + "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", + "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", + "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", + "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", + "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", + "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", + "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", + "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", + "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", + "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", + "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", + "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", + "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", + "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", + "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" + ], + "version": "==1.4.1" }, "urllib3": { "hashes": [ - "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", - "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "version": "==1.25.7" + "version": "==1.25.8" }, "wcwidth": { "hashes": [ From 02216d56c8f8f445c4b7b0b02fea4064c8f27fba Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2020 07:01:58 +0000 Subject: [PATCH 0487/2998] Bump sphinx from 2.3.1 to 2.4.3 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.3.1 to 2.4.3. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.3.1...v2.4.3) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index e0022e841c..9117e93a42 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -696,11 +696,11 @@ }, "sphinx": { "hashes": [ - "sha256:298537cb3234578b2d954ff18c5608468229e116a9757af3b831c2b2b4819159", - "sha256:e6e766b74f85f37a5f3e0773a1e1be8db3fcb799deb58ca6d18b70b0b44542a5" + "sha256:776ff8333181138fae52df65be733127539623bb46cc692e7fa0fcfc80d7aa88", + "sha256:ca762da97c3b5107cbf0ab9e11d3ec7ab8d3c31377266fd613b962ed971df709" ], "index": "pypi", - "version": "==2.3.1" + "version": "==2.4.3" }, "sphinx-issues": { "hashes": [ From 7603b3f3a67ce54a025a2ddf93ddefdd11b80659 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 29 Feb 2020 15:06:28 +0000 Subject: [PATCH 0488/2998] Bump coverage from 5.0.1 to 5.0.3 Bumps [coverage](https://github.com/nedbat/coveragepy) from 5.0.1 to 5.0.3. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/coverage-5.0.1...coverage-5.0.3) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 88 ++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 9117e93a42..6a79418d94 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -63,40 +63,40 @@ }, "coverage": { "hashes": [ - "sha256:0101888bd1592a20ccadae081ba10e8b204d20235d18d05c6f7d5e904a38fc10", - "sha256:04b961862334687549eb91cd5178a6fbe977ad365bddc7c60f2227f2f9880cf4", - "sha256:1ca43dbd739c0fc30b0a3637a003a0d2c7edc1dd618359d58cc1e211742f8bd1", - "sha256:1cbb88b34187bdb841f2599770b7e6ff8e259dc3bb64fc7893acf44998acf5f8", - "sha256:232f0b52a5b978288f0bbc282a6c03fe48cd19a04202df44309919c142b3bb9c", - "sha256:24bcfa86fd9ce86b73a8368383c39d919c497a06eebb888b6f0c12f13e920b1a", - "sha256:25b8f60b5c7da71e64c18888f3067d5b6f1334b9681876b2fb41eea26de881ae", - "sha256:2714160a63da18aed9340c70ed514973971ee7e665e6b336917ff4cca81a25b1", - "sha256:2ca2cd5264e84b2cafc73f0045437f70c6378c0d7dbcddc9ee3fe192c1e29e5d", - "sha256:2cc707fc9aad2592fc686d63ef72dc0031fc98b6fb921d2f5395d9ab84fbc3ef", - "sha256:348630edea485f4228233c2f310a598abf8afa5f8c716c02a9698089687b6085", - "sha256:40fbfd6b044c9db13aeec1daf5887d322c710d811f944011757526ef6e323fd9", - "sha256:46c9c6a1d1190c0b75ec7c0f339088309952b82ae8d67a79ff1319eb4e749b96", - "sha256:591506e088901bdc25620c37aec885e82cc896528f28c57e113751e3471fc314", - "sha256:5ac71bba1e07eab403b082c4428f868c1c9e26a21041436b4905c4c3d4e49b08", - "sha256:5f622f19abda4e934938e24f1d67599249abc201844933a6f01aaa8663094489", - "sha256:65bead1ac8c8930cf92a1ccaedcce19a57298547d5d1db5c9d4d068a0675c38b", - "sha256:7362a7f829feda10c7265b553455de596b83d1623b3d436b6d3c51c688c57bf6", - "sha256:7f2675750c50151f806070ec11258edf4c328340916c53bac0adbc465abd6b1e", - "sha256:960d7f42277391e8b1c0b0ae427a214e1b31a1278de6b73f8807b20c2e913bba", - "sha256:a50b0888d8a021a3342d36a6086501e30de7d840ab68fca44913e97d14487dc1", - "sha256:b7dbc5e8c39ea3ad3db22715f1b5401cd698a621218680c6daf42c2f9d36e205", - "sha256:bb3d29df5d07d5399d58a394d0ef50adf303ab4fbf66dfd25b9ef258effcb692", - "sha256:c0fff2733f7c2950f58a4fd09b5db257b00c6fec57bf3f68c5bae004d804b407", - "sha256:c792d3707a86c01c02607ae74364854220fb3e82735f631cd0a345dea6b4cee5", - "sha256:c90bda74e16bcd03861b09b1d37c0a4158feda5d5a036bb2d6e58de6ff65793e", - "sha256:cfce79ce41cc1a1dc7fc85bb41eeeb32d34a4cf39a645c717c0550287e30ff06", - "sha256:eeafb646f374988c22c8e6da5ab9fb81367ecfe81c70c292623373d2a021b1a1", - "sha256:f425f50a6dd807cb9043d15a4fcfba3b5874a54d9587ccbb748899f70dc18c47", - "sha256:fcd4459fe35a400b8f416bc57906862693c9f88b66dc925e7f2a933e77f6b18b", - "sha256:ff3936dd5feaefb4f91c8c1f50a06c588b5dc69fba4f7d9c79a6617ad80bb7df" + "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", + "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", + "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", + "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", + "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", + "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", + "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", + "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", + "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", + "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", + "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", + "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", + "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", + "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", + "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", + "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", + "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", + "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", + "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", + "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", + "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", + "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", + "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", + "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", + "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", + "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", + "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", + "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", + "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", + "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", + "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" ], "index": "pypi", - "version": "==5.0.1" + "version": "==5.0.3" }, "e1839a8": { "editable": true, @@ -712,17 +712,17 @@ }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", - "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" + "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", + "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" ], - "version": "==1.0.1" + "version": "==1.0.2" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", - "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" + "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", + "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" ], - "version": "==1.0.1" + "version": "==1.0.2" }, "sphinxcontrib-htmlhelp": { "hashes": [ @@ -740,17 +740,17 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", - "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" + "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", + "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" ], - "version": "==1.0.2" + "version": "==1.0.3" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", - "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" + "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc", + "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a" ], - "version": "==1.1.3" + "version": "==1.1.4" }, "stevedore": { "hashes": [ From 48a1d5b41f09e8b70f0e7ab272f90f0fd3eb38ac Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 29 Feb 2020 15:06:34 +0000 Subject: [PATCH 0489/2998] Bump pillow from 6.2.1 to 7.0.0 Bumps [pillow](https://github.com/python-pillow/Pillow) from 6.2.1 to 7.0.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/6.2.1...7.0.0) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 54 ++++++++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 6a79418d94..85fc081635 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -508,39 +508,31 @@ }, "pillow": { "hashes": [ - "sha256:047d9473cf68af50ac85f8ee5d5f21a60f849bc17d348da7fc85711287a75031", - "sha256:0f66dc6c8a3cc319561a633b6aa82c44107f12594643efa37210d8c924fc1c71", - "sha256:12c9169c4e8fe0a7329e8658c7e488001f6b4c8e88740e76292c2b857af2e94c", - "sha256:248cffc168896982f125f5c13e9317c059f74fffdb4152893339f3be62a01340", - "sha256:27faf0552bf8c260a5cee21a76e031acaea68babb64daf7e8f2e2540745082aa", - "sha256:285edafad9bc60d96978ed24d77cdc0b91dace88e5da8c548ba5937c425bca8b", - "sha256:384b12c9aa8ef95558abdcb50aada56d74bc7cc131dd62d28c2d0e4d3aadd573", - "sha256:38950b3a707f6cef09cd3cbb142474357ad1a985ceb44d921bdf7b4647b3e13e", - "sha256:4aad1b88933fd6dc2846552b89ad0c74ddbba2f0884e2c162aa368374bf5abab", - "sha256:4ac6148008c169603070c092e81f88738f1a0c511e07bd2bb0f9ef542d375da9", - "sha256:4deb1d2a45861ae6f0b12ea0a786a03d19d29edcc7e05775b85ec2877cb54c5e", - "sha256:59aa2c124df72cc75ed72c8d6005c442d4685691a30c55321e00ed915ad1a291", - "sha256:5a47d2123a9ec86660fe0e8d0ebf0aa6bc6a17edc63f338b73ea20ba11713f12", - "sha256:5cc901c2ab9409b4b7ac7b5bcc3e86ac14548627062463da0af3b6b7c555a871", - "sha256:6c1db03e8dff7b9f955a0fb9907eb9ca5da75b5ce056c0c93d33100a35050281", - "sha256:7ce80c0a65a6ea90ef9c1f63c8593fcd2929448613fc8da0adf3e6bfad669d08", - "sha256:809c19241c14433c5d6135e1b6c72da4e3b56d5c865ad5736ab99af8896b8f41", - "sha256:83792cb4e0b5af480588601467c0764242b9a483caea71ef12d22a0d0d6bdce2", - "sha256:846fa202bd7ee0f6215c897a1d33238ef071b50766339186687bd9b7a6d26ac5", - "sha256:9f5529fc02009f96ba95bea48870173426879dc19eec49ca8e08cd63ecd82ddb", - "sha256:a423c2ea001c6265ed28700df056f75e26215fd28c001e93ef4380b0f05f9547", - "sha256:ac4428094b42907aba5879c7c000d01c8278d451a3b7cccd2103e21f6397ea75", - "sha256:b1ae48d87f10d1384e5beecd169c77502fcc04a2c00a4c02b85f0a94b419e5f9", - "sha256:bf4e972a88f8841d8fdc6db1a75e0f8d763e66e3754b03006cbc3854d89f1cb1", - "sha256:c6414f6aad598364aaf81068cabb077894eb88fed99c6a65e6e8217bab62ae7a", - "sha256:c710fcb7ee32f67baf25aa9ffede4795fd5d93b163ce95fdc724383e38c9df96", - "sha256:c7be4b8a09852291c3c48d3c25d1b876d2494a0a674980089ac9d5e0d78bd132", - "sha256:c9e5ffb910b14f090ac9c38599063e354887a5f6d7e6d26795e916b4514f2c1a", - "sha256:e0697b826da6c2472bb6488db4c0a7fa8af0d52fa08833ceb3681358914b14e5", - "sha256:e9a3edd5f714229d41057d56ac0f39ad9bdba6767e8c888c951869f0bdd129b0" + "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be", + "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946", + "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837", + "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f", + "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00", + "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d", + "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533", + "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a", + "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358", + "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda", + "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435", + "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2", + "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313", + "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff", + "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317", + "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2", + "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614", + "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0", + "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386", + "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9", + "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636", + "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865" ], "index": "pypi", - "version": "==6.2.1" + "version": "==7.0.0" }, "pkginfo": { "hashes": [ From 559086146a166df422e5f6c159e84ffe5de8489f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2020 06:54:15 +0000 Subject: [PATCH 0490/2998] Bump sphinx from 2.4.3 to 2.4.4 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.4.3 to 2.4.4. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.4.3...v2.4.4) Signed-off-by: dependabot-preview[bot] --- Pipfile.lock | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 85fc081635..374590d5b1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -132,10 +132,10 @@ }, "packaging": { "hashes": [ - "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", - "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], - "version": "==20.1" + "version": "==20.3" }, "pluggy": { "hashes": [ @@ -413,11 +413,11 @@ }, "jeepney": { "hashes": [ - "sha256:0ba6d8c597e9bef1ebd18aaec595f942a264e25c1a48f164d46120eacaa2e9bb", - "sha256:6f45dce1125cf6c58a1c88123d3831f36a789f9204fbad3172eac15f8ccd08d0" + "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e", + "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf" ], "markers": "sys_platform == 'linux'", - "version": "==0.4.2" + "version": "==0.4.3" }, "jinja2": { "hashes": [ @@ -428,10 +428,10 @@ }, "keyring": { "hashes": [ - "sha256:1f393f7466314068961c7e1d508120c092bd71fa54e3d93b76180b526d4abc56", - "sha256:24ae23ab2d6adc59138339e56843e33ec7b0a6b2f06302662477085c6c0aca00" + "sha256:b7bdfb1978cfdbabec63a3d389ad60242e7ffe9d739cae00760408c4f07d2c13", + "sha256:ebce8a4acfcabbcdfdcae2fc58571cebf11f71262cca898edceef89cdc891898" ], - "version": "==21.1.0" + "version": "==21.1.1" }, "markupsafe": { "hashes": [ @@ -487,10 +487,10 @@ }, "packaging": { "hashes": [ - "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", - "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], - "version": "==20.1" + "version": "==20.3" }, "pathspec": { "hashes": [ @@ -564,9 +564,10 @@ }, "pycparser": { "hashes": [ - "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", + "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" ], - "version": "==2.19" + "version": "==2.20" }, "pyflakes": { "hashes": [ @@ -688,11 +689,11 @@ }, "sphinx": { "hashes": [ - "sha256:776ff8333181138fae52df65be733127539623bb46cc692e7fa0fcfc80d7aa88", - "sha256:ca762da97c3b5107cbf0ab9e11d3ec7ab8d3c31377266fd613b962ed971df709" + "sha256:b4c750d546ab6d7e05bdff6ac24db8ae3e8b8253a3569b754e445110a0a12b66", + "sha256:fc312670b56cb54920d6cc2ced455a22a547910de10b3142276495ced49231cb" ], "index": "pypi", - "version": "==2.4.3" + "version": "==2.4.4" }, "sphinx-issues": { "hashes": [ From 99d4c755a0512ec1833cb144c01dd2ca3b0f7fa5 Mon Sep 17 00:00:00 2001 From: mauroporras Date: Thu, 7 May 2020 14:30:12 -0500 Subject: [PATCH 0491/2998] fix: Small typo --- tmuxp/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 41a828a259..791b987889 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -698,7 +698,7 @@ def command_freeze(session_name, socket_name, socket_path): print( '---------------------------------------------------------------' '\n' - 'Freeze does it best to snapshot live tmux sessions.\n' + 'Freeze does its best to snapshot live tmux sessions.\n' ) if click.confirm( 'The new config *WILL* require adjusting afterwards. Save config?' From 96752531ca8cc7ea9686c563f4d39f69b20aa536 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:18:16 -0500 Subject: [PATCH 0492/2998] flake8 fix for 3.8.x --- tmuxp/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 791b987889..123a1f67f8 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -169,8 +169,8 @@ def set_layout_hook(session, hook_name): # with the client hook_cmd.append('selectw -t {}'.format(window.id)) # edit: removed -t, or else it won't respect main-pane-w/h - hook_cmd.append('selectl'.format(window.id)) - hook_cmd.append('selectw -p'.format(window.id)) + hook_cmd.append('selectl') + hook_cmd.append('selectw -p') # unset the hook immediately after executing hook_cmd.append( From bf2ea4c349ca217ce5ba45d06f2bd7bcde8ce64c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:19:27 -0500 Subject: [PATCH 0493/2998] black: Skip string normalization --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000..0097e9f6e6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.black] +skip-string-normalization = true From c2a21dcf7ccaf109f0fc63d3cf3a3038770a3adb Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:12:57 +0000 Subject: [PATCH 0494/2998] Create Dependabot config file --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..491deae0af --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: pip + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 From 22d5d9be76abde53b7ca7c658cb6004ced6425a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:23:23 +0000 Subject: [PATCH 0495/2998] Bump sphinx from 2.4.4 to 3.1.1 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 2.4.4 to 3.1.1. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v2.4.4...v3.1.1) Signed-off-by: dependabot[bot] --- Pipfile.lock | 328 +++++++++++++++++++++++++-------------------------- 1 file changed, 163 insertions(+), 165 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 374590d5b1..5e4f16ae2a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -25,10 +25,10 @@ }, "certifi": { "hashes": [ - "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", - "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", + "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" ], - "version": "==2019.11.28" + "version": "==2020.6.20" }, "chardet": { "hashes": [ @@ -104,10 +104,10 @@ }, "idna": { "hashes": [ - "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", - "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "version": "==2.9" + "version": "==2.10" }, "kaptan": { "hashes": [ @@ -125,17 +125,17 @@ }, "more-itertools": { "hashes": [ - "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", - "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" + "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", + "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" ], - "version": "==8.2.0" + "version": "==8.4.0" }, "packaging": { "hashes": [ - "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", - "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" + "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", + "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" ], - "version": "==20.3" + "version": "==20.4" }, "pluggy": { "hashes": [ @@ -146,24 +146,24 @@ }, "py": { "hashes": [ - "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", - "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", + "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" ], - "version": "==1.8.1" + "version": "==1.9.0" }, "pyparsing": { "hashes": [ - "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", - "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "version": "==2.4.6" + "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", - "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" + "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", + "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" ], - "version": "==5.3.5" + "version": "==5.4.3" }, "pytest-cov": { "hashes": [ @@ -175,47 +175,47 @@ }, "pyyaml": { "hashes": [ - "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6", - "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf", - "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5", - "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e", - "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811", - "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e", - "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d", - "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20", - "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689", - "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994", - "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615" + "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", + "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", + "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", + "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", + "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", + "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", + "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", + "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", + "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", + "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", + "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" ], - "version": "==5.3" + "version": "==5.3.1" }, "requests": { "hashes": [ - "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", - "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" + "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", + "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" ], - "version": "==2.23.0" + "version": "==2.24.0" }, "six": { "hashes": [ - "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", - "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], - "version": "==1.14.0" + "version": "==1.15.0" }, "urllib3": { "hashes": [ - "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", - "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" + "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", + "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" ], - "version": "==1.25.8" + "version": "==1.25.9" }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", + "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" ], - "version": "==0.1.8" + "version": "==0.2.5" } }, "develop": { @@ -243,10 +243,10 @@ }, "appdirs": { "hashes": [ - "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", - "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" ], - "version": "==1.4.3" + "version": "==1.4.4" }, "attrs": { "hashes": [ @@ -272,17 +272,17 @@ }, "bleach": { "hashes": [ - "sha256:44f69771e2ac81ff30d929d485b7f9919f3ad6d019b6b20c74f3b8687c3f70df", - "sha256:aa8b870d0f46965bac2c073a93444636b0e1ca74e9777e34f03dd494b8a59d48" + "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f", + "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b" ], - "version": "==3.1.1" + "version": "==3.1.5" }, "certifi": { "hashes": [ - "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", - "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", + "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" ], - "version": "==2019.11.28" + "version": "==2020.6.20" }, "cffi": { "hashes": [ @@ -334,29 +334,27 @@ }, "cryptography": { "hashes": [ - "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", - "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", - "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", - "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", - "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", - "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", - "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", - "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", - "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", - "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", - "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", - "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", - "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", - "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", - "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", - "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", - "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", - "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", - "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", - "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", - "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" - ], - "version": "==2.8" + "sha256:091d31c42f444c6f519485ed528d8b451d1a0c7bf30e8ca583a0cac44b8a0df6", + "sha256:18452582a3c85b96014b45686af264563e3e5d99d226589f057ace56196ec78b", + "sha256:1dfa985f62b137909496e7fc182dac687206d8d089dd03eaeb28ae16eec8e7d5", + "sha256:1e4014639d3d73fbc5ceff206049c5a9a849cefd106a49fa7aaaa25cc0ce35cf", + "sha256:22e91636a51170df0ae4dcbd250d318fd28c9f491c4e50b625a49964b24fe46e", + "sha256:3b3eba865ea2754738616f87292b7f29448aec342a7c720956f8083d252bf28b", + "sha256:651448cd2e3a6bc2bb76c3663785133c40d5e1a8c1a9c5429e4354201c6024ae", + "sha256:726086c17f94747cedbee6efa77e99ae170caebeb1116353c6cf0ab67ea6829b", + "sha256:844a76bc04472e5135b909da6aed84360f522ff5dfa47f93e3dd2a0b84a89fa0", + "sha256:88c881dd5a147e08d1bdcf2315c04972381d026cdb803325c03fe2b4a8ed858b", + "sha256:96c080ae7118c10fcbe6229ab43eb8b090fccd31a09ef55f83f690d1ef619a1d", + "sha256:a0c30272fb4ddda5f5ffc1089d7405b7a71b0b0f51993cb4e5dbb4590b2fc229", + "sha256:bb1f0281887d89617b4c68e8db9a2c42b9efebf2702a3c5bf70599421a8623e3", + "sha256:c447cf087cf2dbddc1add6987bbe2f767ed5317adb2d08af940db517dd704365", + "sha256:c4fd17d92e9d55b84707f4fd09992081ba872d1a0c610c109c18e062e06a2e55", + "sha256:d0d5aeaedd29be304848f1c5059074a740fa9f6f26b84c5b63e8b29e73dfc270", + "sha256:daf54a4b07d67ad437ff239c8a4080cfd1cc7213df57d33c97de7b4738048d5e", + "sha256:e993468c859d084d5579e2ebee101de8f5a27ce8e2159959b6673b418fd8c785", + "sha256:f118a95c7480f5be0df8afeb9a11bd199aa20afab7a96bcf20409b411a3a85f0" + ], + "version": "==2.9.2" }, "doc8": { "hashes": [ @@ -391,10 +389,10 @@ }, "idna": { "hashes": [ - "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", - "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "version": "==2.9" + "version": "==2.10" }, "imagesize": { "hashes": [ @@ -421,17 +419,17 @@ }, "jinja2": { "hashes": [ - "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250", - "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49" + "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", + "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" ], - "version": "==2.11.1" + "version": "==2.11.2" }, "keyring": { "hashes": [ - "sha256:b7bdfb1978cfdbabec63a3d389ad60242e7ffe9d739cae00760408c4f07d2c13", - "sha256:ebce8a4acfcabbcdfdcae2fc58571cebf11f71262cca898edceef89cdc891898" + "sha256:3401234209015144a5d75701e71cb47239e552b0882313e9f51e8976f9e27843", + "sha256:c53e0e5ccde3ad34284a40ce7976b5b3a3d6de70344c3f8ee44364cc340976ec" ], - "version": "==21.1.1" + "version": "==21.2.1" }, "markupsafe": { "hashes": [ @@ -480,31 +478,31 @@ }, "more-itertools": { "hashes": [ - "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", - "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" + "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", + "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" ], - "version": "==8.2.0" + "version": "==8.4.0" }, "packaging": { "hashes": [ - "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", - "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" + "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", + "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" ], - "version": "==20.3" + "version": "==20.4" }, "pathspec": { "hashes": [ - "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424", - "sha256:562aa70af2e0d434367d9790ad37aed893de47f1693e4201fd1d3dca15d19b96" + "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0", + "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061" ], - "version": "==0.7.0" + "version": "==0.8.0" }, "pbr": { "hashes": [ - "sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b", - "sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488" + "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c", + "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8" ], - "version": "==5.4.4" + "version": "==5.4.5" }, "pillow": { "hashes": [ @@ -550,10 +548,10 @@ }, "py": { "hashes": [ - "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", - "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", + "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" ], - "version": "==1.8.1" + "version": "==1.9.0" }, "pycodestyle": { "hashes": [ @@ -578,24 +576,24 @@ }, "pygments": { "hashes": [ - "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", - "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" + "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", + "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" ], - "version": "==2.5.2" + "version": "==2.6.1" }, "pyparsing": { "hashes": [ - "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", - "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], - "version": "==2.4.6" + "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", - "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" + "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", + "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" ], - "version": "==5.3.5" + "version": "==5.4.3" }, "pytest-rerunfailures": { "hashes": [ @@ -607,50 +605,50 @@ }, "pytz": { "hashes": [ - "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", - "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" + "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", + "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" ], - "version": "==2019.3" + "version": "==2020.1" }, "readme-renderer": { "hashes": [ - "sha256:bb16f55b259f27f75f640acf5e00cf897845a8b3e4731b5c1a436e4b8529202f", - "sha256:c8532b79afc0375a85f10433eca157d6b50f7d6990f337fa498c96cd4bfc203d" + "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d", + "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376" ], - "version": "==24.0" + "version": "==26.0" }, "regex": { "hashes": [ - "sha256:01b2d70cbaed11f72e57c1cfbaca71b02e3b98f739ce33f5f26f71859ad90431", - "sha256:046e83a8b160aff37e7034139a336b660b01dbfe58706f9d73f5cdc6b3460242", - "sha256:113309e819634f499d0006f6200700c8209a2a8bf6bd1bdc863a4d9d6776a5d1", - "sha256:200539b5124bc4721247a823a47d116a7a23e62cc6695744e3eb5454a8888e6d", - "sha256:25f4ce26b68425b80a233ce7b6218743c71cf7297dbe02feab1d711a2bf90045", - "sha256:269f0c5ff23639316b29f31df199f401e4cb87529eafff0c76828071635d417b", - "sha256:5de40649d4f88a15c9489ed37f88f053c15400257eeb18425ac7ed0a4e119400", - "sha256:7f78f963e62a61e294adb6ff5db901b629ef78cb2a1cfce3cf4eeba80c1c67aa", - "sha256:82469a0c1330a4beb3d42568f82dffa32226ced006e0b063719468dcd40ffdf0", - "sha256:8c2b7fa4d72781577ac45ab658da44c7518e6d96e2a50d04ecb0fd8f28b21d69", - "sha256:974535648f31c2b712a6b2595969f8ab370834080e00ab24e5dbb9d19b8bfb74", - "sha256:99272d6b6a68c7ae4391908fc15f6b8c9a6c345a46b632d7fdb7ef6c883a2bbb", - "sha256:9b64a4cc825ec4df262050c17e18f60252cdd94742b4ba1286bcfe481f1c0f26", - "sha256:9e9624440d754733eddbcd4614378c18713d2d9d0dc647cf9c72f64e39671be5", - "sha256:9ff16d994309b26a1cdf666a6309c1ef51ad4f72f99d3392bcd7b7139577a1f2", - "sha256:b33ebcd0222c1d77e61dbcd04a9fd139359bded86803063d3d2d197b796c63ce", - "sha256:bba52d72e16a554d1894a0cc74041da50eea99a8483e591a9edf1025a66843ab", - "sha256:bed7986547ce54d230fd8721aba6fd19459cdc6d315497b98686d0416efaff4e", - "sha256:c7f58a0e0e13fb44623b65b01052dae8e820ed9b8b654bb6296bc9c41f571b70", - "sha256:d58a4fa7910102500722defbde6e2816b0372a4fcc85c7e239323767c74f5cbc", - "sha256:f1ac2dc65105a53c1c2d72b1d3e98c2464a133b4067a51a3d2477b28449709a0" - ], - "version": "==2020.2.20" + "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a", + "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938", + "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29", + "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae", + "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387", + "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a", + "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf", + "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610", + "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9", + "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5", + "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3", + "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89", + "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded", + "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754", + "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f", + "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868", + "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd", + "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910", + "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3", + "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac", + "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c" + ], + "version": "==2020.6.8" }, "requests": { "hashes": [ - "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", - "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" + "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", + "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" ], - "version": "==2.23.0" + "version": "==2.24.0" }, "requests-toolbelt": { "hashes": [ @@ -661,9 +659,9 @@ }, "restructuredtext-lint": { "hashes": [ - "sha256:97b3da356d5b3a8514d8f1f9098febd8b41463bed6a1d9f126cf0a048b6fd908" + "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8" ], - "version": "==1.3.0" + "version": "==1.3.1" }, "secretstorage": { "hashes": [ @@ -675,10 +673,10 @@ }, "six": { "hashes": [ - "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", - "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" ], - "version": "==1.14.0" + "version": "==1.15.0" }, "snowballstemmer": { "hashes": [ @@ -689,11 +687,11 @@ }, "sphinx": { "hashes": [ - "sha256:b4c750d546ab6d7e05bdff6ac24db8ae3e8b8253a3569b754e445110a0a12b66", - "sha256:fc312670b56cb54920d6cc2ced455a22a547910de10b3142276495ced49231cb" + "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258", + "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5" ], "index": "pypi", - "version": "==2.4.4" + "version": "==3.1.1" }, "sphinx-issues": { "hashes": [ @@ -747,10 +745,10 @@ }, "stevedore": { "hashes": [ - "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b", - "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b" + "sha256:609912b87df5ad338ff8e44d13eaad4f4170a65b79ae9cb0aa5632598994a1b7", + "sha256:c4724f8d7b8f6be42130663855d01a9c2414d6046055b5a65ab58a0e38637688" ], - "version": "==1.32.0" + "version": "==2.0.1" }, "tmuxp": { "editable": true, @@ -758,17 +756,17 @@ }, "toml": { "hashes": [ - "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", - "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" ], - "version": "==0.10.0" + "version": "==0.10.1" }, "tqdm": { "hashes": [ - "sha256:0d8b5afb66e23d80433102e9bd8b5c8b65d34c2a2255b2de58d97bd2ea8170fd", - "sha256:f35fb121bafa030bd94e74fcfd44f3c2830039a2ddef7fc87ef1c2d205237b24" + "sha256:07c06493f1403c1380b630ae3dcbe5ae62abcf369a93bbc052502279f189ab8c", + "sha256:cd140979c2bebd2311dfb14781d8f19bd5a9debb92dcab9f6ef899c987fcf71f" ], - "version": "==4.43.0" + "version": "==4.46.1" }, "twine": { "hashes": [ @@ -806,17 +804,17 @@ }, "urllib3": { "hashes": [ - "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", - "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" + "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", + "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" ], - "version": "==1.25.8" + "version": "==1.25.9" }, "wcwidth": { "hashes": [ - "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", - "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" + "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", + "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" ], - "version": "==0.1.8" + "version": "==0.2.5" }, "webencodings": { "hashes": [ From e685e8e89746fc8c788f9bfefd89e26be87bf676 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:30:17 +0000 Subject: [PATCH 0496/2998] Bump pytest-cov from 2.8.1 to 2.10.0 Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 2.8.1 to 2.10.0. - [Release notes](https://github.com/pytest-dev/pytest-cov/releases) - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v2.8.1...v2.10.0) Signed-off-by: dependabot[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 5e4f16ae2a..6005913f2c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -167,11 +167,11 @@ }, "pytest-cov": { "hashes": [ - "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b", - "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626" + "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87", + "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c" ], "index": "pypi", - "version": "==2.8.1" + "version": "==2.10.0" }, "pyyaml": { "hashes": [ From 51e17ff601137c5fb8c0f24a5567db72d82038c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:29:20 +0000 Subject: [PATCH 0497/2998] Bump pytest-rerunfailures from 8.0 to 9.0 Bumps [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) from 8.0 to 9.0. - [Release notes](https://github.com/pytest-dev/pytest-rerunfailures/releases) - [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst) - [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/8.0...9.0) Signed-off-by: dependabot[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 6005913f2c..d7ccdd95cf 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -597,11 +597,11 @@ }, "pytest-rerunfailures": { "hashes": [ - "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812", - "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4" + "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4", + "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b" ], "index": "pypi", - "version": "==8.0" + "version": "==9.0" }, "pytz": { "hashes": [ From 1f0be3b0a0437743e4afec7fbe0fb51911333084 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:28:21 +0000 Subject: [PATCH 0498/2998] Bump codecov from 2.0.16 to 2.1.7 Bumps [codecov](https://github.com/codecov/codecov-python) from 2.0.16 to 2.1.7. - [Release notes](https://github.com/codecov/codecov-python/releases) - [Changelog](https://github.com/codecov/codecov-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-python/compare/v2.0.16...v2.1.7) Signed-off-by: dependabot[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index d7ccdd95cf..241eea21ac 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -47,11 +47,11 @@ }, "codecov": { "hashes": [ - "sha256:38b32934e759a29313382287f59986f25613708f60760c88d31e956399bbeffe", - "sha256:4cf93c30cc1ddb6d7414fce0a45816889499c3febc8bbbc24f1cd1936a804087" + "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091", + "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728" ], "index": "pypi", - "version": "==2.0.16" + "version": "==2.1.7" }, "colorama": { "hashes": [ From 7b6204486e6ef0c86749f90c73e79fc5186f8863 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2020 11:25:20 +0000 Subject: [PATCH 0499/2998] Bump doc8 from 0.8.0 to 0.8.1 Bumps [doc8](https://github.com/pycqa/doc8) from 0.8.0 to 0.8.1. - [Release notes](https://github.com/pycqa/doc8/releases) - [Commits](https://github.com/pycqa/doc8/compare/0.8.0...0.8.1) Signed-off-by: dependabot[bot] --- Pipfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 241eea21ac..fdc99a0566 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -358,11 +358,11 @@ }, "doc8": { "hashes": [ - "sha256:2df89f9c1a5abfb98ab55d0175fed633cae0cf45025b8b1e0ee5ea772be28543", - "sha256:d12f08aa77a4a65eb28752f4bc78f41f611f9412c4155e2b03f1f5d4a45efe04" + "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12", + "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721" ], "index": "pypi", - "version": "==0.8.0" + "version": "==0.8.1" }, "docutils": { "hashes": [ From a063653af997d1b40d567880d29f2555a4f84d2b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:22:29 -0500 Subject: [PATCH 0500/2998] Create poetry deps from Pipfile --- pyproject.toml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0097e9f6e6..e2e97993ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,34 @@ [tool.black] skip-string-normalization = true + +[tool.poetry] +name = "tmuxp" +version = "1.5.4" +description = "tmux session manager." +license = "MIT" +authors = ["Tony Narlock "] + +[tool.poetry.dependencies] +python = ">=3.5" +click = ">=7<8" +codecov = "*" +colorama = "*" +coverage = "*" +kaptan = "*" +libtmux = "<0.9" +pytest-cov = "*" + +[tool.poetry.dev-dependencies] +aafigure = "*" +alagitpull = "*" +black = {version="==19.10b0", python="^3.6"} +doc8 = "*" +docutils = "*" +flake8 = "*" +isort = "*" +pillow = "*" +pytest = "*" +pytest-rerunfailures = "*" +sphinx = "*" +sphinx-issues = "*" +twine = "*" From 3be353b0bbb3e644a8f9613cdebd7fa6af00266f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:29:13 -0500 Subject: [PATCH 0501/2998] Update poetry lockfile --- poetry.lock | 1202 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1202 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000000..2a4c2017d5 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1202 @@ +[[package]] +category = "dev" +description = "ASCII art to image converter" +name = "aafigure" +optional = false +python-versions = "*" +version = "0.6" + +[[package]] +category = "dev" +description = "A configurable sidebar-enabled Sphinx theme" +name = "alabaster" +optional = false +python-versions = "*" +version = "0.7.12" + +[[package]] +category = "dev" +description = "Cleverly-named alabaster sub-theme for git-pull projects" +name = "alagitpull" +optional = false +python-versions = "*" +version = "0.0.23" + +[package.dependencies] +alabaster = "<0.8" + +[[package]] +category = "dev" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "appdirs" +optional = false +python-versions = "*" +version = "1.4.4" + +[[package]] +category = "main" +description = "Atomic file writes." +marker = "sys_platform == \"win32\"" +name = "atomicwrites" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.0" + +[[package]] +category = "main" +description = "Classes Without Boilerplate" +name = "attrs" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "19.3.0" + +[package.extras] +azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] +dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] +docs = ["sphinx", "zope.interface"] +tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] + +[[package]] +category = "dev" +description = "Internationalization utilities" +name = "babel" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.8.0" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +category = "dev" +description = "The uncompromising code formatter." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "black" +optional = false +python-versions = ">=3.6" +version = "19.10b0" + +[package.dependencies] +appdirs = "*" +attrs = ">=18.1.0" +click = ">=6.5" +pathspec = ">=0.6,<1" +regex = "*" +toml = ">=0.9.4" +typed-ast = ">=1.4.0" + +[package.extras] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +category = "dev" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "3.1.5" + +[package.dependencies] +packaging = "*" +six = ">=1.9.0" +webencodings = "*" + +[[package]] +category = "main" +description = "Python package for providing Mozilla's CA Bundle." +name = "certifi" +optional = false +python-versions = "*" +version = "2020.6.20" + +[[package]] +category = "main" +description = "Universal encoding detector for Python 2 and 3" +name = "chardet" +optional = false +python-versions = "*" +version = "3.0.4" + +[[package]] +category = "main" +description = "Composable command line interface toolkit" +name = "click" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "7.1.2" + +[[package]] +category = "main" +description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" +name = "codecov" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.1.7" + +[package.dependencies] +coverage = "*" +requests = ">=2.7.9" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.3" + +[[package]] +category = "main" +description = "Code coverage measurement for Python" +name = "coverage" +optional = false +python-versions = "*" +version = "4.4.2" + +[[package]] +category = "dev" +description = "Style checker for Sphinx (or other) RST documentation" +name = "doc8" +optional = false +python-versions = "*" +version = "0.8.1" + +[package.dependencies] +Pygments = "*" +chardet = "*" +docutils = "*" +restructuredtext-lint = ">=0.7" +six = "*" +stevedore = "*" + +[[package]] +category = "dev" +description = "Docutils -- Python Documentation Utilities" +name = "docutils" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.16" + +[[package]] +category = "dev" +description = "the modular source code checker: pep8 pyflakes and co" +name = "flake8" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +version = "3.8.3" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.6.0a1,<2.7.0" +pyflakes = ">=2.2.0,<2.3.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[[package]] +category = "main" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.10" + +[[package]] +category = "dev" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +name = "imagesize" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.2.0" + +[[package]] +category = "main" +description = "Read metadata from Python packages" +marker = "python_version < \"3.8\"" +name = "importlib-metadata" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "1.7.0" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +category = "dev" +description = "A Python utility / library to sort Python imports." +name = "isort" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "4.3.21" + +[package.extras] +pipfile = ["pipreqs", "requirementslib"] +pyproject = ["toml"] +requirements = ["pipreqs", "pip-api"] +xdg_home = ["appdirs (>=1.4.0)"] + +[[package]] +category = "dev" +description = "A very fast and expressive template engine." +name = "jinja2" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.11.2" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +category = "main" +description = "Configuration manager" +name = "kaptan" +optional = false +python-versions = "*" +version = "0.5.12" + +[package.dependencies] +PyYAML = ">=3.13,<6" + +[[package]] +category = "main" +description = "scripting library / orm for tmux" +name = "libtmux" +optional = false +python-versions = "*" +version = "0.8.2" + +[[package]] +category = "dev" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "1.1.1" + +[[package]] +category = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" +optional = false +python-versions = "*" +version = "0.6.1" + +[[package]] +category = "main" +description = "More routines for operating on iterables, beyond itertools" +name = "more-itertools" +optional = false +python-versions = ">=3.5" +version = "8.4.0" + +[[package]] +category = "main" +description = "Core utilities for Python packages" +name = "packaging" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "20.4" + +[package.dependencies] +pyparsing = ">=2.0.2" +six = "*" + +[[package]] +category = "main" +description = "Object-oriented filesystem paths" +marker = "python_version < \"3.6\"" +name = "pathlib2" +optional = false +python-versions = "*" +version = "2.3.5" + +[package.dependencies] +six = "*" + +[[package]] +category = "dev" +description = "Utility library for gitignore style pattern matching of file paths." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "pathspec" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.8.0" + +[[package]] +category = "dev" +description = "Python Build Reasonableness" +name = "pbr" +optional = false +python-versions = "*" +version = "5.4.5" + +[[package]] +category = "dev" +description = "Python Imaging Library (Fork)" +name = "pillow" +optional = false +python-versions = ">=3.5" +version = "7.1.2" + +[[package]] +category = "dev" +description = "Query metadatdata from sdists / bdists / installed packages." +name = "pkginfo" +optional = false +python-versions = "*" +version = "1.5.0.1" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +category = "main" +description = "plugin and hook calling mechanisms for python" +name = "pluggy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.13.1" + +[package.dependencies] +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "main" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +name = "py" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.9.0" + +[[package]] +category = "dev" +description = "Python style guide checker" +name = "pycodestyle" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.6.0" + +[[package]] +category = "dev" +description = "passive checker of Python programs" +name = "pyflakes" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.2.0" + +[[package]] +category = "dev" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" +optional = false +python-versions = ">=3.5" +version = "2.6.1" + +[[package]] +category = "main" +description = "Python parsing module" +name = "pyparsing" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "2.4.7" + +[[package]] +category = "main" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = ">=3.5" +version = "5.4.3" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = "*" +more-itertools = ">=4.0.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.5.0" +wcwidth = "*" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.dependencies.pathlib2] +python = "<3.6" +version = ">=2.2.0" + +[package.extras] +checkqa-mypy = ["mypy (v0.761)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +category = "main" +description = "Pytest plugin for measuring coverage." +name = "pytest-cov" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.10.0" + +[package.dependencies] +coverage = ">=4.4" +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] + +[[package]] +category = "dev" +description = "pytest plugin to re-run tests to eliminate flaky failures" +name = "pytest-rerunfailures" +optional = false +python-versions = "*" +version = "9.0" + +[package.dependencies] +pytest = ">=5.0" +setuptools = ">=40.0" + +[[package]] +category = "dev" +description = "World timezone definitions, modern and historical" +name = "pytz" +optional = false +python-versions = "*" +version = "2020.1" + +[[package]] +category = "main" +description = "YAML parser and emitter for Python" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + +[[package]] +category = "dev" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +name = "readme-renderer" +optional = false +python-versions = "*" +version = "26.0" + +[package.dependencies] +Pygments = ">=2.5.1" +bleach = ">=2.1.0" +docutils = ">=0.13.1" +six = "*" + +[package.extras] +md = ["cmarkgfm (>=0.2.0)"] + +[[package]] +category = "dev" +description = "Alternative regular expression module, to replace re." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "regex" +optional = false +python-versions = "*" +version = "2020.6.8" + +[[package]] +category = "main" +description = "Python HTTP for Humans." +name = "requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.24.0" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<4" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] + +[[package]] +category = "dev" +description = "A utility belt for advanced users of python-requests" +name = "requests-toolbelt" +optional = false +python-versions = "*" +version = "0.9.1" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +category = "dev" +description = "reStructuredText linter" +name = "restructuredtext-lint" +optional = false +python-versions = "*" +version = "1.3.1" + +[package.dependencies] +docutils = ">=0.11,<1.0" + +[[package]] +category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.15.0" + +[[package]] +category = "dev" +description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +name = "snowballstemmer" +optional = false +python-versions = "*" +version = "2.0.0" + +[[package]] +category = "dev" +description = "Python documentation generator" +name = "sphinx" +optional = false +python-versions = ">=3.5" +version = "3.1.1" + +[package.dependencies] +Jinja2 = ">=2.3" +Pygments = ">=2.0" +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = ">=0.3.5" +docutils = ">=0.12" +imagesize = "*" +packaging = "*" +requests = ">=2.5.0" +setuptools = "*" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] + +[[package]] +category = "dev" +description = "A Sphinx extension for linking to your project's issue tracker" +name = "sphinx-issues" +optional = false +python-versions = "*" +version = "1.2.0" + +[package.dependencies] +sphinx = "*" + +[package.extras] +dev = ["pytest", "flake8 (3.6.0)", "pre-commit (1.13.0)", "tox", "mock", "flake8-bugbear (18.8.0)"] +lint = ["flake8 (3.6.0)", "pre-commit (1.13.0)", "flake8-bugbear (18.8.0)"] +tests = ["pytest", "mock"] + +[[package]] +category = "dev" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +name = "sphinxcontrib-applehelp" +optional = false +python-versions = ">=3.5" +version = "1.0.2" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +category = "dev" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +name = "sphinxcontrib-devhelp" +optional = false +python-versions = ">=3.5" +version = "1.0.2" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +category = "dev" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +name = "sphinxcontrib-htmlhelp" +optional = false +python-versions = ">=3.5" +version = "1.0.3" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +category = "dev" +description = "A sphinx extension which renders display math in HTML via JavaScript" +name = "sphinxcontrib-jsmath" +optional = false +python-versions = ">=3.5" +version = "1.0.1" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +category = "dev" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +name = "sphinxcontrib-qthelp" +optional = false +python-versions = ">=3.5" +version = "1.0.3" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +category = "dev" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +name = "sphinxcontrib-serializinghtml" +optional = false +python-versions = ">=3.5" +version = "1.1.4" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +category = "dev" +description = "Manage dynamic plugins for Python applications" +name = "stevedore" +optional = false +python-versions = "*" +version = "1.32.0" + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" +six = ">=1.10.0" + +[[package]] +category = "dev" +description = "Python Library for Tom's Obvious, Minimal Language" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "toml" +optional = false +python-versions = "*" +version = "0.10.1" + +[[package]] +category = "dev" +description = "Fast, Extensible Progress Meter" +name = "tqdm" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.46.1" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] + +[[package]] +category = "dev" +description = "Collection of utilities for publishing packages on PyPI" +name = "twine" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.15.0" + +[package.dependencies] +pkginfo = ">=1.4.2" +readme-renderer = ">=21.0" +requests = ">=2.5.0,<2.15 || >2.15,<2.16 || >2.16" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +setuptools = ">=0.7.0" +tqdm = ">=4.14" + +[package.extras] +keyring = ["keyring"] +with-blake2 = ["pyblake2"] + +[[package]] +category = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "typed-ast" +optional = false +python-versions = "*" +version = "1.4.1" + +[[package]] +category = "main" +description = "HTTP library with thread-safe connection pooling, file post, and more." +name = "urllib3" +optional = false +python-versions = "*" +version = "1.22" + +[package.extras] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] + +[[package]] +category = "main" +description = "Measures the displayed width of unicode strings in a terminal" +name = "wcwidth" +optional = false +python-versions = "*" +version = "0.2.5" + +[[package]] +category = "dev" +description = "Character encoding aliases for legacy web content" +name = "webencodings" +optional = false +python-versions = "*" +version = "0.5.1" + +[[package]] +category = "main" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version < \"3.8\"" +name = "zipp" +optional = false +python-versions = ">=2.7" +version = "1.2.0" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] + +[metadata] +content-hash = "13689600406273b94c88fd84f2300d98006c9a245c689934d3892f1457851e4e" +python-versions = ">=3.5" + +[metadata.files] +aafigure = [ + {file = "aafigure-0.6-py2.py3-none-any.whl", hash = "sha256:c7f9409eee58d8484696a1c9e75b4c6ceab9fd060223007a19dcc6f515a30696"}, + {file = "aafigure-0.6.tar.gz", hash = "sha256:49f2c1fd2b579c1fffbac1386a2670b3f6f475cc7ff6cc04d8b984888c2d9e1e"}, +] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +alagitpull = [ + {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, +] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, + {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, +] +babel = [ + {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, + {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, +] +black = [ + {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, + {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, +] +bleach = [ + {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, + {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, +] +certifi = [ + {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, + {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, +] +chardet = [ + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +codecov = [ + {file = "codecov-2.1.7-py2.py3-none-any.whl", hash = "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728"}, + {file = "codecov-2.1.7-py3.8.egg", hash = "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34"}, + {file = "codecov-2.1.7.tar.gz", hash = "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091"}, +] +colorama = [ + {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, + {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, +] +coverage = [ + {file = "coverage-4.4.2-cp26-cp26m-macosx_10_10_x86_64.whl", hash = "sha256:d1ee76f560c3c3e8faada866a07a32485445e16ed2206ac8378bd90dadffb9f0"}, + {file = "coverage-4.4.2-cp26-cp26m-manylinux1_i686.whl", hash = "sha256:007eeef7e23f9473622f7d94a3e029a45d55a92a1f083f0f3512f5ab9a669b05"}, + {file = "coverage-4.4.2-cp26-cp26m-manylinux1_x86_64.whl", hash = "sha256:17307429935f96c986a1b1674f78079528833410750321d22b5fb35d1883828e"}, + {file = "coverage-4.4.2-cp26-cp26mu-manylinux1_i686.whl", hash = "sha256:845fddf89dca1e94abe168760a38271abfc2e31863fbb4ada7f9a99337d7c3dc"}, + {file = "coverage-4.4.2-cp26-cp26mu-manylinux1_x86_64.whl", hash = "sha256:3f4d0b3403d3e110d2588c275540649b1841725f5a11a7162620224155d00ba2"}, + {file = "coverage-4.4.2-cp27-cp27m-macosx_10_12_intel.whl", hash = "sha256:4c4f368ffe1c2e7602359c2c50233269f3abe1c48ca6b288dcd0fb1d1c679733"}, + {file = "coverage-4.4.2-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:f8c55dd0f56d3d618dfacf129e010cbe5d5f94b6951c1b2f13ab1a2f79c284da"}, + {file = "coverage-4.4.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cdd92dd9471e624cd1d8c1a2703d25f114b59b736b0f1f659a98414e535ffb3d"}, + {file = "coverage-4.4.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ad357d12971e77360034c1596011a03f50c0f9e1ecd12e081342b8d1aee2236"}, + {file = "coverage-4.4.2-cp27-cp27m-win32.whl", hash = "sha256:700d7579995044dc724847560b78ac786f0ca292867447afda7727a6fbaa082e"}, + {file = "coverage-4.4.2-cp27-cp27m-win_amd64.whl", hash = "sha256:66f393e10dd866be267deb3feca39babba08ae13763e0fc7a1063cbe1f8e49f6"}, + {file = "coverage-4.4.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e9a0e1caed2a52f15c96507ab78a48f346c05681a49c5b003172f8073da6aa6b"}, + {file = "coverage-4.4.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:eea9135432428d3ca7ee9be86af27cb8e56243f73764a9b6c3e0bda1394916be"}, + {file = "coverage-4.4.2-cp33-cp33m-macosx_10_10_x86_64.whl", hash = "sha256:5ff16548492e8a12e65ff3d55857ccd818584ed587a6c2898a9ebbe09a880674"}, + {file = "coverage-4.4.2-cp33-cp33m-manylinux1_i686.whl", hash = "sha256:d00e29b78ff610d300b2c37049a41234d48ea4f2d2581759ebcf67caaf731c31"}, + {file = "coverage-4.4.2-cp33-cp33m-manylinux1_x86_64.whl", hash = "sha256:87d942863fe74b1c3be83a045996addf1639218c2cb89c5da18c06c0fe3917ea"}, + {file = "coverage-4.4.2-cp34-cp34m-macosx_10_10_x86_64.whl", hash = "sha256:358d635b1fc22a425444d52f26287ae5aea9e96e254ff3c59c407426f44574f4"}, + {file = "coverage-4.4.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:81912cfe276e0069dca99e1e4e6be7b06b5fc8342641c6b472cb2fed7de7ae18"}, + {file = "coverage-4.4.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:079248312838c4c8f3494934ab7382a42d42d5f365f0cf7516f938dbb3f53f3f"}, + {file = "coverage-4.4.2-cp34-cp34m-win32.whl", hash = "sha256:b0059630ca5c6b297690a6bf57bf2fdac1395c24b7935fd73ee64190276b743b"}, + {file = "coverage-4.4.2-cp34-cp34m-win_amd64.whl", hash = "sha256:493082f104b5ca920e97a485913de254cbe351900deed72d4264571c73464cd0"}, + {file = "coverage-4.4.2-cp35-cp35m-macosx_10_10_x86_64.whl", hash = "sha256:e3ba9b14607c23623cf38f90b23f5bed4a3be87cbfa96e2e9f4eabb975d1e98b"}, + {file = "coverage-4.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:82cbd3317320aa63c65555aa4894bf33a13fb3a77f079059eb5935eea415938d"}, + {file = "coverage-4.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9721f1b7275d3112dc7ccf63f0553c769f09b5c25a26ee45872c7f5c09edf6c1"}, + {file = "coverage-4.4.2-cp35-cp35m-win32.whl", hash = "sha256:bd4800e32b4c8d99c3a2c943f1ac430cbf80658d884123d19639bcde90dad44a"}, + {file = "coverage-4.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:f29841e865590af72c4b90d7b5b8e93fd560f5dea436c1d5ee8053788f9285de"}, + {file = "coverage-4.4.2-cp36-cp36m-macosx_10_12_x86_64.whl", hash = "sha256:f3a5c6d054c531536a83521c00e5d4004f1e126e2e2556ce399bef4180fbe540"}, + {file = "coverage-4.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dd707a21332615108b736ef0b8513d3edaf12d2a7d5fc26cd04a169a8ae9b526"}, + {file = "coverage-4.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2e1a5c6adebb93c3b175103c2f855eda957283c10cf937d791d81bef8872d6ca"}, + {file = "coverage-4.4.2-cp36-cp36m-win32.whl", hash = "sha256:f87f522bde5540d8a4b11df80058281ac38c44b13ce29ced1e294963dd51a8f8"}, + {file = "coverage-4.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a7cfaebd8f24c2b537fa6a271229b051cdac9c1734bb6f939ccfc7c055689baa"}, + {file = "coverage-4.4.2.tar.gz", hash = "sha256:309d91bd7a35063ec7a0e4d75645488bfab3f0b66373e7722f23da7f5b0f34cc"}, + {file = "coverage-4.4.2.win-amd64-py2.7.exe", hash = "sha256:b6cebae1502ce5b87d7c6f532fa90ab345cfbda62b95aeea4e431e164d498a3d"}, + {file = "coverage-4.4.2.win-amd64-py3.4.exe", hash = "sha256:a4497faa4f1c0fc365ba05eaecfb6b5d24e3c8c72e95938f9524e29dadb15e76"}, + {file = "coverage-4.4.2.win-amd64-py3.5.exe", hash = "sha256:2b4d7f03a8a6632598cbc5df15bbca9f778c43db7cf1a838f4fa2c8599a8691a"}, + {file = "coverage-4.4.2.win-amd64-py3.6.exe", hash = "sha256:1afccd7e27cac1b9617be8c769f6d8a6d363699c9b86820f40c74cfb3328921c"}, + {file = "coverage-4.4.2.win32-py2.7.exe", hash = "sha256:0388c12539372bb92d6dde68b4627f0300d948965bbb7fc104924d715fdc0965"}, + {file = "coverage-4.4.2.win32-py3.4.exe", hash = "sha256:ab3508df9a92c1d3362343d235420d08e2662969b83134f8a97dc1451cbe5e84"}, + {file = "coverage-4.4.2.win32-py3.5.exe", hash = "sha256:43a155eb76025c61fc20c3d03b89ca28efa6f5be572ab6110b2fb68eda96bfea"}, + {file = "coverage-4.4.2.win32-py3.6.exe", hash = "sha256:f98b461cb59f117887aa634a66022c0bd394278245ed51189f63a036516e32de"}, +] +doc8 = [ + {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, + {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, +] +docutils = [ + {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, + {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, +] +flake8 = [ + {file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"}, + {file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +imagesize = [ + {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, + {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] +isort = [ + {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, + {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +kaptan = [ + {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, +] +libtmux = [ + {file = "libtmux-0.8.2.tar.gz", hash = "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +more-itertools = [ + {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, + {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, +] +packaging = [ + {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, + {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, +] +pathlib2 = [ + {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, + {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, +] +pathspec = [ + {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, + {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, +] +pbr = [ + {file = "pbr-5.4.5-py2.py3-none-any.whl", hash = "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8"}, + {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, +] +pillow = [ + {file = "Pillow-7.1.2-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3"}, + {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d"}, + {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b532bcc2f008e96fd9241177ec580829dee817b090532f43e54074ecffdcd97f"}, + {file = "Pillow-7.1.2-cp35-cp35m-win32.whl", hash = "sha256:12e4bad6bddd8546a2f9771485c7e3d2b546b458ae8ff79621214119ac244523"}, + {file = "Pillow-7.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9744350687459234867cbebfe9df8f35ef9e1538f3e729adbd8fde0761adb705"}, + {file = "Pillow-7.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:f54be399340aa602066adb63a86a6a5d4f395adfdd9da2b9a0162ea808c7b276"}, + {file = "Pillow-7.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1f694e28c169655c50bb89a3fa07f3b854d71eb47f50783621de813979ba87f3"}, + {file = "Pillow-7.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f784aad988f12c80aacfa5b381ec21fd3f38f851720f652b9f33facc5101cf4d"}, + {file = "Pillow-7.1.2-cp36-cp36m-win32.whl", hash = "sha256:b37bb3bd35edf53125b0ff257822afa6962649995cbdfde2791ddb62b239f891"}, + {file = "Pillow-7.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:b67a6c47ed963c709ed24566daa3f95a18f07d3831334da570c71da53d97d088"}, + {file = "Pillow-7.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:eaa83729eab9c60884f362ada982d3a06beaa6cc8b084cf9f76cae7739481dfa"}, + {file = "Pillow-7.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f46e0e024346e1474083c729d50de909974237c72daca05393ee32389dabe457"}, + {file = "Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0e2a3bceb0fd4e0cb17192ae506d5f082b309ffe5fc370a5667959c9b2f85fa3"}, + {file = "Pillow-7.1.2-cp37-cp37m-win32.whl", hash = "sha256:ccc9ad2460eb5bee5642eaf75a0438d7f8887d484490d5117b98edd7f33118b7"}, + {file = "Pillow-7.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b943e71c2065ade6fef223358e56c167fc6ce31c50bc7a02dd5c17ee4338e8ac"}, + {file = "Pillow-7.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:04766c4930c174b46fd72d450674612ab44cca977ebbcc2dde722c6933290107"}, + {file = "Pillow-7.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f455efb7a98557412dc6f8e463c1faf1f1911ec2432059fa3e582b6000fc90e2"}, + {file = "Pillow-7.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ee94fce8d003ac9fd206496f2707efe9eadcb278d94c271f129ab36aa7181344"}, + {file = "Pillow-7.1.2-cp38-cp38-win32.whl", hash = "sha256:4b02b9c27fad2054932e89f39703646d0c543f21d3cc5b8e05434215121c28cd"}, + {file = "Pillow-7.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:3d25dd8d688f7318dca6d8cd4f962a360ee40346c15893ae3b95c061cdbc4079"}, + {file = "Pillow-7.1.2-pp373-pypy36_pp73-win32.whl", hash = "sha256:0f01e63c34f0e1e2580cc0b24e86a5ccbbfa8830909a52ee17624c4193224cd9"}, + {file = "Pillow-7.1.2-py3.8-macosx-10.9-x86_64.egg", hash = "sha256:70e3e0d99a0dcda66283a185f80697a9b08806963c6149c8e6c5f452b2aa59c0"}, + {file = "Pillow-7.1.2.tar.gz", hash = "sha256:a0b49960110bc6ff5fead46013bcb8825d101026d466f3a4de3476defe0fb0dd"}, +] +pkginfo = [ + {file = "pkginfo-1.5.0.1-py2.py3-none-any.whl", hash = "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"}, + {file = "pkginfo-1.5.0.1.tar.gz", hash = "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +py = [ + {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, + {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, +] +pycodestyle = [ + {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, + {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, +] +pyflakes = [ + {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, + {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, +] +pygments = [ + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pytest = [ + {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, + {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, +] +pytest-cov = [ + {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, + {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, +] +pytest-rerunfailures = [ + {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, + {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, +] +pytz = [ + {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, + {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, +] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] +readme-renderer = [ + {file = "readme_renderer-26.0-py2.py3-none-any.whl", hash = "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376"}, + {file = "readme_renderer-26.0.tar.gz", hash = "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d"}, +] +regex = [ + {file = "regex-2020.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"}, + {file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"}, + {file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"}, + {file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"}, + {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"}, + {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"}, + {file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"}, + {file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"}, + {file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"}, + {file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"}, + {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"}, + {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"}, + {file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"}, + {file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"}, + {file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"}, + {file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"}, + {file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"}, + {file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"}, + {file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"}, + {file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"}, + {file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"}, +] +requests = [ + {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, + {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +restructuredtext-lint = [ + {file = "restructuredtext_lint-1.3.1.tar.gz", hash = "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, + {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, +] +sphinx = [ + {file = "Sphinx-3.1.1-py3-none-any.whl", hash = "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5"}, + {file = "Sphinx-3.1.1.tar.gz", hash = "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258"}, +] +sphinx-issues = [ + {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, + {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, + {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, + {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, +] +stevedore = [ + {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, + {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, +] +toml = [ + {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, + {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, +] +tqdm = [ + {file = "tqdm-4.46.1-py2.py3-none-any.whl", hash = "sha256:07c06493f1403c1380b630ae3dcbe5ae62abcf369a93bbc052502279f189ab8c"}, + {file = "tqdm-4.46.1.tar.gz", hash = "sha256:cd140979c2bebd2311dfb14781d8f19bd5a9debb92dcab9f6ef899c987fcf71f"}, +] +twine = [ + {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, + {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, +] +typed-ast = [ + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, + {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, + {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, + {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, + {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, +] +urllib3 = [ + {file = "urllib3-1.22-py2.py3-none-any.whl", hash = "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b"}, + {file = "urllib3-1.22.tar.gz", hash = "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +zipp = [ + {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, + {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, +] From a23f9c163b2ca9462766cb0d5d4fb158efdd2b65 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:29:44 -0500 Subject: [PATCH 0502/2998] poetry: Move python / cov packages into dev dependencies --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e2e97993ac..598186bf9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,12 +11,8 @@ authors = ["Tony Narlock "] [tool.poetry.dependencies] python = ">=3.5" click = ">=7<8" -codecov = "*" -colorama = "*" -coverage = "*" kaptan = "*" libtmux = "<0.9" -pytest-cov = "*" [tool.poetry.dev-dependencies] aafigure = "*" @@ -32,3 +28,7 @@ pytest-rerunfailures = "*" sphinx = "*" sphinx-issues = "*" twine = "*" +codecov = "*" +colorama = "*" +coverage = "*" +pytest-cov = "*" From 0843cca31544107a9515748fe326d1b5190ea8b3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:30:21 -0500 Subject: [PATCH 0503/2998] Update poetry lockfile --- poetry.lock | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2a4c2017d5..ab0b55eb77 100644 --- a/poetry.lock +++ b/poetry.lock @@ -35,7 +35,7 @@ python-versions = "*" version = "1.4.4" [[package]] -category = "main" +category = "dev" description = "Atomic file writes." marker = "sys_platform == \"win32\"" name = "atomicwrites" @@ -44,7 +44,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.4.0" [[package]] -category = "main" +category = "dev" description = "Classes Without Boilerplate" name = "attrs" optional = false @@ -103,7 +103,7 @@ six = ">=1.9.0" webencodings = "*" [[package]] -category = "main" +category = "dev" description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false @@ -111,7 +111,7 @@ python-versions = "*" version = "2020.6.20" [[package]] -category = "main" +category = "dev" description = "Universal encoding detector for Python 2 and 3" name = "chardet" optional = false @@ -127,7 +127,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "7.1.2" [[package]] -category = "main" +category = "dev" description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false @@ -139,7 +139,7 @@ coverage = "*" requests = ">=2.7.9" [[package]] -category = "main" +category = "dev" description = "Cross-platform colored terminal text." name = "colorama" optional = false @@ -147,7 +147,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.3" [[package]] -category = "main" +category = "dev" description = "Code coverage measurement for Python" name = "coverage" optional = false @@ -196,7 +196,7 @@ python = "<3.8" version = "*" [[package]] -category = "main" +category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" optional = false @@ -212,7 +212,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.2.0" [[package]] -category = "main" +category = "dev" description = "Read metadata from Python packages" marker = "python_version < \"3.8\"" name = "importlib-metadata" @@ -291,7 +291,7 @@ python-versions = "*" version = "0.6.1" [[package]] -category = "main" +category = "dev" description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" optional = false @@ -299,7 +299,7 @@ python-versions = ">=3.5" version = "8.4.0" [[package]] -category = "main" +category = "dev" description = "Core utilities for Python packages" name = "packaging" optional = false @@ -311,7 +311,7 @@ pyparsing = ">=2.0.2" six = "*" [[package]] -category = "main" +category = "dev" description = "Object-oriented filesystem paths" marker = "python_version < \"3.6\"" name = "pathlib2" @@ -359,7 +359,7 @@ version = "1.5.0.1" testing = ["nose", "coverage"] [[package]] -category = "main" +category = "dev" description = "plugin and hook calling mechanisms for python" name = "pluggy" optional = false @@ -375,7 +375,7 @@ version = ">=0.12" dev = ["pre-commit", "tox"] [[package]] -category = "main" +category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" optional = false @@ -407,7 +407,7 @@ python-versions = ">=3.5" version = "2.6.1" [[package]] -category = "main" +category = "dev" description = "Python parsing module" name = "pyparsing" optional = false @@ -415,7 +415,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" [[package]] -category = "main" +category = "dev" description = "pytest: simple powerful testing with Python" name = "pytest" optional = false @@ -445,7 +445,7 @@ checkqa-mypy = ["mypy (v0.761)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] -category = "main" +category = "dev" description = "Pytest plugin for measuring coverage." name = "pytest-cov" optional = false @@ -514,7 +514,7 @@ python-versions = "*" version = "2020.6.8" [[package]] -category = "main" +category = "dev" description = "Python HTTP for Humans." name = "requests" optional = false @@ -554,7 +554,7 @@ version = "1.3.1" docutils = ">=0.11,<1.0" [[package]] -category = "main" +category = "dev" description = "Python 2 and 3 compatibility utilities" name = "six" optional = false @@ -750,7 +750,7 @@ python-versions = "*" version = "1.4.1" [[package]] -category = "main" +category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" optional = false @@ -762,7 +762,7 @@ secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "cer socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] -category = "main" +category = "dev" description = "Measures the displayed width of unicode strings in a terminal" name = "wcwidth" optional = false @@ -778,7 +778,7 @@ python-versions = "*" version = "0.5.1" [[package]] -category = "main" +category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" marker = "python_version < \"3.8\"" name = "zipp" @@ -791,7 +791,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "13689600406273b94c88fd84f2300d98006c9a245c689934d3892f1457851e4e" +content-hash = "59ab1155855346100ee08d05273e6856d544ed9f0b04c07de45d1e57a4fe00b7" python-versions = ">=3.5" [metadata.files] From b3ed9e28946e3d2be43260e62f6bc23a5a5c51ef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:31:37 -0500 Subject: [PATCH 0504/2998] Makefile: Use poetry --- Makefile | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 65930cfcf2..659df240ba 100644 --- a/Makefile +++ b/Makefile @@ -9,13 +9,13 @@ entr_warn: @echo "----------------------------------------------------------" isort: - isort `${PY_FILES}` + poetry run isort `${PY_FILES}` black: - black `${PY_FILES}` --skip-string-normalization + poetry run black `${PY_FILES}` --skip-string-normalization test: - py.test $(test) + poetry run py.test $(test) watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi @@ -27,14 +27,7 @@ watch_docs: cd doc && $(MAKE) watch_docs flake8: - flake8 tmuxp tests + poetry run flake8 tmuxp tests watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi - -sync_pipfile: - pipenv install --skip-lock --dev -r requirements/doc.txt && \ - pipenv install --skip-lock --dev -r requirements/dev.txt && \ - pipenv install --skip-lock --dev -r requirements/test.txt && \ - pipenv install --skip-lock --dev -e . && \ - pipenv install --skip-lock -r requirements/base.txt From f2205cbb41771e82fb39927d2363c3d5c08443d4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 06:31:47 -0500 Subject: [PATCH 0505/2998] travis: Use poetry --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9f99efa044..bfe8ef61b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,9 +36,8 @@ cache: - ~/source - ~/build install: - - pip install -e . - - pip install -r requirements/test.txt - - pip install -r requirements/dev.txt + - pip install poetry + - poetry install before_script: - mkdir -p ~/source - mkdir -p ~/build/tmux-$TMUX_VERSION @@ -51,7 +50,7 @@ before_script: - cd $TRAVIS_BUILD_DIR - tmux -V script: - - py.test --cov + - poetry run py.test --cov - make flake8 addons: apt: From b5c48afc41ef0edf41d90609626298f73da16f09 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 07:00:18 -0500 Subject: [PATCH 0506/2998] Update README for poetry --- doc/developing.rst | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/doc/developing.rst b/doc/developing.rst index faa749bb2d..b5ee6353b3 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -59,7 +59,7 @@ adjust the code and the installed software will reflect the changes. $ tmuxp -Using pipenv +Using poetry ^^^^^^^^^^^^ To begin developing, check out the code from github: @@ -70,33 +70,26 @@ To begin developing, check out the code from github: $ cd tmuxp You can create a virtualenv, and install all of the locked -packages as listed in Pipfile.lock: +packages as listed in poetry.lock: .. code-block:: bash - $ pipenv install --ignore-pipfile --dev - -If you prefer to install updated packages based on Pipfile only, not being -bound by Pipfile.lock: - -.. code-block:: bash - - $ pipenv install --skip-lock --dev + $ poetry install If you ever need to update packages during your development session, the -following command can be used to update all packages as per Pipfile settings or +following command can be used to update all packages as per poetry settings or individual package (second command): .. code-block:: bash - $ pipenv update --dev - $ pipenv update requests + $ poetry update + $ poetry update requests Then activate it to your current tty / terminal session with: .. code-block:: bash - $ pipenv shell + $ poetry shell That is it! You are now ready to code! From eed52bd331ccb46de00e2c2b1c4094b195cd5ff3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 07:02:24 -0500 Subject: [PATCH 0507/2998] docs: update poetry --- doc/examples.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index 6792d377e8..f5cc8e2e6f 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -434,8 +434,8 @@ Bonus: pipenv auto-bootstrapping ``before_script`` CWD's into the root (session)-level ``start_directory``. -If you use `pipenv`_, you can use a script like this to ensure your -packages are installed: +If you use `pipenv`_ / `poetry`_, you can use a script like this to ensure +your packages are installed: .. code-block:: yaml @@ -469,6 +469,7 @@ You can also source yourself into the virtual environment using - ./manage.py runserver .. _pipenv: https://docs.pipenv.org/ +.. _poetry: https://python-poetry.org/ Kung fu ------- From de92316f524c2b4254245d525452cf2550f89c10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 12:32:55 -0500 Subject: [PATCH 0508/2998] travis: Update poetry commands --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bfe8ef61b8..d89c3ac53e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,12 @@ cache: - directories: - ~/source - ~/build -install: +before_install: - pip install poetry - - poetry install + - poetry --version + - poetry version +install: + - poetry install --v before_script: - mkdir -p ~/source - mkdir -p ~/build/tmux-$TMUX_VERSION From 8ac09f30150d8888c8d017a49d4299bfd0d3bcf6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 13:51:05 -0500 Subject: [PATCH 0509/2998] Poetry: Python Version constrained packages --- poetry.lock | 18 +++++++++++++----- pyproject.toml | 15 ++++++++++++--- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index ab0b55eb77..161b689450 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "sys_platform == \"win32\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,6 +46,7 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -214,7 +215,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -277,6 +278,7 @@ version = "0.8.2" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -293,6 +295,7 @@ version = "0.6.1" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -313,7 +316,7 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -342,6 +345,7 @@ version = "5.4.5" [[package]] category = "dev" description = "Python Imaging Library (Fork)" +marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.5" @@ -361,6 +365,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -377,6 +382,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -474,6 +480,7 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" +marker = "python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -764,6 +771,7 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" +marker = "python_version >= \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -780,7 +788,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -791,7 +799,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "59ab1155855346100ee08d05273e6856d544ed9f0b04c07de45d1e57a4fe00b7" +content-hash = "1edcc1ab605113e54bbaeae8a8729e0b465ec277813a344782ab0c55438c9d8a" python-versions = ">=3.5" [metadata.files] diff --git a/pyproject.toml b/pyproject.toml index 598186bf9c..c43b26ccef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,10 +22,19 @@ doc8 = "*" docutils = "*" flake8 = "*" isort = "*" -pillow = "*" -pytest = "*" +pillow = [ + {version="<7", python="<3"}, + {version="*", python=">=3"} +] +pytest = [ + {version="<4.7.0", python="<3"}, + {version="*", python=">=3"} +] pytest-rerunfailures = "*" -sphinx = "*" +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} +] sphinx-issues = "*" twine = "*" codecov = "*" From 9d3f21925dbd8cafcb41a8df85e5bfd09913ba8c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:04:36 -0500 Subject: [PATCH 0510/2998] Relax python version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c43b26ccef..ac9172dd99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ license = "MIT" authors = ["Tony Narlock "] [tool.poetry.dependencies] -python = ">=3.5" +python = ">=2.7" click = ">=7<8" kaptan = "*" libtmux = "<0.9" From 1e9383a27e118b5cb7c69451954ce2b3875d438c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:05:06 -0500 Subject: [PATCH 0511/2998] travis: Fix command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d89c3ac53e..f49a7d7e24 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ before_install: - poetry --version - poetry version install: - - poetry install --v + - poetry install -v before_script: - mkdir -p ~/source - mkdir -p ~/build/tmux-$TMUX_VERSION From fff4b9a5dd8c87390be37d13ff1e0fb8e27ea1d3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:07:20 -0500 Subject: [PATCH 0512/2998] poetry: Relax python version more --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ac9172dd99..634fc82bdb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ license = "MIT" authors = ["Tony Narlock "] [tool.poetry.dependencies] -python = ">=2.7" +python = "~2.7 || ^3.5" click = ">=7<8" kaptan = "*" libtmux = "<0.9" From e0358e232300c1f432ce51ce405bfaefc1f29ea2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:07:31 -0500 Subject: [PATCH 0513/2998] Update poetry lockfile --- poetry.lock | 353 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 340 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 161b689450..83640af8d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,7 +46,6 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -69,6 +68,19 @@ version = "2.8.0" [package.dependencies] pytz = ">=2015.7" +[[package]] +category = "dev" +description = "Backport of functools.lru_cache" +marker = "python_version < \"3.2\"" +name = "backports.functools-lru-cache" +optional = false +python-versions = ">=2.6" +version = "1.6.1" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov"] + [[package]] category = "dev" description = "The uncompromising code formatter." @@ -147,6 +159,28 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.3" +[[package]] +category = "dev" +description = "Updated configparser from Python 3.7 for Python 2.6+." +marker = "python_version < \"3.2\"" +name = "configparser" +optional = false +python-versions = ">=2.6" +version = "4.0.2" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytest-flake8", "pytest-black-multipy"] + +[[package]] +category = "dev" +description = "Backports and enhancements for the contextlib module" +marker = "python_version >= \"3\" and python_version < \"3.4\" or python_version < \"3.4\"" +name = "contextlib2" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.6.0.post1" + [[package]] category = "dev" description = "Code coverage measurement for Python" @@ -179,6 +213,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.16" +[[package]] +category = "dev" +description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" +marker = "python_version < \"3.4\"" +name = "enum34" +optional = false +python-versions = "*" +version = "1.1.10" + [[package]] category = "dev" description = "the modular source code checker: pep8 pyflakes and co" @@ -192,10 +235,53 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" +[package.dependencies.configparser] +python = "<3.2" +version = "*" + +[package.dependencies.enum34] +python = "<3.4" +version = "*" + +[package.dependencies.functools32] +python = "<3.2" +version = "*" + [package.dependencies.importlib-metadata] python = "<3.8" version = "*" +[package.dependencies.typing] +python = "<3.5" +version = "*" + +[[package]] +category = "dev" +description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" +marker = "python_version < \"3\"" +name = "funcsigs" +optional = false +python-versions = "*" +version = "1.0.2" + +[[package]] +category = "dev" +description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." +marker = "python_version < \"3.2\"" +name = "functools32" +optional = false +python-versions = "*" +version = "3.2.3-2" + +[[package]] +category = "dev" +description = "Backport of the concurrent.futures package from Python 3" +marker = "python_version < \"3.2\"" +name = "futures" +optional = false +python-versions = ">=2.6, <3" +version = "3.3.0" + [[package]] category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" @@ -215,7 +301,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -224,6 +310,18 @@ version = "1.7.0" [package.dependencies] zipp = ">=0.5" +[package.dependencies.configparser] +python = "<3" +version = ">=3.5" + +[package.dependencies.contextlib2] +python = "<3" +version = "*" + +[package.dependencies.pathlib2] +python = "<3" +version = "*" + [package.extras] docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] @@ -236,6 +334,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "4.3.21" +[package.dependencies] +[package.dependencies."backports.functools-lru-cache"] +python = "<3.2" +version = "*" + +[package.dependencies.futures] +python = "<3.2" +version = "*" + [package.extras] pipfile = ["pipreqs", "requirementslib"] pyproject = ["toml"] @@ -278,7 +385,6 @@ version = "0.8.2" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -295,7 +401,18 @@ version = "0.6.1" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" -marker = "python_version >= \"3\"" +marker = "python_version <= \"2.7\"" +name = "more-itertools" +optional = false +python-versions = "*" +version = "5.0.0" + +[package.dependencies] +six = ">=1.0.0,<2.0.0" + +[[package]] +category = "dev" +description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -316,7 +433,7 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\"" +marker = "python_version < \"3.6\" or python_version >= \"3\" and python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -325,6 +442,10 @@ version = "2.3.5" [package.dependencies] six = "*" +[package.dependencies.scandir] +python = "<3.5" +version = "*" + [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." @@ -342,6 +463,15 @@ optional = false python-versions = "*" version = "5.4.5" +[[package]] +category = "dev" +description = "Python Imaging Library (Fork)" +marker = "python_version < \"3\" or python_version >= \"3\"" +name = "pillow" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "6.2.2" + [[package]] category = "dev" description = "Python Imaging Library (Fork)" @@ -365,7 +495,6 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" -marker = "python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -382,7 +511,6 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" -marker = "python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -404,6 +532,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.2.0" +[[package]] +category = "dev" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.5.2" + [[package]] category = "dev" description = "Pygments is a syntax highlighting package written in Python." @@ -420,6 +556,46 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" +[[package]] +category = "dev" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +version = "4.6.11" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.5.0" +six = ">=1.10.0" +wcwidth = "*" + +[package.dependencies.colorama] +python = "<3.4.0 || >=3.5.0" +version = "*" + +[package.dependencies.funcsigs] +python = "<3.0" +version = ">=1.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.dependencies.more-itertools] +python = "<2.8" +version = ">=4.0.0,<6.0.0" + +[package.dependencies.pathlib2] +python = "<3.6" +version = ">=2.2.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] + [[package]] category = "dev" description = "pytest: simple powerful testing with Python" @@ -465,6 +641,18 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] +[[package]] +category = "dev" +description = "pytest plugin to re-run tests to eliminate flaky failures" +name = "pytest-rerunfailures" +optional = false +python-versions = "*" +version = "8.0" + +[package.dependencies] +pytest = ">=4.4" +setuptools = ">=40.0" + [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -480,7 +668,6 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" -marker = "python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -576,6 +763,37 @@ optional = false python-versions = "*" version = "2.0.0" +[[package]] +category = "dev" +description = "Python documentation generator" +name = "sphinx" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.8.5" + +[package.dependencies] +Jinja2 = ">=2.3" +Pygments = ">=2.0" +alabaster = ">=0.7,<0.8" +babel = ">=1.3,<2.0 || >2.0" +colorama = ">=0.3.5" +docutils = ">=0.11" +imagesize = "*" +packaging = "*" +requests = ">=2.0.0" +setuptools = "*" +six = ">=1.5" +snowballstemmer = ">=1.1" +sphinxcontrib-websupport = "*" + +[package.dependencies.typing] +python = "<3.5" +version = "*" + +[package.extras] +test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] +websupport = ["sqlalchemy (>=0.9)", "whoosh (>=2.0)"] + [[package]] category = "dev" description = "Python documentation generator" @@ -695,6 +913,18 @@ version = "1.1.4" lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] +[[package]] +category = "dev" +description = "Sphinx API for Web Apps" +marker = "python_version < \"3\"" +name = "sphinxcontrib-websupport" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.1.2" + +[package.extras] +test = ["pytest", "mock"] + [[package]] category = "dev" description = "Manage dynamic plugins for Python applications" @@ -756,6 +986,15 @@ optional = false python-versions = "*" version = "1.4.1" +[[package]] +category = "dev" +description = "Type Hints for Python" +marker = "python_version < \"3.5\"" +name = "typing" +optional = false +python-versions = "*" +version = "3.7.4.1" + [[package]] category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." @@ -771,12 +1010,16 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" -marker = "python_version >= \"3\"" name = "wcwidth" optional = false python-versions = "*" version = "0.2.5" +[package.dependencies] +[package.dependencies."backports.functools-lru-cache"] +python = "<3.2" +version = ">=1.2.1" + [[package]] category = "dev" description = "Character encoding aliases for legacy web content" @@ -788,19 +1031,24 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" version = "1.2.0" +[package.dependencies] +[package.dependencies.contextlib2] +python = "<3.4" +version = "*" + [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "1edcc1ab605113e54bbaeae8a8729e0b465ec277813a344782ab0c55438c9d8a" -python-versions = ">=3.5" +content-hash = "8c7b4fe636b0e1b4526182cf5edc78a2113276f97f7000f4ffa74a96047e4724" +python-versions = "~2.7 || ^3.5" [metadata.files] aafigure = [ @@ -830,6 +1078,10 @@ babel = [ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, ] +"backports.functools-lru-cache" = [ + {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, + {file = "backports.functools_lru_cache-1.6.1.tar.gz", hash = "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"}, +] black = [ {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, @@ -859,6 +1111,14 @@ colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, ] +configparser = [ + {file = "configparser-4.0.2-py2.py3-none-any.whl", hash = "sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c"}, + {file = "configparser-4.0.2.tar.gz", hash = "sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df"}, +] +contextlib2 = [ + {file = "contextlib2-0.6.0.post1-py2.py3-none-any.whl", hash = "sha256:3355078a159fbb44ee60ea80abd0d87b80b78c248643b49aa6d94673b413609b"}, + {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, +] coverage = [ {file = "coverage-4.4.2-cp26-cp26m-macosx_10_10_x86_64.whl", hash = "sha256:d1ee76f560c3c3e8faada866a07a32485445e16ed2206ac8378bd90dadffb9f0"}, {file = "coverage-4.4.2-cp26-cp26m-manylinux1_i686.whl", hash = "sha256:007eeef7e23f9473622f7d94a3e029a45d55a92a1f083f0f3512f5ab9a669b05"}, @@ -909,10 +1169,27 @@ docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, ] +enum34 = [ + {file = "enum34-1.1.10-py2-none-any.whl", hash = "sha256:a98a201d6de3f2ab3db284e70a33b0f896fbf35f8086594e8c9e74b909058d53"}, + {file = "enum34-1.1.10-py3-none-any.whl", hash = "sha256:c3858660960c984d6ab0ebad691265180da2b43f07e061c0f8dca9ef3cffd328"}, + {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, +] flake8 = [ {file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"}, {file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"}, ] +funcsigs = [ + {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, + {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"}, +] +functools32 = [ + {file = "functools32-3.2.3-2.tar.gz", hash = "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"}, + {file = "functools32-3.2.3-2.zip", hash = "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0"}, +] +futures = [ + {file = "futures-3.3.0-py2-none-any.whl", hash = "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16"}, + {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, +] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, @@ -974,6 +1251,9 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ + {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, + {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, + {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] @@ -994,6 +1274,36 @@ pbr = [ {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, ] pillow = [ + {file = "Pillow-6.2.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:834dd023b7f987d6b700ad93dc818098d7eb046bd445e9992b3093c6f9d7a95f"}, + {file = "Pillow-6.2.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d3a98444a00b4643b22b0685dbf9e0ddcaf4ebfd4ea23f84f228adf5a0765bb2"}, + {file = "Pillow-6.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2b4a94be53dff02af90760c10a2e3634c3c7703410f38c98154d5ce71fe63d20"}, + {file = "Pillow-6.2.2-cp27-cp27m-win32.whl", hash = "sha256:87ef0eca169f7f0bc050b22f05c7e174a65c36d584428431e802c0165c5856ea"}, + {file = "Pillow-6.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:cbd5647097dc55e501f459dbac7f1d0402225636deeb9e0a98a8d2df649fc19d"}, + {file = "Pillow-6.2.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:4adc3302df4faf77c63ab3a83e1a3e34b94a6a992084f4aa1cb236d1deaf4b39"}, + {file = "Pillow-6.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e3a797a079ce289e59dbd7eac9ca3bf682d52687f718686857281475b7ca8e6a"}, + {file = "Pillow-6.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:bb7861e4618a0c06c40a2e509c1bea207eea5fd4320d486e314e00745a402ca5"}, + {file = "Pillow-6.2.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:535e8e0e02c9f1fc2e307256149d6ee8ad3aa9a6e24144b7b6e6fb6126cb0e99"}, + {file = "Pillow-6.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:bc149dab804291a18e1186536519e5e122a2ac1316cb80f506e855a500b1cdd4"}, + {file = "Pillow-6.2.2-cp35-cp35m-win32.whl", hash = "sha256:1a3bc8e1db5af40a81535a62a591fafdb30a8a1b319798ea8052aa65ef8f06d2"}, + {file = "Pillow-6.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:d6b4dc325170bee04ca8292bbd556c6f5398d52c6149ca881e67daf62215426f"}, + {file = "Pillow-6.2.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:43ef1cff7ee57f9c8c8e6fa02a62eae9fa23a7e34418c7ce88c0e3fe09d1fb38"}, + {file = "Pillow-6.2.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:900de1fdc93764be13f6b39dc0dd0207d9ff441d87ad7c6e97e49b81987dc0f3"}, + {file = "Pillow-6.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b83b380f9181cacc994f4c983d95a9c8b00b50bf786c66d235716b526a3332"}, + {file = "Pillow-6.2.2-cp36-cp36m-win32.whl", hash = "sha256:00e0bbe9923adc5cc38a8da7d87d4ce16cde53b8d3bba8886cb928e84522d963"}, + {file = "Pillow-6.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:5ccfcb0a34ad9b77ad247c231edb781763198f405a5c8dc1b642449af821fb7f"}, + {file = "Pillow-6.2.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:5dcbbaa3a24d091a64560d3c439a8962866a79a033d40eb1a75f1b3413bfc2bc"}, + {file = "Pillow-6.2.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6e2a7e74d1a626b817ecb7a28c433b471a395c010b2a1f511f976e9ea4363e64"}, + {file = "Pillow-6.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c424d35a5259be559b64490d0fd9e03fba81f1ce8e5b66e0a59de97547351d80"}, + {file = "Pillow-6.2.2-cp37-cp37m-win32.whl", hash = "sha256:aa4792ab056f51b49e7d59ce5733155e10a918baf8ce50f64405db23d5627fa2"}, + {file = "Pillow-6.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0d5c99f80068f13231ac206bd9b2e80ea357f5cf9ae0fa97fab21e32d5b61065"}, + {file = "Pillow-6.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03457e439d073770d88afdd90318382084732a5b98b0eb6f49454746dbaae701"}, + {file = "Pillow-6.2.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ccf16fe444cc43800eeacd4f4769971200982200a71b1368f49410d0eb769543"}, + {file = "Pillow-6.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b72c39585f1837d946bd1a829a4820ccf86e361f28cbf60f5d646f06318b61e2"}, + {file = "Pillow-6.2.2-cp38-cp38-win32.whl", hash = "sha256:3ba7d8f1d962780f86aa747fef0baf3211b80cb13310fff0c375da879c0656d4"}, + {file = "Pillow-6.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3e81485cec47c24f5fb27acb485a4fc97376b2b332ed633867dc68ac3077998c"}, + {file = "Pillow-6.2.2-pp273-pypy_73-win32.whl", hash = "sha256:aa1b0297e352007ec781a33f026afbb062a9a9895bb103c8f49af434b1666880"}, + {file = "Pillow-6.2.2-pp373-pypy36_pp73-win32.whl", hash = "sha256:82859575005408af81b3e9171ae326ff56a69af5439d3fc20e8cb76cd51c8246"}, + {file = "Pillow-6.2.2.tar.gz", hash = "sha256:db9ff0c251ed066d367f53b64827cc9e18ccea001b986d08c265e53625dab950"}, {file = "Pillow-7.1.2-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3"}, {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d"}, {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b532bcc2f008e96fd9241177ec580829dee817b090532f43e54074ecffdcd97f"}, @@ -1039,6 +1349,8 @@ pyflakes = [ {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, ] pygments = [ + {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, + {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] @@ -1047,6 +1359,8 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ + {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, + {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, ] @@ -1055,6 +1369,8 @@ pytest-cov = [ {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, ] pytest-rerunfailures = [ + {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, + {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, ] @@ -1122,6 +1438,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, ] sphinx = [ + {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, + {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, {file = "Sphinx-3.1.1-py3-none-any.whl", hash = "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5"}, {file = "Sphinx-3.1.1.tar.gz", hash = "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258"}, ] @@ -1153,6 +1471,10 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, ] +sphinxcontrib-websupport = [ + {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, + {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, +] stevedore = [ {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, @@ -1192,6 +1514,11 @@ typed-ast = [ {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] +typing = [ + {file = "typing-3.7.4.1-py2-none-any.whl", hash = "sha256:c8cabb5ab8945cd2f54917be357d134db9cc1eb039e59d1606dc1e60cb1d9d36"}, + {file = "typing-3.7.4.1-py3-none-any.whl", hash = "sha256:f38d83c5a7a7086543a0f649564d661859c5146a85775ab90c0d2f93ffaa9714"}, + {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, +] urllib3 = [ {file = "urllib3-1.22-py2.py3-none-any.whl", hash = "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b"}, {file = "urllib3-1.22.tar.gz", hash = "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"}, From 2a1062b99a8162902f6f671e3775d1fd93f97d2c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:21:32 -0500 Subject: [PATCH 0514/2998] poetry: Lock pytest-cov --- poetry.lock | 138 +++++++++++++++++++++++++++++++------------------ pyproject.toml | 5 +- 2 files changed, 92 insertions(+), 51 deletions(-) diff --git a/poetry.lock b/poetry.lock index 83640af8d3..0c23945a4d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -175,7 +175,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version >= \"3\" and python_version < \"3.4\" or python_version < \"3.4\"" +marker = "python_version >= \"3\" and python_version < \"3.4\" or python_version < \"3\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -186,8 +186,11 @@ category = "dev" description = "Code coverage measurement for Python" name = "coverage" optional = false -python-versions = "*" -version = "4.4.2" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "5.1" + +[package.extras] +toml = ["toml"] [[package]] category = "dev" @@ -385,6 +388,7 @@ version = "0.8.2" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -629,6 +633,23 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] category = "dev" description = "Pytest plugin for measuring coverage." +marker = "python_version < \"3\" or python_version >= \"3\"" +name = "pytest-cov" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.9.0" + +[package.dependencies] +coverage = ">=4.4" +pytest = ">=3.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] + +[[package]] +category = "dev" +description = "Pytest plugin for measuring coverage." +marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -668,6 +689,7 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -747,6 +769,15 @@ version = "1.3.1" [package.dependencies] docutils = ">=0.11,<1.0" +[[package]] +category = "dev" +description = "scandir, a better directory iterator and faster os.walk()" +marker = "python_version < \"3\"" +name = "scandir" +optional = false +python-versions = "*" +version = "1.10.0" + [[package]] category = "dev" description = "Python 2 and 3 compatibility utilities" @@ -1000,11 +1031,12 @@ category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" optional = false -python-versions = "*" -version = "1.22" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "1.25.9" [package.extras] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] @@ -1031,7 +1063,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1047,7 +1079,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "8c7b4fe636b0e1b4526182cf5edc78a2113276f97f7000f4ffa74a96047e4724" +content-hash = "6622b5c3e7440c726170193068092b6fa72e9929ff227cc1c5ac481e51084652" python-versions = "~2.7 || ^3.5" [metadata.files] @@ -1120,46 +1152,37 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-4.4.2-cp26-cp26m-macosx_10_10_x86_64.whl", hash = "sha256:d1ee76f560c3c3e8faada866a07a32485445e16ed2206ac8378bd90dadffb9f0"}, - {file = "coverage-4.4.2-cp26-cp26m-manylinux1_i686.whl", hash = "sha256:007eeef7e23f9473622f7d94a3e029a45d55a92a1f083f0f3512f5ab9a669b05"}, - {file = "coverage-4.4.2-cp26-cp26m-manylinux1_x86_64.whl", hash = "sha256:17307429935f96c986a1b1674f78079528833410750321d22b5fb35d1883828e"}, - {file = "coverage-4.4.2-cp26-cp26mu-manylinux1_i686.whl", hash = "sha256:845fddf89dca1e94abe168760a38271abfc2e31863fbb4ada7f9a99337d7c3dc"}, - {file = "coverage-4.4.2-cp26-cp26mu-manylinux1_x86_64.whl", hash = "sha256:3f4d0b3403d3e110d2588c275540649b1841725f5a11a7162620224155d00ba2"}, - {file = "coverage-4.4.2-cp27-cp27m-macosx_10_12_intel.whl", hash = "sha256:4c4f368ffe1c2e7602359c2c50233269f3abe1c48ca6b288dcd0fb1d1c679733"}, - {file = "coverage-4.4.2-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:f8c55dd0f56d3d618dfacf129e010cbe5d5f94b6951c1b2f13ab1a2f79c284da"}, - {file = "coverage-4.4.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cdd92dd9471e624cd1d8c1a2703d25f114b59b736b0f1f659a98414e535ffb3d"}, - {file = "coverage-4.4.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ad357d12971e77360034c1596011a03f50c0f9e1ecd12e081342b8d1aee2236"}, - {file = "coverage-4.4.2-cp27-cp27m-win32.whl", hash = "sha256:700d7579995044dc724847560b78ac786f0ca292867447afda7727a6fbaa082e"}, - {file = "coverage-4.4.2-cp27-cp27m-win_amd64.whl", hash = "sha256:66f393e10dd866be267deb3feca39babba08ae13763e0fc7a1063cbe1f8e49f6"}, - {file = "coverage-4.4.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e9a0e1caed2a52f15c96507ab78a48f346c05681a49c5b003172f8073da6aa6b"}, - {file = "coverage-4.4.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:eea9135432428d3ca7ee9be86af27cb8e56243f73764a9b6c3e0bda1394916be"}, - {file = "coverage-4.4.2-cp33-cp33m-macosx_10_10_x86_64.whl", hash = "sha256:5ff16548492e8a12e65ff3d55857ccd818584ed587a6c2898a9ebbe09a880674"}, - {file = "coverage-4.4.2-cp33-cp33m-manylinux1_i686.whl", hash = "sha256:d00e29b78ff610d300b2c37049a41234d48ea4f2d2581759ebcf67caaf731c31"}, - {file = "coverage-4.4.2-cp33-cp33m-manylinux1_x86_64.whl", hash = "sha256:87d942863fe74b1c3be83a045996addf1639218c2cb89c5da18c06c0fe3917ea"}, - {file = "coverage-4.4.2-cp34-cp34m-macosx_10_10_x86_64.whl", hash = "sha256:358d635b1fc22a425444d52f26287ae5aea9e96e254ff3c59c407426f44574f4"}, - {file = "coverage-4.4.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:81912cfe276e0069dca99e1e4e6be7b06b5fc8342641c6b472cb2fed7de7ae18"}, - {file = "coverage-4.4.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:079248312838c4c8f3494934ab7382a42d42d5f365f0cf7516f938dbb3f53f3f"}, - {file = "coverage-4.4.2-cp34-cp34m-win32.whl", hash = "sha256:b0059630ca5c6b297690a6bf57bf2fdac1395c24b7935fd73ee64190276b743b"}, - {file = "coverage-4.4.2-cp34-cp34m-win_amd64.whl", hash = "sha256:493082f104b5ca920e97a485913de254cbe351900deed72d4264571c73464cd0"}, - {file = "coverage-4.4.2-cp35-cp35m-macosx_10_10_x86_64.whl", hash = "sha256:e3ba9b14607c23623cf38f90b23f5bed4a3be87cbfa96e2e9f4eabb975d1e98b"}, - {file = "coverage-4.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:82cbd3317320aa63c65555aa4894bf33a13fb3a77f079059eb5935eea415938d"}, - {file = "coverage-4.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9721f1b7275d3112dc7ccf63f0553c769f09b5c25a26ee45872c7f5c09edf6c1"}, - {file = "coverage-4.4.2-cp35-cp35m-win32.whl", hash = "sha256:bd4800e32b4c8d99c3a2c943f1ac430cbf80658d884123d19639bcde90dad44a"}, - {file = "coverage-4.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:f29841e865590af72c4b90d7b5b8e93fd560f5dea436c1d5ee8053788f9285de"}, - {file = "coverage-4.4.2-cp36-cp36m-macosx_10_12_x86_64.whl", hash = "sha256:f3a5c6d054c531536a83521c00e5d4004f1e126e2e2556ce399bef4180fbe540"}, - {file = "coverage-4.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dd707a21332615108b736ef0b8513d3edaf12d2a7d5fc26cd04a169a8ae9b526"}, - {file = "coverage-4.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2e1a5c6adebb93c3b175103c2f855eda957283c10cf937d791d81bef8872d6ca"}, - {file = "coverage-4.4.2-cp36-cp36m-win32.whl", hash = "sha256:f87f522bde5540d8a4b11df80058281ac38c44b13ce29ced1e294963dd51a8f8"}, - {file = "coverage-4.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a7cfaebd8f24c2b537fa6a271229b051cdac9c1734bb6f939ccfc7c055689baa"}, - {file = "coverage-4.4.2.tar.gz", hash = "sha256:309d91bd7a35063ec7a0e4d75645488bfab3f0b66373e7722f23da7f5b0f34cc"}, - {file = "coverage-4.4.2.win-amd64-py2.7.exe", hash = "sha256:b6cebae1502ce5b87d7c6f532fa90ab345cfbda62b95aeea4e431e164d498a3d"}, - {file = "coverage-4.4.2.win-amd64-py3.4.exe", hash = "sha256:a4497faa4f1c0fc365ba05eaecfb6b5d24e3c8c72e95938f9524e29dadb15e76"}, - {file = "coverage-4.4.2.win-amd64-py3.5.exe", hash = "sha256:2b4d7f03a8a6632598cbc5df15bbca9f778c43db7cf1a838f4fa2c8599a8691a"}, - {file = "coverage-4.4.2.win-amd64-py3.6.exe", hash = "sha256:1afccd7e27cac1b9617be8c769f6d8a6d363699c9b86820f40c74cfb3328921c"}, - {file = "coverage-4.4.2.win32-py2.7.exe", hash = "sha256:0388c12539372bb92d6dde68b4627f0300d948965bbb7fc104924d715fdc0965"}, - {file = "coverage-4.4.2.win32-py3.4.exe", hash = "sha256:ab3508df9a92c1d3362343d235420d08e2662969b83134f8a97dc1451cbe5e84"}, - {file = "coverage-4.4.2.win32-py3.5.exe", hash = "sha256:43a155eb76025c61fc20c3d03b89ca28efa6f5be572ab6110b2fb68eda96bfea"}, - {file = "coverage-4.4.2.win32-py3.6.exe", hash = "sha256:f98b461cb59f117887aa634a66022c0bd394278245ed51189f63a036516e32de"}, + {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, + {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, + {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, + {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, + {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, + {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, + {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, + {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, + {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, + {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, + {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, + {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, + {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, + {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, + {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, + {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, + {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, + {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, + {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, ] doc8 = [ {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, @@ -1365,6 +1388,8 @@ pytest = [ {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, ] pytest-cov = [ + {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, + {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"}, {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, ] @@ -1429,6 +1454,19 @@ requests-toolbelt = [ restructuredtext-lint = [ {file = "restructuredtext_lint-1.3.1.tar.gz", hash = "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8"}, ] +scandir = [ + {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, + {file = "scandir-1.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"}, + {file = "scandir-1.10.0-cp34-cp34m-win32.whl", hash = "sha256:2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f"}, + {file = "scandir-1.10.0-cp34-cp34m-win_amd64.whl", hash = "sha256:2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e"}, + {file = "scandir-1.10.0-cp35-cp35m-win32.whl", hash = "sha256:2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f"}, + {file = "scandir-1.10.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32"}, + {file = "scandir-1.10.0-cp36-cp36m-win32.whl", hash = "sha256:2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022"}, + {file = "scandir-1.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4"}, + {file = "scandir-1.10.0-cp37-cp37m-win32.whl", hash = "sha256:67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173"}, + {file = "scandir-1.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d"}, + {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, +] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, @@ -1520,8 +1558,8 @@ typing = [ {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, ] urllib3 = [ - {file = "urllib3-1.22-py2.py3-none-any.whl", hash = "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b"}, - {file = "urllib3-1.22.tar.gz", hash = "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"}, + {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, + {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, diff --git a/pyproject.toml b/pyproject.toml index 634fc82bdb..f4993d336a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,4 +40,7 @@ twine = "*" codecov = "*" colorama = "*" coverage = "*" -pytest-cov = "*" +pytest-cov = [ + {version="<2.10.0", python="<3"}, + {version="*", python=">=3"} +] From 92df0b5908aec46afb04ac0f6816de4c63e478b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:25:08 -0500 Subject: [PATCH 0515/2998] Update poetry lockfile --- poetry.lock | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0c23945a4d..07b199531a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,6 +46,7 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -60,6 +61,7 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i [[package]] category = "dev" description = "Internationalization utilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -175,7 +177,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version >= \"3\" and python_version < \"3.4\" or python_version < \"3\"" +marker = "python_version < \"3\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -296,6 +298,7 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -355,6 +358,7 @@ xdg_home = ["appdirs (>=1.4.0)"] [[package]] category = "dev" description = "A very fast and expressive template engine." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -417,6 +421,7 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -437,7 +442,7 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version < \"3.6\" or python_version >= \"3\" and python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3\"" name = "pathlib2" optional = false python-versions = "*" @@ -499,6 +504,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -515,6 +521,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -555,6 +562,7 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -789,6 +797,7 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -876,6 +885,7 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -888,6 +898,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -900,6 +911,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -912,6 +924,7 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" +marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -923,6 +936,7 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -935,6 +949,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -1042,6 +1057,7 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -1063,7 +1079,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" name = "zipp" optional = false python-versions = ">=2.7" From 3e99e8274694b1d3f4dfba371e284ed3bf756ee5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2020 15:28:35 -0500 Subject: [PATCH 0516/2998] Poetry: Lock pathlib2 to make pytest happy For some reason, the latest pytest version doesn't want pathlib2 at 2.3.5 [SolverProblemError] Because no versions of pytest match <4.6.11 || >4.6.11,<4.7.0 and pytest (4.6.11) depends on pathlib2 (>=2.2.0), pytest (<4.7.0) requires pathlib2 (>=2.2.0). And because no versions of pathlib2 match >=2.2.0,<2.3.5 || >2.3.5 and pathlib2 (2.3.5) depends on scandir (*), pytest (<4.7.0) requires scandir (*). So, because no versions of scandir match * and tmuxp depends on pytest (<4.7.0), version solving failed. --- poetry.lock | 44 ++++++++++++++++++++------------------------ pyproject.toml | 1 + 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/poetry.lock b/poetry.lock index 07b199531a..0362babd92 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,7 +46,6 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -61,7 +60,6 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i [[package]] category = "dev" description = "Internationalization utilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -177,7 +175,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3\"" +marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -298,7 +296,6 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -358,7 +355,6 @@ xdg_home = ["appdirs (>=1.4.0)"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -392,7 +388,6 @@ version = "0.8.2" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -421,7 +416,6 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" -marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -442,11 +436,11 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3\"" +marker = "python_version < \"3\"" name = "pathlib2" optional = false python-versions = "*" -version = "2.3.5" +version = "2.3.4" [package.dependencies] six = "*" @@ -455,6 +449,18 @@ six = "*" python = "<3.5" version = "*" +[[package]] +category = "dev" +description = "Object-oriented filesystem paths" +marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" +name = "pathlib2" +optional = false +python-versions = "*" +version = "2.3.5" + +[package.dependencies] +six = "*" + [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." @@ -504,7 +510,6 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -521,7 +526,6 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -562,7 +566,6 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -697,7 +700,6 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -797,7 +799,6 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -885,7 +886,6 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -898,7 +898,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -911,7 +910,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -924,7 +922,6 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" -marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -936,7 +933,6 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -949,7 +945,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -1057,7 +1052,6 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -1079,7 +1073,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1095,7 +1089,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "6622b5c3e7440c726170193068092b6fa72e9929ff227cc1c5ac481e51084652" +content-hash = "f437bd12a8b2f5c43a576e0f7f30d3fe1d8a7580d82d60acfb8bad1fe291ac2b" python-versions = "~2.7 || ^3.5" [metadata.files] @@ -1301,6 +1295,8 @@ packaging = [ {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, ] pathlib2 = [ + {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, + {file = "pathlib2-2.3.4.tar.gz", hash = "sha256:446014523bb9be5c28128c4d2a10ad6bb60769e78bd85658fe44a450674e0ef8"}, {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] diff --git a/pyproject.toml b/pyproject.toml index f4993d336a..7ffb67e48c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ pytest = [ {version="<4.7.0", python="<3"}, {version="*", python=">=3"} ] +pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" sphinx = [ {version="<2", python="<3"}, From f8d7b281b73add2ff6a55f8cbeb6df37c579f2d1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2020 08:32:17 -0500 Subject: [PATCH 0517/2998] travis: Allow failure on pypy3 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f49a7d7e24..b535b4f812 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,7 @@ matrix: finish_fast: true allow_failures: - env: TMUX_VERSION=master + - python: pypy3 cache: - pip - apt From 2809a5e3440e10d22305418adca14d07315dbdca Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2020 09:17:16 -0500 Subject: [PATCH 0518/2998] Remove Pipfile and Pipfile.lock --- Pipfile | 33 -- Pipfile.lock | 827 --------------------------------------------------- 2 files changed, 860 deletions(-) delete mode 100644 Pipfile delete mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 7713933496..0000000000 --- a/Pipfile +++ /dev/null @@ -1,33 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[dev-packages] -docutils = "*" -alagitpull = "*" -aafigure = "*" -sphinx = "*" -isort = "*" -"flake8" = "*" -pytest = "*" -pytest-rerunfailures = "*" -tmuxp = {path = ".",editable = true} -"doc8" = "*" -twine = "*" -sphinx-issues = "*" -pillow = "*" -black = "==19.10b0" - -[packages] -kaptan = "*" -libtmux = "<0.9" -click = ">=7<8" -colorama = "*" -e1839a8 = {path = ".",editable = true} -pytest-cov = "*" -coverage = "*" -codecov = "*" - -[requires] -python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index fdc99a0566..0000000000 --- a/Pipfile.lock +++ /dev/null @@ -1,827 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "16a8ddebb088222899af5b7b21f9f0341b0290822c2eb71836ac30ad38d5fc27" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "attrs": { - "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" - ], - "version": "==19.3.0" - }, - "certifi": { - "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" - ], - "version": "==2020.6.20" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" - ], - "index": "pypi", - "version": "==7.0" - }, - "codecov": { - "hashes": [ - "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091", - "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728" - ], - "index": "pypi", - "version": "==2.1.7" - }, - "colorama": { - "hashes": [ - "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", - "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" - ], - "index": "pypi", - "version": "==0.4.3" - }, - "coverage": { - "hashes": [ - "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", - "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", - "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", - "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", - "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", - "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", - "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", - "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", - "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", - "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", - "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", - "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", - "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", - "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", - "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", - "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", - "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", - "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", - "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", - "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", - "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", - "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", - "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", - "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", - "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", - "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", - "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", - "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", - "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", - "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", - "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" - ], - "index": "pypi", - "version": "==5.0.3" - }, - "e1839a8": { - "editable": true, - "path": "." - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "version": "==2.10" - }, - "kaptan": { - "hashes": [ - "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2" - ], - "index": "pypi", - "version": "==0.5.12" - }, - "libtmux": { - "hashes": [ - "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a" - ], - "index": "pypi", - "version": "==0.8.2" - }, - "more-itertools": { - "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" - ], - "version": "==8.4.0" - }, - "packaging": { - "hashes": [ - "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", - "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" - ], - "version": "==20.4" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "version": "==0.13.1" - }, - "py": { - "hashes": [ - "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", - "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" - ], - "version": "==1.9.0" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", - "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" - ], - "version": "==5.4.3" - }, - "pytest-cov": { - "hashes": [ - "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87", - "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c" - ], - "index": "pypi", - "version": "==2.10.0" - }, - "pyyaml": { - "hashes": [ - "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", - "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", - "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", - "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", - "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", - "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", - "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", - "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", - "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", - "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", - "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" - ], - "version": "==5.3.1" - }, - "requests": { - "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" - ], - "version": "==2.24.0" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "version": "==1.15.0" - }, - "urllib3": { - "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" - ], - "version": "==1.25.9" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" - } - }, - "develop": { - "aafigure": { - "hashes": [ - "sha256:49f2c1fd2b579c1fffbac1386a2670b3f6f475cc7ff6cc04d8b984888c2d9e1e", - "sha256:c7f9409eee58d8484696a1c9e75b4c6ceab9fd060223007a19dcc6f515a30696" - ], - "index": "pypi", - "version": "==0.6" - }, - "alabaster": { - "hashes": [ - "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", - "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" - ], - "version": "==0.7.12" - }, - "alagitpull": { - "hashes": [ - "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a" - ], - "index": "pypi", - "version": "==0.0.23" - }, - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, - "attrs": { - "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" - ], - "version": "==19.3.0" - }, - "babel": { - "hashes": [ - "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38", - "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4" - ], - "version": "==2.8.0" - }, - "black": { - "hashes": [ - "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", - "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539" - ], - "index": "pypi", - "version": "==19.10b0" - }, - "bleach": { - "hashes": [ - "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f", - "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b" - ], - "version": "==3.1.5" - }, - "certifi": { - "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" - ], - "version": "==2020.6.20" - }, - "cffi": { - "hashes": [ - "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", - "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", - "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", - "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", - "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", - "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", - "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", - "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", - "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", - "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", - "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", - "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", - "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", - "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", - "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", - "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", - "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", - "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", - "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", - "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", - "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", - "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", - "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", - "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", - "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", - "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", - "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", - "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" - ], - "version": "==1.14.0" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" - ], - "index": "pypi", - "version": "==7.0" - }, - "cryptography": { - "hashes": [ - "sha256:091d31c42f444c6f519485ed528d8b451d1a0c7bf30e8ca583a0cac44b8a0df6", - "sha256:18452582a3c85b96014b45686af264563e3e5d99d226589f057ace56196ec78b", - "sha256:1dfa985f62b137909496e7fc182dac687206d8d089dd03eaeb28ae16eec8e7d5", - "sha256:1e4014639d3d73fbc5ceff206049c5a9a849cefd106a49fa7aaaa25cc0ce35cf", - "sha256:22e91636a51170df0ae4dcbd250d318fd28c9f491c4e50b625a49964b24fe46e", - "sha256:3b3eba865ea2754738616f87292b7f29448aec342a7c720956f8083d252bf28b", - "sha256:651448cd2e3a6bc2bb76c3663785133c40d5e1a8c1a9c5429e4354201c6024ae", - "sha256:726086c17f94747cedbee6efa77e99ae170caebeb1116353c6cf0ab67ea6829b", - "sha256:844a76bc04472e5135b909da6aed84360f522ff5dfa47f93e3dd2a0b84a89fa0", - "sha256:88c881dd5a147e08d1bdcf2315c04972381d026cdb803325c03fe2b4a8ed858b", - "sha256:96c080ae7118c10fcbe6229ab43eb8b090fccd31a09ef55f83f690d1ef619a1d", - "sha256:a0c30272fb4ddda5f5ffc1089d7405b7a71b0b0f51993cb4e5dbb4590b2fc229", - "sha256:bb1f0281887d89617b4c68e8db9a2c42b9efebf2702a3c5bf70599421a8623e3", - "sha256:c447cf087cf2dbddc1add6987bbe2f767ed5317adb2d08af940db517dd704365", - "sha256:c4fd17d92e9d55b84707f4fd09992081ba872d1a0c610c109c18e062e06a2e55", - "sha256:d0d5aeaedd29be304848f1c5059074a740fa9f6f26b84c5b63e8b29e73dfc270", - "sha256:daf54a4b07d67ad437ff239c8a4080cfd1cc7213df57d33c97de7b4738048d5e", - "sha256:e993468c859d084d5579e2ebee101de8f5a27ce8e2159959b6673b418fd8c785", - "sha256:f118a95c7480f5be0df8afeb9a11bd199aa20afab7a96bcf20409b411a3a85f0" - ], - "version": "==2.9.2" - }, - "doc8": { - "hashes": [ - "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12", - "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721" - ], - "index": "pypi", - "version": "==0.8.1" - }, - "docutils": { - "hashes": [ - "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af", - "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc" - ], - "index": "pypi", - "version": "==0.16" - }, - "entrypoints": { - "hashes": [ - "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", - "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" - ], - "version": "==0.3" - }, - "flake8": { - "hashes": [ - "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb", - "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca" - ], - "index": "pypi", - "version": "==3.7.9" - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "version": "==2.10" - }, - "imagesize": { - "hashes": [ - "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1", - "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1" - ], - "version": "==1.2.0" - }, - "isort": { - "hashes": [ - "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", - "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" - ], - "index": "pypi", - "version": "==4.3.21" - }, - "jeepney": { - "hashes": [ - "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e", - "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf" - ], - "markers": "sys_platform == 'linux'", - "version": "==0.4.3" - }, - "jinja2": { - "hashes": [ - "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", - "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" - ], - "version": "==2.11.2" - }, - "keyring": { - "hashes": [ - "sha256:3401234209015144a5d75701e71cb47239e552b0882313e9f51e8976f9e27843", - "sha256:c53e0e5ccde3ad34284a40ce7976b5b3a3d6de70344c3f8ee44364cc340976ec" - ], - "version": "==21.2.1" - }, - "markupsafe": { - "hashes": [ - "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", - "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", - "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", - "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", - "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", - "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", - "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", - "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", - "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", - "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", - "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", - "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", - "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", - "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", - "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", - "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", - "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", - "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", - "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", - "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", - "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", - "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", - "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", - "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", - "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", - "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", - "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", - "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", - "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", - "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", - "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be" - ], - "version": "==1.1.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "more-itertools": { - "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" - ], - "version": "==8.4.0" - }, - "packaging": { - "hashes": [ - "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", - "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" - ], - "version": "==20.4" - }, - "pathspec": { - "hashes": [ - "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0", - "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061" - ], - "version": "==0.8.0" - }, - "pbr": { - "hashes": [ - "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c", - "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8" - ], - "version": "==5.4.5" - }, - "pillow": { - "hashes": [ - "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be", - "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946", - "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837", - "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f", - "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00", - "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d", - "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533", - "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a", - "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358", - "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda", - "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435", - "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2", - "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313", - "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff", - "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317", - "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2", - "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614", - "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0", - "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386", - "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9", - "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636", - "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865" - ], - "index": "pypi", - "version": "==7.0.0" - }, - "pkginfo": { - "hashes": [ - "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", - "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32" - ], - "version": "==1.5.0.1" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "version": "==0.13.1" - }, - "py": { - "hashes": [ - "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", - "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" - ], - "version": "==1.9.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", - "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" - ], - "version": "==2.5.0" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "version": "==2.20" - }, - "pyflakes": { - "hashes": [ - "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", - "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" - ], - "version": "==2.1.1" - }, - "pygments": { - "hashes": [ - "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", - "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" - ], - "version": "==2.6.1" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", - "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" - ], - "version": "==5.4.3" - }, - "pytest-rerunfailures": { - "hashes": [ - "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4", - "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b" - ], - "index": "pypi", - "version": "==9.0" - }, - "pytz": { - "hashes": [ - "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", - "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" - ], - "version": "==2020.1" - }, - "readme-renderer": { - "hashes": [ - "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d", - "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376" - ], - "version": "==26.0" - }, - "regex": { - "hashes": [ - "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a", - "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938", - "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29", - "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae", - "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387", - "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a", - "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf", - "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610", - "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9", - "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5", - "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3", - "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89", - "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded", - "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754", - "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f", - "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868", - "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd", - "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910", - "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3", - "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac", - "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c" - ], - "version": "==2020.6.8" - }, - "requests": { - "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" - ], - "version": "==2.24.0" - }, - "requests-toolbelt": { - "hashes": [ - "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", - "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" - ], - "version": "==0.9.1" - }, - "restructuredtext-lint": { - "hashes": [ - "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8" - ], - "version": "==1.3.1" - }, - "secretstorage": { - "hashes": [ - "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6", - "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b" - ], - "markers": "sys_platform == 'linux'", - "version": "==3.1.2" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "version": "==1.15.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0", - "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52" - ], - "version": "==2.0.0" - }, - "sphinx": { - "hashes": [ - "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258", - "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5" - ], - "index": "pypi", - "version": "==3.1.1" - }, - "sphinx-issues": { - "hashes": [ - "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22", - "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3" - ], - "index": "pypi", - "version": "==1.2.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", - "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f", - "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b" - ], - "version": "==1.0.3" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" - ], - "version": "==1.0.3" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc", - "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a" - ], - "version": "==1.1.4" - }, - "stevedore": { - "hashes": [ - "sha256:609912b87df5ad338ff8e44d13eaad4f4170a65b79ae9cb0aa5632598994a1b7", - "sha256:c4724f8d7b8f6be42130663855d01a9c2414d6046055b5a65ab58a0e38637688" - ], - "version": "==2.0.1" - }, - "tmuxp": { - "editable": true, - "path": "." - }, - "toml": { - "hashes": [ - "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", - "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" - ], - "version": "==0.10.1" - }, - "tqdm": { - "hashes": [ - "sha256:07c06493f1403c1380b630ae3dcbe5ae62abcf369a93bbc052502279f189ab8c", - "sha256:cd140979c2bebd2311dfb14781d8f19bd5a9debb92dcab9f6ef899c987fcf71f" - ], - "version": "==4.46.1" - }, - "twine": { - "hashes": [ - "sha256:c1af8ca391e43b0a06bbc155f7f67db0bf0d19d284bfc88d1675da497a946124", - "sha256:d561a5e511f70275e5a485a6275ff61851c16ffcb3a95a602189161112d9f160" - ], - "index": "pypi", - "version": "==3.1.1" - }, - "typed-ast": { - "hashes": [ - "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", - "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", - "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", - "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", - "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", - "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", - "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", - "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", - "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", - "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", - "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", - "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", - "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", - "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", - "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", - "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", - "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", - "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", - "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", - "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", - "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" - ], - "version": "==1.4.1" - }, - "urllib3": { - "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" - ], - "version": "==1.25.9" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - } - } -} From 76af6064649dadb0876f53c05673948c3e5dd5c9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2020 09:18:31 -0500 Subject: [PATCH 0519/2998] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index ec62760077..ee4bce9f0e 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ current - Travis: Only run on master and PRs one time - Travis: Add caching for tmux builds - Travis: Test 2.9 and 3.0a +- :issue:`613`: Move from Pipenv to Poetry 1.5.4 <2019-11-06> ------------------ From 864713820c8a847ab5ac0eb983ac1ccaf23f936b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2020 10:19:51 -0500 Subject: [PATCH 0520/2998] poetry: Load in .venv directory --- poetry.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 poetry.toml diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000000..ab1033bd37 --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true From f68609d4359f86e2c0383cde3f42c9e390c66ad1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2020 10:20:00 -0500 Subject: [PATCH 0521/2998] tmuxp: Update for poetry --- .tmuxp-before-script.sh | 3 +++ .tmuxp.yaml | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100755 .tmuxp-before-script.sh diff --git a/.tmuxp-before-script.sh b/.tmuxp-before-script.sh new file mode 100755 index 0000000000..0721faabdd --- /dev/null +++ b/.tmuxp-before-script.sh @@ -0,0 +1,3 @@ +#!/bin/sh +poetry shell --no-ansi --no-interaction &2> /dev/null +poetry install --no-ansi --no-interaction &2> /dev/null diff --git a/.tmuxp.yaml b/.tmuxp.yaml index cb44faefeb..f597979c45 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -1,8 +1,8 @@ session_name: tmuxp start_directory: ./ # load session relative to config location (project root). -before_script: pipenv install --dev --skip-lock -shell_command_before: - - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' +before_script: ./.tmuxp-before-script.sh +shell_command_before: +- '[ -f .venv/bin/activate ] && source .venv/bin/activate && reset' windows: - window_name: tmuxp focus: True From 3edfd2acbdf2becda09f0d2ac107265983bf5104 Mon Sep 17 00:00:00 2001 From: Badr BADRI <57548585+pythops@users.noreply.github.com> Date: Sun, 21 Jun 2020 19:33:48 +0200 Subject: [PATCH 0522/2998] Add ls option to cli --- tmuxp/cli.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 123a1f67f8..78b2d49e7c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -10,6 +10,7 @@ import logging import os import sys +from pathlib import Path import click import kaptan @@ -924,3 +925,11 @@ def command_convert(config): buf.write(newconfig) buf.close() print('New config saved to <%s>.' % newfile) + + +@cli.command(name='ls', short_help='List configured sessions in $HOME/.tmuxp dir.') +def command_ls(): + tmuxp_dir = Path.home() / '.tmuxp' + if tmuxp_dir.exists() and tmuxp_dir.is_dir(): + for f in tmuxp_dir.iterdir(): + print(f.stem) From 82cfc69b93ecb4e4095bf50a42cddf0e6c7a1534 Mon Sep 17 00:00:00 2001 From: Badr BADRI <57548585+pythops@users.noreply.github.com> Date: Sat, 27 Jun 2020 17:33:46 +0200 Subject: [PATCH 0523/2998] Add tests for ls option --- tests/test_cli.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 2e94efa151..c63730a625 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,6 +4,7 @@ import json import os +from pathlib import Path import pytest @@ -13,7 +14,13 @@ import libtmux from libtmux.common import has_lt_version from tmuxp import cli, config -from tmuxp.cli import get_config_dir, is_pure_name, load_workspace, scan_config +from tmuxp.cli import ( + command_ls, + get_config_dir, + is_pure_name, + load_workspace, + scan_config, +) from .fixtures._util import curjoin, loadfixture @@ -574,3 +581,15 @@ def check_cmd(config_arg): assert str(user_config) in check_cmd(str(configdir.join('myconfig.yaml'))) assert 'file not found' in check_cmd('.tmuxp.json') + +def test_ls_cli(monkeypatch, tmpdir): + tmpdir.join('.tmuxp/session_1.yaml').ensure() + tmpdir.join('.tmuxp/session_2.yaml').ensure() + tmpdir.join('.tmuxp/session_3.json').ensure() + + monkeypatch.setenv("HOME", str(tmpdir)) + + runner = CliRunner() + + cli_output = runner.invoke(command_ls).output + assert cli_output == "session_1\nsession_2\nsession_3\n" From 10e5561e96026b8c6947411720ba292a30bf67d2 Mon Sep 17 00:00:00 2001 From: Badr BADRI <57548585+pythops@users.noreply.github.com> Date: Sat, 27 Jun 2020 19:02:30 +0200 Subject: [PATCH 0524/2998] Use single quotes --- tests/test_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index c63730a625..a44ff8f485 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -592,4 +592,4 @@ def test_ls_cli(monkeypatch, tmpdir): runner = CliRunner() cli_output = runner.invoke(command_ls).output - assert cli_output == "session_1\nsession_2\nsession_3\n" + assert cli_output == 'session_1\nsession_2\nsession_3\n' From e453ce830a5a62219a7a1b3edd68a4756b2f588a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Jul 2020 06:17:12 -0500 Subject: [PATCH 0525/2998] tmuxp ls: Alphabetize --- tmuxp/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 78b2d49e7c..723622c8eb 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -931,5 +931,5 @@ def command_convert(config): def command_ls(): tmuxp_dir = Path.home() / '.tmuxp' if tmuxp_dir.exists() and tmuxp_dir.is_dir(): - for f in tmuxp_dir.iterdir(): + for f in sorted(tmuxp_dir.iterdir()): print(f.stem) From 9e3b36c2c089b53c7fb8531eade2e57c087df358 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Jul 2020 06:34:48 -0500 Subject: [PATCH 0526/2998] Ignore directories, files not covered in home dir --- tmuxp/cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 723622c8eb..7f2598495d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -27,6 +27,8 @@ logger = logging.getLogger(__name__) +VALID_CONFIG_DIR_FILE_EXTENSIONS = ['.yaml', '.yml', '.json'] + def get_cwd(): return os.getcwd() @@ -327,7 +329,7 @@ def scan_config(config, config_dir=None): x for x in [ '%s%s' % (join(config_dir, config), ext) - for ext in ['.yaml', '.yml', '.json'] + for ext in VALID_CONFIG_DIR_FILE_EXTENSIONS ] if exists(x) ] @@ -932,4 +934,6 @@ def command_ls(): tmuxp_dir = Path.home() / '.tmuxp' if tmuxp_dir.exists() and tmuxp_dir.is_dir(): for f in sorted(tmuxp_dir.iterdir()): + if f.is_dir() or f.suffix not in VALID_CONFIG_DIR_FILE_EXTENSIONS: + continue print(f.stem) From 77c45af8583c3a8de346f18671e77feb04e95961 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Jul 2020 06:35:20 -0500 Subject: [PATCH 0527/2998] tmuxp ls: Update tests --- tests/test_cli.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index a44ff8f485..c6b7f7c0a9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,7 +4,7 @@ import json import os -from pathlib import Path +import pathlib import pytest @@ -582,14 +582,32 @@ def check_cmd(config_arg): assert 'file not found' in check_cmd('.tmuxp.json') -def test_ls_cli(monkeypatch, tmpdir): - tmpdir.join('.tmuxp/session_1.yaml').ensure() - tmpdir.join('.tmuxp/session_2.yaml').ensure() - tmpdir.join('.tmuxp/session_3.json').ensure() +def test_ls_cli(monkeypatch, tmpdir): monkeypatch.setenv("HOME", str(tmpdir)) - runner = CliRunner() + filenames = [ + '.git/', + '.gitignore/', + 'session_1.yaml', + 'session_2.yaml', + 'session_3.json', + 'session_4.txt', + ] + + # should ignore: + # - directories should be ignored + # - extensions not covered in VALID_CONFIG_DIR_FILE_EXTENSIONS + ignored_filenames = ['.git/', '.gitignore/', 'session_4.txt'] + stems = [pathlib.PurePath(f).stem for f in filenames if f not in ignored_filenames] + + for filename in filenames: + location = tmpdir.join('.tmuxp/{}'.format(filename)) + if filename.endswith('/'): + location.ensure_dir() + else: + location.ensure() + runner = CliRunner() cli_output = runner.invoke(command_ls).output - assert cli_output == 'session_1\nsession_2\nsession_3\n' + assert cli_output == '\n'.join(stems) + '\n' From 40a0cf1529407d8e7a82a43ea23d7eb2c6683224 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Jul 2020 06:42:34 -0500 Subject: [PATCH 0528/2998] tmuxp ls: Do it without pathlib This way only python 2.7 is needed --- tests/test_cli.py | 3 +-- tmuxp/cli.py | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index c6b7f7c0a9..1d5882fe5c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,7 +4,6 @@ import json import os -import pathlib import pytest @@ -599,7 +598,7 @@ def test_ls_cli(monkeypatch, tmpdir): # - directories should be ignored # - extensions not covered in VALID_CONFIG_DIR_FILE_EXTENSIONS ignored_filenames = ['.git/', '.gitignore/', 'session_4.txt'] - stems = [pathlib.PurePath(f).stem for f in filenames if f not in ignored_filenames] + stems = [os.path.splitext(f)[0] for f in filenames if f not in ignored_filenames] for filename in filenames: location = tmpdir.join('.tmuxp/{}'.format(filename)) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7f2598495d..b3d912b489 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -10,7 +10,6 @@ import logging import os import sys -from pathlib import Path import click import kaptan @@ -931,9 +930,10 @@ def command_convert(config): @cli.command(name='ls', short_help='List configured sessions in $HOME/.tmuxp dir.') def command_ls(): - tmuxp_dir = Path.home() / '.tmuxp' - if tmuxp_dir.exists() and tmuxp_dir.is_dir(): - for f in sorted(tmuxp_dir.iterdir()): - if f.is_dir() or f.suffix not in VALID_CONFIG_DIR_FILE_EXTENSIONS: + tmuxp_dir = get_config_dir() + if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): + for f in sorted(os.listdir(tmuxp_dir)): + stem, ext = os.path.splitext(f) + if os.path.isdir(f) or ext not in VALID_CONFIG_DIR_FILE_EXTENSIONS: continue - print(f.stem) + print(stem) From 5e7b9526477eb1d518ad2f844e586f0fc4f3e1da Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 10 Jul 2020 07:22:30 -0500 Subject: [PATCH 0529/2998] tmuxp ls: Fix help message --- tmuxp/cli.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index b3d912b489..f724a765af 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -928,7 +928,9 @@ def command_convert(config): print('New config saved to <%s>.' % newfile) -@cli.command(name='ls', short_help='List configured sessions in $HOME/.tmuxp dir.') +@cli.command( + name='ls', short_help='List configured sessions in {}.'.format(get_config_dir()) +) def command_ls(): tmuxp_dir = get_config_dir() if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): From 8cc661e595b4ef6c0ade804d19b0d103a41ac85f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 07:52:35 -0500 Subject: [PATCH 0530/2998] Update CHANGES --- CHANGES | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGES b/CHANGES index ee4bce9f0e..9b5b17fb2b 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Here you can find the recent changes to tmuxp current ------- +- :issue:`616` New command: ``tmuxp ls`` + + List commands available via config directory. If the config is printed, + it's loadable via ``tmuxp load configfilename`` without needing to type the + full filepath. +- :issue:`480` Fix typo, thanks @jstoja +- :issue:`578` Fix typo, thanks @mauroporras - :issue:`519` Fix typo, thanks @timgates42 - :issue:`506` Fix Makefile typo, thanks @wolfgangpfnuer - Travis: Only run on master and PRs one time From 066977a2470e68527df76b6d4e20a35d578e58b5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 07:55:23 -0500 Subject: [PATCH 0531/2998] tmuxp config: Run sphinx docs through poetry --- .tmuxp.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tmuxp.yaml b/.tmuxp.yaml index f597979c45..d498e1d60a 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -22,4 +22,4 @@ windows: - focus: true - pane - make serve - - make watch + - make SPHINXBUILD='poetry run sphinx-build' watch From 0b99bdb052c2460954d99fd6c93809a86b67a62e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 07:56:26 -0500 Subject: [PATCH 0532/2998] Update docs to mention building docs via SPHINXBUILD variable --- doc/developing.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/developing.rst b/doc/developing.rst index b5ee6353b3..3c9f12ea7a 100644 --- a/doc/developing.rst +++ b/doc/developing.rst @@ -194,6 +194,9 @@ Rebuild the documentation when an ``.rst`` file is edited: $ cd doc $ make watch + # If you're not source'd via `poetry shell`, you can use this: + $ make SPHINXBUILD='poetry run sphinx-build' watch + .. _tmuxp developer config: tmuxp developer config From 8d001deffb389fc564d62c96226e5a23a62e17e4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 07:57:03 -0500 Subject: [PATCH 0533/2998] Add Python 3.8 to trove classifiers --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 170098ac5c..8aae9cadd6 100644 --- a/setup.py +++ b/setup.py @@ -55,6 +55,7 @@ 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: Implementation :: PyPy', "Topic :: Utilities", "Topic :: System :: Shells", From afed0eccc11cf44ae234bfc6b8e1503ba0df0ad5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 08:02:33 -0500 Subject: [PATCH 0534/2998] Update isort to 5.0+ See also: - https://timothycrosley.github.io/isort/docs/major_releases/introducing_isort_5/ - https://timothycrosley.github.io/isort/docs/upgrade_guides/5.0.0/ --- poetry.lock | 201 +++++++++++++++---------------------------------- pyproject.toml | 5 +- 2 files changed, 65 insertions(+), 141 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0362babd92..de3e9409bb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -28,7 +28,6 @@ alabaster = "<0.8" [[package]] category = "dev" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "appdirs" optional = false python-versions = "*" @@ -37,7 +36,6 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -71,7 +69,6 @@ pytz = ">=2015.7" [[package]] category = "dev" description = "Backport of functools.lru_cache" -marker = "python_version < \"3.2\"" name = "backports.functools-lru-cache" optional = false python-versions = ">=2.6" @@ -84,7 +81,6 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pyt [[package]] category = "dev" description = "The uncompromising code formatter." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "black" optional = false python-versions = ">=3.6" @@ -162,7 +158,6 @@ version = "0.4.3" [[package]] category = "dev" description = "Updated configparser from Python 3.7 for Python 2.6+." -marker = "python_version < \"3.2\"" name = "configparser" optional = false python-versions = ">=2.6" @@ -175,7 +170,6 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -219,7 +213,6 @@ version = "0.16" [[package]] category = "dev" description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" -marker = "python_version < \"3.4\"" name = "enum34" optional = false python-versions = "*" @@ -237,31 +230,15 @@ version = "3.8.3" mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" - -[package.dependencies.configparser] -python = "<3.2" -version = "*" - -[package.dependencies.enum34] -python = "<3.4" -version = "*" - -[package.dependencies.functools32] -python = "<3.2" -version = "*" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" +configparser = {version = "*", markers = "python_version < \"3.2\""} +enum34 = {version = "*", markers = "python_version < \"3.4\""} +functools32 = {version = "*", markers = "python_version < \"3.2\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +typing = {version = "*", markers = "python_version < \"3.5\""} [[package]] category = "dev" description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -marker = "python_version < \"3\"" name = "funcsigs" optional = false python-versions = "*" @@ -270,7 +247,6 @@ version = "1.0.2" [[package]] category = "dev" description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." -marker = "python_version < \"3.2\"" name = "functools32" optional = false python-versions = "*" @@ -279,7 +255,6 @@ version = "3.2.3-2" [[package]] category = "dev" description = "Backport of the concurrent.futures package from Python 3" -marker = "python_version < \"3.2\"" name = "futures" optional = false python-versions = ">=2.6, <3" @@ -304,7 +279,6 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -312,18 +286,9 @@ version = "1.7.0" [package.dependencies] zipp = ">=0.5" - -[package.dependencies.configparser] -python = "<3" -version = ">=3.5" - -[package.dependencies.contextlib2] -python = "<3" -version = "*" - -[package.dependencies.pathlib2] -python = "<3" -version = "*" +configparser = {version = ">=3.5", markers = "python_version < \"3\""} +contextlib2 = {version = "*", markers = "python_version < \"3\""} +pathlib2 = {version = "*", markers = "python_version < \"3\""} [package.extras] docs = ["sphinx", "rst.linker"] @@ -338,13 +303,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "4.3.21" [package.dependencies] -[package.dependencies."backports.functools-lru-cache"] -python = "<3.2" -version = "*" - -[package.dependencies.futures] -python = "<3.2" -version = "*" +"backports.functools-lru-cache" = {version = "*", markers = "python_version < \"3.2\""} +futures = {version = "*", markers = "python_version < \"3.2\""} [package.extras] pipfile = ["pipreqs", "requirementslib"] @@ -352,6 +312,18 @@ pyproject = ["toml"] requirements = ["pipreqs", "pip-api"] xdg_home = ["appdirs (>=1.4.0)"] +[[package]] +category = "dev" +description = "A Python utility / library to sort Python imports." +name = "isort" +optional = false +python-versions = ">=3.6,<4.0" +version = "5.1.4" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] + [[package]] category = "dev" description = "A very fast and expressive template engine." @@ -404,7 +376,6 @@ version = "0.6.1" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" -marker = "python_version <= \"2.7\"" name = "more-itertools" optional = false python-versions = "*" @@ -413,6 +384,14 @@ version = "5.0.0" [package.dependencies] six = ">=1.0.0,<2.0.0" +[[package]] +category = "dev" +description = "More routines for operating on iterables, beyond itertools" +name = "more-itertools" +optional = false +python-versions = ">=3.5" +version = "8.3.0" + [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" @@ -436,7 +415,6 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version < \"3\"" name = "pathlib2" optional = false python-versions = "*" @@ -444,27 +422,11 @@ version = "2.3.4" [package.dependencies] six = "*" - -[package.dependencies.scandir] -python = "<3.5" -version = "*" - -[[package]] -category = "dev" -description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" -name = "pathlib2" -optional = false -python-versions = "*" -version = "2.3.5" - -[package.dependencies] -six = "*" +scandir = {version = "*", markers = "python_version < \"3.5\""} [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -481,7 +443,6 @@ version = "5.4.5" [[package]] category = "dev" description = "Python Imaging Library (Fork)" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -490,7 +451,6 @@ version = "6.2.2" [[package]] category = "dev" description = "Python Imaging Library (Fork)" -marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.5" @@ -516,9 +476,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "0.13.1" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] @@ -555,14 +513,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "2.5.2" -[[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." -name = "pygments" -optional = false -python-versions = ">=3.5" -version = "2.6.1" - [[package]] category = "dev" description = "Python parsing module" @@ -587,26 +537,18 @@ pluggy = ">=0.12,<1.0" py = ">=1.5.0" six = ">=1.10.0" wcwidth = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\" and python_version != \"3.4\""} +funcsigs = {version = ">=1.0", markers = "python_version < \"3.0\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} -[package.dependencies.colorama] -python = "<3.4.0 || >=3.5.0" -version = "*" - -[package.dependencies.funcsigs] -python = "<3.0" -version = ">=1.0" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.more-itertools] -python = "<2.8" +[[package.dependencies.more-itertools]] +markers = "python_version <= \"2.7\"" version = ">=4.0.0,<6.0.0" -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" +[[package.dependencies.more-itertools]] +markers = "python_version > \"2.7\"" +version = ">=4.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] @@ -620,22 +562,16 @@ python-versions = ">=3.5" version = "5.4.3" [package.dependencies] -atomicwrites = ">=1.0" attrs = ">=17.4.0" -colorama = "*" more-itertools = ">=4.0.0" packaging = "*" pluggy = ">=0.12,<1.0" py = ">=1.5.0" wcwidth = "*" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} [package.extras] checkqa-mypy = ["mypy (v0.761)"] @@ -644,7 +580,6 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] category = "dev" description = "Pytest plugin for measuring coverage." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -660,7 +595,6 @@ testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", " [[package]] category = "dev" description = "Pytest plugin for measuring coverage." -marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -683,7 +617,6 @@ version = "8.0" [package.dependencies] pytest = ">=4.4" -setuptools = ">=40.0" [[package]] category = "dev" @@ -695,7 +628,6 @@ version = "9.0" [package.dependencies] pytest = ">=5.0" -setuptools = ">=40.0" [[package]] category = "dev" @@ -733,7 +665,6 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -782,7 +713,6 @@ docutils = ">=0.11,<1.0" [[package]] category = "dev" description = "scandir, a better directory iterator and faster os.walk()" -marker = "python_version < \"3\"" name = "scandir" optional = false python-versions = "*" @@ -817,19 +747,15 @@ Jinja2 = ">=2.3" Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3,<2.0 || >2.0" -colorama = ">=0.3.5" docutils = ">=0.11" imagesize = "*" packaging = "*" requests = ">=2.0.0" -setuptools = "*" six = ">=1.5" snowballstemmer = ">=1.1" sphinxcontrib-websupport = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +typing = {version = "*", markers = "python_version < \"3.5\""} [package.extras] test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] @@ -848,12 +774,10 @@ Jinja2 = ">=2.3" Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" -colorama = ">=0.3.5" docutils = ">=0.12" imagesize = "*" packaging = "*" requests = ">=2.5.0" -setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -861,6 +785,7 @@ sphinxcontrib-htmlhelp = "*" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = "*" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} [package.extras] docs = ["sphinxcontrib-websupport"] @@ -957,7 +882,6 @@ test = ["pytest"] [[package]] category = "dev" description = "Sphinx API for Web Apps" -marker = "python_version < \"3\"" name = "sphinxcontrib-websupport" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -981,7 +905,6 @@ six = ">=1.10.0" [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "toml" optional = false python-versions = "*" @@ -1011,7 +934,6 @@ pkginfo = ">=1.4.2" readme-renderer = ">=21.0" requests = ">=2.5.0,<2.15 || >2.15,<2.16 || >2.16" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -setuptools = ">=0.7.0" tqdm = ">=4.14" [package.extras] @@ -1021,7 +943,6 @@ with-blake2 = ["pyblake2"] [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "typed-ast" optional = false python-versions = "*" @@ -1030,7 +951,6 @@ version = "1.4.1" [[package]] category = "dev" description = "Type Hints for Python" -marker = "python_version < \"3.5\"" name = "typing" optional = false python-versions = "*" @@ -1058,9 +978,7 @@ python-versions = "*" version = "0.2.5" [package.dependencies] -[package.dependencies."backports.functools-lru-cache"] -python = "<3.2" -version = ">=1.2.1" +"backports.functools-lru-cache" = {version = ">=1.2.1", markers = "python_version < \"3.2\""} [[package]] category = "dev" @@ -1073,23 +991,21 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" version = "1.2.0" [package.dependencies] -[package.dependencies.contextlib2] -python = "<3.4" -version = "*" +contextlib2 = {version = "*", markers = "python_version < \"3.4\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "f437bd12a8b2f5c43a576e0f7f30d3fe1d8a7580d82d60acfb8bad1fe291ac2b" +content-hash = "4e4bec346cb084e426f1960c5d4a9e82ade5564535adef1c7a4adbda2c1c21ae" +lock-version = "1.1" python-versions = "~2.7 || ^3.5" [metadata.files] @@ -1238,6 +1154,8 @@ importlib-metadata = [ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, + {file = "isort-5.1.4-py3-none-any.whl", hash = "sha256:ae3007f72a2e9da36febd3454d8be4b175d6ca17eb765841d5fe3d038aede79d"}, + {file = "isort-5.1.4.tar.gz", hash = "sha256:145072eedc4927cc9c1f9478f2d83b2fc1e6469df4129c02ef4e8c742207a46c"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -1277,6 +1195,11 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mccabe = [ @@ -1287,6 +1210,8 @@ more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, + {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, + {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] @@ -1297,8 +1222,6 @@ packaging = [ pathlib2 = [ {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, {file = "pathlib2-2.3.4.tar.gz", hash = "sha256:446014523bb9be5c28128c4d2a10ad6bb60769e78bd85658fe44a450674e0ef8"}, - {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, - {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, @@ -1386,8 +1309,6 @@ pyflakes = [ pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, - {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, - {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, diff --git a/pyproject.toml b/pyproject.toml index 7ffb67e48c..e8a9f68f76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,10 @@ black = {version="==19.10b0", python="^3.6"} doc8 = "*" docutils = "*" flake8 = "*" -isort = "*" +isort = [ + {version="<5", python="<3.6"}, + {version=">=5.0.0", python=">=3.6"} +] pillow = [ {version="<7", python="<3"}, {version="*", python=">=3"} From 5783fbb96972a2ebb8ea930933495e704191bb05 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 08:02:57 -0500 Subject: [PATCH 0535/2998] isort: Update config for 5.0 See also: https://timothycrosley.github.io/isort/docs/upgrade_guides/5.0.0/ --- setup.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 61d2927083..91d6b136b4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -50,7 +50,5 @@ include_trailing_comma = true multi_line_output = 3 known_pytest = pytest,py known_first_party = libtmux,tmuxp -split_before_closing_bracket = true sections = FUTURE,STDLIB,PYTEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER line_length = 88 -not_skip = __init__.py From 0a95e5c2515b80a9447187f25cc90225eaa4728f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 08:03:23 -0500 Subject: [PATCH 0536/2998] Run isort 5.x on _compat --- tmuxp/_compat.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index 8cbcb0cdde..36f5bc19ee 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -20,12 +20,12 @@ itervalues = lambda d: d.itervalues() iteritems = lambda d: d.iteritems() + from itertools import imap, izip + + import ConfigParser as configparser + import cPickle as pickle from cStringIO import StringIO as BytesIO from StringIO import StringIO - import cPickle as pickle - import ConfigParser as configparser - - from itertools import izip, imap range_type = xrange @@ -33,6 +33,7 @@ input = raw_input from string import lower as ascii_lowercase + import urlparse exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') @@ -58,9 +59,9 @@ def console_to_str(s): itervalues = lambda d: iter(d.values()) iteritems = lambda d: iter(d.items()) - from io import StringIO, BytesIO - import pickle import configparser + import pickle + from io import BytesIO, StringIO izip = zip imap = map @@ -69,9 +70,9 @@ def console_to_str(s): cmp = lambda a, b: (a > b) - (a < b) input = input - from string import ascii_lowercase import urllib.parse as urllib import urllib.parse as urlparse + from string import ascii_lowercase from urllib.request import urlretrieve console_encoding = sys.__stdout__.encoding From 3a1a72fdd7b63b0012f36a2b7cae1a5bedf2334c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 09:00:43 -0500 Subject: [PATCH 0537/2998] CHANGES: isort update --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 9b5b17fb2b..bbd12e216b 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ current - :issue:`578` Fix typo, thanks @mauroporras - :issue:`519` Fix typo, thanks @timgates42 - :issue:`506` Fix Makefile typo, thanks @wolfgangpfnuer +- :issue:`619` Update isort to 5.x - Travis: Only run on master and PRs one time - Travis: Add caching for tmux builds - Travis: Test 2.9 and 3.0a From 10ee575ce0a0724894cd328b61799f734405d6f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 09:03:20 -0500 Subject: [PATCH 0538/2998] CHANGES: Prepare to ship v1.5.5 --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index bbd12e216b..871539cd5d 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Changelog Here you can find the recent changes to tmuxp -current -------- +1.5.5 <2020-07-26> +------------------ - :issue:`616` New command: ``tmuxp ls`` List commands available via config directory. If the config is printed, From d238603b36f544026251fe74399be0bb01cdfc13 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 09:05:38 -0500 Subject: [PATCH 0539/2998] Tag v1.5.5 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e8a9f68f76..51af073f7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.4" +version = "1.5.5" description = "tmux session manager." license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 570f21eba6..60528c0e71 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.4' +__version__ = '1.5.5' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From b4c54fb9c9fc3710e3ace6e36a1aa04aac0f0be4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 13:21:21 -0500 Subject: [PATCH 0540/2998] Ensure @pythops is credited Almost missed this! Thank you for #599 --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 871539cd5d..46250c9532 100644 --- a/CHANGES +++ b/CHANGES @@ -6,11 +6,11 @@ Here you can find the recent changes to tmuxp 1.5.5 <2020-07-26> ------------------ -- :issue:`616` New command: ``tmuxp ls`` +- :issue:`616` (via: :issue:`599`) New command: ``tmuxp ls`` List commands available via config directory. If the config is printed, it's loadable via ``tmuxp load configfilename`` without needing to type the - full filepath. + full filepath. Thank you @pythops! - :issue:`480` Fix typo, thanks @jstoja - :issue:`578` Fix typo, thanks @mauroporras - :issue:`519` Fix typo, thanks @timgates42 From 2b4e27d7f57cb7975155e6084e8f0583b98ea361 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 16:41:27 -0500 Subject: [PATCH 0541/2998] CHANGES: Fix issue --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 46250c9532..880d55dd96 100644 --- a/CHANGES +++ b/CHANGES @@ -38,7 +38,7 @@ Here you can find the recent changes to tmuxp - :issue:`491` ``tmuxp freeze`` will now infer active session with freezing - :issue:`490` Fix XDG's ``$XDG_CONFIG_HOME`` behavior - :issue:`483`, :issue:`482`, :issue:`480` Doc fixes -- :issue:`484` Simplifying handling of configs with no panes (Fixes +- :issue:`487` Simplifying handling of configs with no panes (Fixes :issue:`470`) 1.5.1 <2019-02-18> From c87ca9ed86f9e278adc123a5aafd34d31a06150a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Jul 2020 16:47:58 -0500 Subject: [PATCH 0542/2998] Update .tmuxp.json via tmuxp convert .tmuxp.yaml --- .tmuxp.json | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/.tmuxp.json b/.tmuxp.json index c98c092189..636804fce8 100644 --- a/.tmuxp.json +++ b/.tmuxp.json @@ -1,41 +1,41 @@ { - "before_script": "pipenv install --dev --skip-lock", + "session_name": "tmuxp", + "start_directory": "./", + "before_script": "./.tmuxp-before-script.sh", + "shell_command_before": [ + "[ -f .venv/bin/activate ] && source .venv/bin/activate && reset" + ], "windows": [ { + "window_name": "tmuxp", + "focus": true, + "layout": "main-horizontal", + "options": { + "main-pane-height": 35 + }, "panes": [ { "focus": true - }, - "pane", + }, + "pane", "make watch_test" - ], - "layout": "main-horizontal", + ] + }, + { + "window_name": "docs", + "layout": "main-horizontal", "options": { "main-pane-height": 35 - }, - "focus": true, - "window_name": "tmuxp" - }, - { + }, + "start_directory": "doc/", "panes": [ { "focus": true - }, - "pane", - "make serve", - "make watch" - ], - "start_directory": "doc/", - "layout": "main-horizontal", - "window_name": "docs", - "options": { - "main-pane-height": 35 - } + }, + "pane", + "make serve", + "make SPHINXBUILD='poetry run sphinx-build' watch" + ] } - ], - "session_name": "tmuxp", - "start_directory": "./", - "shell_command_before": [ - "[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset" ] } \ No newline at end of file From aebc911a44bfff4f3c4dcc82cd0ab89ff89de686 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 5 Aug 2020 16:45:29 -0500 Subject: [PATCH 0543/2998] docs(CHANGES): Fix links (reformat titles) cat CHANGES | sed s/"<\(201[3-9]\|2020\)"/"\(\1"/g | sed s/">$"/"\)"/g | \ sed 's/^[0-1]\..*/tmuxp &/g' | sed 's/^--/&------/g' > CHANGES --- CHANGES | 376 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 188 insertions(+), 188 deletions(-) diff --git a/CHANGES b/CHANGES index 880d55dd96..ae3243aefc 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Changelog Here you can find the recent changes to tmuxp -1.5.5 <2020-07-26> ------------------- +tmuxp 1.5.5 (2020-07-26) +------------------------ - :issue:`616` (via: :issue:`599`) New command: ``tmuxp ls`` List commands available via config directory. If the config is printed, @@ -21,17 +21,17 @@ Here you can find the recent changes to tmuxp - Travis: Test 2.9 and 3.0a - :issue:`613`: Move from Pipenv to Poetry -1.5.4 <2019-11-06> ------------------- +tmuxp 1.5.4 (2019-11-06) +------------------------ - :issue:`500`: Fix window focus - Fix travis CI builds for python 3.7 -1.5.3 <2019-06-06> ------------------- +tmuxp 1.5.3 (2019-06-06) +------------------------ - :issue:`377`: Include examples in source distribution package -1.5.2 <2019-06-02> ------------------- +tmuxp 1.5.2 (2019-06-02) +------------------------ - Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2 released today) - :issue:`484` CHANGES converted to plain reStructuredText @@ -41,13 +41,13 @@ Here you can find the recent changes to tmuxp - :issue:`487` Simplifying handling of configs with no panes (Fixes :issue:`470`) -1.5.1 <2019-02-18> ------------------- +tmuxp 1.5.1 (2019-02-18) +------------------------ - Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package. - Include twine to dev packages on requirements and Pipfile files. -1.5.0 <2018-10-02> ------------------- +tmuxp 1.5.0 (2018-10-02) +------------------------ - Support Click 7.0 - Remove unused ``__future__`` imports - :issue:`471` Update libtmux 0.8.0 -> 0.8.1 @@ -65,16 +65,16 @@ Here you can find the recent changes to tmuxp This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. -1.4.2 <2018-09-30> ------------------- +tmuxp 1.4.2 (2018-09-30) +------------------------ - :issue:`431` Include tests in source distribution -1.4.1 <2018-09-26> ------------------- +tmuxp 1.4.1 (2018-09-26) +------------------------ - Loosen click restraint to <7 -1.4.0 <2018-03-11> ------------------- +tmuxp 1.4.0 (2018-03-11) +------------------------ - Bump libtmux to 0.8.0 - :issue:`264` Update license from BSD to MIT - :issue:`348` Continuous integration updates and fixes for Travis CI @@ -90,8 +90,8 @@ Here you can find the recent changes to tmuxp External websites open in new window. - Update pytest to 3.4.1 -1.3.5 <2017-11-10> ------------------- +tmuxp 1.3.5 (2017-11-10) +------------------------ - :issue:`312` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: @@ -104,33 +104,33 @@ Here you can find the recent changes to tmuxp - :issue:`308` Fix bug where layouts don't correctly set on tmux 2.6 - Upgrade libtmux to 0.7.7 -1.3.4 <2017-10-12> ------------------- +tmuxp 1.3.4 (2017-10-12) +------------------------ - `before_script` now respects `start_directory` in the session root. This makes it easier to run things like `pipenv install` as a `before_script`. -1.3.3 <2017-10-07> ------------------- +tmuxp 1.3.3 (2017-10-07) +------------------------ - Update libtmux to 0.7.5 for tmux 2.6 hotfix -1.3.2 <2017-08-20> ------------------- +tmuxp 1.3.2 (2017-08-20) +------------------------ - :issue:`184` - update libtmux to fix environmental variables in the session scope - Update libtmux to 0.7.4 - Updates to pytest and pytest-rerunfailures -1.3.1 <2017-05-29> ------------------- +tmuxp 1.3.1 (2017-05-29) +------------------------ - :issue:`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. - Update libtmux to 0.7.3 - Switch theme to alagitpull (alabaster subtheme) - Remove unneeded doc dependency packages -1.3.0 <2017-04-27> ------------------- +tmuxp 1.3.0 (2017-04-27) +------------------------ - :issue:`239` Improve support for formatted options when freezing and using configs with them. - :issue:`236` Support for symlinked directories, thanks @rafi. @@ -140,65 +140,65 @@ Here you can find the recent changes to tmuxp - :issue:`248` Upgrade libtmux to 0.7.1 - Upgrade colorama from 0.3.7 to 0.3.9 -1.2.8 <2017-04-02> ------------------- +tmuxp 1.2.8 (2017-04-02) +------------------------ - :issue:`229` More helpful error message on systems missing tmux. - Update libtmux from 0.6.4 to 0.6.5. -1.2.7 <2017-03-25> ------------------- +tmuxp 1.2.7 (2017-03-25) +------------------------ - Support for OpenBSD. -1.2.6 <2017-02-24> ------------------- +tmuxp 1.2.6 (2017-02-24) +------------------------ - :issue:`218` Fix pane ordering by running ``select-layout`` before splits. -1.2.5 <2017-02-08> ------------------- +tmuxp 1.2.5 (2017-02-08) +------------------------ - :issue:`207` add custom tmuxp config directory via ``TMUXP_CONFIGDIR`` variable. - :issue:`199` support for running tmuxp on tmux ``master``. - update libtmux from 0.6.2 to 0.6.3. -1.2.4 <2017-01-13> ------------------- +tmuxp 1.2.4 (2017-01-13) +------------------------ - :issue:`198` bump click from 6.6 to 6.7 - :issue:`195` pin packages for colorama and doc requirements -1.2.3 <2016-12-21> ------------------- +tmuxp 1.2.3 (2016-12-21) +------------------------ - bump libtmux 0.6.0 to 0.6.1 - :issue:`193` improve suppress history test, courtesy of @abeyer. - :issue:`191` documentation typo from @modille - :issue:`186` documentation typo from @joelwallis -1.2.2 <2016-09-16> ------------------- +tmuxp 1.2.2 (2016-09-16) +------------------------ - :issue:`181` Support tmux 2.3 -1.2.1 <2016-09-16> ------------------- +tmuxp 1.2.1 (2016-09-16) +------------------------ - :issue:`132` Handle cases with invalid session names - update libtmux from 0.5.0 to 0.6.0 -1.2.0 <2016-06-16> ------------------- +tmuxp 1.2.0 (2016-06-16) +------------------------ - :issue:`65` Ability to specify ``options`` and ``global_options`` via configuration. Also you can specify environment variables via that. Include tests and add example. -1.1.1 <2016-06-02> ------------------- +tmuxp 1.1.1 (2016-06-02) +------------------------ - :issue:`167` fix attaching multiple sessions - :issue:`165` fix typo in error output, thanks @fpietka - :issue:`166` add new docs on zsh/bash completion - Add back ``tmuxp -V`` for version info -1.1.0 <2016-06-01> ------------------- +tmuxp 1.1.0 (2016-06-01) +------------------------ - :issue:`160` load tmuxp configs by name - :issue:`134` Use ``click`` for command-line completion, Rewrite command line functionality for importing, config finding, conversion and prompts. @@ -206,19 +206,19 @@ Here you can find the recent changes to tmuxp - :issue:`158` argparse bug overcome by switch to click -1.0.2 <2016-05-25> ------------------- +tmuxp 1.0.2 (2016-05-25) +------------------------ - :issue:`163` fix issue re-attaching sessions that are already loaded - :issue:`159` improved support for tmuxinator imports, from @fpietka. - :issue:`161` readme link fixes from @Omeryl. -1.0.1 <2016-05-25> ------------------- +tmuxp 1.0.1 (2016-05-25) +------------------------ - switch to readthedocs.io for docs - :issue:`157` bump libtmux to 0.4.1 -1.0.0-rc1 <2016-05-25> ----------------------- +tmuxp 1.0.0-rc1 (2016-05-25) +---------------------------- - version jump 0.11.1 to 1.0 - tests moved to py.test framework - `libtmux`_ core split into its own project @@ -229,39 +229,39 @@ Here you can find the recent changes to tmuxp - update .tmuxp.yaml and .tmuxp.json for Makefile change - overhaul README -0.11.0 <2016-02-29> -------------------- +tmuxp 0.11.0 (2016-02-29) +------------------------- - :issue:`137` Support for environment settings in configs, thanks `@tasdomas` - Spelling correction, thanks `@sehe`_. -0.10.0 <2016-01-30> -------------------- +tmuxp 0.10.0 (2016-01-30) +------------------------- - :issue:`135` Load multiple tmux sessions at once, thanks `@madprog`_. - :issue:`131` :issue:`133` README and Documentation fixes -0.9.3 <2016-01-06> ------------------- +tmuxp 0.9.3 (2016-01-06) +------------------------ - switch to ``.venv`` for virtualenv directory to not conflict with ``.env`` (used by `autoenv`_). - :issue:`130` move to `entr(1)`_ for file watching in tests. update docs. - [compatibility] Support `Anaconda Python`_ 2 and 3 -0.9.2 <2015-10-21> ------------------- +tmuxp 0.9.2 (2015-10-21) +------------------------ - :issue:`122` Update to support tmux 2.1, thank you `@estin`_. - use travis container infrastructure for faster tests - change test in workspace builder test to use ``top(1)`` instead of ``man(1)``. ``man(1)`` caused errors on some systems where ``PAGER`` is set. -0.9.1 <2015-08-23> ------------------- +tmuxp 0.9.1 (2015-08-23) +------------------------ - :issue:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. See GH issue 119 and `#201564`_ @ FreeBSD Bugzilla. Thanks Ruslan Makhmatkhanov. -0.9.0 <2015-07-08> ------------------- +tmuxp 0.9.0 (2015-07-08) +------------------------ - Renamed ``config.expandpath`` to ``config.expandshell``. - compat 2.7/3.3 wrapper for ``EnvironmentVarGuard`` for testing. @@ -279,13 +279,13 @@ Here you can find the recent changes to tmuxp `@thomasballinger`_. - update travis to use new tmux git repository. -0.8.1 <2015-05-09> ------------------- +tmuxp 0.8.1 (2015-05-09) +------------------------ - [testing]: fix sniffer test runner in python 3 - new animated image demo for RTD and README -0.8.0 <2015-05-07> ------------------- +tmuxp 0.8.0 (2015-05-07) +------------------------ - version bump 0.1.13 -> 0.8.0 - tmux 2.0 support - Fix documentation for :meth:``Session.switch_client()``. @@ -300,8 +300,8 @@ Here you can find the recent changes to tmuxp (See conversation at https://github.com/bitprophet/dotfiles/issues/5) - Refactor ``util.tmux`` into :meth:`util.tmux_cmd`. -0.1.13 <2015-03-25> -------------------- +tmuxp 0.1.13 (2015-03-25) +------------------------- - Remove ``package_metadata.py`` in favor of ``__about__.py``. - ``scent.py`` for building docs - docutils from 0.11 to 0.12 @@ -319,8 +319,8 @@ Here you can find the recent changes to tmuxp from `@thomasballinger`_. - Update about page from teamocil and erb support from `@raine`_. -0.1.12 <2014-08-06> -------------------- +tmuxp 0.1.12 (2014-08-06) +------------------------- - [config] :meth:`config.expand` now resolves directories in configuration via :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars`. - [config] :meth:`config.expandpath` for helping resolve paths. @@ -333,8 +333,8 @@ Here you can find the recent changes to tmuxp Will behave better with relative directories. -0.1.11 <2014-04-06> -------------------- +tmuxp 0.1.11 (2014-04-06) +------------------------- - ``before_script`` now loads relative to project directory with ``./``. - Use ``bootstrap_env.py`` in tmuxp's ``.tmuxp.yaml`` and @@ -347,8 +347,8 @@ Here you can find the recent changes to tmuxp has moved to the ``exc`` module. - Tests for ``run_script_before`` refactored. -0.1.10 <2014-04-02> -------------------- +tmuxp 0.1.10 (2014-04-02) +------------------------- - 2 bug fixes and allow panes with no shell commands to accept options, thanks for these 3 patches, `@ThiefMaster`_: - :issue:`73` Fix an error caused by spaces in @@ -358,12 +358,12 @@ Here you can find the recent changes to tmuxp - :issue:`76` Don't require ``shell_command`` to pass options to panes (like ``focus: true``). -0.1.9 <2014-04-01> ------------------- +tmuxp 0.1.9 (2014-04-01) +------------------------ - The ``--force`` was not with us. -0.1.8 <2014-03-30> ------------------- +tmuxp 0.1.8 (2014-03-30) +------------------------ - :issue:`72` Create destination directory if it doesn't exist. Thanks `@ThiefMaster`_. - New context manager for tests, ``temp_session``. @@ -374,13 +374,13 @@ Here you can find the recent changes to tmuxp script. - :issue:`56` :ref:`python_api_quickstart ` -0.1.7 <2014-02-25> ------------------- +tmuxp 0.1.7 (2014-02-25) +------------------------ - :issue:`55` where tmuxp would crash with letter numbers in version. Write tests. -0.1.6 <2014-02-08> ------------------- +tmuxp 0.1.6 (2014-02-08) +------------------------ - :meth:`Window.split_window()` now allows ``-c start_directory``. - :issue:`35` Builder will now use ``-c start_directory`` to @@ -390,102 +390,102 @@ Here you can find the recent changes to tmuxp window creations. This would bleed into tmux user sessions after creations. -0.1.5-1 <2014-02-05> --------------------- +tmuxp 0.1.5-1 (2014-02-05) +-------------------------- - :issue:`49` bug where ``package_manifest.py`` missing from ``MANIFEST.in`` would cause error installing. -0.1.5 <2014-02-05> ------------------- +tmuxp 0.1.5 (2014-02-05) +------------------------ - section heading normalization. - tao of tmux section now treated as a chatper. tao of tmux may be split off into its own project. - use conventions from `tony/cookiecutter-pypackage`_. -0.1.4 <2014-02-02> ------------------- +tmuxp 0.1.4 (2014-02-02) +------------------------ - Fix ``$ tmuxp freeze`` CLI output. - Update ``_compat`` support module. - Fix extra space in `PEP 263`_. -0.1.3 <2014-01-29> ------------------- +tmuxp 0.1.3 (2014-01-29) +------------------------ - :issue:`48` Fix Python 3 CLI issue. - :issue:`48` ``$ tmuxp`` without option raises an error. - Add space before send-keys to not populate bash and zsh history. -0.1.2 <2014-01-08> ------------------- +tmuxp 0.1.2 (2014-01-08) +------------------------ - now using werkzeug / flask style testsuites. - :issue:`43` Merge ``tmuxp -d`` for loading in detached mode. Thanks `roxit`_. -0.1.1 <2013-12-25> ------------------- +tmuxp 0.1.1 (2013-12-25) +------------------------ - :issue:`32` Fix bug where special characters caused unicode caused unexpected outcomes loading and freezing sessions. -0.1.0 <2013-12-18> ------------------- +tmuxp 0.1.0 (2013-12-18) +------------------------ - fix duplicate print out of filename with using ``tmuxp load .``. - version to 0.1. No ``--pre`` needed. Future versions will not use rc. -0.1-rc8 <2013-12-17> --------------------- +tmuxp 0.1-rc8 (2013-12-17) +-------------------------- - ``unicode_literals`` - Move py2/py3 compliancy code to ``_compat``. -0.1-rc7 <2013-12-07> --------------------- +tmuxp 0.1-rc7 (2013-12-07) +-------------------------- - :issue:`33` Partial rewrite of :meth:`config.expand`. - tmuxp will exit silently with ``Ctrl-c``. -0.1-rc6 <2013-12-06> --------------------- +tmuxp 0.1-rc6 (2013-12-06) +-------------------------- - :issue:`31` [examples] from stratoukos add ``window_index`` option, and example. -0.1-rc5 <2013-12-04> --------------------- +tmuxp 0.1-rc5 (2013-12-04) +-------------------------- - :issue:`28` shell_command_before in session scope of config causing duplication. New test. - :issue:`26` :issue:`29` for OS X tests. Thanks stratoukos. - :issue:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't exist. -0.1-rc4 <2013-12-03> --------------------- +tmuxp 0.1-rc4 (2013-12-03) +-------------------------- - fix bug were ``focus: true`` would not launch sessions when using ``$ tmuxp load`` in a tmux session. -0.1-rc3 <2013-12-03> --------------------- +tmuxp 0.1-rc3 (2013-12-03) +-------------------------- - :issue:`25` ``focus: true`` not working in panes. Add tests for focusing panes in config. - :meth:`Pane.select_pane()`. - add new example for ``focus: true``. -0.1-rc2 <2013-11-23> --------------------- +tmuxp 0.1-rc2 (2013-11-23) +-------------------------- - :issue:`23` fix bug where workspace would not build with pane-base-index set to 1. Update tests to fix if ``pane-base-index`` is not 0. - removed ``$ tmuxp load --list`` functionality. Update :ref:`quickstart` accordingly. -0.1-rc1 <2013-11-23> --------------------- +tmuxp 0.1-rc1 (2013-11-23) +-------------------------- - `pep8`_ and `pep257`_ in unit tests. - Changelog will now be updated on a version basis, use `pep440`_ versioning. -0.1-dev <2013-11-21> --------------------- +tmuxp 0.1-dev (2013-11-21) +-------------------------- - :meth:`Session.show_options`, :meth:`Session.show_option` now accept ``g`` to pass in ``-g``. -0.1-dev <2013-11-20> --------------------- +tmuxp 0.1-dev (2013-11-20) +-------------------------- - :meth:`Window.show_window_options`, :meth:`Window.show_window_option` now accept ``g`` to pass in ``-g``. - :issue:`15` Behavioral changes in the WorkspaceBuilder to fix pane @@ -495,31 +495,31 @@ Here you can find the recent changes to tmuxp - WorkspaceBuilder tests have been improved to use async better. -0.1-dev <2013-11-17> --------------------- +tmuxp 0.1-dev (2013-11-17) +-------------------------- - fix a bug where missing tmux didn't show correct warning. -0.1-dev <2013-11-15> --------------------- +tmuxp 0.1-dev (2013-11-15) +-------------------------- - Travis now tests python 2.6 as requirement and not allowed to fail. -0.1-dev <2013-11-13> --------------------- +tmuxp 0.1-dev (2013-11-13) +-------------------------- - :issue:`19` accept ``-y`` argument to answer yes to questions. - :meth:`cli.SessionCompleter` no longer allows a duplicate session after one is added. - ongoing work on :ref:`about_tmux`. -0.1-dev <2013-11-09> --------------------- +tmuxp 0.1-dev (2013-11-09) +-------------------------- - [translation] `documentation in Chinese`_ from `wrongwaycn`_. - More work done on the :ref:`about_tmux` page. - :meth:`Pane.split_window()` for splitting :class:`Window` at ``target-pane`` location. -0.1-dev <2013-11-08> --------------------- +tmuxp 0.1-dev (2013-11-08) +-------------------------- - [freeze] - ``$ tmuxp freeze`` will now freeze a window with a ``start_directory`` when all panes in a window are inside the same directory. @@ -538,16 +538,16 @@ Here you can find the recent changes to tmuxp This will improve ``$ tmuxp freeze`` -0.1-dev <2013-11-07> --------------------- +tmuxp 0.1-dev (2013-11-07) +-------------------------- - Remove old logger (based on `tornado's log.py`_), replace with new, simpler one. - fix `teamocil`_ import. - support import teamocil ``root`` to ``start_directory``. -0.1-dev <2013-11-06> --------------------- +tmuxp 0.1-dev (2013-11-06) +-------------------------- - tagged v0.0.37. Many fixes. Python 2.6 support. Will switch to per-version changelog after 0.1 release. - support for blank panes (null, ``pane``, ``blank``) and panes @@ -557,21 +557,21 @@ Here you can find the recent changes to tmuxp previously return a duplicate shell command, or generic python, node interpreter. -0.1-dev <2013-11-05> --------------------- +tmuxp 0.1-dev (2013-11-05) +-------------------------- - Support for ``[-L socket-name]`` and ``[-S socket-path]`` in autocompletion and when loading. Note, switching client into another socket may cause an error. - Documentation tweaking to :ref:`API`, :ref:`about_tmux`. - `pep257`_, `pep8`_. -0.1-dev <2013-11-04> --------------------- +tmuxp 0.1-dev (2013-11-04) +-------------------------- - `pep257`_, `pep8`_. - tagged version ``v0.0.36``. -0.1-dev <2013-11-02> --------------------- +tmuxp 0.1-dev (2013-11-02) +-------------------------- - Many documentation, `pep257`_, `pep8`_ fixes - move old :class:`Server` methods ``__list_panes()``, ``__list_windows`` and ``__list_sessions`` into the single underscore. @@ -581,8 +581,8 @@ Here you can find the recent changes to tmuxp - [config] support for relative paths of ``start_directory``. Add an update config in *Start Directory* on :ref:`examples`. -0.1-dev <2013-11-01> --------------------- +tmuxp 0.1-dev (2013-11-01) +-------------------------- - New servers for :class:`Server` arguments ``socket_name``, ``socket_path``, ``config_file``. - :class:`Server` support for ``-2`` with ``colors=256`` and @@ -596,8 +596,8 @@ Here you can find the recent changes to tmuxp and ``start_directory``. - Allow saving with ``~`` in file destination. -0.1-dev <2013-10-31> --------------------- +tmuxp 0.1-dev (2013-10-31) +-------------------------- - :meth:`util.is_version()` - correctly :meth:`config.trickle()` the ``start_directory``. - get ``start_directory`` working for configs @@ -608,8 +608,8 @@ Here you can find the recent changes to tmuxp - :class:`Window.move_window()` for moving window. - doc overhaul. front page, renamed orm_al.rst to internals.rst. -0.1-dev <2013-10-30> --------------------- +tmuxp 0.1-dev (2013-10-30) +-------------------------- - fix bug where if inside tmux, loading a workspace via switch_client wouldn't work. - fix bug where ``tmuxp load .`` would return an error instead of a @@ -620,8 +620,8 @@ Here you can find the recent changes to tmuxp - :meth:`Window.kill_window()` - support for ``start_directory`` (work in progress) -0.1-dev <2013-10-29> --------------------- +tmuxp 0.1-dev (2013-10-29) +-------------------------- - :meth:`Window.select_pane` now accepts ``-l``, ``-U``, ``-D``, ``-L``, ``-R``. - support for ``automatic-rename`` option. @@ -644,8 +644,8 @@ Here you can find the recent changes to tmuxp string. See the shorthand form in the :ref:`examples` section. - [config] support loading ``.yml``. -0.1-dev <2013-10-28> --------------------- +tmuxp 0.1-dev (2013-10-28) +-------------------------- - fix ``tmuxp load .`` fixed - fix ``tmuxp convert `` fixed. - `pep257`_ fixes. @@ -656,15 +656,15 @@ Here you can find the recent changes to tmuxp - :meth:`Window.tmux` and :meth:`Pane.tmux` will automatically add their ``{window/pane}_id`` if one isn't specific. -0.1-dev <2013-10-27> --------------------- +tmuxp 0.1-dev (2013-10-27) +-------------------------- - `argcomplete`_ overhaul for CLI bash completion. - ``tmuxp load``, ``tmuxp convert`` and ``tmuxp import`` now support relative and full filenames in addition to searching the config directory. -0.1-dev <2013-10-26> --------------------- +tmuxp 0.1-dev (2013-10-26) +-------------------------- - initial version of `tmuxinator`_ and `teamocil`_ config importer. it does not support all options and it not guaranteed to fully convert window/pane size and state. @@ -675,16 +675,16 @@ Here you can find the recent changes to tmuxp - fix ``$ tmuxp load -l`` to work correctly alongside ``$ tmuxp load filename``. -0.1-dev <2013-10-25> --------------------- +tmuxp 0.1-dev (2013-10-25) +-------------------------- - fix bug where ``-v`` and ``--version`` wouldn't print version. - property handle case where no tmux server exists when ``attach-session`` or ``kill-session`` is used. - test fixtures and inital work for importing `tmuxinator`_ and `teamocil`_ configs -0.1-dev <2013-10-24> --------------------- +tmuxp 0.1-dev (2013-10-24) +-------------------------- - clean out old code for ``automatic-rename`` option. it will be reimplemented fresh. - check for ``oh-my-zsh`` when using ``$SHELL`` ``zsh``. Prompt if @@ -699,8 +699,8 @@ Here you can find the recent changes to tmuxp - Fix bug in tab completion for listing sessions with no tmux server is active. -0.1-dev <2013-10-23> --------------------- +tmuxp 0.1-dev (2013-10-23) +-------------------------- - zsh/bash/tcsh completion improvements for tab-completion options - tmuxp ``kill-session`` with tab-completion. - tmuxp ``attach-session`` with tab-completion. Attach session will @@ -708,8 +708,8 @@ Here you can find the recent changes to tmuxp - tmuxp ``load`` for loading configs. - unit test fixes. -0.1-dev <2013-10-21> --------------------- +tmuxp 0.1-dev (2013-10-21) +-------------------------- - Make 1.8 the official minimym version, give warning notice to upgrade tmux if out of date - Fix regression causing unexpected build behavior due to unremoved code @@ -718,8 +718,8 @@ Here you can find the recent changes to tmuxp - Examples now have graphics - ``$ tmuxp -v`` will print the version info. -0.1-dev <2013-10-19> --------------------- +tmuxp 0.1-dev (2013-10-19) +-------------------------- - tmuxp will now give warning and sys.exit() with a message if ``tmux`` not found in system PATH - internal overhaul of :class:`Server`, :class:`Session` @@ -743,8 +743,8 @@ Here you can find the recent changes to tmuxp @property :meth:`Window._panes` to :meth:`Window._list_panes()` to return a list of dicts without making objects. -0.1-dev <2013-10-18> --------------------- +tmuxp 0.1-dev (2013-10-18) +-------------------------- - internal overhaul of :class:`Server`, :class:`Session`, :class:`Window`, and :class:`Pane`. @@ -761,8 +761,8 @@ Here you can find the recent changes to tmuxp and 1.7 support seem likely eventually if there is enough demand. - python 3 support -0.1-dev <2013-10-17> --------------------- +tmuxp 0.1-dev (2013-10-17) +-------------------------- - updated README docs with new project details, screenshots - new example ``.tmuxp.yaml`` file updated to include development workflow. Removed nodemon as the tool for checking files for @@ -770,8 +770,8 @@ Here you can find the recent changes to tmuxp - Support for switching sessions from within tmux. In both cases after the the session is built and if session already exists. -0.1-dev <2013-10-16> --------------------- +tmuxp 0.1-dev (2013-10-16) +-------------------------- - use :meth:`util.which()` from salt.util to find tmux binary. - add MANIFEST.in, fix issue where package would not install because missing file @@ -793,8 +793,8 @@ Here you can find the recent changes to tmuxp - :class:`Server`, :class:`Session`, :class:`Window`, :class:`Pane` now explicitly mixin subclasses. -0.1-dev <2013-10-15> --------------------- +tmuxp 0.1-dev (2013-10-15) +-------------------------- - new theme - initial examples, misc. updates, front page update. - support for ``$ tmux .`` to load ``.tmuxp.{yaml/json/py}`` in current @@ -813,8 +813,8 @@ Here you can find the recent changes to tmuxp - htop - If session name is already exists, prompt to attach. -0.1-dev <2013-10-14> --------------------- +tmuxp 0.1-dev (2013-10-14) +-------------------------- - can now -l to list configs in current directory and $HOME/.tmuxp - tmuxp can now launch configs and build sessions - new exceptions @@ -825,8 +825,8 @@ Here you can find the recent changes to tmuxp - :meth:`config.in_dir()` - :meth:`config.in_cwd()` -0.1-dev <2013-10-13> --------------------- +tmuxp 0.1-dev (2013-10-13) +-------------------------- - :meth:`config.inline()` to produce far far better looking config exports and tests. - :meth:`Pane.resize_pane()` and tests @@ -836,8 +836,8 @@ Here you can find the recent changes to tmuxp - :meth:`Server.find()`, :meth:`Session.find()`, :meth:`Window.find()`. -0.1-dev <2013-10-12> --------------------- +tmuxp 0.1-dev (2013-10-12) +-------------------------- - Test documentation updates - Builder is now :class:`WorkspaceBuilder` + tests. - WorkspaceBuilder can build panes @@ -847,8 +847,8 @@ Here you can find the recent changes to tmuxp - :meth:`Session.show_options()`, :meth:`Session.show_option()`, :meth:`Session.set_option()` -0.1-dev <2013-10-11> --------------------- +tmuxp 0.1-dev (2013-10-11) +-------------------------- - More preparation for builder / session maker utility. - test runner and test suite overhaul. - Documentation for development environment and test runner updated. @@ -859,14 +859,14 @@ Here you can find the recent changes to tmuxp - setup.py import __version__ via regex from tmuxp package - move beginnings of cli to ``tmuxp.cli`` -0.1-dev <2013-10-09> --------------------- +tmuxp 0.1-dev (2013-10-09) +-------------------------- - New logging module - Removed dependency logutils - Removed dependency sh -0.1-dev <2013-10-08> --------------------- +tmuxp 0.1-dev (2013-10-08) +-------------------------- - switch to semver .. _tmuxinator: https://github.com/aziz/tmuxinator From d9090ab693320a7515624f32717641b561b7137f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 15 Aug 2020 10:27:50 -0500 Subject: [PATCH 0544/2998] docs(README): Update user-level configs, split docs into sections more --- README.rst | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index 222edf402f..bc3ae5c136 100644 --- a/README.rst +++ b/README.rst @@ -45,12 +45,6 @@ Save as *mysession.yaml*, and load: $ tmuxp load ./mysession.yaml -Sessions in *~/.tmuxp/* can use names: - -.. code-block:: sh - - $ tmuxp load mysession - Projects with *.tmuxp.yaml* or *.tmuxp.json* load via directory: .. code-block:: sh @@ -65,15 +59,35 @@ Load multiple at once (in bg, offer to attach last): `simple`_ and `very elaborate`_ config examples -Store configs in (*~/.tmuxp*) or include in your project as -*~/.tmuxp.{yaml,json}*. See `author's tmuxp configs`_ and the -the projects' `tmuxp.yaml`_. +User-level configurations +------------------------- +tmuxp checks for configs in user directories: + +- ``$TMUXP_CONFIGDIR``, if set +- ``$XDG_CONFIG_HOME``, usually *$HOME/.config/tmuxp/* +- ``$HOME/.tmuxp/`` + +Load your tmuxp config from anywhere by using the filename, assuming +*~/.config/tmuxp/mysession.yaml* (or *.json*): +.. code-block:: sh + + $ tmuxp load mysession + +See `author's tmuxp configs`_ and the projects' `tmuxp.yaml`_. + +Pre-load hook +------------- Run custom startup scripts (such as installing project dependencies before loading tmux. See the `bootstrap_env.py`_ and `before_script`_ example +Load in detached state +---------------------- You can also load sessions in the background by passing ``-d`` flag +Screenshot +---------- + .. image:: https://raw.github.com/tmux-python/tmuxp/master/doc/_static/tmuxp-demo.gif :scale: 100% :width: 45% From d7d444e161c0c47e75d44cb48c1b6194d1ed71a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 15 Aug 2020 10:28:12 -0500 Subject: [PATCH 0545/2998] docs(CHANGES): Update to reference #404 added in 1.5.0 Thanks @anddam --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index ae3243aefc..768523c601 100644 --- a/CHANGES +++ b/CHANGES @@ -51,6 +51,7 @@ tmuxp 1.5.0 (2018-10-02) - Support Click 7.0 - Remove unused ``__future__`` imports - :issue:`471` Update libtmux 0.8.0 -> 0.8.1 +- :issue:`404` from @anddam, support XDG base directory - Sort imports - Add configuration and make command for isort. - Add sphinxcontrib-napoleon. From 218364ac46bde18a9f4bf4bb82f6a80e1d2cf2fa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Aug 2020 15:15:29 -0500 Subject: [PATCH 0546/2998] chore(docs): Remove unused releases config --- doc/conf.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 2f8a77879a..1b1425485f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -32,11 +32,6 @@ 'sphinx_issues', ] -releases_unstable_prehistory = True -releases_document_name = ["history"] -releases_issue_uri = "https://github.com/tmux-python/tmuxp/issues/%s" -releases_release_uri = "https://github.com/tmux-python/tmuxp/tree/v%s" - issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] From efc440b8f6e1bd7f5a8b7cd1bd2988f3335a486e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:21:24 -0500 Subject: [PATCH 0547/2998] build(alagitpull): Update to 0.1.0 --- poetry.lock | 168 +++++++++++++++++++++++++++++++------------ pyproject.toml | 2 +- requirements/doc.txt | 2 +- 3 files changed, 125 insertions(+), 47 deletions(-) diff --git a/poetry.lock b/poetry.lock index de3e9409bb..8f6d9fd147 100644 --- a/poetry.lock +++ b/poetry.lock @@ -19,8 +19,8 @@ category = "dev" description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" optional = false -python-versions = "*" -version = "0.0.23" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.1.0" [package.dependencies] alabaster = "<0.8" @@ -28,6 +28,7 @@ alabaster = "<0.8" [[package]] category = "dev" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "appdirs" optional = false python-versions = "*" @@ -36,6 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." +marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -69,6 +71,7 @@ pytz = ">=2015.7" [[package]] category = "dev" description = "Backport of functools.lru_cache" +marker = "python_version < \"3.2\"" name = "backports.functools-lru-cache" optional = false python-versions = ">=2.6" @@ -81,6 +84,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pyt [[package]] category = "dev" description = "The uncompromising code formatter." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "black" optional = false python-versions = ">=3.6" @@ -158,6 +162,7 @@ version = "0.4.3" [[package]] category = "dev" description = "Updated configparser from Python 3.7 for Python 2.6+." +marker = "python_version < \"3.2\"" name = "configparser" optional = false python-versions = ">=2.6" @@ -170,6 +175,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" +marker = "python_version < \"3.4\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -213,6 +219,7 @@ version = "0.16" [[package]] category = "dev" description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" +marker = "python_version < \"3.4\"" name = "enum34" optional = false python-versions = "*" @@ -230,15 +237,31 @@ version = "3.8.3" mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" -configparser = {version = "*", markers = "python_version < \"3.2\""} -enum34 = {version = "*", markers = "python_version < \"3.4\""} -functools32 = {version = "*", markers = "python_version < \"3.2\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -typing = {version = "*", markers = "python_version < \"3.5\""} + +[package.dependencies.configparser] +python = "<3.2" +version = "*" + +[package.dependencies.enum34] +python = "<3.4" +version = "*" + +[package.dependencies.functools32] +python = "<3.2" +version = "*" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.dependencies.typing] +python = "<3.5" +version = "*" [[package]] category = "dev" description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" +marker = "python_version < \"3\"" name = "funcsigs" optional = false python-versions = "*" @@ -247,6 +270,7 @@ version = "1.0.2" [[package]] category = "dev" description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." +marker = "python_version < \"3.2\"" name = "functools32" optional = false python-versions = "*" @@ -255,6 +279,7 @@ version = "3.2.3-2" [[package]] category = "dev" description = "Backport of the concurrent.futures package from Python 3" +marker = "python_version < \"3.2\"" name = "futures" optional = false python-versions = ">=2.6, <3" @@ -279,6 +304,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -286,9 +312,18 @@ version = "1.7.0" [package.dependencies] zipp = ">=0.5" -configparser = {version = ">=3.5", markers = "python_version < \"3\""} -contextlib2 = {version = "*", markers = "python_version < \"3\""} -pathlib2 = {version = "*", markers = "python_version < \"3\""} + +[package.dependencies.configparser] +python = "<3" +version = ">=3.5" + +[package.dependencies.contextlib2] +python = "<3" +version = "*" + +[package.dependencies.pathlib2] +python = "<3" +version = "*" [package.extras] docs = ["sphinx", "rst.linker"] @@ -297,14 +332,20 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "A Python utility / library to sort Python imports." +marker = "python_version < \"3.6\"" name = "isort" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "4.3.21" [package.dependencies] -"backports.functools-lru-cache" = {version = "*", markers = "python_version < \"3.2\""} -futures = {version = "*", markers = "python_version < \"3.2\""} +[package.dependencies."backports.functools-lru-cache"] +python = "<3.2" +version = "*" + +[package.dependencies.futures] +python = "<3.2" +version = "*" [package.extras] pipfile = ["pipreqs", "requirementslib"] @@ -315,6 +356,7 @@ xdg_home = ["appdirs (>=1.4.0)"] [[package]] category = "dev" description = "A Python utility / library to sort Python imports." +marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" @@ -376,6 +418,7 @@ version = "0.6.1" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version <= \"2.7\"" name = "more-itertools" optional = false python-versions = "*" @@ -384,14 +427,6 @@ version = "5.0.0" [package.dependencies] six = ">=1.0.0,<2.0.0" -[[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -name = "more-itertools" -optional = false -python-versions = ">=3.5" -version = "8.3.0" - [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" @@ -415,6 +450,7 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" +marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -422,11 +458,15 @@ version = "2.3.4" [package.dependencies] six = "*" -scandir = {version = "*", markers = "python_version < \"3.5\""} + +[package.dependencies.scandir] +python = "<3.5" +version = "*" [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -443,6 +483,7 @@ version = "5.4.5" [[package]] category = "dev" description = "Python Imaging Library (Fork)" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -451,6 +492,7 @@ version = "6.2.2" [[package]] category = "dev" description = "Python Imaging Library (Fork)" +marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.5" @@ -476,7 +518,9 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "0.13.1" [package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" [package.extras] dev = ["pre-commit", "tox"] @@ -537,18 +581,26 @@ pluggy = ">=0.12,<1.0" py = ">=1.5.0" six = ">=1.10.0" wcwidth = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\" and python_version != \"3.4\""} -funcsigs = {version = ">=1.0", markers = "python_version < \"3.0\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} -[[package.dependencies.more-itertools]] -markers = "python_version <= \"2.7\"" +[package.dependencies.colorama] +python = "<3.4.0 || >=3.5.0" +version = "*" + +[package.dependencies.funcsigs] +python = "<3.0" +version = ">=1.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.dependencies.more-itertools] +python = "<2.8" version = ">=4.0.0,<6.0.0" -[[package.dependencies.more-itertools]] -markers = "python_version > \"2.7\"" -version = ">=4.0.0" +[package.dependencies.pathlib2] +python = "<3.6" +version = ">=2.2.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] @@ -562,16 +614,22 @@ python-versions = ">=3.5" version = "5.4.3" [package.dependencies] +atomicwrites = ">=1.0" attrs = ">=17.4.0" +colorama = "*" more-itertools = ">=4.0.0" packaging = "*" pluggy = ">=0.12,<1.0" py = ">=1.5.0" wcwidth = "*" -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.dependencies.pathlib2] +python = "<3.6" +version = ">=2.2.0" [package.extras] checkqa-mypy = ["mypy (v0.761)"] @@ -580,6 +638,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] category = "dev" description = "Pytest plugin for measuring coverage." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -595,6 +654,7 @@ testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", " [[package]] category = "dev" description = "Pytest plugin for measuring coverage." +marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -617,6 +677,7 @@ version = "8.0" [package.dependencies] pytest = ">=4.4" +setuptools = ">=40.0" [[package]] category = "dev" @@ -628,6 +689,7 @@ version = "9.0" [package.dependencies] pytest = ">=5.0" +setuptools = ">=40.0" [[package]] category = "dev" @@ -665,6 +727,7 @@ md = ["cmarkgfm (>=0.2.0)"] [[package]] category = "dev" description = "Alternative regular expression module, to replace re." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" @@ -713,6 +776,7 @@ docutils = ">=0.11,<1.0" [[package]] category = "dev" description = "scandir, a better directory iterator and faster os.walk()" +marker = "python_version < \"3\"" name = "scandir" optional = false python-versions = "*" @@ -747,15 +811,19 @@ Jinja2 = ">=2.3" Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3,<2.0 || >2.0" +colorama = ">=0.3.5" docutils = ">=0.11" imagesize = "*" packaging = "*" requests = ">=2.0.0" +setuptools = "*" six = ">=1.5" snowballstemmer = ">=1.1" sphinxcontrib-websupport = "*" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -typing = {version = "*", markers = "python_version < \"3.5\""} + +[package.dependencies.typing] +python = "<3.5" +version = "*" [package.extras] test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] @@ -774,10 +842,12 @@ Jinja2 = ">=2.3" Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" +colorama = ">=0.3.5" docutils = ">=0.12" imagesize = "*" packaging = "*" requests = ">=2.5.0" +setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -785,7 +855,6 @@ sphinxcontrib-htmlhelp = "*" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = "*" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} [package.extras] docs = ["sphinxcontrib-websupport"] @@ -882,6 +951,7 @@ test = ["pytest"] [[package]] category = "dev" description = "Sphinx API for Web Apps" +marker = "python_version < \"3\"" name = "sphinxcontrib-websupport" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -905,6 +975,7 @@ six = ">=1.10.0" [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "toml" optional = false python-versions = "*" @@ -934,6 +1005,7 @@ pkginfo = ">=1.4.2" readme-renderer = ">=21.0" requests = ">=2.5.0,<2.15 || >2.15,<2.16 || >2.16" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +setuptools = ">=0.7.0" tqdm = ">=4.14" [package.extras] @@ -943,6 +1015,7 @@ with-blake2 = ["pyblake2"] [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "typed-ast" optional = false python-versions = "*" @@ -951,6 +1024,7 @@ version = "1.4.1" [[package]] category = "dev" description = "Type Hints for Python" +marker = "python_version < \"3.5\"" name = "typing" optional = false python-versions = "*" @@ -978,7 +1052,9 @@ python-versions = "*" version = "0.2.5" [package.dependencies] -"backports.functools-lru-cache" = {version = ">=1.2.1", markers = "python_version < \"3.2\""} +[package.dependencies."backports.functools-lru-cache"] +python = "<3.2" +version = ">=1.2.1" [[package]] category = "dev" @@ -991,21 +1067,24 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" version = "1.2.0" [package.dependencies] -contextlib2 = {version = "*", markers = "python_version < \"3.4\""} +[package.dependencies.contextlib2] +python = "<3.4" +version = "*" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "4e4bec346cb084e426f1960c5d4a9e82ade5564535adef1c7a4adbda2c1c21ae" -lock-version = "1.1" +content-hash = "c53751f2463e3955e8d52153376ceeb666df6ba7036646dee8d92f54213fef82" +lock-version = "1.0" python-versions = "~2.7 || ^3.5" [metadata.files] @@ -1018,7 +1097,8 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] alagitpull = [ - {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, + {file = "alagitpull-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b9ed87ee410c6fa40a63a91d2f25919a10e20c6d39e080356b067f3ff6f379b"}, + {file = "alagitpull-0.1.0.tar.gz", hash = "sha256:f6076f81a738c3291b598d8016b248edf5adf25d1d348c2599eff92c1eedaed9"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, @@ -1210,8 +1290,6 @@ more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, - {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, - {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] diff --git a/pyproject.toml b/pyproject.toml index 51af073f7a..604f7895c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ libtmux = "<0.9" [tool.poetry.dev-dependencies] aafigure = "*" -alagitpull = "*" +alagitpull = "~=0.1.0" black = {version="==19.10b0", python="^3.6"} doc8 = "*" docutils = "*" diff --git a/requirements/doc.txt b/requirements/doc.txt index e0f7333f71..f10de812e7 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,7 +1,7 @@ -r ./base.txt docutils>=0.14 sphinx>=2.0.0 -alagitpull>=0.0.21 +alagitpull>=0.1.0 sphinx_issues==1.2.0 aafigure>=0.6 doc8>=0.8.0 From 0cb93efaa2f3d4815d955355020da1df073a78fd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:29:11 -0500 Subject: [PATCH 0548/2998] poetry(build): Sync more packages with requirements files --- poetry.lock | 669 +++++++++++++++++++++++++++++++++++++------------ pyproject.toml | 52 ++-- 2 files changed, 544 insertions(+), 177 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8f6d9fd147..8ce732469b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,6 +46,7 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -60,6 +61,7 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i [[package]] category = "dev" description = "Internationalization utilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -123,6 +125,18 @@ optional = false python-versions = "*" version = "2020.6.20" +[[package]] +category = "dev" +description = "Foreign Function Interface for Python calling C code." +marker = "sys_platform == \"linux\"" +name = "cffi" +optional = false +python-versions = "*" +version = "1.14.1" + +[package.dependencies] +pycparser = "*" + [[package]] category = "dev" description = "Universal encoding detector for Python 2 and 3" @@ -145,20 +159,36 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.7" +version = "2.1.8" [package.dependencies] coverage = "*" requests = ">=2.7.9" [[package]] -category = "dev" +category = "main" description = "Cross-platform colored terminal text." name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.3" +[[package]] +category = "dev" +description = "Python parser for the CommonMark Markdown spec" +name = "commonmark" +optional = false +python-versions = "*" +version = "0.9.1" + +[package.dependencies] +[package.dependencies.future] +python = "<3" +version = ">=0.14.0" + +[package.extras] +test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] + [[package]] category = "dev" description = "Updated configparser from Python 3.7 for Python 2.6+." @@ -175,7 +205,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\"" +marker = "python_version < \"3\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -187,26 +217,31 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.1" +version = "5.2.1" [package.extras] toml = ["toml"] [[package]] category = "dev" -description = "Style checker for Sphinx (or other) RST documentation" -name = "doc8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +marker = "sys_platform == \"linux\"" +name = "cryptography" optional = false -python-versions = "*" -version = "0.8.1" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "3.0" [package.dependencies] -Pygments = "*" -chardet = "*" -docutils = "*" -restructuredtext-lint = ">=0.7" -six = "*" -stevedore = "*" +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +idna = ["idna (>=2.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] [[package]] category = "dev" @@ -276,6 +311,15 @@ optional = false python-versions = "*" version = "3.2.3-2" +[[package]] +category = "dev" +description = "Clean single-source support for Python 3 and 2" +marker = "python_version < \"3\"" +name = "future" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" + [[package]] category = "dev" description = "Backport of the concurrent.futures package from Python 3" @@ -296,6 +340,7 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -329,10 +374,19 @@ version = "*" docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +[[package]] +category = "dev" +description = "iniconfig: brain-dead simple config-ini parsing" +marker = "python_version >= \"3\"" +name = "iniconfig" +optional = false +python-versions = "*" +version = "1.0.1" + [[package]] category = "dev" description = "A Python utility / library to sort Python imports." -marker = "python_version < \"3.6\"" +marker = "python_version < \"3.6\" or python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -360,15 +414,29 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.1.4" +version = "5.3.2" [package.extras] +colors = ["colorama (>=0.4.3,<0.5.0)"] pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] requirements_deprecated_finder = ["pipreqs", "pip-api"] +[[package]] +category = "dev" +description = "Low-level, pure Python DBus protocol wrapper." +marker = "sys_platform == \"linux\"" +name = "jeepney" +optional = false +python-versions = ">=3.5" +version = "0.4.3" + +[package.extras] +dev = ["testpath"] + [[package]] category = "dev" description = "A very fast and expressive template engine." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -391,6 +459,27 @@ version = "0.5.12" [package.dependencies] PyYAML = ">=3.13,<6" +[[package]] +category = "dev" +description = "Store and access your passwords safely." +name = "keyring" +optional = false +python-versions = ">=3.6" +version = "21.3.0" + +[package.dependencies] +SecretStorage = ">=3" +jeepney = ">=0.4.2" +pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy"] + [[package]] category = "main" description = "scripting library / orm for tmux" @@ -402,6 +491,7 @@ version = "0.8.2" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -415,6 +505,27 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "Rolling backport of unittest.mock for all Pythons" +marker = "python_version < \"3\"" +name = "mock" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.0.5" + +[package.dependencies] +six = "*" + +[package.dependencies.funcsigs] +python = "<3.3" +version = ">=1" + +[package.extras] +build = ["twine", "wheel", "blurb"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" @@ -430,6 +541,7 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" +marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" @@ -450,7 +562,7 @@ six = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" +marker = "python_version < \"3\"" name = "pathlib2" optional = false python-versions = "*" @@ -463,6 +575,18 @@ six = "*" python = "<3.5" version = "*" +[[package]] +category = "dev" +description = "Object-oriented filesystem paths" +marker = "python_version >= \"3\" and python_version < \"3.6\"" +name = "pathlib2" +optional = false +python-versions = "*" +version = "2.3.5" + +[package.dependencies] +six = "*" + [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." @@ -472,14 +596,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.8.0" -[[package]] -category = "dev" -description = "Python Build Reasonableness" -name = "pbr" -optional = false -python-versions = "*" -version = "5.4.5" - [[package]] category = "dev" description = "Python Imaging Library (Fork)" @@ -496,7 +612,7 @@ marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.5" -version = "7.1.2" +version = "7.2.0" [[package]] category = "dev" @@ -512,6 +628,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -528,6 +645,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -541,6 +659,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.6.0" +[[package]] +category = "dev" +description = "C parser in Python" +marker = "sys_platform == \"linux\"" +name = "pycparser" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.20" + [[package]] category = "dev" description = "passive checker of Python programs" @@ -557,9 +684,18 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "2.5.2" +[[package]] +category = "dev" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" +optional = false +python-versions = ">=3.5" +version = "2.6.1" + [[package]] category = "dev" description = "Python parsing module" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -611,17 +747,18 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "5.4.3" +version = "6.0.1" [package.dependencies] atomicwrites = ">=1.0" attrs = ">=17.4.0" colorama = "*" +iniconfig = "*" more-itertools = ">=4.0.0" packaging = "*" pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" +py = ">=1.8.2" +toml = "*" [package.dependencies.importlib-metadata] python = "<3.8" @@ -632,7 +769,7 @@ python = "<3.6" version = ">=2.2.0" [package.extras] -checkqa-mypy = ["mypy (v0.761)"] +checkqa_mypy = ["mypy (0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] @@ -667,6 +804,40 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] +[[package]] +category = "dev" +description = "Thin-wrapper around the mock package for easier use with py.test" +marker = "python_version < \"3\" or python_version >= \"3\"" +name = "pytest-mock" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.0.0" + +[package.dependencies] +pytest = ">=2.7" + +[package.dependencies.mock] +python = "<3.0" +version = "*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "dev" +description = "Thin-wrapper around the mock package for easier use with pytest" +marker = "python_version >= \"3\"" +name = "pytest-mock" +optional = false +python-versions = ">=3.5" +version = "3.2.0" + +[package.dependencies] +pytest = ">=2.7" + +[package.extras] +dev = ["pre-commit", "tox", "pytest-asyncio"] + [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -694,11 +865,21 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" version = "2020.1" +[[package]] +category = "dev" +description = "" +marker = "sys_platform == \"win32\"" +name = "pywin32-ctypes" +optional = false +python-versions = "*" +version = "0.2.0" + [[package]] category = "main" description = "YAML parser and emitter for Python" @@ -724,6 +905,19 @@ six = "*" [package.extras] md = ["cmarkgfm (>=0.2.0)"] +[[package]] +category = "dev" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +name = "recommonmark" +optional = false +python-versions = "*" +version = "0.6.0" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + [[package]] category = "dev" description = "Alternative regular expression module, to replace re." @@ -731,7 +925,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.6.8" +version = "2020.7.14" [[package]] category = "dev" @@ -764,14 +958,14 @@ requests = ">=2.0.1,<3.0.0" [[package]] category = "dev" -description = "reStructuredText linter" -name = "restructuredtext-lint" +description = "Validating URI References per RFC 3986" +name = "rfc3986" optional = false python-versions = "*" -version = "1.3.1" +version = "1.4.0" -[package.dependencies] -docutils = ">=0.11,<1.0" +[package.extras] +idna2008 = ["idna"] [[package]] category = "dev" @@ -782,6 +976,19 @@ optional = false python-versions = "*" version = "1.10.0" +[[package]] +category = "dev" +description = "Python bindings to FreeDesktop.org Secret Service API" +marker = "sys_platform == \"linux\"" +name = "secretstorage" +optional = false +python-versions = ">=3.5" +version = "3.1.2" + +[package.dependencies] +cryptography = "*" +jeepney = ">=0.4.2" + [[package]] category = "dev" description = "Python 2 and 3 compatibility utilities" @@ -793,6 +1000,7 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -835,7 +1043,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.1.1" +version = "3.2.0" [package.dependencies] Jinja2 = ">=2.3" @@ -880,6 +1088,7 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -892,6 +1101,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -904,6 +1114,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -916,6 +1127,7 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" +marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -927,6 +1139,7 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -939,6 +1152,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -960,22 +1174,10 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] -[[package]] -category = "dev" -description = "Manage dynamic plugins for Python applications" -name = "stevedore" -optional = false -python-versions = "*" -version = "1.32.0" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" -six = ">=1.10.0" - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false python-versions = "*" @@ -987,7 +1189,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.46.1" +version = "4.48.2" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] @@ -1012,6 +1214,29 @@ tqdm = ">=4.14" keyring = ["keyring"] with-blake2 = ["pyblake2"] +[[package]] +category = "dev" +description = "Collection of utilities for publishing packages on PyPI" +name = "twine" +optional = false +python-versions = ">=3.6" +version = "3.2.0" + +[package.dependencies] +colorama = ">=0.4.3" +keyring = ">=15.1" +pkginfo = ">=1.4.2" +readme-renderer = ">=21.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +setuptools = ">=0.7.0" +tqdm = ">=4.14" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1027,8 +1252,8 @@ description = "Type Hints for Python" marker = "python_version < \"3.5\"" name = "typing" optional = false -python-versions = "*" -version = "3.7.4.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.7.4.3" [[package]] category = "dev" @@ -1036,7 +1261,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.9" +version = "1.25.10" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1046,6 +1271,7 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" +marker = "python_version < \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -1067,7 +1293,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1082,8 +1308,29 @@ version = "*" docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] +[[package]] +category = "dev" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version >= \"3\" and python_version < \"3.8\"" +name = "zipp" +optional = false +python-versions = ">=3.6" +version = "3.1.0" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["jaraco.itertools", "func-timeout"] + +[extras] +coverage = [] +deploy = [] +docs = [] +format = [] +lint = [] +test = [] + [metadata] -content-hash = "c53751f2463e3955e8d52153376ceeb666df6ba7036646dee8d92f54213fef82" +content-hash = "55071e1712036e5feedbdbbd08b46a2ff50bd9691fb9bf1ef2ae44386833ec91" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1132,6 +1379,36 @@ certifi = [ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ] +cffi = [ + {file = "cffi-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:66dd45eb9530e3dde8f7c009f84568bc7cac489b93d04ac86e3111fb46e470c2"}, + {file = "cffi-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:4f53e4128c81ca3212ff4cf097c797ab44646a40b42ec02a891155cd7a2ba4d8"}, + {file = "cffi-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:833401b15de1bb92791d7b6fb353d4af60dc688eaa521bd97203dcd2d124a7c1"}, + {file = "cffi-1.14.1-cp27-cp27m-win32.whl", hash = "sha256:26f33e8f6a70c255767e3c3f957ccafc7f1f706b966e110b855bfe944511f1f9"}, + {file = "cffi-1.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:b87dfa9f10a470eee7f24234a37d1d5f51e5f5fa9eeffda7c282e2b8f5162eb1"}, + {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:effd2ba52cee4ceff1a77f20d2a9f9bf8d50353c854a282b8760ac15b9833168"}, + {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bac0d6f7728a9cc3c1e06d4fcbac12aaa70e9379b3025b27ec1226f0e2d404cf"}, + {file = "cffi-1.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d6033b4ffa34ef70f0b8086fd4c3df4bf801fee485a8a7d4519399818351aa8e"}, + {file = "cffi-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8416ed88ddc057bab0526d4e4e9f3660f614ac2394b5e019a628cdfff3733849"}, + {file = "cffi-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:892daa86384994fdf4856cb43c93f40cbe80f7f95bb5da94971b39c7f54b3a9c"}, + {file = "cffi-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:c991112622baee0ae4d55c008380c32ecfd0ad417bcd0417ba432e6ba7328caa"}, + {file = "cffi-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fcf32bf76dc25e30ed793145a57426064520890d7c02866eb93d3e4abe516948"}, + {file = "cffi-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f960375e9823ae6a07072ff7f8a85954e5a6434f97869f50d0e41649a1c8144f"}, + {file = "cffi-1.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a6d28e7f14ecf3b2ad67c4f106841218c8ab12a0683b1528534a6c87d2307af3"}, + {file = "cffi-1.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cda422d54ee7905bfc53ee6915ab68fe7b230cacf581110df4272ee10462aadc"}, + {file = "cffi-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:4a03416915b82b81af5502459a8a9dd62a3c299b295dcdf470877cb948d655f2"}, + {file = "cffi-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:4ce1e995aeecf7cc32380bc11598bfdfa017d592259d5da00fc7ded11e61d022"}, + {file = "cffi-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e23cb7f1d8e0f93addf0cae3c5b6f00324cccb4a7949ee558d7b6ca973ab8ae9"}, + {file = "cffi-1.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ddff0b2bd7edcc8c82d1adde6dbbf5e60d57ce985402541cd2985c27f7bec2a0"}, + {file = "cffi-1.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f90c2267101010de42f7273c94a1f026e56cbc043f9330acd8a80e64300aba33"}, + {file = "cffi-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:3cd2c044517f38d1b577f05927fb9729d3396f1d44d0c659a445599e79519792"}, + {file = "cffi-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fa72a52a906425416f41738728268072d5acfd48cbe7796af07a923236bcf96"}, + {file = "cffi-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc"}, + {file = "cffi-1.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939"}, + {file = "cffi-1.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe"}, + {file = "cffi-1.14.1-cp38-cp38-win32.whl", hash = "sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995"}, + {file = "cffi-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90"}, + {file = "cffi-1.14.1.tar.gz", hash = "sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f"}, +] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, @@ -1141,14 +1418,18 @@ click = [ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] codecov = [ - {file = "codecov-2.1.7-py2.py3-none-any.whl", hash = "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728"}, - {file = "codecov-2.1.7-py3.8.egg", hash = "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34"}, - {file = "codecov-2.1.7.tar.gz", hash = "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091"}, + {file = "codecov-2.1.8-py2.py3-none-any.whl", hash = "sha256:65e8a8008e43eb45a9404bf68f8d4a60d36de3827ef2287971c94940128eba1e"}, + {file = "codecov-2.1.8-py3.8.egg", hash = "sha256:fa7985ac6a3886cf68e3420ee1b5eb4ed30c4bdceec0f332d17ab69f545fbc90"}, + {file = "codecov-2.1.8.tar.gz", hash = "sha256:0be9cd6358cc6a3c01a1586134b0fb524dfa65ccbec3a40e9f28d5f976676ba2"}, ] colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, ] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] configparser = [ {file = "configparser-4.0.2-py2.py3-none-any.whl", hash = "sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c"}, {file = "configparser-4.0.2.tar.gz", hash = "sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df"}, @@ -1158,41 +1439,61 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, - {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, - {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, - {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, - {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, - {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, - {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, - {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, - {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, - {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, - {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, - {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, - {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, - {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, - {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, - {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, - {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, - {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, - {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, -] -doc8 = [ - {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, - {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59"}, + {file = "coverage-5.2.1-cp27-cp27m-win32.whl", hash = "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3"}, + {file = "coverage-5.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651"}, + {file = "coverage-5.2.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3"}, + {file = "coverage-5.2.1-cp35-cp35m-win32.whl", hash = "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"}, + {file = "coverage-5.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962"}, + {file = "coverage-5.2.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb"}, + {file = "coverage-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d"}, + {file = "coverage-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546"}, + {file = "coverage-5.2.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034"}, + {file = "coverage-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46"}, + {file = "coverage-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8"}, + {file = "coverage-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b"}, + {file = "coverage-5.2.1-cp38-cp38-win32.whl", hash = "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd"}, + {file = "coverage-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d"}, + {file = "coverage-5.2.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4"}, + {file = "coverage-5.2.1-cp39-cp39-win32.whl", hash = "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89"}, + {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, + {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, +] +cryptography = [ + {file = "cryptography-3.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83"}, + {file = "cryptography-3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a"}, + {file = "cryptography-3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f"}, + {file = "cryptography-3.0-cp27-cp27m-win32.whl", hash = "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6"}, + {file = "cryptography-3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f"}, + {file = "cryptography-3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b"}, + {file = "cryptography-3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67"}, + {file = "cryptography-3.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd"}, + {file = "cryptography-3.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77"}, + {file = "cryptography-3.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c"}, + {file = "cryptography-3.0-cp35-cp35m-win32.whl", hash = "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b"}, + {file = "cryptography-3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07"}, + {file = "cryptography-3.0-cp36-cp36m-win32.whl", hash = "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559"}, + {file = "cryptography-3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71"}, + {file = "cryptography-3.0-cp37-cp37m-win32.whl", hash = "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2"}, + {file = "cryptography-3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756"}, + {file = "cryptography-3.0-cp38-cp38-win32.whl", hash = "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261"}, + {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, + {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, @@ -1215,6 +1516,9 @@ functools32 = [ {file = "functools32-3.2.3-2.tar.gz", hash = "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"}, {file = "functools32-3.2.3-2.zip", hash = "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0"}, ] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] futures = [ {file = "futures-3.3.0-py2-none-any.whl", hash = "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16"}, {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, @@ -1231,11 +1535,19 @@ importlib-metadata = [ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, ] +iniconfig = [ + {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, + {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, +] isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.1.4-py3-none-any.whl", hash = "sha256:ae3007f72a2e9da36febd3454d8be4b175d6ca17eb765841d5fe3d038aede79d"}, - {file = "isort-5.1.4.tar.gz", hash = "sha256:145072eedc4927cc9c1f9478f2d83b2fc1e6469df4129c02ef4e8c742207a46c"}, + {file = "isort-5.3.2-py3-none-any.whl", hash = "sha256:5196bd2f5b23dc91215734b1c96c6d28390061d69860a948094c12635d6d64e6"}, + {file = "isort-5.3.2.tar.gz", hash = "sha256:ba83762132a8661d3525f87a86549712fb7d8da79eeb452e01f327ada9e87920"}, +] +jeepney = [ + {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, + {file = "jeepney-0.4.3.tar.gz", hash = "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -1244,6 +1556,10 @@ jinja2 = [ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] +keyring = [ + {file = "keyring-21.3.0-py3-none-any.whl", hash = "sha256:e7a17caf40c40b6bb8c4772224a487e4a63013560ed0c521065aeba7ecd42182"}, + {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, +] libtmux = [ {file = "libtmux-0.8.2.tar.gz", hash = "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a"}, ] @@ -1286,6 +1602,10 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mock = [ + {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, + {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, +] more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, @@ -1300,15 +1620,13 @@ packaging = [ pathlib2 = [ {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, {file = "pathlib2-2.3.4.tar.gz", hash = "sha256:446014523bb9be5c28128c4d2a10ad6bb60769e78bd85658fe44a450674e0ef8"}, + {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, + {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] pathspec = [ {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, ] -pbr = [ - {file = "pbr-5.4.5-py2.py3-none-any.whl", hash = "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8"}, - {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, -] pillow = [ {file = "Pillow-6.2.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:834dd023b7f987d6b700ad93dc818098d7eb046bd445e9992b3093c6f9d7a95f"}, {file = "Pillow-6.2.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d3a98444a00b4643b22b0685dbf9e0ddcaf4ebfd4ea23f84f228adf5a0765bb2"}, @@ -1340,29 +1658,32 @@ pillow = [ {file = "Pillow-6.2.2-pp273-pypy_73-win32.whl", hash = "sha256:aa1b0297e352007ec781a33f026afbb062a9a9895bb103c8f49af434b1666880"}, {file = "Pillow-6.2.2-pp373-pypy36_pp73-win32.whl", hash = "sha256:82859575005408af81b3e9171ae326ff56a69af5439d3fc20e8cb76cd51c8246"}, {file = "Pillow-6.2.2.tar.gz", hash = "sha256:db9ff0c251ed066d367f53b64827cc9e18ccea001b986d08c265e53625dab950"}, - {file = "Pillow-7.1.2-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:ae2b270f9a0b8822b98655cb3a59cdb1bd54a34807c6c56b76dd2e786c3b7db3"}, - {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:d23e2aa9b969cf9c26edfb4b56307792b8b374202810bd949effd1c6e11ebd6d"}, - {file = "Pillow-7.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b532bcc2f008e96fd9241177ec580829dee817b090532f43e54074ecffdcd97f"}, - {file = "Pillow-7.1.2-cp35-cp35m-win32.whl", hash = "sha256:12e4bad6bddd8546a2f9771485c7e3d2b546b458ae8ff79621214119ac244523"}, - {file = "Pillow-7.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9744350687459234867cbebfe9df8f35ef9e1538f3e729adbd8fde0761adb705"}, - {file = "Pillow-7.1.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:f54be399340aa602066adb63a86a6a5d4f395adfdd9da2b9a0162ea808c7b276"}, - {file = "Pillow-7.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1f694e28c169655c50bb89a3fa07f3b854d71eb47f50783621de813979ba87f3"}, - {file = "Pillow-7.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f784aad988f12c80aacfa5b381ec21fd3f38f851720f652b9f33facc5101cf4d"}, - {file = "Pillow-7.1.2-cp36-cp36m-win32.whl", hash = "sha256:b37bb3bd35edf53125b0ff257822afa6962649995cbdfde2791ddb62b239f891"}, - {file = "Pillow-7.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:b67a6c47ed963c709ed24566daa3f95a18f07d3831334da570c71da53d97d088"}, - {file = "Pillow-7.1.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:eaa83729eab9c60884f362ada982d3a06beaa6cc8b084cf9f76cae7739481dfa"}, - {file = "Pillow-7.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f46e0e024346e1474083c729d50de909974237c72daca05393ee32389dabe457"}, - {file = "Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0e2a3bceb0fd4e0cb17192ae506d5f082b309ffe5fc370a5667959c9b2f85fa3"}, - {file = "Pillow-7.1.2-cp37-cp37m-win32.whl", hash = "sha256:ccc9ad2460eb5bee5642eaf75a0438d7f8887d484490d5117b98edd7f33118b7"}, - {file = "Pillow-7.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b943e71c2065ade6fef223358e56c167fc6ce31c50bc7a02dd5c17ee4338e8ac"}, - {file = "Pillow-7.1.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:04766c4930c174b46fd72d450674612ab44cca977ebbcc2dde722c6933290107"}, - {file = "Pillow-7.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f455efb7a98557412dc6f8e463c1faf1f1911ec2432059fa3e582b6000fc90e2"}, - {file = "Pillow-7.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ee94fce8d003ac9fd206496f2707efe9eadcb278d94c271f129ab36aa7181344"}, - {file = "Pillow-7.1.2-cp38-cp38-win32.whl", hash = "sha256:4b02b9c27fad2054932e89f39703646d0c543f21d3cc5b8e05434215121c28cd"}, - {file = "Pillow-7.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:3d25dd8d688f7318dca6d8cd4f962a360ee40346c15893ae3b95c061cdbc4079"}, - {file = "Pillow-7.1.2-pp373-pypy36_pp73-win32.whl", hash = "sha256:0f01e63c34f0e1e2580cc0b24e86a5ccbbfa8830909a52ee17624c4193224cd9"}, - {file = "Pillow-7.1.2-py3.8-macosx-10.9-x86_64.egg", hash = "sha256:70e3e0d99a0dcda66283a185f80697a9b08806963c6149c8e6c5f452b2aa59c0"}, - {file = "Pillow-7.1.2.tar.gz", hash = "sha256:a0b49960110bc6ff5fead46013bcb8825d101026d466f3a4de3476defe0fb0dd"}, + {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, + {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"}, + {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"}, + {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"}, + {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"}, + {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"}, + {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"}, + {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"}, + {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"}, + {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"}, + {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"}, + {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"}, + {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"}, + {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, + {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, + {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, + {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, ] pkginfo = [ {file = "pkginfo-1.5.0.1-py2.py3-none-any.whl", hash = "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"}, @@ -1380,6 +1701,10 @@ pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] pyflakes = [ {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, @@ -1387,6 +1712,8 @@ pyflakes = [ pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1395,8 +1722,8 @@ pyparsing = [ pytest = [ {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, - {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, - {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, + {file = "pytest-6.0.1-py3-none-any.whl", hash = "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"}, + {file = "pytest-6.0.1.tar.gz", hash = "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, @@ -1404,6 +1731,12 @@ pytest-cov = [ {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, ] +pytest-mock = [ + {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, + {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, + {file = "pytest-mock-3.2.0.tar.gz", hash = "sha256:7122d55505d5ed5a6f3df940ad174b3f606ecae5e9bc379569cdcbd4cd9d2b83"}, + {file = "pytest_mock-3.2.0-py3-none-any.whl", hash = "sha256:5564c7cd2569b603f8451ec77928083054d8896046830ca763ed68f4112d17c7"}, +] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, @@ -1414,6 +1747,10 @@ pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, @@ -1431,28 +1768,32 @@ readme-renderer = [ {file = "readme_renderer-26.0-py2.py3-none-any.whl", hash = "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376"}, {file = "readme_renderer-26.0.tar.gz", hash = "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d"}, ] +recommonmark = [ + {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, + {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, +] regex = [ - {file = "regex-2020.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"}, - {file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"}, - {file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"}, - {file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"}, - {file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"}, - {file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"}, - {file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"}, - {file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"}, - {file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"}, + {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, + {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, + {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, + {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, + {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, + {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, + {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, + {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, + {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, @@ -1462,8 +1803,9 @@ requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] -restructuredtext-lint = [ - {file = "restructuredtext_lint-1.3.1.tar.gz", hash = "sha256:470e53b64817211a42805c3a104d2216f6f5834b22fe7adb637d1de4d6501fb8"}, +rfc3986 = [ + {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, + {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, ] scandir = [ {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, @@ -1478,6 +1820,10 @@ scandir = [ {file = "scandir-1.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d"}, {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, ] +secretstorage = [ + {file = "SecretStorage-3.1.2-py3-none-any.whl", hash = "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b"}, + {file = "SecretStorage-3.1.2.tar.gz", hash = "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6"}, +] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, @@ -1489,8 +1835,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.1.1-py3-none-any.whl", hash = "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5"}, - {file = "Sphinx-3.1.1.tar.gz", hash = "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258"}, + {file = "Sphinx-3.2.0-py3-none-any.whl", hash = "sha256:f7db5b76c42c8b5ef31853c2de7178ef378b985d7793829ec071e120dac1d0ca"}, + {file = "Sphinx-3.2.0.tar.gz", hash = "sha256:cf2d5bc3c6c930ab0a1fbef3ad8a82994b1bf4ae923f8098a05c7e5516f07177"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -1524,21 +1870,19 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] -stevedore = [ - {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, - {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, -] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] tqdm = [ - {file = "tqdm-4.46.1-py2.py3-none-any.whl", hash = "sha256:07c06493f1403c1380b630ae3dcbe5ae62abcf369a93bbc052502279f189ab8c"}, - {file = "tqdm-4.46.1.tar.gz", hash = "sha256:cd140979c2bebd2311dfb14781d8f19bd5a9debb92dcab9f6ef899c987fcf71f"}, + {file = "tqdm-4.48.2-py2.py3-none-any.whl", hash = "sha256:1a336d2b829be50e46b84668691e0a2719f26c97c62846298dd5ae2937e4d5cf"}, + {file = "tqdm-4.48.2.tar.gz", hash = "sha256:564d632ea2b9cb52979f7956e093e831c28d441c11751682f84c86fc46e4fd21"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, + {file = "twine-3.2.0-py3-none-any.whl", hash = "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472"}, + {file = "twine-3.2.0.tar.gz", hash = "sha256:34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, @@ -1564,13 +1908,12 @@ typed-ast = [ {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing = [ - {file = "typing-3.7.4.1-py2-none-any.whl", hash = "sha256:c8cabb5ab8945cd2f54917be357d134db9cc1eb039e59d1606dc1e60cb1d9d36"}, - {file = "typing-3.7.4.1-py3-none-any.whl", hash = "sha256:f38d83c5a7a7086543a0f649564d661859c5146a85775ab90c0d2f93ffaa9714"}, - {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, + {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, + {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] urllib3 = [ - {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, - {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, + {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, + {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -1583,4 +1926,6 @@ webencodings = [ zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, + {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, + {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, ] diff --git a/pyproject.toml b/pyproject.toml index 604f7895c7..15c588f801 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,40 +11,62 @@ authors = ["Tony Narlock "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" click = ">=7<8" -kaptan = "*" +kaptan = ">=0.5.10" libtmux = "<0.9" +colorama = ">=0.3.9" [tool.poetry.dev-dependencies] -aafigure = "*" -alagitpull = "~=0.1.0" -black = {version="==19.10b0", python="^3.6"} -doc8 = "*" -docutils = "*" -flake8 = "*" -isort = [ - {version="<5", python="<3.6"}, - {version=">=5.0.0", python=">=3.6"} +### Docs ### +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} ] +recommonmark = {version = "^0.6.0"} +alagitpull = {version = "~0.1.0"} +sphinx-issues = {version = "^1.2.0"} +aafigure = ">=0.6" pillow = [ {version="<7", python="<3"}, {version="*", python=">=3"} ] + +### Testing ### pytest = [ {version="<4.7.0", python="<3"}, {version="*", python=">=3"} ] pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency pytest-rerunfailures = "*" -sphinx = [ - {version="<2", python="<3"}, +pytest-mock = [ + {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -sphinx-issues = "*" -twine = "*" + +### Coverage ### codecov = "*" -colorama = "*" coverage = "*" pytest-cov = [ {version="<2.10.0", python="<3"}, {version="*", python=">=3"} ] + +### Format ### +black = {version="==19.10b0", python="^3.6"} +isort = [ + {version="<5", python="<3.6"}, + {version="*", python=">=3.6"} +] + +### Lint ### +flake8 = "*" + +### Deploy ### +twine = "*" + +[tool.poetry.extras] +docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull", "aafigure", "pillow"] +test = ["pytest", "pathlib2", "pytest-rerunfailures", "pytest-mock"] +coverage = ["codecov", "coverage", "pytest-cov"] +format = ["black", "isort"] +lint = ["flake8"] +deploy = ["twine"] From a28d0e1773322684823f10acd4cad6873e3838cb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:34:53 -0500 Subject: [PATCH 0549/2998] build(Makefile): Update to latest and greatest --- Makefile | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 659df240ba..890440d777 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null +DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]css\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +SHELL := /bin/bash entr_warn: @echo "----------------------------------------------------------" @@ -12,7 +14,7 @@ isort: poetry run isort `${PY_FILES}` black: - poetry run black `${PY_FILES}` --skip-string-normalization + poetry run black `${PY_FILES}` test: poetry run py.test $(test) @@ -21,13 +23,19 @@ watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: - cd doc && $(MAKE) html + $(MAKE) -C docs html watch_docs: - cd doc && $(MAKE) watch_docs + if command -v entr > /dev/null; then ${DOC_FILES} | entr -c $(MAKE) build_docs; else $(MAKE) build_docs entr_warn; fi + +serve_docs: + $(MAKE) -C docs serve + +dev_docs: + $(MAKE) -j watch_docs serve_docs flake8: - poetry run flake8 tmuxp tests + poetry run flake8 watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi From 80b69035c9dfb8aa6b48a4c78c888f3a42eb27e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:35:27 -0500 Subject: [PATCH 0550/2998] build(MANIFEST): Include pyproject.toml --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 06fe340bec..078513d84c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include README.rst LICENSE CHANGES .tmuxp.yaml +include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt recursive-include doc *.rst recursive-include tests *.py *.yaml *.json *.sh From 49307b1d2e49a560787458b27c9d0bf25ed5e08a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:37:26 -0500 Subject: [PATCH 0551/2998] build(codecov): Ignore loud codecov messages --- .codecov.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..bf9b9abef6 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,15 @@ +codecov: + notify: + require_ci_to_pass: no + +coverage: + precision: 2 + round: down + range: "70...100" + status: + project: + default: + target: auto + threshold: 1% + base: auto + patch: off From 54052185e6b3697d82f91319b29569427f227b3c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:38:33 -0500 Subject: [PATCH 0552/2998] build(docs): run through poetry by default --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index cf76db1b3d..659b7d3820 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -6,7 +6,7 @@ HTTP_PORT = 8031 # You can set these variables from the command line. SPHINXOPTS = -SPHINXBUILD = sphinx-build +SPHINXBUILD = poetry run sphinx-build PAPER = BUILDDIR = _build From e19d8098835eae9182360f59075cf910bc8a9bf1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:39:46 -0500 Subject: [PATCH 0553/2998] build(docs): Update Makefile to latest and greatest --- doc/Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 659b7d3820..6f47067bbc 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,6 +1,7 @@ # Makefile for Sphinx documentation # -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py\|.*[.]py$$' 2> /dev/null +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.].md\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +SHELL := /bin/bash PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8031 @@ -165,13 +166,16 @@ watch: serve: @echo '==============================================================' @echo - @echo 'docs server running at http://0.0.0.0:${HTTP_PORT}/_build/html' + @echo 'docs server running at http://localhost:${HTTP_PORT}/' @echo @echo '==============================================================' @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi serve_py2: - python -m SimpleHTTPServer ${HTTP_PORT} + pushd _build/html; python2 -m SimpleHTTPServer ${HTTP_PORT}; popd serve_py3: - python -m http.server ${HTTP_PORT} + python -m http.server ${HTTP_PORT} --directory _build/html + +dev: + $(MAKE) -j watch serve From b5563769fb0581d0e31f8f01534bcc1bc192be80 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:43:27 -0500 Subject: [PATCH 0554/2998] build(docs): Add manifest and icons --- doc/_static/img/icons/icon-128x128.png | Bin 0 -> 1681 bytes doc/_static/img/icons/icon-144x144.png | Bin 0 -> 1847 bytes doc/_static/img/icons/icon-152x152.png | Bin 0 -> 1885 bytes doc/_static/img/icons/icon-192x192.png | Bin 0 -> 2462 bytes doc/_static/img/icons/icon-384x384.png | Bin 0 -> 4795 bytes doc/_static/img/icons/icon-512x512.png | Bin 0 -> 7521 bytes doc/_static/img/icons/icon-72x72.png | Bin 0 -> 1084 bytes doc/_static/img/icons/icon-96x96.png | Bin 0 -> 1316 bytes doc/manifest.json | 53 +++++++++++++++++++++++++ 9 files changed, 53 insertions(+) create mode 100644 doc/_static/img/icons/icon-128x128.png create mode 100644 doc/_static/img/icons/icon-144x144.png create mode 100644 doc/_static/img/icons/icon-152x152.png create mode 100644 doc/_static/img/icons/icon-192x192.png create mode 100644 doc/_static/img/icons/icon-384x384.png create mode 100644 doc/_static/img/icons/icon-512x512.png create mode 100644 doc/_static/img/icons/icon-72x72.png create mode 100644 doc/_static/img/icons/icon-96x96.png create mode 100644 doc/manifest.json diff --git a/doc/_static/img/icons/icon-128x128.png b/doc/_static/img/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1868fbe87c520e6868e1a027dcf8bf003c09da GIT binary patch literal 1681 zcmchV`#aMM9LK+t%h2RWZp%A2`4DexCRH_2cLHd_M0)l#K;M2r2{s00e1iYI{KZFN66H z@+JIl>H!4(Egi4`Abj+fL8FYQ9RT1*AWbi#L+L9FN8e-iQUWaTC$aQ6FtWq*p6By3 z-(!r6CX?|_vS2|r$Xbi#noZ(84MBUiDpH;$V#HCJ(O$(U?WE-#3DsdyH#fB3q)7>y zWUUB#m?J@NEMO3Z)~rGXn%8|toA$GII0X|cRKi*ajaG*I#$lhX^3Kn$l%C1!ugSj| zwwI2O(YIIj9SnmgIYJkiM~Hrt&l#5uTIt!))twmytm|e&DkZLrik8EW&ujJG($xw^ zMV5BuE|lw4MOO4;%NM5RHJG2OKS@7LqRZtUmz)X@eW7dg7Gz*vPi{$u8-`iC>^n)O zB(lLdIb9scqr2NKQ<_cH^ZuhvoB$rH>G=qsMmY4`W&!0yUB~$`#{88Th5a&L_*&@L zSdh{^BOAaI<^pE#VhjWKN`y)6fff&6&}jE@%W7jdfMuNUO0Psd-}8Z2L1C$^PGx7F1+QZ@>Chwb)OL)Oh5RCVNl!mW&SOGD8pHBe9lAPSW7;pYlJ zRG}p?cR8^jc?OU!OmgAr5j^-@x*u@z0KZ>iyvCf{l6WT9?pvi&!@?_j9{?W!#J!D9 zBhm$y(t>TBn;$Gm#Uyc0A1&!JaxOWN>SO=`3b`nQk^8K7a*S;or^W5g7S8J42U>(` z-1x?j=j%EHJ={iJ6EID{BJ%|AXu{5BT8iArfeGLPz@r$T=cAbX3O`WF{cqdAg~l=m zz}0{!AMlRkQ5=9$5N|HhhGC8)=~=y#?u1QHPg}kD!aO6Yy^|F0hW)9cvnJbjDO~)m zv&$DzXNN!`pc63ngADiW2)t8IQ0LRj%WLc5p0f;6Ki(}YB|NX#>*HBDbsbFWS)TyQzHE%4 zdoEh8*nUl}>sFqJM#z&^dZKAe{$qtye(cwId{`}u5(&3V{0z}&6K#@CAz>#RCUMM3 zg>kieFojx)c(fHWHNmi3$E0o*j!oXi4KX&S_Mv(=W_N?Sp5@jqnmV5#wuh3R5fpb} znLkSFTt_M?1dVFN)PhRYep;Oq5-ZvL-RtGgAMB+{)k=En$W*7d*qec{;P)Q%t&QXJ zapT`Jmb9VvH6kC0f88nds$S9t(OcAqXT~0cJ4L7`H!s>@Fm$x7PAA-Gy!xNRgZTy% zwEVNN{SR+a2Salj8+Wn^i{$gAKA|Ze&SmjEf@_51%%ev9QD7k-5D}5o?@WXV@!uY> zGsH$2$-58OJ-Y0Nx(@0l-Db|V4-KeEiOkK3D%8Wk3F{-V^*a+W67go_p#j(-0Q@d( zh3C5MsrD@e(qoYOA>%y7=}oGva*IsL;6g$P{8oQ;Q#*^Qo3(QaE_Cekt_rV5p)4t> z&5fu**6ZvahAfz+iOQqux$C`Gu4Sx{g#%-qx67_AXCa2pY?;aJ7PW3)1;B&Lq2ydz zOU{=xDx5dicb342Db*y+2?!z VzC#B13N!xIR-~DYX|0KC%)dW5xKRKA literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-144x144.png b/doc/_static/img/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..9ddcefd721ab5c476fb061a07b9b7230fdc069c3 GIT binary patch literal 1847 zcmd6oYdq5n7{~u3l#W!cXTnN8a<66-YRl#_B)3SIN=4;T%q(Uur@7QPZpmcQq_Yvu zWR}h4pg2MVb+K2F2g?Hhpn!Hjxo>&q z4{ev-nnJtr7hAUDrh`u;0PNiRL!f>EaSZ@uMQGG1PyEo_&}_K!S@rfW%*MCh?UbB` z1r+M%Fkes|b z*!R3A?E=XEk2enRfG-fM8|AgTAwrRydBND$50&ux$a0E zXc{y;(`Xf(5#L+akN0_3bnEUOYVP$A@zNTXO_5QEsuq_`BfjAv9x!DOY3e5qAJ?fg zPY6B9h4IrYk6s~#mUoQxW$scfK^xyFni0q$bZuU@Biv^(qk$jQloyPgO~Y00S?)^6 z&=-(qHDlN2h#qjQ(MIsYM@M?B#i5<%)<6Nl;`No&LX${Bkq9AJHZ<2BNd&ePm*`4( zvB;<91?;Lgv4sf$qVr6YC)vy(h2m4v4&hfGlkfo6C}9ZNylNroB9srdB;U2%od9?` zCM}0g0imF+ybS_?wj%(kpCDRVLVTr*CxDvGtO`MOZR8)%2J@IuP0B(VThd*xfXLa# ztBb>b9~sbWZVe5PQ4AAR!v^iyb9r*LSe6tWg}9n89!m^JflrIWCMOz3=Qo3UR!Yq6 z0wi?IZ{c!{lF}{qfI;#>GEz3dQQE98F=E&!f4KjXOTKURZbZ&B;+G$E{v+ZAI+{YV zIJ~}H-vCl~M;=ic4biP{)8=Sli?gkI;dtWajE49z!;P#k3pK^`W1?^ zK{6B3g0XI$MUlQ^t+&3I)-tfI`nmh$*SFvG1N#$_y~)?D5BNtN2pD)@fWYx*&UgOK z$dNUxA$X1^Ufpw_K=~5}c6F~hl@u>L=7P9%?PuE2|Mo-$7keCb^}at>+ycp@O;0?#19n~LuI^j-D!+rxr{9eAGdd07Wd|Yr}od* zHGyYRLm2@~ALAE+_qw6t5bCE)c#4aV}37hS`yu6HdTl#_#X{fu!jx>Bm#QT;m zvGmT4mfvEUH8)!9J=&`^j~(yez}L&JjoX*yYBQ9bN~#(hY4=s!eK3_}PfzFQpdOh% zaIi&{8Cah^`{8aynkVO?SXAUkAcj=s(5d2-d5-(sD^Hd%jpU{TQ}y_A&Ut*3*ILpO zYgtM5J`>`6;3Emc%h6R}3c$T&_*!rce*c^dc6zO;v3z2v9aSw#bQ0&D3 zS%ISWG6*XwNJy-R=pQ>jI-$^k|S78}I1{?etw01BQKFvLX?p{uQ z#BGPeQuHFKJ@SxPT&wY|^h04|sFK7%VT5K!C0R79)j5jVbliXr4;)Oj6+F8=>*ytM zhxcgIe?1Ss)aA!H?DerQYFS5#N;ipeL(*^`Gf*_Iy+qc_mLc>yfdUmsW@$1^HS;R)ytRTbM$hH19)!2t7 seq$AUKH(M8X`LdY{lI8x(aTR5&b*N%o97_I-1>w7+SUbCX>%dzU$R;utN;K2 literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-152x152.png b/doc/_static/img/icons/icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..2950bed9694a8638179113f8ae9cbc76c387db69 GIT binary patch literal 1885 zcmb7FYc$&jAO4$(GI~*!G_Pv4LTOw|+%oj-5K>}@OG877H8e@Z;!=VrZB>mdJ#FgN zT3w=DC4wdDQj5){6}Rc@GC@sGswAnR1Zi1!wvRjSx)0Cq`F(iK^Wk}Z=lt^g{k(Lw zq1pfd=%T$n0zYukAJ_rRenHkGVxsNZJ|);KVJ}12|`5u@96pLyeOOQ&ihOEH0*C`76cr*rra@I zX=$Msj(`MIE+5vuX|P)`!X^ao{zmW8a58agYp#K>A*&A0pthTBBybwv@XgBK-)VF| zvgd%Vr2>1nV@PJ(pHtFb5{alt$lhR-<2EB?VIktOQG3ly*Yrf@E2?1+d+$}Q<5V+o zMl_>NYAxiQZo;!u)|{YPC*Niys}=>7#HIn6y<@D4yBL|K-PYVlhx0bsYa#Db@5iBQ z`da7(2zb~5i!*>~ZYZR!5qo!X$n49uFny*JyV{d*Wv7A2w0dMRb$x!<=F~>q_T0;gr9WyT&~dIqutr5%dU$eM*L3xi(Gn^8vGz(Q*nG{y*09VtPb^7u3?jfNp28L z#M)%Nr;Cs+Y9Je^4gpYyhyajHmfHVct^P^yj}HG@V6472GeKz{7*lB)tJJ!&J- z6ml8cGa2#Zet2Y)yV2`$Kg6!bBbLl|$*~qIYjtwAsO-CrO{J0H#f{23RcO3i)t(Xk zJf%~7H`ML*`-B(Z6X`qnTA$G3HEAe2U%%dflmx&bfzbQ}!uY`{Y#9*K@)IEpB*2c$ zIldJI{F%v5nsBF_RJ;9-Kq)oHx#M6u%TOs6Sp7$|oVN32OnJ@$<7iv`KA?2nAWn7g znLECYs2SbFPqpk z*hvT8xqVc5e?<@en4G-`UygfRDQ zSVKS}?}$gUR~?yQS7BiL5-uwyPMYRgmF9>$WUHl+7I}8Z1{cF_mk}c%=)u@CMZQ%g z7a&KRB_)_8iv~ky}=543flSx-#NzeKZj746U zD(XsF85z}IoP9fk+LV`M%kyv1z-*Y0g%u{$-X$zB<24OtR}ykQg*${SAcvqbI70wokV6O{ zLqJFn zRiFR>$&0pDSNOK;tBQ&6*DLg3QN9rmxAi~+AR+fvAw!G=E`QJYqSZOX-#&bvK>diA zQ||ih`I_8tLgle~_nWj^e$k4GLK^4a3ztWCAU@cZq&v$#yBa{$7kY1fRK`*xD|sKi*WSjU4pI z(4VRs_;7$2mwjl6m{yzWHT~Lew?>&6&!gDj6JnT44z*;>bls3nttgLsW3a*8(K_T# zb(1T)pFBE7luWyMlDdA1MK9ggzRZnTJ-^GAa`0$GR@8)MebDyFDVX!@SL&S=?ZTw^ zuD(rSFIRtNv&_}t>Npna(kj}ECR$|a`-R)8;G3BcNE;))hc)W#sb_yG9BvaRUuz7e zypa|F@;s;v&O^6DV=x!~mxOh~=1t2>^^J8$I3x5~>9B2nHhZFYVc?*-;go@WEXWbL zU#@JBo_2G7+|8t)r5EVa2JR$yNDLHFD!jE5<6U@ZG(MvBboH!d3alKz({~Ns`HAjo zOR3aoTUj|dQA{twx0?Yw3@T?lfD~9pyhN*JV|m(Iwe$)fcb5xp;LA2RIv_WNp=a7w zq^R}izQJ&qK+h359Mt(t9-9bq&I*JK;{@f*v>Ze{OX6Sb@qQtg3MD;cNQDGTl293^ zdw`M3Syos;FFX)(G8`P1OcL#1HsA1qXGbk{W<5`SN*BolM#^rrV<~}x5ame4_62P82~K! z8T?D5LLgi!ur2O|yq=eFo`R1xVqH)Z#z1}n8gB2F^u>Q~ixm7JA_+>LFA}|Fc_<%A z!K}D|qgo(AY?7%K)j`ndn&LB8d);xpE;<>S+gglYY}^f>*q@4rSja+NQ^vCG@Mk~9 zZ0t%K({5KDB>aNq&W_J4*>4De2Vz}wWZLETg21{(Aa5`@wSLML@8Sn6vWVb74FHpT zj7EHw;OAk-(TjMLcH?*8L6Ag_l7N!lj|8s?`(JA24ju0vk0e*i~ zIOjKU44m^e&WVQK@%7uYlzu~QMaMgw_?WVn93$QLI3L46Q&5Bj=1MPl2bt(?bmbb9 zw2-VEy8Y;fj=Ku!-LZ_)lvleKT5H7>PCM1Iel4AYZ}seVNC@TTbk0jFdz~<3%)Xv{ z(Zr88Ocvxy*BNB=NBT5h*9`rPd*5W`MayU*IiHgt1tO?<3!FMzs|M~CZ^<8)GI;yr zhK{KX?Vzdj1(?N8^RaC>gmqE>44OVx<33WUT6?|4>Hu}@Ze{nXsi%I6<2>Ox0|`nX z(k1)BUo9YH5uox6sNN7Rfk(>Wcv z%q)w(7h^D!Pc2n1krT=EfoT00(RLh-z^PE0;EGB#(xQP{uY?Bd710T?x#xIK2VK!V zVWsFk8p8CH%jl^#(VSwK4?97X((M9SnwJmigw`3%*qE@Nczi+VBz99BJXF`uqBm(m z**vbRm>5D1n_yt95FLi0XM14V_3j$*=HV>AKG;54>yu|>G05i%c1x+xWmB1gQMOm6(7x=LpT+BATc`)JzI+t=0m){D-#W;TcR-e1XM?C>dI()Tyt?^ zP%CY1v7SL#9~$w)Iu$NP?fJH~&rK%B9TlN%luT-FN_zjYfz4P$Z*##0ia;K0`zHSbpugO& literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-384x384.png b/doc/_static/img/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5df94ab591e32ff8dbc6027e6e5c2eec02d621 GIT binary patch literal 4795 zcmcgwcUaTO)}Bx#QiK%*7Z)Q}P*;Rd1Vp4Lb`Wq;5T&Ysg$_yyRcVSMf{214DpCX~ zf+Q#tpAe0a!B=?uNd-rbnzGwB1`v()^Hw zsJtiuK;p>Z{XYQ!i{Lf*Drn?cV;LTLTkU<=)(-%&wY&!FB8Ra7SnF|Q|K1aU19b9g z|9c}dIxpsa#ND3gLcMFTw@|=7`!ug_La>UhUDc^PF!f>Z z3Bl!@YxU01DQOiG)}|M+wj7_j5|OQ~8G${53w|ObM}%61+gf*Zn}mn5t4O*dE1b+N zhFxCu@pVtbwlWc2Dur*Kdlh@?dQ=a`LF$WB>{*ba`(P_3apoAdMB<#yJbpnb4p z#`@`73mU-mvUx>aZ4{_^BVHqDRTqKE*^!X3!FzhRlW;3^E?ZIBXk0{v`6r#@Y-;ee69{$jNy>eD+*zt3@&egkOdp3Pk6CbXuP^FH8&Zf<;QR3DA^ z(I3r={Rr0pw{ddhrP`aU*K!%BNaOI$pD-k?kvk zTh`%6D;B17E5oel--l=PXD$A69_2>zYyDFjZ=tDZg`KJWwQ^Sk_)FwOK0ZOuV7MCJ^FwF3|!TSBUa=E%#=X zwul%my?+omI;F6Z`<%EpUHJ|>`7M5~2^Vv|D7+w=LcIgvKv?SfFuNuzbBh|cPNCi4 z2T4j*n!oR^{y7V5sI|c?*PS5;gp9$q$3TfDoRr*eHv<9V zxm}2vj`{QYqnUvyi#_)OIP7Y!Q2>6XGlPr_9Dd?S3%iQOME)FAO?IK;goSzDhKPqry2^G79rMEln;pu7NR`~%vGd_dunVYRQ|BU28revcg@2Ohx(Oo&GuDc%fYU<`x+>}!p;2wKK- z0eRxb;`!na@m>F+^WSlx1>ahcTy(nF%ptV4s z*cj|_a9&m>>GH;0jP~fuF{?&=RbUjfxnqw~mWth{lGaJ*w4UC{$Ql#NP6(G4ZIAD! zS)h0NIj>M%5CkzG&{5yi$ems4DAvSy#o>3ph!S}9sqc29-*ui3TlQSjXD_okc__zQ zko@?sQs5j!&YJa*9Mlg&tcD(Z^N^5JmB^;)L;K{vICDBj6!@$ZmEvc@@;7HoiS|s6 zk`uj7DFL`~GOb&(ZuYZ}irlS`ovrv0hC27^wmoyJ3^vLpglLBBp#?#^OWUntbV~l? zn69B2nNgtrx;shTh4|Le+u=E9Tjj?q)~CEl#{6j#(?~Hb^AKgT9gb4j*wxOy8ZsHW zS`3|qy@3nMay(du!45lFSLVa@TTZq~Bva9&BT3stqFpXsgcsdc6ZcAy;A{Ff>hVPW zzbY5SkNJGyGm+0l9yvEbCM)yxMdNQo%uD50)&4)C`W6xYLjjA43P6JUEh|WJzoyEQ zqi--*LVKk6-;2V19v}2WiL<5dR+f**4>rxjy1MSs77vPsAp z10$(2SNaxNM-&zf!cJG(cfO?Ecv5HBX!7%O5-n=RQ3QdXiK1jM8fqd1QzbX-Rw4zr zs7|yd{#;l0IMSwYG@R+_=eY|P(v&FHJ=i;^W$7KWsIuCGlW4CwTSDr1TC&DoHWgdM zQBS^9s@d(EpLnrHK=hd5UC$oPXQ#_VRdFQESAA#WLu7iig#6ZaLnv$bW?*q0bJo(co6+#kLx zsJp0IvR7U?&`DjJHx zHH5%UD@JE{-)@^q_6#NmvktlkNd^@ zP}3k4A$*AL*oDjWX!A^N#?cK`(|=roR;3lNw~tvSHN6iG?09nJz&d>dJLjr)MZ!%C ztN7WjvR=no$yFWhOpaClE7fDM9^3u8_rZ-+w-f23q5A&B6_(u=Eu0cs7DTwpM+}QT zeyrm3^*m=T;5PJ zW>zdA)Ul_KeFPhJwClM=z<5%yUq^J=A(?`Q<*aZf18K2qvBQp-C)_`L-n)6-UJzY9 zjY()e+V#Y0dA@e;j!MO@sL=dsb%2tzzn4E*GB>6?*1D_*-LPdiHz>VtpP1(O?+RQb z4NHx8A8^!2pMNtP*?hIP}Q>tcSD9_5&dLFEG|aG$aPRi#pFhTv?bRClgTXLdh=_ zB3TT{HRawPHq!Gh$GDj`%ijNV)a1yl(W!;7z5BonI_LwYIfwX6UXC-HZ9&uk0H?y9bSI%^IPbsGV8cVntfNip6}kVWc-%n_?8CZ_mOi zH97^UN$MISa>K75E|9Ja=XSqXR_g{L>RbGHp_ zzm!s$Ph!yQj@ulsI74A-S7bQa;+BJoVG9Mh#Fc;)?TSYZWghgG=-t+f1KA~K@#A@U zg1sp>u?oRgr+@N!hh*;1ABoF&?U!JWIU)(kmPL-7MTaZoo*7Y& zh$MGRXx$7sX2zJA-{&*7UAtTR-QV}|{bL?8@Av!jdcIz-=kxV?y~l_!Hq_(Q9Q+6ecs77C#`${fNwMOg1sBStO9_<7QN#~&s^=B8Q}Fb zTf&deR}-o((`WOnA9t5-R2$nP%e!ZjgJG?lIp=eM=K^iKc#ElUwToOAL$A5Txw-jxjmX9LSHatZqYR*`#493+>&p&Gbz+;*5Z^IxKGO60Xu? zRu3H0hBD5whSCXt*c3WNIl=yj1nNOuJ}xzW{#ooG`4= zdESJ>`a~2XpuLxQuW0aC!ttnJ-y2wLaQf?DE^cojpeCU?ID$&nQAEG8=pGx1{Q-uZzaH3pa`R<6663Cae~l6w+Gkd2j$g2p$q_-<5_|lO)KVo9p2kiW#wQ z5^an^L%QW{%&vatm#N#WUD$FI%x)$!FuJKHaHx3-Jo zyNO!?8(KDkpFd-9`r*(bhewi+Q3(}!vz4mVlsa#(v@a-|ya~aH3ss%&Ij~*n$-YgP zpN>*T%5{35!smsr*~rM{i9T0ab=2c=)~#})H>UOr!|gvKS$oI0wf0h%ZknMpxv*EJ z7Rc5T5;wa*(MBOO07ssCjSANJc%xzT6;doWf_d1nu{=!WM3pm5nX9I&b+tesW5#1A zlj<)~aBt4{>B8))svWhsV8#QJN(vE#qkx(+1ZU#Wtf#f0*hLg>+aIRGVlvTQeG7oafR^iB|%>~x57?lUKfdg*6n(+Co(9jcRdH8_Z zck^Hq4){3oL=%;OQn_nXH5S!`NWILO=EwFbG96l1j{-bE&yIY~TUhBJ>5rgvdF76^ zMbFx218qyHS!qc8BC9uo^vQX|hsifw#VC%Usx5HCB!P1|m79e~+ppG*ESSIHAL>Jp zO>!iyhgpoL3XJXu5*S)+TD<10W!cbetUn#fr?5DzCM^{s54suL@wCB$AYvGOr9UK3 zo*AU1J`@>0-%qb6&xsJ5Vid7ZCRbX4MojfwRmv3iAIr9O8-+Ph97oiF2P zcyoPP`}}9w{Uemw7}8K%EnBQs`b5aQ7}r@0$>&h_?UZMq>V#T7I%dYz!4?=KhhJ{5 z)hfyD)+{*Aos^_3a(FL*g7RDQ-xhj zo*}AJ4K*v2J32p5qYvHIv;h@W%z9s3O`hXZx3g1I2wJdTO=Ss`NCKR|^ubJ^k)Y#Q za#m!9kZ@wT(G|@c2nC0J)$oy7%#YJX@CDeulrtF!;DpuSj;1Xua zp3S%p{A2cO>E0YzDqVGTLQt@}M>!|A`)!0Ho{TQ7Ce1yB1Ds&@o~23StPaHxcg#i* zjwlh}#yhxbI)oXs_Pf@EJM;>%MVz|^t=N4y5WEDOFL0#W0&Iz*xN9;m0Uy*R@LpgY z4BE4I=g>SjFERMXwl<<^z`$-ruh|oj>Hw)nB0>puY zjqJ7}IKzb8xxiXslMQ*01OS*M7zF@Ff!F{i_=17w+*U&DCHov)qoA(<>$l+S9Zno* z!iHOGTL^D$4W6&TLraJ&$oTK>zKOpc4~h>0fdD{cV8uI4G+xi zH!i=B_Xim2uVVa}oVD;lhn(yP{v`Hq>435P-GS%NT>nG1*xvu(XT3W%7wp(1|0)oS zy#q%<8FJzv0-^BNiUC@~B!4R==$J$P3;XNQ*Glal*n*?JhW?Gx<+lDBRcnR(kEMlU z2m3FyKz+3_AoKr(zn+|bQCt8FA`gIn>Bud||9IdoHJRD!%L*? z#fmX(8E<{ZuE!rvfb`XD-wp1a1GjL%fqJO*wx5T3_0|tii`Q?5WIKNgnh$?@9PD;z z3kP`aRRryzXLqx$!G}RS(42j~cJfV>^-c>FxluC3*M9edBiHEziAg8@E@&2-Mo{|Q zz*%xGh~s0OP#1o4?PP^iZpxP0aI-sVsJuf#bywcpJ@rP`gPpP(f+*3|f+nose~5E< zg*FQFXRe&F^b$0-!7n7ZXe>??PCgu~T@j82FAv;I@?=@Ob392|O-|j*&GN0g-aQiS z`2iNr(c!2_x^hxCEqZ$SzK_g}PQg_jFy9`6Rn<8i%f29|djr9G_u}m(o@|zCY2M5ix!b!(@TgT_!uIb8w6_SHp*HtEs8c*rl z?*o}$H%7qE|HYhzqy8V0k?Rx2Oa+< zp>N@@4VyJQhym1}69U(N+}hxA&9!ZuxWA)AgNJSTPxl@a?%&=034Xn|uh9j${|B=E zjt)RQ^ySuouZRDZ+W&Eq|ADv0{`x`7z8XM(urK0#?JEv+{*Qcta{)~9U(y9|{)YGW zguvv#r3XwB3IdM$v)X?tr!UL@@>>0x+P~=m`@+wfJijl$N*Cmw9q9ie8IahuVuh0X zv%7DS1sOn!eZ3dg0NG^z84s#9fD?TE(TmW=*X#G|YJY<+c07={Abo#Hh`oWc76E=m zlM(iV}@0bVVIA+X^gX0{0}iYI2o~`&({TpBD1CSR1(#m$8pEoD#{WdpmFY+)2me zs1wA^==-ig^Y?_@uUS9o49n6E*FTXrr4c;ZB8|BI+C>_(RK<()j}JFXIK^L(Ait3> z3$PUDs##S6FB7}%wIO=}^KJxU+pmI+u9#uR*rYVy-e0!K+S5)f%vv~Er+E9_EJewi z^)a5jUHL^TSF5sZDaxZ7J$@^~NOPfe(Y2$tWk*Myeyl9nvm>W%qiK$zV4IORlS$2J zkPjSfmGLkn$ez_aZ@I5pNeNl)D`+fc7JagT?&37Go2$)$pn*mkhDLIbT#N^Q&C48> zFyE&9ee-d+aggxw$fS~1B{}zsY_n$br|SNbC9@y%&(^&ds0<4gIP4j&QGRhTD3j!0 zgPG~_-@D(gqvEiKd)abR%L|DuL+Ju2cR$aD3)OE@d|lj_I8)Q}-W$crRtgIp7UF0D z6VIE{SQaw0;B8W>D@~oyRgTfgg%BxFE?Gfx&A1azv;ARHwEhHgE!@GT`b`OIB=~Ge>%% zULt5o)&=BLDdq3atLcD$Edy63fW{x4IMUstR&$Um?o5PtWKt*Ixb!Bcr8@0~Fni4xP1zjHP z^Gm*=^$0Muo`)BdUvEI|Q!z1ZuRiywW^lsPNA!&EeKX>8g3rcC{RBSnnI*U+f%gFN z&c=wqh*MQvZ@9zev?fyS8tUGbb7ejKAxzp}%!3E_!2mXw=mrK|U&T_9V@4R?OSrY? ziJ(TI4>9GcsGr6|`z%IG#RH62EH6moDa@(?l;Oh$mUi)trnjX5Kh4D9)hXcb8<)F_ z)s?2bPnVsDP9BU)IN9~U^l>!lm*fbVAP=CCOg(-?C1^tH**uL^^zMV_OJuA^bXA^D zOiJ_uLUy2dTEtz$uR=!a?ADF%!XOWKx|t)u&CHwGuw=0+|)~cG-NQW0yvKK6fnl%9~%c%c3Sl0G9Fa> zh6)xrGn3OcfLa&EZa|r+3yW^uQ;Y2HB6_?VFc8?3G1#Uh0>}ztpPn7zFx+lw{J}Rc z7>Q!$XuZ^jfxnrZT_O2WuzDs3mE`quk4%1yCq~87@jj&~y;9RxFphrB@$M9&B4$So z6qFBfIW0Fq?8m4n^wpC&FQX{79kVZ8Dp+MkB21y$G3}3qBW>E(;$dH!nw$vb%$ z!T(ZBD>*a8TA8sKl5vk_&%~z$8nmrm)K)DV_Tgj3!#r0IH?FwZcF{_Gk21LC&vVjj zRy|pFVCl;s`2+lIOci;(Fp#c9#Ta+rAfE8jO+$|cya{fY#j!#o#^oG8c~{Fof4hSq z%ZaPgiecIS;5MI#J$Tnp`rxkyK6M_IpX5`OrqfxpX+2iFEHmvs>v?zdQ*77r&s*9Q zTzZCIow0lIgt`w!0874)o`fAZE@QWvtaLK0>tTdv4>N2Fxjc6`Md)%qD-KrpE9vme z9l<{3S?}SRkh`O%pYJw3PsUo!X4B!y1LAu(0O`spG}$eQ<_4QHF4EukC!|?yBaUJ3 zr(l(BHlP-li~>(>%4@Ea!0L&^9#@CNrP=XPe*$g-09C+#A*OA0TYDOlPaK zIi{6?cd29PrfZ5jZA{z8aU%t+;W!+>1;^>s%>d5B^+nsjxS}(2Nx6CyVZY3_*0Ls0 zR-Qa(Oxf}FXx_#ZU2dQtI}*m9Ej)0Iw(5{4aFGho^a&>xI|p3O^q&DJ=AwqI85wr+tz(?R@+p z@Q_Ib0N5Yfr}7{k z^X7Zi9Og`QS1TzWI|Nx|CLZJWNe^8$gGCWPo9A)IE6GV%5zFVxH%J@ojJgG5O3!1I zD$C2;k4e9ht`ij&A@!D*QsI{BE}fn;w(3}X^x0|R2jMsGV$3e}!21>Y zu%8hz%MVTRew-4_b7>#X4y7QgsvDZ*pA9=Cr-yO+vO(HcE`E=WRbYR8PeW@JAi@JEwoL*n;)6*Lc+6h54R17)71?6()GNKC0K5$WJsrd2`P%0~{ttnT(ewZS literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-72x72.png b/doc/_static/img/icons/icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..656a708cdbc4c86116a26ec9b0da5cf8a278f32c GIT binary patch literal 1084 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!oCO|{#S9GGLLkg|>2BR01_tJL zo-U3d6}R5rIiD?)D#89?XT^(?TdXy2FZz7$%sDmRY;9f9O`h6uE-d`4jy<+F|1Y>T zKlA0$kd`%^le$)9@E7A$NV5C1=$8coj{rH2qJt%IMv@zP5|~T;G~s z46I95JDG=k`1(fo`S^O+wQ(R&~bsjsq@_8$%`-NUwq9QC427p@AFGGKK}81 z1(Vtm2gXTnz8_n6`gf(*<|CD^j{>G^?z>a*+u6#|vHyvJ0XIWJR%CJPd{teYQO(n)Ks_Dwz`IG zRdvF8=8JCYuQDn!+cG>c5@0sOk0!9}vS9tYvfgfWkmP>*H}kW4&fbZ6yHi6wgKcuj zDy_@bM!mH!E#K^&63weEP*?r+Tv3rqc!jxjxWtJwW=g72)tV&^4513^AFUU?z9(s8 zOs3B@t)oJv8jaT`9x7-pYhrjIdq2CviKC_A;S2?imn=U+=Tr-qfBd%7zTn|v`@)BZ z*`73~#@Or^uv3tF{ou>G`KKP2_cQppFdmpfKP%XQy#X_ZyO z&INY`n7{5QnRNART;Y}H?(Nsg{+Tn3FKd4tMNUzu$^Ns71w`|-_7CFYs{d*r)-8WzS-C4Ur*f3_iTJ=yfx#Q@6QVT-2Zf{Wz6#n&Sj|Qvs(Z5-K%|@m#>yC z-(Mr7vBIc&m*1gv)BPS8x1YP?zcgs+>6UJtn4&_f&odUQrJ0dBLP4$QBI`_;{qQ42*c8BF$j$65{izWN6>J-&kbCyQwTTP3|>+KYkD!v+7x5>B1{{NO2 cQ_Sj_Srs!|_I24F1{Mblp00i_>zopr08fDCW&i*H literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-96x96.png b/doc/_static/img/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..57fe0708713fe2444d169778ef26af8cdb064e67 GIT binary patch literal 1316 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GGLLkg|>2BR01_qXE zo-U3d6}R5rx$PelD#G@`v(}_hEN9P>Iko3zO6Dm?cnaq&s(2_r!Oq0DMo>83XYoU` z4pYOGh8l}PFRRU3(W@IZS?a*HS;sCN5ua-HH0h}khe)r}5>_q~<1=S&p5DseGwH=_ zq3?5Q)PHU&YiQqlJ%9aS?&kHIc2>9d%dguWZc^U9(@lG}zvsG_6VxU?^}QSN`_Id( zOSk^uedL~Jm-W`d=-a#2i%+jtxxM&$FY%i4U2tU`~l z&sk-8$31lIa?j1j(yb267s#Kp*Xy|6xfNgY=NR3eHrxK|0dCt@6AI(3Uos~%{X5KA zaNU{j`qy$jpH=J67Z-^-bnp7P>gO!8d&a^O?uDnnFZfgO-*la`yU2lr&>z924(^Yi zRWl}NJH2|Vzxc{c<1cHOW~|Nm*-Ht4pKezy@p<*)XW*+(x8mL9 z|35lDTh@kg{WqTMxqau`R=mC=vA5`1SG$_SsUI`*m(|z)U;Xi^@N_jX`#19=E}5$T zQWvw|VX^Pm$Lo_X_OJ)En#qL<&-u#Zb%~qdU6;|9k7u+!(q2sdDLi2wQ~BGJm^~l4 zCRMP$G+^Xgdp>sgk2g$5>mUAEQ+VZH#r)UB+;U7F$6mDGs@$cMByuu-vB!gH`#4wq zRn-hKc&6Jhah9l*Nyj=C%eq?OhcUbYwfW~Oa+u^|mUTQ}W>dXyF!%8Vj`&F)38$JF z+@u;z{G<}3$O|3}UH^C;Tpzm|ziNn)<$F2n)UwH&_Iy;a6?qpI8xdE`DAd{Fqb7W* zP(@XEV?@!0w40I!8kPc6PBPkO%CxgFuk!o7>Q?o#Rs8jSVC}EI$wl70=iR@jq^z~N zzV>vzhiAQ)o!jQE-Xc#qJ3g`aeDJ+&&KLWbvxBYfQ>&b9fpW<1`A%EEZrZVJUdh>G z|GovEJp8rOxqV*m_V&Y9Ze3D3JZIaru&m51A5;6tJ@>991nf9C=^@)>lfKK}rnu_c z<(~chXPbTAy_w$6?(SY%c|Grv%{#gGH+D`gOHDmFXN^u!;q{w0r_A2mUiOq@=H%oF z*G`(Igl%)I3)cC`)T+8YNAZN2?n%Yo$@k{-+}g&Kdu{)a**3*BY;@s&*1>8NDv){h{oPLjqQ`h5+c_Q*^TX$Yx zoBj5CF1K>tvzZ}58e#J+GoJmt5*!g1{*3?0`PH5Q`(<*R6JJR0&-|CH<2+$yVNTuK z6>|5(Rr2iO(!+L~-Tw9gU#N4x> Date: Mon, 10 Aug 2020 18:48:46 -0500 Subject: [PATCH 0555/2998] build(setup.py): Fix quotes --- setup.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/setup.py b/setup.py index 8aae9cadd6..83b8ad9d94 100644 --- a/setup.py +++ b/setup.py @@ -44,19 +44,19 @@ keywords=about['__title__'], entry_points=dict(console_scripts=['tmuxp=tmuxp:cli.cli']), classifiers=[ - 'Development Status :: 5 - Production/Stable', + "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: Implementation :: PyPy', + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells", ], From 578e277de1cb81285e3351ba383b524d1cd345e6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:50:00 -0500 Subject: [PATCH 0556/2998] build(pyproject): Add classifiers --- pyproject.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 15c588f801..bdd3ddcfa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,23 @@ version = "1.5.5" description = "tmux session manager." license = "MIT" authors = ["Tony Narlock "] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: MIT License", + "Operating System :: POSIX", + "Operating System :: MacOS :: MacOS X", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Utilities", + "Topic :: System :: Shells" +] [tool.poetry.dependencies] python = "~2.7 || ^3.5" From 828308efa4212870449ad95e385842ee8fba9c52 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:54:36 -0500 Subject: [PATCH 0557/2998] build(pyproject): Add more metadata --- pyproject.toml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index bdd3ddcfa9..b259bcd60c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" version = "1.5.5" -description = "tmux session manager." +description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] classifiers = [ @@ -24,6 +24,14 @@ classifiers = [ "Topic :: Utilities", "Topic :: System :: Shells" ] +keywords = ["tmux", "session manager", "terminal", "ncurses"] +homepage = "http://github.com/tmux-python/tmuxp/" +readme = "README.rst" + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/tmux-python/tmuxp/issues" +Documentation = "https://tmuxp.git-pull.com" +Repository = "https://github.com/tmux-python/tmuxp" [tool.poetry.dependencies] python = "~2.7 || ^3.5" From a32d8ae0dfaff9f1d21a26a63ddcfbe93705c5cf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:55:15 -0500 Subject: [PATCH 0558/2998] build(pyproject): Add scripts for tmuxp --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b259bcd60c..fbddb8d07f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,9 @@ readme = "README.rst" Documentation = "https://tmuxp.git-pull.com" Repository = "https://github.com/tmux-python/tmuxp" +[tool.poetry.scripts] +tmuxp = 'tmuxp:cli.cli' + [tool.poetry.dependencies] python = "~2.7 || ^3.5" click = ">=7<8" From e2865f915ad4db6f6aac212903f25197b1c4e892 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:01:58 -0500 Subject: [PATCH 0559/2998] refactor(docs): Move doc/ -> docs/ --- .tmuxp.json | 4 ++-- .tmuxp.yaml | 2 +- MANIFEST.in | 2 +- {doc => docs}/Makefile | 0 {doc => docs}/_ext/__init__.py | 0 {doc => docs}/_ext/aafig.py | 0 {doc => docs}/_static/favicon.ico | Bin {doc => docs}/_static/img/books/amazon-logo.png | Bin {doc => docs}/_static/img/books/ibooks-logo.png | Bin {doc => docs}/_static/img/icons/icon-128x128.png | Bin {doc => docs}/_static/img/icons/icon-144x144.png | Bin {doc => docs}/_static/img/icons/icon-152x152.png | Bin {doc => docs}/_static/img/icons/icon-192x192.png | Bin {doc => docs}/_static/img/icons/icon-384x384.png | Bin {doc => docs}/_static/img/icons/icon-512x512.png | Bin {doc => docs}/_static/img/icons/icon-72x72.png | Bin {doc => docs}/_static/img/icons/icon-96x96.png | Bin {doc => docs}/_static/img/tmuxp.svg | 0 {doc => docs}/_static/tao-tmux-screenshot.png | Bin {doc => docs}/_static/tmuxp-demo.gif | Bin {doc => docs}/_static/tmuxp-dev-screenshot.png | Bin {doc => docs}/_templates/book.html | 0 {doc => docs}/about.rst | 0 {doc => docs}/about_tmux.rst | 0 {doc => docs}/api.rst | 0 {doc => docs}/cli.rst | 0 {doc => docs}/conf.py | 0 {doc => docs}/developing.rst | 0 {doc => docs}/examples.rst | 0 {doc => docs}/glossary.rst | 0 {doc => docs}/history.rst | 0 {doc => docs}/index.rst | 0 {doc => docs}/manifest.json | 0 {doc => docs}/quickstart.rst | 0 {doc => docs}/requirements.txt | 0 35 files changed, 4 insertions(+), 4 deletions(-) rename {doc => docs}/Makefile (100%) rename {doc => docs}/_ext/__init__.py (100%) rename {doc => docs}/_ext/aafig.py (100%) rename {doc => docs}/_static/favicon.ico (100%) rename {doc => docs}/_static/img/books/amazon-logo.png (100%) rename {doc => docs}/_static/img/books/ibooks-logo.png (100%) rename {doc => docs}/_static/img/icons/icon-128x128.png (100%) rename {doc => docs}/_static/img/icons/icon-144x144.png (100%) rename {doc => docs}/_static/img/icons/icon-152x152.png (100%) rename {doc => docs}/_static/img/icons/icon-192x192.png (100%) rename {doc => docs}/_static/img/icons/icon-384x384.png (100%) rename {doc => docs}/_static/img/icons/icon-512x512.png (100%) rename {doc => docs}/_static/img/icons/icon-72x72.png (100%) rename {doc => docs}/_static/img/icons/icon-96x96.png (100%) rename {doc => docs}/_static/img/tmuxp.svg (100%) rename {doc => docs}/_static/tao-tmux-screenshot.png (100%) rename {doc => docs}/_static/tmuxp-demo.gif (100%) rename {doc => docs}/_static/tmuxp-dev-screenshot.png (100%) rename {doc => docs}/_templates/book.html (100%) rename {doc => docs}/about.rst (100%) rename {doc => docs}/about_tmux.rst (100%) rename {doc => docs}/api.rst (100%) rename {doc => docs}/cli.rst (100%) rename {doc => docs}/conf.py (100%) rename {doc => docs}/developing.rst (100%) rename {doc => docs}/examples.rst (100%) rename {doc => docs}/glossary.rst (100%) rename {doc => docs}/history.rst (100%) rename {doc => docs}/index.rst (100%) rename {doc => docs}/manifest.json (100%) rename {doc => docs}/quickstart.rst (100%) rename {doc => docs}/requirements.txt (100%) diff --git a/.tmuxp.json b/.tmuxp.json index 636804fce8..17256e7bcf 100644 --- a/.tmuxp.json +++ b/.tmuxp.json @@ -27,7 +27,7 @@ "options": { "main-pane-height": 35 }, - "start_directory": "doc/", + "start_directory": "docs/", "panes": [ { "focus": true @@ -38,4 +38,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/.tmuxp.yaml b/.tmuxp.yaml index d498e1d60a..28ce7652fa 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -17,7 +17,7 @@ windows: layout: main-horizontal options: main-pane-height: 35 - start_directory: doc/ + start_directory: docs/ panes: - focus: true - pane diff --git a/MANIFEST.in b/MANIFEST.in index 078513d84c..abc5eab53a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt -recursive-include doc *.rst +recursive-include docs *.rst recursive-include tests *.py *.yaml *.json *.sh recursive-include examples *.yaml *.json diff --git a/doc/Makefile b/docs/Makefile similarity index 100% rename from doc/Makefile rename to docs/Makefile diff --git a/doc/_ext/__init__.py b/docs/_ext/__init__.py similarity index 100% rename from doc/_ext/__init__.py rename to docs/_ext/__init__.py diff --git a/doc/_ext/aafig.py b/docs/_ext/aafig.py similarity index 100% rename from doc/_ext/aafig.py rename to docs/_ext/aafig.py diff --git a/doc/_static/favicon.ico b/docs/_static/favicon.ico similarity index 100% rename from doc/_static/favicon.ico rename to docs/_static/favicon.ico diff --git a/doc/_static/img/books/amazon-logo.png b/docs/_static/img/books/amazon-logo.png similarity index 100% rename from doc/_static/img/books/amazon-logo.png rename to docs/_static/img/books/amazon-logo.png diff --git a/doc/_static/img/books/ibooks-logo.png b/docs/_static/img/books/ibooks-logo.png similarity index 100% rename from doc/_static/img/books/ibooks-logo.png rename to docs/_static/img/books/ibooks-logo.png diff --git a/doc/_static/img/icons/icon-128x128.png b/docs/_static/img/icons/icon-128x128.png similarity index 100% rename from doc/_static/img/icons/icon-128x128.png rename to docs/_static/img/icons/icon-128x128.png diff --git a/doc/_static/img/icons/icon-144x144.png b/docs/_static/img/icons/icon-144x144.png similarity index 100% rename from doc/_static/img/icons/icon-144x144.png rename to docs/_static/img/icons/icon-144x144.png diff --git a/doc/_static/img/icons/icon-152x152.png b/docs/_static/img/icons/icon-152x152.png similarity index 100% rename from doc/_static/img/icons/icon-152x152.png rename to docs/_static/img/icons/icon-152x152.png diff --git a/doc/_static/img/icons/icon-192x192.png b/docs/_static/img/icons/icon-192x192.png similarity index 100% rename from doc/_static/img/icons/icon-192x192.png rename to docs/_static/img/icons/icon-192x192.png diff --git a/doc/_static/img/icons/icon-384x384.png b/docs/_static/img/icons/icon-384x384.png similarity index 100% rename from doc/_static/img/icons/icon-384x384.png rename to docs/_static/img/icons/icon-384x384.png diff --git a/doc/_static/img/icons/icon-512x512.png b/docs/_static/img/icons/icon-512x512.png similarity index 100% rename from doc/_static/img/icons/icon-512x512.png rename to docs/_static/img/icons/icon-512x512.png diff --git a/doc/_static/img/icons/icon-72x72.png b/docs/_static/img/icons/icon-72x72.png similarity index 100% rename from doc/_static/img/icons/icon-72x72.png rename to docs/_static/img/icons/icon-72x72.png diff --git a/doc/_static/img/icons/icon-96x96.png b/docs/_static/img/icons/icon-96x96.png similarity index 100% rename from doc/_static/img/icons/icon-96x96.png rename to docs/_static/img/icons/icon-96x96.png diff --git a/doc/_static/img/tmuxp.svg b/docs/_static/img/tmuxp.svg similarity index 100% rename from doc/_static/img/tmuxp.svg rename to docs/_static/img/tmuxp.svg diff --git a/doc/_static/tao-tmux-screenshot.png b/docs/_static/tao-tmux-screenshot.png similarity index 100% rename from doc/_static/tao-tmux-screenshot.png rename to docs/_static/tao-tmux-screenshot.png diff --git a/doc/_static/tmuxp-demo.gif b/docs/_static/tmuxp-demo.gif similarity index 100% rename from doc/_static/tmuxp-demo.gif rename to docs/_static/tmuxp-demo.gif diff --git a/doc/_static/tmuxp-dev-screenshot.png b/docs/_static/tmuxp-dev-screenshot.png similarity index 100% rename from doc/_static/tmuxp-dev-screenshot.png rename to docs/_static/tmuxp-dev-screenshot.png diff --git a/doc/_templates/book.html b/docs/_templates/book.html similarity index 100% rename from doc/_templates/book.html rename to docs/_templates/book.html diff --git a/doc/about.rst b/docs/about.rst similarity index 100% rename from doc/about.rst rename to docs/about.rst diff --git a/doc/about_tmux.rst b/docs/about_tmux.rst similarity index 100% rename from doc/about_tmux.rst rename to docs/about_tmux.rst diff --git a/doc/api.rst b/docs/api.rst similarity index 100% rename from doc/api.rst rename to docs/api.rst diff --git a/doc/cli.rst b/docs/cli.rst similarity index 100% rename from doc/cli.rst rename to docs/cli.rst diff --git a/doc/conf.py b/docs/conf.py similarity index 100% rename from doc/conf.py rename to docs/conf.py diff --git a/doc/developing.rst b/docs/developing.rst similarity index 100% rename from doc/developing.rst rename to docs/developing.rst diff --git a/doc/examples.rst b/docs/examples.rst similarity index 100% rename from doc/examples.rst rename to docs/examples.rst diff --git a/doc/glossary.rst b/docs/glossary.rst similarity index 100% rename from doc/glossary.rst rename to docs/glossary.rst diff --git a/doc/history.rst b/docs/history.rst similarity index 100% rename from doc/history.rst rename to docs/history.rst diff --git a/doc/index.rst b/docs/index.rst similarity index 100% rename from doc/index.rst rename to docs/index.rst diff --git a/doc/manifest.json b/docs/manifest.json similarity index 100% rename from doc/manifest.json rename to docs/manifest.json diff --git a/doc/quickstart.rst b/docs/quickstart.rst similarity index 100% rename from doc/quickstart.rst rename to docs/quickstart.rst diff --git a/doc/requirements.txt b/docs/requirements.txt similarity index 100% rename from doc/requirements.txt rename to docs/requirements.txt From 0e403ac398023c5484cc2bae228dd5565fe1f11b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:09:54 -0500 Subject: [PATCH 0560/2998] build(conf): Update to latest and greatest --- docs/conf.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 1b1425485f..3ad371f510 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,6 +5,7 @@ from os.path import dirname, relpath import alagitpull +from recommonmark.transform import AutoStructify import tmuxp @@ -30,16 +31,33 @@ 'aafig', 'alagitpull', 'sphinx_issues', + 'recommonmark', ] issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] -source_suffix = '.rst' +source_suffix = {'.rst': 'restructuredtext', '.md': 'markdown'} master_doc = 'index' +# app setup hook +def setup(app): + app.add_config_value( + 'recommonmark_config', + { + #'url_resolver': lambda url: github_doc_root + url, + 'enable_auto_toc_tree': True, + 'auto_toc_tree_section': 'Contents', + 'auto_code_block': True, + 'enable_eval_rst': True, + }, + True, + ) + app.add_transform(AutoStructify) + + project = about['__title__'] copyright = about['__copyright__'] @@ -51,8 +69,8 @@ pygments_style = 'sphinx' html_theme_path = [alagitpull.get_path()] -html_favicon = '_static/favicon.ico' html_theme = 'alagitpull' +html_extra_path = ['manifest.json'] html_static_path = ['_static'] html_sidebars = { '**': [ @@ -73,6 +91,12 @@ 'github_banner': True, 'projects': alagitpull.projects, 'project_name': about['__title__'], + 'project_title': about['__title__'], + 'project_description': about['__description__'], + 'project_url': about['__docs__'], + 'show_meta_manifest_tag': True, + 'show_meta_og_tags': True, + 'show_meta_app_icon_tags': True, } alagitpull_internal_hosts = ['tmuxp.git-pull.com', '0.0.0.0'] From 4c50f75f87cf8c48d925f0b29a97742dd8310b6b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:12:28 -0500 Subject: [PATCH 0561/2998] build(docs): Add layout --- docs/_templates/layout.html | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 docs/_templates/layout.html diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000000..19a94fe470 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,45 @@ +{% extends "!layout.html" %} +{%- block extrahead %} + {{ super() }} + {%- if theme_show_meta_manifest_tag == true %} + + {% endif -%} + {%- if theme_show_meta_og_tags == true %} + + + + + + + + + + + + + + + + {% endif -%} + {%- if theme_show_meta_app_icon_tags == true %} + + + + + + + + + + + + + + + + + + + + {% endif -%} +{% endblock %} From 316e0640045a8849a7780d88cc7738882eb4c2d6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:13:14 -0500 Subject: [PATCH 0562/2998] build(publish-docs): Add doc builder gh action --- .github/workflows/publish-docs.yml | 99 ++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 .github/workflows/publish-docs.yml diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000000..d08770e87d --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,99 @@ +name: Publish Docs + +on: + push: + branches: + - master +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '3.x' ] + steps: + - uses: actions/checkout@v1 + - name: Configure git + run: | + git config --global user.name 'travis-ci' + git config --global user.email 'travis@nowhere.edu' + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + + - name: Install poetry + run: | + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + rm get-poetry.py + + - name: Get poetry cache paths from config + run: | + echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') + echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + + - name: Configure poetry + shell: bash + run: poetry config virtualenvs.in-project true + + - name: Set up cache + uses: actions/cache@v2 + id: cache + with: + path: | + .venv + {{ env.poetry_cache_dir }} + {{ env.poetry_virtualenvs_path }} + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + shell: bash + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + + - name: Upgrade pip + shell: bash + run: poetry run python -m pip install pip -U + + - name: Install dependencies [w/ docs] + run: poetry install --extras "docs lint" + + - name: Build documentation + run: | + pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd + + - name: Push documentation to S3 + uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: 'us-west-1' # optional: defaults to us-east-1 + SOURCE_DIR: 'docs/_build/html' # optional: defaults to entire repository + + - name: Generate list of changed files for CloudFront to invalidate + run: | + pushd docs/_build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + for file in $FILES; do + echo $file + # add bare directory to list of updated paths when we see index.html + [[ "$file" == *"/index.html" ]] && echo $file | sed -e 's/\/index.html$/\//' + done | sort | uniq | tr '\n' ' ' > .updated_files + + - name: Invalidate on CloudFront + uses: chetan/invalidate-cloudfront-action@master + env: + DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION }} + AWS_REGION: 'us-east-1' + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + PATHS_FROM: .updated_files From db7693fb14ca8bcf890d6ed2d0218c07f26bcc73 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:16:38 -0500 Subject: [PATCH 0563/2998] docs: Include buttons on docs page --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 3708aa125a..a79d62409a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,7 +8,7 @@ tmux session manager ==================== .. include:: ../README.rst - :start-line: 4 + :start-line: 2 :end-before: .. image .. image:: _static/tmuxp-demo.gif From 2912571f7574cf50c48c925eb8b1c1ec4930f032 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:16:50 -0500 Subject: [PATCH 0564/2998] docs(README): Link to docs CI task --- README.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index bc3ae5c136..56125f35da 100644 --- a/README.rst +++ b/README.rst @@ -197,6 +197,10 @@ tests .. code-block:: bash :alt: Python Package :target: http://badge.fury.io/py/tmuxp +.. |docs| image:: https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg + :alt: Docs + :target: https://github.com/tmux-python/tmuxp/actions?query=workflow%3A"Publish+Docs" + .. |build-status| image:: https://img.shields.io/travis/tmux-python/tmuxp.svg :alt: Build Status :target: https://travis-ci.org/tmux-python/tmuxp @@ -207,8 +211,3 @@ tests .. code-block:: bash .. |license| image:: https://img.shields.io/github/license/tmux-python/tmuxp.svg :alt: License - -.. |docs| image:: https://readthedocs.org/projects/tmuxp/badge/?version=latest - :alt: Documentation Status - :scale: 100% - :target: https://readthedocs.org/projects/tmuxp/ From 6500706d1581855f1c8fe9b77ef1e85009c16c29 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:23:33 -0500 Subject: [PATCH 0565/2998] build(doc index): Update includes, headers --- docs/index.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index a79d62409a..fc6d677954 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,14 +14,13 @@ tmux session manager .. image:: _static/tmuxp-demo.gif :width: 100% - Freeze a tmux session --------------------- .. include:: ../README.rst :start-after: --------------------- -Explore: - +Table of Contents +----------------- .. toctree:: :maxdepth: 2 From 6ebae38de6e722ead6cc548098a76f8c43330969 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:24:21 -0500 Subject: [PATCH 0566/2998] build(README): Remove table --- README.rst | 46 +++++++++++----------------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/README.rst b/README.rst index 56125f35da..8af3b9de19 100644 --- a/README.rst +++ b/README.rst @@ -153,41 +153,17 @@ See donation options at https://git-pull.com/support.html. Project details --------------- - -============== ========================================================== -tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7. 2.8 -python support 2.7, >= 3.5, pypy, pypy3 -config support yaml, json, python dict -Source https://github.com/tmux-python/tmuxp -Docs http://tmuxp.git-pull.com -API http://tmuxp.git-pull.com/en/latest/api.html -Changelog http://tmuxp.git-pull.com/en/latest/history.html -Issues https://github.com/tmux-python/tmuxp/issues -Travis http://travis-ci.org/tmux-python/tmuxp -Test Coverage https://codecov.io/gh/tmux-python/tmuxp -pypi https://pypi.python.org/pypi/tmuxp -Open Hub https://www.openhub.net/p/tmuxp -License `MIT`_. -git repo .. code-block:: bash - - $ git clone https://github.com/tmux-python/tmuxp.git -install stable .. code-block:: bash - - $ pip install --user tmuxp -install dev .. code-block:: bash - - $ git clone https://github.com/tmux-python/tmuxp.git tmuxp - $ cd ./tmuxp - $ virtualenv .venv - $ source .venv/bin/activate - $ pip install -e . - - See the `developing and testing`_ page in the docs for - more. -tests .. code-block:: bash - - $ make test -============== ========================================================== +- tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 +- python support: 2.7, >= 3.3, pypy, pypy3 +- Source: https://github.com/tmux-python/tmuxp +- Docs: https://tmuxp.git-pull.com +- API: https://tmuxp.git-pull.com/api.html +- Changelog: https://tmuxp.git-pull.com/history.html +- Issues: https://github.com/tmux-python/tmuxp/issues +- Test Coverage: https://codecov.io/gh/tmux-python/tmuxp +- pypi: https://pypi.python.org/pypi/tmuxp +- Open Hub: https://www.openhub.net/p/tmuxp-python +- License: `MIT`_. .. _MIT: http://opensource.org/licenses/MIT .. _developing and testing: http://tmuxp.git-pull.com/en/latest/developing.html From bce85e63bc64be0e05a8a1fbdc1ac5c4dc579031 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:25:11 -0500 Subject: [PATCH 0567/2998] docs: Update /en/latest reference to new path / --- README.rst | 30 +++++++++++++++--------------- docs/conf.py | 2 +- docs/quickstart.rst | 2 +- tmuxp/cli.py | 6 +++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/README.rst b/README.rst index 8af3b9de19..55391e4da3 100644 --- a/README.rst +++ b/README.rst @@ -118,26 +118,26 @@ Want to learn more about tmux itself? `Read The Tao of Tmux online`_. .. _Documentation: http://tmuxp.git-pull.com .. _Source: https://github.com/tmux-python/tmuxp .. _中文: http://tmuxp-zh.rtfd.org/ -.. _before_script: http://tmuxp.git-pull.com/en/latest/examples.html#bootstrap-project-before-launch -.. _virtualenv: https://virtualenv.git-pull.com/en/latest/ -.. _Read The Tao of tmux online: http://tmuxp.git-pull.com/en/latest/about_tmux.html +.. _before_script: http://tmuxp.git-pull.com/examples.html#bootstrap-project-before-launch +.. _virtualenv: https://virtualenv.git-pull.com/ +.. _Read The Tao of tmux online: http://tmuxp.git-pull.com/about_tmux.html .. _author's tmuxp configs: https://github.com/tony/tmuxp-config -.. _python library: https://tmuxp.git-pull.com/en/latest/api.html -.. _python API quickstart: https://tmuxp.git-pull.com/en/latest/quickstart_python.html +.. _python library: https://tmuxp.git-pull.com/api.html +.. _python API quickstart: https://tmuxp.git-pull.com/quickstart_python.html .. _tmux(1): http://tmux.sourceforge.net/ .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil -.. _Examples: http://tmuxp.git-pull.com/en/latest/examples.html -.. _freezing tmux: http://tmuxp.git-pull.com/en/latest/cli.html#freeze-sessions +.. _Examples: http://tmuxp.git-pull.com/examples.html +.. _freezing tmux: http://tmuxp.git-pull.com/cli.html#freeze-sessions .. _bootstrap_env.py: https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py -.. _travis.yml: http://tmuxp.git-pull.com/en/latest/developing.html#travis-ci -.. _testing: http://tmuxp.git-pull.com/en/latest/developing.html#test-runner -.. _python objects: http://tmuxp.git-pull.com/en/latest/api.html#api +.. _travis.yml: http://tmuxp.git-pull.com/developing.html#travis-ci +.. _testing: http://tmuxp.git-pull.com/developing.html#test-runner +.. _python objects: http://tmuxp.git-pull.com/api.html#api .. _tmuxp.yaml: https://github.com/tmux-python/tmuxp/blob/master/.tmuxp.yaml -.. _simple: http://tmuxp.git-pull.com/en/latest/examples.html#short-hand-inline -.. _very elaborate: http://tmuxp.git-pull.com/en/latest/examples.html#super-advanced-dev-environment -.. _Quickstart: http://tmuxp.git-pull.com/en/latest/quickstart.html -.. _Commands: http://tmuxp.git-pull.com/en/latest/cli.html +.. _simple: http://tmuxp.git-pull.com/examples.html#short-hand-inline +.. _very elaborate: http://tmuxp.git-pull.com/examples.html#super-advanced-dev-environment +.. _Quickstart: http://tmuxp.git-pull.com/quickstart.html +.. _Commands: http://tmuxp.git-pull.com/cli.html .. _libtmux: https://github.com/tmux-python/libtmux .. _on the web: https://leanpub.com/the-tao-of-tmux/read @@ -166,7 +166,7 @@ Project details - License: `MIT`_. .. _MIT: http://opensource.org/licenses/MIT -.. _developing and testing: http://tmuxp.git-pull.com/en/latest/developing.html +.. _developing and testing: http://tmuxp.git-pull.com/developing.html .. _Amazon Kindle: http://amzn.to/2gPfRhC .. |pypi| image:: https://img.shields.io/pypi/v/tmuxp.svg diff --git a/docs/conf.py b/docs/conf.py index 3ad371f510..f28e06db0c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -138,7 +138,7 @@ def setup(app): intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'libtmux': ('https://libtmux.readthedocs.io/en/latest', None), + 'libtmux': ('https://libtmux.readthedocs.io', None), 'click': ('http://click.pocoo.org/5', None), } diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 380c8edae1..b10753f43d 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -98,7 +98,7 @@ python abstraction layer :meth:`libtmux.Pane.send_keys` ``$ tmux send-keys`` ======================================== ================================= -.. _Import: http://tmuxp.readthedocs.io/en/latest/cli.html#import +.. _Import: http://tmuxp.readthedocs.io/cli.html#import .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil .. _Abstraction Layer: http://en.wikipedia.org/wiki/Abstraction_layer diff --git a/tmuxp/cli.py b/tmuxp/cli.py index f724a765af..18772d1a9d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -606,7 +606,7 @@ def cli(log_level): Pass the "--help" argument to any command to see detailed help. See detailed documentation and examples at: - http://tmuxp.readthedocs.io/en/latest/""" + http://tmuxp.readthedocs.io/""" try: has_minimum_version() except TmuxCommandNotFound: @@ -735,7 +735,7 @@ def command_freeze(session_name, socket_name, socket_path): else: print( 'tmuxp has examples in JSON and YAML format at ' - '\n' + '\n' 'View tmuxp docs at .' ) sys.exit() @@ -866,7 +866,7 @@ def import_config(configfile, importfunc): else: click.echo( 'tmuxp has examples in JSON and YAML format at ' - '\n' + '\n' 'View tmuxp docs at ' ) sys.exit() From ae7fc266e0aa260e1833b54461e54d8146701a1b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:25:40 -0500 Subject: [PATCH 0568/2998] build(docs): Use new libtmux site --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index f28e06db0c..65f4b5b9fc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -138,7 +138,7 @@ def setup(app): intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'libtmux': ('https://libtmux.readthedocs.io', None), + 'libtmux': ('https://libtmux.git-pull.com/', None), 'click': ('http://click.pocoo.org/5', None), } From ef9f2876e7ebfff5ee88d09f95bfe307aefe8e5f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:39:57 -0500 Subject: [PATCH 0569/2998] docs(CHANGES): Update for this PRs changes --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index 768523c601..babc6a3afa 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,14 @@ Changelog Here you can find the recent changes to tmuxp +current +------- +- :issue:`623` Move docs from RTD to self-serve site +- :issue:`623` Modernize Makefiles +- :issue:`623` New development docs +- :issue:`623` Update pyproject.toml to experiment with poetry packaging +- :issue:`619` isort 5 + tmuxp 1.5.5 (2020-07-26) ------------------------ - :issue:`616` (via: :issue:`599`) New command: ``tmuxp ls`` From 74ef7938d333fef5e03e0477502b4d1532750286 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:40:18 -0500 Subject: [PATCH 0570/2998] docs: Update tmuxp doc links to mention tmuxp.git-pull.com --- docs/quickstart.rst | 2 +- tmuxp/cli.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index b10753f43d..aebac4812f 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -98,7 +98,7 @@ python abstraction layer :meth:`libtmux.Pane.send_keys` ``$ tmux send-keys`` ======================================== ================================= -.. _Import: http://tmuxp.readthedocs.io/cli.html#import +.. _Import: http://tmuxp.git-pull.com/cli.html#import .. _tmuxinator: https://github.com/aziz/tmuxinator .. _teamocil: https://github.com/remiprev/teamocil .. _Abstraction Layer: http://en.wikipedia.org/wiki/Abstraction_layer diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 18772d1a9d..3537449356 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -606,7 +606,7 @@ def cli(log_level): Pass the "--help" argument to any command to see detailed help. See detailed documentation and examples at: - http://tmuxp.readthedocs.io/""" + http://tmuxp.git-pull.com/""" try: has_minimum_version() except TmuxCommandNotFound: @@ -735,8 +735,8 @@ def command_freeze(session_name, socket_name, socket_path): else: print( 'tmuxp has examples in JSON and YAML format at ' - '\n' - 'View tmuxp docs at .' + '\n' + 'View tmuxp docs at .' ) sys.exit() @@ -866,8 +866,8 @@ def import_config(configfile, importfunc): else: click.echo( 'tmuxp has examples in JSON and YAML format at ' - '\n' - 'View tmuxp docs at ' + '\n' + 'View tmuxp docs at ' ) sys.exit() From 173188a52e27ea19f0416a9e8e65fe467598bf85 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 20:59:42 -0500 Subject: [PATCH 0571/2998] docs: Fix metadata --- docs/_templates/layout.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index 19a94fe470..2943238cf7 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -33,10 +33,10 @@ - + - + From 8a6e38d50412b37908b046d19f50801e8a9179e6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 11 Aug 2020 05:23:01 -0500 Subject: [PATCH 0572/2998] build: Fix .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d103c98ef8..cfc23d45dd 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover +*.cover .hypothesis/ .pytest_cache/ From 94f1e1725751abda20602c68fcc3fc47f8ed5253 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Aug 2020 10:13:20 -0500 Subject: [PATCH 0573/2998] build: Update poetry lockfile --- poetry.lock | 87 +++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8ce732469b..69ba5a5192 100644 --- a/poetry.lock +++ b/poetry.lock @@ -132,7 +132,7 @@ marker = "sys_platform == \"linux\"" name = "cffi" optional = false python-versions = "*" -version = "1.14.1" +version = "1.14.2" [package.dependencies] pycparser = "*" @@ -205,7 +205,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3\"" +marker = "python_version < \"3.4\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -414,7 +414,7 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.3.2" +version = "5.4.2" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -486,7 +486,7 @@ description = "scripting library / orm for tmux" name = "libtmux" optional = false python-versions = "*" -version = "0.8.2" +version = "0.8.3" [[package]] category = "dev" @@ -795,7 +795,7 @@ marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.10.0" +version = "2.10.1" [package.dependencies] coverage = ">=4.4" @@ -1043,7 +1043,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.2.0" +version = "3.2.1" [package.dependencies] Jinja2 = ">=2.3" @@ -1293,7 +1293,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1311,7 +1311,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1380,34 +1380,34 @@ certifi = [ {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ] cffi = [ - {file = "cffi-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:66dd45eb9530e3dde8f7c009f84568bc7cac489b93d04ac86e3111fb46e470c2"}, - {file = "cffi-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:4f53e4128c81ca3212ff4cf097c797ab44646a40b42ec02a891155cd7a2ba4d8"}, - {file = "cffi-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:833401b15de1bb92791d7b6fb353d4af60dc688eaa521bd97203dcd2d124a7c1"}, - {file = "cffi-1.14.1-cp27-cp27m-win32.whl", hash = "sha256:26f33e8f6a70c255767e3c3f957ccafc7f1f706b966e110b855bfe944511f1f9"}, - {file = "cffi-1.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:b87dfa9f10a470eee7f24234a37d1d5f51e5f5fa9eeffda7c282e2b8f5162eb1"}, - {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:effd2ba52cee4ceff1a77f20d2a9f9bf8d50353c854a282b8760ac15b9833168"}, - {file = "cffi-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bac0d6f7728a9cc3c1e06d4fcbac12aaa70e9379b3025b27ec1226f0e2d404cf"}, - {file = "cffi-1.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d6033b4ffa34ef70f0b8086fd4c3df4bf801fee485a8a7d4519399818351aa8e"}, - {file = "cffi-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8416ed88ddc057bab0526d4e4e9f3660f614ac2394b5e019a628cdfff3733849"}, - {file = "cffi-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:892daa86384994fdf4856cb43c93f40cbe80f7f95bb5da94971b39c7f54b3a9c"}, - {file = "cffi-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:c991112622baee0ae4d55c008380c32ecfd0ad417bcd0417ba432e6ba7328caa"}, - {file = "cffi-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fcf32bf76dc25e30ed793145a57426064520890d7c02866eb93d3e4abe516948"}, - {file = "cffi-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f960375e9823ae6a07072ff7f8a85954e5a6434f97869f50d0e41649a1c8144f"}, - {file = "cffi-1.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a6d28e7f14ecf3b2ad67c4f106841218c8ab12a0683b1528534a6c87d2307af3"}, - {file = "cffi-1.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cda422d54ee7905bfc53ee6915ab68fe7b230cacf581110df4272ee10462aadc"}, - {file = "cffi-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:4a03416915b82b81af5502459a8a9dd62a3c299b295dcdf470877cb948d655f2"}, - {file = "cffi-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:4ce1e995aeecf7cc32380bc11598bfdfa017d592259d5da00fc7ded11e61d022"}, - {file = "cffi-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e23cb7f1d8e0f93addf0cae3c5b6f00324cccb4a7949ee558d7b6ca973ab8ae9"}, - {file = "cffi-1.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ddff0b2bd7edcc8c82d1adde6dbbf5e60d57ce985402541cd2985c27f7bec2a0"}, - {file = "cffi-1.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f90c2267101010de42f7273c94a1f026e56cbc043f9330acd8a80e64300aba33"}, - {file = "cffi-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:3cd2c044517f38d1b577f05927fb9729d3396f1d44d0c659a445599e79519792"}, - {file = "cffi-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fa72a52a906425416f41738728268072d5acfd48cbe7796af07a923236bcf96"}, - {file = "cffi-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc"}, - {file = "cffi-1.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939"}, - {file = "cffi-1.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe"}, - {file = "cffi-1.14.1-cp38-cp38-win32.whl", hash = "sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995"}, - {file = "cffi-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90"}, - {file = "cffi-1.14.1.tar.gz", hash = "sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f"}, + {file = "cffi-1.14.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82"}, + {file = "cffi-1.14.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4"}, + {file = "cffi-1.14.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e"}, + {file = "cffi-1.14.2-cp27-cp27m-win32.whl", hash = "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c"}, + {file = "cffi-1.14.2-cp27-cp27m-win_amd64.whl", hash = "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1"}, + {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7"}, + {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c"}, + {file = "cffi-1.14.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731"}, + {file = "cffi-1.14.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0"}, + {file = "cffi-1.14.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e"}, + {file = "cffi-1.14.2-cp35-cp35m-win32.whl", hash = "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487"}, + {file = "cffi-1.14.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad"}, + {file = "cffi-1.14.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2"}, + {file = "cffi-1.14.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123"}, + {file = "cffi-1.14.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1"}, + {file = "cffi-1.14.2-cp36-cp36m-win32.whl", hash = "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281"}, + {file = "cffi-1.14.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4"}, + {file = "cffi-1.14.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798"}, + {file = "cffi-1.14.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4"}, + {file = "cffi-1.14.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f"}, + {file = "cffi-1.14.2-cp37-cp37m-win32.whl", hash = "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650"}, + {file = "cffi-1.14.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15"}, + {file = "cffi-1.14.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa"}, + {file = "cffi-1.14.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c"}, + {file = "cffi-1.14.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75"}, + {file = "cffi-1.14.2-cp38-cp38-win32.whl", hash = "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e"}, + {file = "cffi-1.14.2-cp38-cp38-win_amd64.whl", hash = "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c"}, + {file = "cffi-1.14.2.tar.gz", hash = "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, @@ -1542,8 +1542,8 @@ iniconfig = [ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.3.2-py3-none-any.whl", hash = "sha256:5196bd2f5b23dc91215734b1c96c6d28390061d69860a948094c12635d6d64e6"}, - {file = "isort-5.3.2.tar.gz", hash = "sha256:ba83762132a8661d3525f87a86549712fb7d8da79eeb452e01f327ada9e87920"}, + {file = "isort-5.4.2-py3-none-any.whl", hash = "sha256:60a1b97e33f61243d12647aaaa3e6cc6778f5eb9f42997650f1cc975b6008750"}, + {file = "isort-5.4.2.tar.gz", hash = "sha256:d488ba1c5a2db721669cc180180d5acf84ebdc5af7827f7aaeaa75f73cf0e2b8"}, ] jeepney = [ {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, @@ -1561,7 +1561,8 @@ keyring = [ {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, ] libtmux = [ - {file = "libtmux-0.8.2.tar.gz", hash = "sha256:2acd86617203bc966b125d016526fb40503411a2281b55d9d970a487dc6e065a"}, + {file = "libtmux-0.8.3-py2.py3-none-any.whl", hash = "sha256:b628121f6db98e34837f78e06aa4388c1a0c53518b2336f437b023bd95798c09"}, + {file = "libtmux-0.8.3.tar.gz", hash = "sha256:a4c7379604ccdc684aa865723211184709f9a2b45511772989b5f26ad156650e"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1728,8 +1729,8 @@ pytest = [ pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"}, - {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, - {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, + {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, + {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, ] pytest-mock = [ {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, @@ -1835,8 +1836,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.2.0-py3-none-any.whl", hash = "sha256:f7db5b76c42c8b5ef31853c2de7178ef378b985d7793829ec071e120dac1d0ca"}, - {file = "Sphinx-3.2.0.tar.gz", hash = "sha256:cf2d5bc3c6c930ab0a1fbef3ad8a82994b1bf4ae923f8098a05c7e5516f07177"}, + {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"}, + {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, From 8934ab8166f90611815873c67d67626ce768dd64 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Aug 2020 10:14:16 -0500 Subject: [PATCH 0574/2998] ci: Remove travis --- .travis.yml | 65 ----------------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b535b4f812..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,65 +0,0 @@ -language: python -sudo: false -dist: bionic # 18.04 -python: - - 2.7 - - 3.7 - - pypy3 -if: (type = push AND branch IN (master)) OR (type = pull_request) -env: - global: - - RETRY_TIMEOUT_SECONDS=15 - matrix: - - TMUX_VERSION=master - - TMUX_VERSION=3.0a - - TMUX_VERSION=2.9 - - TMUX_VERSION=2.8 - - TMUX_VERSION=2.8 - - TMUX_VERSION=2.7 - - TMUX_VERSION=2.6 - - TMUX_VERSION=2.5 - - TMUX_VERSION=2.4 - - TMUX_VERSION=2.3 - - TMUX_VERSION=2.2 - - TMUX_VERSION=2.1 - - TMUX_VERSION=2.0 - - TMUX_VERSION=1.9a - - TMUX_VERSION=1.8 -matrix: - finish_fast: true - allow_failures: - - env: TMUX_VERSION=master - - python: pypy3 -cache: - - pip - - apt - - directories: - - ~/source - - ~/build -before_install: - - pip install poetry - - poetry --version - - poetry version -install: - - poetry install -v -before_script: - - mkdir -p ~/source - - mkdir -p ~/build/tmux-$TMUX_VERSION - - if [[ ! -d ~/source/tmux-$TMUX_VERSION ]]; then git clone https://github.com/tmux/tmux.git ~/source/tmux-$TMUX_VERSION; fi - - cd ~/source/tmux-$TMUX_VERSION - - git checkout $TMUX_VERSION - - export PATH=$HOME/build/tmux-$TMUX_VERSION/bin:$PATH - - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then sh autogen.sh; fi - - if [[ $TMUX_VERSION == "master" || ! $(tmux -V | grep $TMUX_VERSION) ]]; then ./configure --prefix=$HOME/build/tmux-$TMUX_VERSION && make && make install; fi - - cd $TRAVIS_BUILD_DIR - - tmux -V -script: - - poetry run py.test --cov - - make flake8 -addons: - apt: - packages: - - libevent-dev - - libncurses-dev -after_success: - - codecov From cb3c504429276b820800368bc9bd93869a5f20d8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Aug 2020 10:13:52 -0500 Subject: [PATCH 0575/2998] build: Add gh action for testing (ported via libtmux) --- .github/workflows/tests.yml | 100 ++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..b077c871e2 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,100 @@ +name: tests + +on: [push, pull_request] + +jobs: + build: + # Don't run twice for internal PRs from our own repo + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '2.7', '3.x' ] + tmux-version: [ '2.6', '2.7', '2.8', '3.0', 'master' ] + steps: + - uses: actions/checkout@v1 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + + - name: Install poetry + run: | + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + rm get-poetry.py + + - name: Get poetry cache paths from config + run: | + echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') + echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + + - name: Configure poetry + shell: bash + run: poetry config virtualenvs.in-project true + + - name: Set up poetry cache + uses: actions/cache@v2 + id: cache + with: + path: | + .venv + {{ env.poetry_cache_dir }} + {{ env.poetry_virtualenvs_path }} + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + shell: bash + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + + - name: Setup tmux build cache for tmux ${{ matrix.tmux-version }} + id: tmux-build-cache + uses: actions/cache@v1 + with: + path: ~/tmux-builds/tmux-${{ matrix.tmux-version }} + key: tmux-${{ matrix.tmux-version }} + + - name: Build tmux ${{ matrix.tmux-version }} + if: steps.tmux-build-cache.outputs.cache-hit != 'true' + run: | + sudo apt install libevent-dev libncurses5-dev libtinfo-dev libutempter-dev bison + mkdir ~/tmux-builds + mkdir ~/tmux-src + git clone https://github.com/tmux/tmux.git ~/tmux-src/tmux-${{ matrix.tmux-version }} + cd ~/tmux-src/tmux-${{ matrix.tmux-version }} + git checkout ${{ matrix.tmux-version }} + sh autogen.sh + ./configure --prefix=$HOME/tmux-builds/tmux-${{ matrix.tmux-version }} && make && make install + export PATH=$HOME/tmux-builds/tmux-${{ matrix.tmux-version }}/bin:$PATH + cd ~ + tmux -V + + - name: Upgrade pip + shell: bash + run: poetry run python -m pip install pip -U + + - name: Install python dependencies + run: | + poetry install -E "test coverage lint" + - name: Lint with flake8 + run: | + poetry run flake8 + - name: Test with pytest + continue-on-error: ${{ matrix.tmux-version == 'master' }} + run: | + export PATH=$HOME/tmux-builds/tmux-${{ matrix.tmux-version }}/bin:$PATH + ls $HOME/tmux-builds/tmux-${{ matrix.tmux-version }}/bin + tmux -V + poetry run py.test --cov=./ --cov-report=xml + - uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} From bdb21544fce0f59efe6746c07943d3768440c531 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Aug 2020 10:40:13 -0500 Subject: [PATCH 0576/2998] docs(CHANGES): Update --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index babc6a3afa..d91236054b 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,8 @@ current - :issue:`623` Move docs from RTD to self-serve site - :issue:`623` Modernize Makefiles - :issue:`623` New development docs +- :issue:`623` Move doc -> docs +- :issue:`623` Move tests to GitHub Actions - :issue:`623` Update pyproject.toml to experiment with poetry packaging - :issue:`619` isort 5 From 19629dd6789d3f37979697994e519153cb719541 Mon Sep 17 00:00:00 2001 From: Roberto Solares Date: Tue, 21 Jul 2020 10:37:50 -0600 Subject: [PATCH 0577/2998] Add flag to overwrite config files on freeze --- tmuxp/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3537449356..0af95f25fd 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -659,7 +659,8 @@ def startup(config_dir): @click.argument('session_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') -def command_freeze(session_name, socket_name, socket_path): +@click.option('--force', 'force', help='overwrite the config file', is_flag=True) +def command_freeze(session_name, socket_name, socket_path, force): """Snapshot a session into a config. If SESSION_NAME is provided, snapshot that session. Otherwise, use the @@ -716,7 +717,7 @@ def command_freeze(session_name, socket_name, socket_path): dest_prompt = click.prompt( 'Save to: %s' % save_to, value_proc=get_abs_path, default=save_to ) - if os.path.exists(dest_prompt): + if not force and os.path.exists(dest_prompt): print('%s exists. Pick a new filename.' % dest_prompt) continue From 551ed7794ea15d2d49f368352281dcaaf0cd2978 Mon Sep 17 00:00:00 2001 From: Roberto Solares Date: Thu, 30 Jul 2020 17:05:12 -0600 Subject: [PATCH 0578/2998] Add freeze overwrite test --- tests/test_cli.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index 1d5882fe5c..f688fcaf0f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -491,6 +491,14 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): ['\n', 'y\n', './la.yaml\n', 'y\n'], ), (['freeze'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists + ( # Create a new one + ['freeze', 'mysession', '--force'], + ['\n', 'y\n', './la.yaml\n', 'y\n'] + ), + ( # Imply current session if not entered + ['freeze', '--force'], + ['\n', 'y\n', './la.yaml\n', 'y\n'], + ), ], ) def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): @@ -508,6 +516,34 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): assert tmpdir.join('la.yaml').check() +@pytest.mark.parametrize( + "cli_args,inputs", + [ + ( # Overwrite + ['freeze', 'mysession', '--force'], + ['\n', 'y\n', './exists.yaml\n', 'y\n'], + ), + ( # Imply current session if not entered + ['freeze', '--force'], + ['\n', 'y\n', './exists.yaml\n', 'y\n'] + ), + ], +) +def test_freeze_overwrite(server, cli_args, inputs, tmpdir, monkeypatch): + monkeypatch.setenv('HOME', str(tmpdir)) + tmpdir.join('exists.yaml').ensure() + + server.new_session(session_name='mysession') + + with tmpdir.as_cwd(): + runner = CliRunner() + # Use tmux server (socket name) used in the test + cli_args = cli_args + ['-L', server.socket_name] + out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + print(out.output) + assert tmpdir.join('exists.yaml').check() + + def test_get_abs_path(tmpdir): expect = str(tmpdir) with tmpdir.as_cwd(): From c9c29109bffc3872f29d59c803d777961c709a1b Mon Sep 17 00:00:00 2001 From: aRkedos Date: Mon, 17 Aug 2020 18:36:58 +0200 Subject: [PATCH 0579/2998] rebase to sync up with current upstream master --- tmuxp/cli.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3537449356..7a68361e6c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -898,12 +898,14 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') +@click.option('--yes', '-y', 'confirmed', help='Auto confirms with "yes".', + is_flag=True) @click.argument('config', type=ConfigPath(exists=True), nargs=1) -def command_convert(config): +def command_convert(confirmed, config): """Convert a tmuxp config between JSON and YAML.""" _, ext = os.path.splitext(config) - if 'json' in ext: + if 'json' in ext and not confirmed: if click.confirm('convert to <%s> to yaml?' % config): configparser = kaptan.Kaptan() configparser.import_config(config) @@ -914,7 +916,7 @@ def command_convert(config): buf.write(newconfig) buf.close() print('New config saved to %s' % newfile) - elif 'yaml' in ext: + elif 'yaml' in ext and not confirmed: if click.confirm('convert to <%s> to json?' % config): configparser = kaptan.Kaptan() configparser.import_config(config) @@ -926,6 +928,24 @@ def command_convert(config): buf.write(newconfig) buf.close() print('New config saved to <%s>.' % newfile) + elif 'json' in ext and confirmed: + configparser = kaptan.Kaptan() + configparser.import_config(config) + newfile = config.replace(ext, '.yaml') + newconfig = configparser.export('yaml', indent=2, default_flow_style=False) + buf = open(newfile, 'w') + buf.write(newconfig) + buf.close() + print('New config saved to <%s>.' % newfile) + elif 'yaml' in ext and confirmed: + configparser = kaptan.Kaptan() + configparser.import_config(config) + newfile = config.replace(ext, '.json') + newconfig = configparser.export('json', indent=2) + buf = open(newfile, 'w') + buf.write(newconfig) + buf.close() + print('New config saved to <%s>.' % newfile) @cli.command( From e239b62b416bfea01d377237feb49e2352b57a7a Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 22 Aug 2020 16:24:04 -0700 Subject: [PATCH 0580/2998] Adding session name option --- README.rst | 6 ++++++ docs/cli.rst | 7 +++++++ tests/test_cli.py | 19 +++++++++++++++++++ tmuxp/cli.py | 21 +++++++++++++++++++-- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 55391e4da3..d209e18e5f 100644 --- a/README.rst +++ b/README.rst @@ -57,6 +57,12 @@ Load multiple at once (in bg, offer to attach last): $ tmuxp load mysession ./another/project/ +Name a session: + +.. code-block:: bash + + $ tmxup load -n session-name ./mysession.yaml + `simple`_ and `very elaborate`_ config examples User-level configurations diff --git a/docs/cli.rst b/docs/cli.rst index 9fc5ba7b07..ad9dc63c1c 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -84,6 +84,13 @@ without being attached. The last one will be attached if there is no $ tmuxp load ... +A session name can be provided at the terminal. If multiple sessions +are created, the last session is named from the terminal. + +.. code-block:: bash + + $ tmxup load -n ... + .. _cli_import: Import diff --git a/tests/test_cli.py b/tests/test_cli.py index 1d5882fe5c..bfa68e16bd 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -282,6 +282,25 @@ def test_load_workspace(server, monkeypatch): assert session.name == 'sampleconfig' +def test_load_workspace_named_session(server, monkeypatch): + # this is an implementation test. Since this testsuite may be ran within + # a tmux session by the developer himself, delete the TMUX variable + # temporarily. + monkeypatch.delenv('TMUX', raising=False) + session_file = curjoin("workspacebuilder/two_pane.yaml") + + # open it detached + session = load_workspace( + session_file, + socket_name=server.socket_name, + new_session_name='tmuxp-new', + detached=True + ) + + assert isinstance(session, libtmux.Session) + assert session.name == 'tmuxp-new' + + @pytest.mark.skipif( has_lt_version('2.1'), reason='exact session name matches only tmux >= 2.1' ) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3537449356..337f7dce04 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -399,6 +399,7 @@ def load_workspace( config_file, socket_name=None, socket_path=None, + new_session_name=None, colors=None, detached=False, answer_yes=False, @@ -414,6 +415,8 @@ def load_workspace( ``tmux -L `` socket_path: str, optional ``tmux -S `` + new_session_name: str, options + ``tmux new -t `` colors : str, optional '-2' Force tmux to support 256 colors @@ -498,6 +501,9 @@ def load_workspace( sconfig = sconfig.import_config(config_file).get() # shapes configurations relative to config / profile file location sconfig = config.expand(sconfig, os.path.dirname(config_file)) + # Overwrite session name + if new_session_name: + sconfig['session_name'] = new_session_name # propagate config inheritance (e.g. session -> window, window -> pane) sconfig = config.trickle(sconfig) @@ -746,6 +752,7 @@ def command_freeze(session_name, socket_name, socket_path): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') +@click.option('-n', 'new_session_name', help='name of the new session') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( '-d', 'detached', help='Load the session without attaching it', is_flag=True @@ -763,7 +770,16 @@ def command_freeze(session_name, socket_name, socket_path): flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) -def command_load(ctx, config, socket_name, socket_path, answer_yes, detached, colors): +def command_load( + ctx, + config, + socket_name, + socket_path, + new_session_name, + answer_yes, + detached, + colors, +): """Load a tmux workspace from each CONFIG. CONFIG is a specifier for a configuration file. @@ -791,6 +807,7 @@ def command_load(ctx, config, socket_name, socket_path, answer_yes, detached, co tmux_options = { 'socket_name': socket_name, 'socket_path': socket_path, + 'new_session_name': new_session_name, 'answer_yes': answer_yes, 'colors': colors, 'detached': detached, @@ -809,7 +826,7 @@ def command_load(ctx, config, socket_name, socket_path, answer_yes, detached, co # Load each configuration but the last to the background for cfg in config[:-1]: opt = tmux_options.copy() - opt.update({'detached': True}) + opt.update({'detached': True, 'new_session_name': None}) load_workspace(cfg, **opt) # todo: obey the -d in the cli args only if user specifies From 60acdcec0b00f6bc5dd2c8e4df523399fa0d2e5b Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 22 Aug 2020 17:01:11 -0700 Subject: [PATCH 0581/2998] ran flake8 to pick up a comma --- tests/test_cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index bfa68e16bd..f1c921f3ae 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -291,10 +291,10 @@ def test_load_workspace_named_session(server, monkeypatch): # open it detached session = load_workspace( - session_file, - socket_name=server.socket_name, - new_session_name='tmuxp-new', - detached=True + session_file, + socket_name=server.socket_name, + new_session_name='tmuxp-new', + detached=True, ) assert isinstance(session, libtmux.Session) From d2813e832d75400c9df54ff4257cd8c997233075 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 12 Sep 2020 11:56:35 -0700 Subject: [PATCH 0582/2998] changed the -n to -s for overloading the session name to reuse a tmuxp config file for multiple sessions --- README.rst | 2 +- docs/cli.rst | 2 +- tmuxp/cli.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index d209e18e5f..9e3139397f 100644 --- a/README.rst +++ b/README.rst @@ -61,7 +61,7 @@ Name a session: .. code-block:: bash - $ tmxup load -n session-name ./mysession.yaml + $ tmxup load -s session-name ./mysession.yaml `simple`_ and `very elaborate`_ config examples diff --git a/docs/cli.rst b/docs/cli.rst index ad9dc63c1c..8739cae850 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -89,7 +89,7 @@ are created, the last session is named from the terminal. .. code-block:: bash - $ tmxup load -n ... + $ tmxup load -s ... .. _cli_import: diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 337f7dce04..e33e7bec0a 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -416,7 +416,7 @@ def load_workspace( socket_path: str, optional ``tmux -S `` new_session_name: str, options - ``tmux new -t `` + ``tmux new -s `` colors : str, optional '-2' Force tmux to support 256 colors @@ -752,7 +752,7 @@ def command_freeze(session_name, socket_name, socket_path): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') -@click.option('-n', 'new_session_name', help='name of the new session') +@click.option('-s', 'new_session_name', help='start new session with new session name') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( '-d', 'detached', help='Load the session without attaching it', is_flag=True From c515c797757ae5eff14eee82e740a8d95550e389 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 12 Sep 2020 12:20:04 -0700 Subject: [PATCH 0583/2998] Updated docs to reflect underscores instead of dashes to match other documentation --- README.rst | 2 +- docs/cli.rst | 2 +- tmuxp/cli.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 9e3139397f..48995015ec 100644 --- a/README.rst +++ b/README.rst @@ -61,7 +61,7 @@ Name a session: .. code-block:: bash - $ tmxup load -s session-name ./mysession.yaml + $ tmxup load -s session_name ./mysession.yaml `simple`_ and `very elaborate`_ config examples diff --git a/docs/cli.rst b/docs/cli.rst index 8739cae850..ecad270da8 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -89,7 +89,7 @@ are created, the last session is named from the terminal. .. code-block:: bash - $ tmxup load -s ... + $ tmxup load -s ... .. _cli_import: diff --git a/tmuxp/cli.py b/tmuxp/cli.py index e33e7bec0a..ecbdeae243 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -416,7 +416,7 @@ def load_workspace( socket_path: str, optional ``tmux -S `` new_session_name: str, options - ``tmux new -s `` + ``tmux new -s `` colors : str, optional '-2' Force tmux to support 256 colors From 64d5b704b41776dd5b5b101ee4c69691e775dd4b Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 13 Sep 2020 14:40:37 -0700 Subject: [PATCH 0584/2998] Updating the change log and the versioning documentation --- CHANGES | 10 ++++++++-- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index d91236054b..6f07233679 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,14 @@ Changelog Here you can find the recent changes to tmuxp -current -------- +tmuxp 1.5.7 (2020-09-13) +------------------------ +- :issue:`590` Add new session name option to cli +- :issue:`590` Add test for new session name option +- :issue:`590` Updata docs for new session name option + +tmuxp 1.5.6 (2020-08-16) +------------------------ - :issue:`623` Move docs from RTD to self-serve site - :issue:`623` Modernize Makefiles - :issue:`623` New development docs diff --git a/pyproject.toml b/pyproject.toml index fbddb8d07f..d3a09729cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.5" +version = "1.5.7" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 60528c0e71..962811f3a1 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.5' +__version__ = '1.5.7' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 672bacfbcc1976debbf0c4cb73d3bc6a595f4abe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Sep 2020 07:47:52 -0500 Subject: [PATCH 0585/2998] Test convert -y --- tests/test_cli.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 1d5882fe5c..a206040635 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -387,7 +387,14 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output -@pytest.mark.parametrize("cli_args", [(['convert', '.']), (['convert', '.tmuxp.yaml'])]) +@pytest.mark.parametrize( + "cli_args", + [ + (['convert', '.']), + (['convert', '.tmuxp.yaml']), + (['convert', '.tmuxp.yaml', '-y']), + ], +) def test_convert(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at tmpdir.join('.tmuxp.yaml').write( @@ -401,7 +408,10 @@ def test_convert(cli_args, tmpdir, monkeypatch): with tmpdir.as_cwd(): runner = CliRunner() - runner.invoke(cli.cli, cli_args, input='y\ny\n') + # If autoconfirm (-y) no need to prompt y + input_args = 'y\ny\n' if '-y' not in cli_args else '' + + runner.invoke(cli.cli, cli_args, input=input_args) assert tmpdir.join('.tmuxp.json').check() assert tmpdir.join('.tmuxp.json').open().read() == json.dumps( {'session_name': 'hello'}, indent=2 From 28bc3ffdd0f9cfc7805da990cd6009034c373e78 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Sep 2020 07:56:44 -0500 Subject: [PATCH 0586/2998] Simplify convert --- tmuxp/cli.py | 58 ++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7a68361e6c..31a8f3075f 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -898,50 +898,32 @@ def command_import_tmuxinator(configfile): @cli.command(name='convert') -@click.option('--yes', '-y', 'confirmed', help='Auto confirms with "yes".', - is_flag=True) +@click.option( + '--yes', '-y', 'confirmed', help='Auto confirms with "yes".', is_flag=True +) @click.argument('config', type=ConfigPath(exists=True), nargs=1) def command_convert(confirmed, config): """Convert a tmuxp config between JSON and YAML.""" _, ext = os.path.splitext(config) - if 'json' in ext and not confirmed: - if click.confirm('convert to <%s> to yaml?' % config): - configparser = kaptan.Kaptan() - configparser.import_config(config) - newfile = config.replace(ext, '.yaml') - newconfig = configparser.export('yaml', indent=2, default_flow_style=False) + if 'json' in ext: + to_filetype = 'yaml' + elif 'yaml' in ext: + to_filetype = 'json' + + configparser = kaptan.Kaptan() + configparser.import_config(config) + newfile = config.replace(ext, '.%s' % to_filetype) + + export_kwargs = {'default_flow_style': False} if to_filetype == 'yaml' else {} + newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) + + if not confirmed: + if click.confirm('convert to <%s> to %s?' % (config, to_filetype)): if click.confirm('Save config to %s?' % newfile): - buf = open(newfile, 'w') - buf.write(newconfig) - buf.close() - print('New config saved to %s' % newfile) - elif 'yaml' in ext and not confirmed: - if click.confirm('convert to <%s> to json?' % config): - configparser = kaptan.Kaptan() - configparser.import_config(config) - newfile = config.replace(ext, '.json') - newconfig = configparser.export('json', indent=2) - print(newconfig) - if click.confirm('Save config to <%s>?' % newfile): - buf = open(newfile, 'w') - buf.write(newconfig) - buf.close() - print('New config saved to <%s>.' % newfile) - elif 'json' in ext and confirmed: - configparser = kaptan.Kaptan() - configparser.import_config(config) - newfile = config.replace(ext, '.yaml') - newconfig = configparser.export('yaml', indent=2, default_flow_style=False) - buf = open(newfile, 'w') - buf.write(newconfig) - buf.close() - print('New config saved to <%s>.' % newfile) - elif 'yaml' in ext and confirmed: - configparser = kaptan.Kaptan() - configparser.import_config(config) - newfile = config.replace(ext, '.json') - newconfig = configparser.export('json', indent=2) + confirmed = True + + if confirmed: buf = open(newfile, 'w') buf.write(newconfig) buf.close() From aef8b8e79a593e7f8ed143e110f734e068de2631 Mon Sep 17 00:00:00 2001 From: aRkedos Date: Mon, 21 Sep 2020 18:13:32 +0200 Subject: [PATCH 0587/2998] documented changes in CHANGES and README file --- CHANGES | 1 + README.rst | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/CHANGES b/CHANGES index d91236054b..985fa2464d 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Here you can find the recent changes to tmuxp current ------- +- :issue:`589` added option for the the confirm command to auto-confirm the prompt. - :issue:`623` Move docs from RTD to self-serve site - :issue:`623` Modernize Makefiles - :issue:`623` New development docs diff --git a/README.rst b/README.rst index 55391e4da3..3829fe2b3a 100644 --- a/README.rst +++ b/README.rst @@ -105,6 +105,28 @@ Snapshot your tmux layout, pane paths, and window/session names. See more about `freezing tmux`_ sessions. + +Convert a session file +---------------------- + +Convert a session file from yaml to json and vice versa. + +.. code-block:: sh + + $ tmuxp convert filename + +This will prompt you for confirmation and shows you the new file that is going +to be written. + + +You can auto confirm the prompt. In this case no preview will be shown. + +.. code-block:: sh + + $ tmuxp convert -y filename + $ tmuxp convert --yes filename + + Docs / Reading material ----------------------- From 4e633f425a4589d7e96964d0f8d619088d6556eb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:11:48 -0500 Subject: [PATCH 0588/2998] Update CHANGES There is no 1.5.6 or 1.5.7 releases, so keep these in 1.5-current --- CHANGES | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 6f07233679..a23f12d6ec 100644 --- a/CHANGES +++ b/CHANGES @@ -4,14 +4,11 @@ Changelog Here you can find the recent changes to tmuxp -tmuxp 1.5.7 (2020-09-13) ------------------------- +tmuxp 1.5-current +----------------- - :issue:`590` Add new session name option to cli - :issue:`590` Add test for new session name option -- :issue:`590` Updata docs for new session name option - -tmuxp 1.5.6 (2020-08-16) ------------------------- +- :issue:`590` Update docs for new session name option - :issue:`623` Move docs from RTD to self-serve site - :issue:`623` Modernize Makefiles - :issue:`623` New development docs From 7db5972175655bc5e28371e9c72e683559067dd5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:41:53 -0500 Subject: [PATCH 0589/2998] Fix CHANGES issue and mention @joseph-flinn --- CHANGES | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index a23f12d6ec..14e32ff7c8 100644 --- a/CHANGES +++ b/CHANGES @@ -6,9 +6,9 @@ Here you can find the recent changes to tmuxp tmuxp 1.5-current ----------------- -- :issue:`590` Add new session name option to cli -- :issue:`590` Add test for new session name option -- :issue:`590` Update docs for new session name option +- :issue:`626` Add new session name option to cli. Thank you @joseph-flinn! +- :issue:`626` Add test for new session name option +- :issue:`626` Update docs for new session name option - :issue:`623` Move docs from RTD to self-serve site - :issue:`623` Modernize Makefiles - :issue:`623` New development docs From fd355f571e5d27732576e9df09b97305b2905d49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:47:49 -0500 Subject: [PATCH 0590/2998] Add credit for @aRkedos --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index deb4a391a4..5a5fa359db 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Here you can find the recent changes to tmuxp tmuxp 1.5-current ----------------- - :issue:`589` added option for the the confirm command to auto-confirm the prompt. + Thank you @aRkedos! - :issue:`626` Add new session name option to cli. Thank you @joseph-flinn! - :issue:`626` Add test for new session name option - :issue:`626` Update docs for new session name option From 5b635025495708fabd818c5dbbc08b6045ea7135 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:52:12 -0500 Subject: [PATCH 0591/2998] CHANGES: Update for #618 --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 5a5fa359db..aad024ffaf 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,8 @@ Here you can find the recent changes to tmuxp tmuxp 1.5-current ----------------- +- :issue:`618`: allow passing ``--overwrite`` to ``tmuxp freeze``. Thank you + @betoSolares! - :issue:`589` added option for the the confirm command to auto-confirm the prompt. Thank you @aRkedos! - :issue:`626` Add new session name option to cli. Thank you @joseph-flinn! From 06aa28878389bea8405ad9e3687e63f8d8c82502 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 07:54:30 -0500 Subject: [PATCH 0592/2998] Update black 19.10b0 to 20.08b1 --- poetry.lock | 92 ++++++++++++++++++++++++++++++++------------------ pyproject.toml | 2 +- 2 files changed, 61 insertions(+), 33 deletions(-) diff --git a/poetry.lock b/poetry.lock index 69ba5a5192..cddc79fb8c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,7 +46,6 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\" or python_version < \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -61,7 +60,6 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i [[package]] category = "dev" description = "Internationalization utilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -90,18 +88,24 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "black" optional = false python-versions = ">=3.6" -version = "19.10b0" +version = "20.8b1" [package.dependencies] appdirs = "*" -attrs = ">=18.1.0" -click = ">=6.5" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" pathspec = ">=0.6,<1" -regex = "*" -toml = ">=0.9.4" +regex = ">=2020.1.8" +toml = ">=0.10.1" typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.dependencies.dataclasses] +python = "<3.7" +version = ">=0.6" [package.extras] +colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] @@ -205,7 +209,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\"" +marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -243,6 +247,15 @@ pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] +[[package]] +category = "dev" +description = "A backport of the dataclasses module for Python 3.6" +marker = "python_version >= \"3.6\" and python_version < \"3.7\"" +name = "dataclasses" +optional = false +python-versions = ">=3.6, <3.7" +version = "0.7" + [[package]] category = "dev" description = "Docutils -- Python Documentation Utilities" @@ -340,7 +353,6 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -377,7 +389,6 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" -marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" @@ -436,7 +447,6 @@ dev = ["testpath"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -491,7 +501,6 @@ version = "0.8.3" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -541,12 +550,20 @@ six = ">=1.0.0,<2.0.0" [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" -marker = "python_version >= \"3\"" name = "more-itertools" optional = false python-versions = ">=3.5" version = "8.4.0" +[[package]] +category = "dev" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "mypy-extensions" +optional = false +python-versions = "*" +version = "0.4.3" + [[package]] category = "dev" description = "Core utilities for Python packages" @@ -578,7 +595,7 @@ version = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -628,7 +645,6 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -645,7 +661,6 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -695,7 +710,6 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -865,7 +879,6 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -1000,7 +1013,6 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -1088,7 +1100,6 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -1101,7 +1112,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -1114,7 +1124,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -1127,7 +1136,6 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" -marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -1139,7 +1147,6 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -1152,7 +1159,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -1177,7 +1183,6 @@ test = ["pytest", "mock"] [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false python-versions = "*" @@ -1255,6 +1260,15 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "3.7.4.3" +[[package]] +category = "dev" +description = "Backported and Experimental Type Hints for Python 3.5+" +marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +name = "typing-extensions" +optional = false +python-versions = "*" +version = "3.7.4.3" + [[package]] category = "dev" description = "HTTP library with thread-safe connection pooling, file post, and more." @@ -1293,7 +1307,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1311,7 +1325,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\") or python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1330,7 +1344,7 @@ lint = [] test = [] [metadata] -content-hash = "55071e1712036e5feedbdbbd08b46a2ff50bd9691fb9bf1ef2ae44386833ec91" +content-hash = "77432007847ff3d4dfb7b62412e8db50dfd30076ba6bb1e019851c7b0502e7ed" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1368,8 +1382,7 @@ babel = [ {file = "backports.functools_lru_cache-1.6.1.tar.gz", hash = "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"}, ] black = [ - {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, - {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] bleach = [ {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, @@ -1495,6 +1508,10 @@ cryptography = [ {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, ] +dataclasses = [ + {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, + {file = "dataclasses-0.7.tar.gz", hash = "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6"}, +] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, @@ -1614,6 +1631,10 @@ more-itertools = [ {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1683,6 +1704,8 @@ pillow = [ {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"}, + {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, ] @@ -1912,6 +1935,11 @@ typing = [ {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] urllib3 = [ {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, diff --git a/pyproject.toml b/pyproject.toml index d3a09729cf..c636739c59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,7 +79,7 @@ pytest-cov = [ ] ### Format ### -black = {version="==19.10b0", python="^3.6"} +black = {version="==20.08b1", python="^3.6"} isort = [ {version="<5", python="<3.6"}, {version="*", python=">=3.6"} From b7520277dffd1479a905f46bed2fee7a4497db43 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 07:54:51 -0500 Subject: [PATCH 0593/2998] Format with black 19.10b0 --- tmuxp/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 48045d361e..eddcb95eb0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -37,9 +37,9 @@ def get_config_dir(): """ Return tmuxp configuration directory. - ``TMUXP_CONFIGDIR`` environmental variable has precedence if set. We also - evaluate XDG default directory from XDG_CONFIG_HOME environmental variable - if set or its default. Then the old default ~/.tmuxp is returned for + ``TMUXP_CONFIGDIR`` environmental variable has precedence if set. We also + evaluate XDG default directory from XDG_CONFIG_HOME environmental variable + if set or its default. Then the old default ~/.tmuxp is returned for compatibility. Returns From 91c69c90c698026e0f0fc9e133c7eea3a90f577c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:58:04 -0500 Subject: [PATCH 0594/2998] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index aad024ffaf..810152442b 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ tmuxp 1.5-current - :issue:`623` Move tests to GitHub Actions - :issue:`623` Update pyproject.toml to experiment with poetry packaging - :issue:`619` isort 5 +- :issue:`629` Update black from 19.10b0 to 20.08b1 tmuxp 1.5.5 (2020-07-26) ------------------------ From 3b18168720a147faeebea7a1d30a760074cb4b4d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 09:59:55 -0500 Subject: [PATCH 0595/2998] Tag v1.5.6 --- CHANGES | 4 ++-- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 810152442b..734f0bd754 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Changelog Here you can find the recent changes to tmuxp -tmuxp 1.5-current ------------------ +tmuxp 1.5.6 (2020-10-12) +------------------------ - :issue:`618`: allow passing ``--overwrite`` to ``tmuxp freeze``. Thank you @betoSolares! - :issue:`589` added option for the the confirm command to auto-confirm the prompt. diff --git a/pyproject.toml b/pyproject.toml index c636739c59..0d43bcb633 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.7" +version = "1.5.6" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 962811f3a1..1f1ccc8e2f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.7' +__version__ = '1.5.6' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 9b7d2a664a20b606ae82a38eb1b0eb276af39900 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 12 Oct 2020 10:01:37 -0500 Subject: [PATCH 0596/2998] Update CHANGES for next release --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 734f0bd754..bdbd94d090 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changelog Here you can find the recent changes to tmuxp +current +------- +- *Insert changes/features/fixes for next release here* + tmuxp 1.5.6 (2020-10-12) ------------------------ - :issue:`618`: allow passing ``--overwrite`` to ``tmuxp freeze``. Thank you From e9769e175d0813f62cbd4c1943a4a88e54b64a19 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Oct 2020 10:24:04 -0500 Subject: [PATCH 0597/2998] Update packages --- poetry.lock | 434 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 247 insertions(+), 187 deletions(-) diff --git a/poetry.lock b/poetry.lock index cddc79fb8c..0da87ab58f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version < \"3\"" +marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,20 +46,22 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.3.0" +version = "20.2.0" [package.extras] -azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] -dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] category = "dev" description = "Internationalization utilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -114,7 +116,7 @@ description = "An easy safelist-based HTML-sanitizing tool." name = "bleach" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.1.5" +version = "3.2.1" [package.dependencies] packaging = "*" @@ -136,7 +138,7 @@ marker = "sys_platform == \"linux\"" name = "cffi" optional = false python-versions = "*" -version = "1.14.2" +version = "1.14.3" [package.dependencies] pycparser = "*" @@ -163,7 +165,7 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.8" +version = "2.1.10" [package.dependencies] coverage = "*" @@ -175,7 +177,7 @@ description = "Cross-platform colored terminal text." name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" +version = "0.4.4" [[package]] category = "dev" @@ -209,7 +211,7 @@ testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytes [[package]] category = "dev" description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\" or python_version >= \"3\" and python_version < \"3.4\"" +marker = "python_version < \"3.4\"" name = "contextlib2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -221,7 +223,7 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.2.1" +version = "5.3" [package.extras] toml = ["toml"] @@ -233,7 +235,7 @@ marker = "sys_platform == \"linux\"" name = "cryptography" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "3.0" +version = "3.1.1" [package.dependencies] cffi = ">=1.8,<1.11.3 || >1.11.3" @@ -242,7 +244,6 @@ six = ">=1.4.1" [package.extras] docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -idna = ["idna (>=2.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] @@ -279,7 +280,7 @@ description = "the modular source code checker: pep8 pyflakes and co" name = "flake8" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "3.8.3" +version = "3.8.4" [package.dependencies] mccabe = ">=0.6.0,<0.7.0" @@ -353,6 +354,7 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -365,7 +367,7 @@ marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.7.0" +version = "2.0.0" [package.dependencies] zipp = ">=0.5" @@ -389,10 +391,11 @@ testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" +marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" -version = "1.0.1" +version = "1.1.1" [[package]] category = "dev" @@ -425,11 +428,11 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.4.2" +version = "5.6.4" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] [[package]] @@ -447,6 +450,7 @@ dev = ["testpath"] [[package]] category = "dev" description = "A very fast and expressive template engine." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -475,7 +479,7 @@ description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "21.3.0" +version = "21.4.0" [package.dependencies] SecretStorage = ">=3" @@ -501,6 +505,7 @@ version = "0.8.3" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -547,14 +552,6 @@ version = "5.0.0" [package.dependencies] six = ">=1.0.0,<2.0.0" -[[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -name = "more-itertools" -optional = false -python-versions = ">=3.5" -version = "8.4.0" - [[package]] category = "dev" description = "Experimental type system extensions for programs checked with the mypy typechecker." @@ -595,7 +592,7 @@ version = "*" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\" or python_version < \"3.6\"" +marker = "python_version >= \"3\" and python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -631,13 +628,22 @@ optional = false python-versions = ">=3.5" version = "7.2.0" +[[package]] +category = "dev" +description = "Python Imaging Library (Fork)" +marker = "python_version >= \"3\"" +name = "pillow" +optional = false +python-versions = ">=3.6" +version = "8.0.1" + [[package]] category = "dev" description = "Query metadatdata from sdists / bdists / installed packages." name = "pkginfo" optional = false python-versions = "*" -version = "1.5.0.1" +version = "1.6.0" [package.extras] testing = ["nose", "coverage"] @@ -645,6 +651,7 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -661,6 +668,7 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -705,11 +713,12 @@ description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false python-versions = ">=3.5" -version = "2.6.1" +version = "2.7.2" [[package]] category = "dev" description = "Python parsing module" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -761,14 +770,13 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "6.0.1" +version = "6.1.1" [package.dependencies] atomicwrites = ">=1.0" attrs = ">=17.4.0" colorama = "*" iniconfig = "*" -more-itertools = ">=4.0.0" packaging = "*" pluggy = ">=0.12,<1.0" py = ">=1.8.2" @@ -844,10 +852,10 @@ marker = "python_version >= \"3\"" name = "pytest-mock" optional = false python-versions = ">=3.5" -version = "3.2.0" +version = "3.3.1" [package.dependencies] -pytest = ">=2.7" +pytest = ">=5.0" [package.extras] dev = ["pre-commit", "tox", "pytest-asyncio"] @@ -869,8 +877,8 @@ category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" name = "pytest-rerunfailures" optional = false -python-versions = "*" -version = "9.0" +python-versions = ">=3.5" +version = "9.1.1" [package.dependencies] pytest = ">=5.0" @@ -879,6 +887,7 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -907,7 +916,7 @@ description = "readme_renderer is a library for rendering \"readme\" description name = "readme-renderer" optional = false python-versions = "*" -version = "26.0" +version = "28.0" [package.dependencies] Pygments = ">=2.5.1" @@ -938,7 +947,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.7.14" +version = "2020.10.23" [[package]] category = "dev" @@ -1013,6 +1022,7 @@ version = "1.15.0" [[package]] category = "dev" description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" @@ -1100,6 +1110,7 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -1112,6 +1123,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -1124,6 +1136,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -1136,6 +1149,7 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" +marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -1147,6 +1161,7 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -1159,6 +1174,7 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -1183,6 +1199,7 @@ test = ["pytest", "mock"] [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false python-versions = "*" @@ -1194,7 +1211,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.48.2" +version = "4.50.2" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] @@ -1275,11 +1292,11 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.10" +version = "1.25.11" [package.extras] brotli = ["brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] @@ -1307,7 +1324,7 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\")" +marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1325,15 +1342,15 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" and (python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\") or python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" -version = "3.1.0" +version = "3.3.2" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["jaraco.itertools", "func-timeout"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] coverage = [] @@ -1370,8 +1387,8 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, + {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"}, + {file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"}, ] babel = [ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, @@ -1385,42 +1402,50 @@ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] bleach = [ - {file = "bleach-3.1.5-py2.py3-none-any.whl", hash = "sha256:2bce3d8fab545a6528c8fa5d9f9ae8ebc85a56da365c7f85180bfe96a35ef22f"}, - {file = "bleach-3.1.5.tar.gz", hash = "sha256:3c4c520fdb9db59ef139915a5db79f8b51bc2a7257ea0389f30c846883430a4b"}, + {file = "bleach-3.2.1-py2.py3-none-any.whl", hash = "sha256:9f8ccbeb6183c6e6cddea37592dfb0167485c1e3b13b3363bc325aa8bda3adbd"}, + {file = "bleach-3.2.1.tar.gz", hash = "sha256:52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080"}, ] certifi = [ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ] cffi = [ - {file = "cffi-1.14.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82"}, - {file = "cffi-1.14.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4"}, - {file = "cffi-1.14.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e"}, - {file = "cffi-1.14.2-cp27-cp27m-win32.whl", hash = "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c"}, - {file = "cffi-1.14.2-cp27-cp27m-win_amd64.whl", hash = "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1"}, - {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7"}, - {file = "cffi-1.14.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c"}, - {file = "cffi-1.14.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731"}, - {file = "cffi-1.14.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0"}, - {file = "cffi-1.14.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e"}, - {file = "cffi-1.14.2-cp35-cp35m-win32.whl", hash = "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487"}, - {file = "cffi-1.14.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad"}, - {file = "cffi-1.14.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2"}, - {file = "cffi-1.14.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123"}, - {file = "cffi-1.14.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1"}, - {file = "cffi-1.14.2-cp36-cp36m-win32.whl", hash = "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281"}, - {file = "cffi-1.14.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4"}, - {file = "cffi-1.14.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798"}, - {file = "cffi-1.14.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4"}, - {file = "cffi-1.14.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f"}, - {file = "cffi-1.14.2-cp37-cp37m-win32.whl", hash = "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650"}, - {file = "cffi-1.14.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15"}, - {file = "cffi-1.14.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa"}, - {file = "cffi-1.14.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c"}, - {file = "cffi-1.14.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75"}, - {file = "cffi-1.14.2-cp38-cp38-win32.whl", hash = "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e"}, - {file = "cffi-1.14.2-cp38-cp38-win_amd64.whl", hash = "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c"}, - {file = "cffi-1.14.2.tar.gz", hash = "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b"}, + {file = "cffi-1.14.3-2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc"}, + {file = "cffi-1.14.3-2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768"}, + {file = "cffi-1.14.3-2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d"}, + {file = "cffi-1.14.3-2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1"}, + {file = "cffi-1.14.3-2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca"}, + {file = "cffi-1.14.3-2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a"}, + {file = "cffi-1.14.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c"}, + {file = "cffi-1.14.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730"}, + {file = "cffi-1.14.3-cp27-cp27m-win32.whl", hash = "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d"}, + {file = "cffi-1.14.3-cp27-cp27m-win_amd64.whl", hash = "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05"}, + {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b"}, + {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171"}, + {file = "cffi-1.14.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f"}, + {file = "cffi-1.14.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4"}, + {file = "cffi-1.14.3-cp35-cp35m-win32.whl", hash = "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d"}, + {file = "cffi-1.14.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d"}, + {file = "cffi-1.14.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3"}, + {file = "cffi-1.14.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808"}, + {file = "cffi-1.14.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537"}, + {file = "cffi-1.14.3-cp36-cp36m-win32.whl", hash = "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0"}, + {file = "cffi-1.14.3-cp36-cp36m-win_amd64.whl", hash = "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e"}, + {file = "cffi-1.14.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1"}, + {file = "cffi-1.14.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579"}, + {file = "cffi-1.14.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394"}, + {file = "cffi-1.14.3-cp37-cp37m-win32.whl", hash = "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc"}, + {file = "cffi-1.14.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869"}, + {file = "cffi-1.14.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e"}, + {file = "cffi-1.14.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828"}, + {file = "cffi-1.14.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9"}, + {file = "cffi-1.14.3-cp38-cp38-win32.whl", hash = "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522"}, + {file = "cffi-1.14.3-cp38-cp38-win_amd64.whl", hash = "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15"}, + {file = "cffi-1.14.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d"}, + {file = "cffi-1.14.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c"}, + {file = "cffi-1.14.3-cp39-cp39-win32.whl", hash = "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b"}, + {file = "cffi-1.14.3-cp39-cp39-win_amd64.whl", hash = "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3"}, + {file = "cffi-1.14.3.tar.gz", hash = "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, @@ -1431,13 +1456,13 @@ click = [ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] codecov = [ - {file = "codecov-2.1.8-py2.py3-none-any.whl", hash = "sha256:65e8a8008e43eb45a9404bf68f8d4a60d36de3827ef2287971c94940128eba1e"}, - {file = "codecov-2.1.8-py3.8.egg", hash = "sha256:fa7985ac6a3886cf68e3420ee1b5eb4ed30c4bdceec0f332d17ab69f545fbc90"}, - {file = "codecov-2.1.8.tar.gz", hash = "sha256:0be9cd6358cc6a3c01a1586134b0fb524dfa65ccbec3a40e9f28d5f976676ba2"}, + {file = "codecov-2.1.10-py2.py3-none-any.whl", hash = "sha256:61bc71b5f58be8000bf9235aa9d0112f8fd3acca00aa02191bb81426d22a8584"}, + {file = "codecov-2.1.10-py3.8.egg", hash = "sha256:a333626e6ff882db760ce71a1d84baf80ddff2cd459a3cc49b41fdac47d77ca5"}, + {file = "codecov-2.1.10.tar.gz", hash = "sha256:d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33"}, ] colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, @@ -1452,61 +1477,64 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.2.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4"}, - {file = "coverage-5.2.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01"}, - {file = "coverage-5.2.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8"}, - {file = "coverage-5.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59"}, - {file = "coverage-5.2.1-cp27-cp27m-win32.whl", hash = "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3"}, - {file = "coverage-5.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f"}, - {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd"}, - {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651"}, - {file = "coverage-5.2.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b"}, - {file = "coverage-5.2.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d"}, - {file = "coverage-5.2.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3"}, - {file = "coverage-5.2.1-cp35-cp35m-win32.whl", hash = "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"}, - {file = "coverage-5.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962"}, - {file = "coverage-5.2.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082"}, - {file = "coverage-5.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716"}, - {file = "coverage-5.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb"}, - {file = "coverage-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d"}, - {file = "coverage-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546"}, - {file = "coverage-5.2.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811"}, - {file = "coverage-5.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258"}, - {file = "coverage-5.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034"}, - {file = "coverage-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46"}, - {file = "coverage-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8"}, - {file = "coverage-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0"}, - {file = "coverage-5.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd"}, - {file = "coverage-5.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b"}, - {file = "coverage-5.2.1-cp38-cp38-win32.whl", hash = "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd"}, - {file = "coverage-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d"}, - {file = "coverage-5.2.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3"}, - {file = "coverage-5.2.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4"}, - {file = "coverage-5.2.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4"}, - {file = "coverage-5.2.1-cp39-cp39-win32.whl", hash = "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89"}, - {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"}, - {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"}, + {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, + {file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"}, + {file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"}, + {file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"}, + {file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"}, + {file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"}, + {file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"}, + {file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"}, + {file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"}, + {file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"}, + {file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"}, + {file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"}, + {file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"}, + {file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"}, + {file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"}, + {file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"}, + {file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"}, + {file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"}, + {file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"}, + {file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"}, + {file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"}, + {file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"}, + {file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"}, + {file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"}, + {file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"}, + {file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"}, + {file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"}, + {file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"}, + {file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"}, + {file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"}, + {file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"}, + {file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"}, + {file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"}, + {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, ] cryptography = [ - {file = "cryptography-3.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a"}, - {file = "cryptography-3.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f"}, - {file = "cryptography-3.0-cp27-cp27m-win32.whl", hash = "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6"}, - {file = "cryptography-3.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b"}, - {file = "cryptography-3.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67"}, - {file = "cryptography-3.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd"}, - {file = "cryptography-3.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77"}, - {file = "cryptography-3.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c"}, - {file = "cryptography-3.0-cp35-cp35m-win32.whl", hash = "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b"}, - {file = "cryptography-3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07"}, - {file = "cryptography-3.0-cp36-cp36m-win32.whl", hash = "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559"}, - {file = "cryptography-3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71"}, - {file = "cryptography-3.0-cp37-cp37m-win32.whl", hash = "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2"}, - {file = "cryptography-3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756"}, - {file = "cryptography-3.0-cp38-cp38-win32.whl", hash = "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261"}, - {file = "cryptography-3.0-cp38-cp38-win_amd64.whl", hash = "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f"}, - {file = "cryptography-3.0.tar.gz", hash = "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053"}, + {file = "cryptography-3.1.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:65beb15e7f9c16e15934569d29fb4def74ea1469d8781f6b3507ab896d6d8719"}, + {file = "cryptography-3.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:983c0c3de4cb9fcba68fd3f45ed846eb86a2a8b8d8bc5bb18364c4d00b3c61fe"}, + {file = "cryptography-3.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e97a3b627e3cb63c415a16245d6cef2139cca18bb1183d1b9375a1c14e83f3b3"}, + {file = "cryptography-3.1.1-cp27-cp27m-win32.whl", hash = "sha256:cb179acdd4ae1e4a5a160d80b87841b3d0e0be84af46c7bb2cd7ece57a39c4ba"}, + {file = "cryptography-3.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:b372026ebf32fe2523159f27d9f0e9f485092e43b00a5adacf732192a70ba118"}, + {file = "cryptography-3.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:680da076cad81cdf5ffcac50c477b6790be81768d30f9da9e01960c4b18a66db"}, + {file = "cryptography-3.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5d52c72449bb02dd45a773a203196e6d4fae34e158769c896012401f33064396"}, + {file = "cryptography-3.1.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:f0e099fc4cc697450c3dd4031791559692dd941a95254cb9aeded66a7aa8b9bc"}, + {file = "cryptography-3.1.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a7597ffc67987b37b12e09c029bd1dc43965f75d328076ae85721b84046e9ca7"}, + {file = "cryptography-3.1.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4549b137d8cbe3c2eadfa56c0c858b78acbeff956bd461e40000b2164d9167c6"}, + {file = "cryptography-3.1.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:89aceb31cd5f9fc2449fe8cf3810797ca52b65f1489002d58fe190bfb265c536"}, + {file = "cryptography-3.1.1-cp35-cp35m-win32.whl", hash = "sha256:559d622aef2a2dff98a892eef321433ba5bc55b2485220a8ca289c1ecc2bd54f"}, + {file = "cryptography-3.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:451cdf60be4dafb6a3b78802006a020e6cd709c22d240f94f7a0696240a17154"}, + {file = "cryptography-3.1.1-cp36-abi3-win32.whl", hash = "sha256:762bc5a0df03c51ee3f09c621e1cee64e3a079a2b5020de82f1613873d79ee70"}, + {file = "cryptography-3.1.1-cp36-abi3-win_amd64.whl", hash = "sha256:b12e715c10a13ca1bd27fbceed9adc8c5ff640f8e1f7ea76416352de703523c8"}, + {file = "cryptography-3.1.1-cp36-cp36m-win32.whl", hash = "sha256:21b47c59fcb1c36f1113f3709d37935368e34815ea1d7073862e92f810dc7499"}, + {file = "cryptography-3.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:48ee615a779ffa749d7d50c291761dc921d93d7cf203dca2db663b4f193f0e49"}, + {file = "cryptography-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:b2bded09c578d19e08bd2c5bb8fed7f103e089752c9cf7ca7ca7de522326e921"}, + {file = "cryptography-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f99317a0fa2e49917689b8cf977510addcfaaab769b3f899b9c481bbd76730c2"}, + {file = "cryptography-3.1.1-cp38-cp38-win32.whl", hash = "sha256:ab010e461bb6b444eaf7f8c813bb716be2d78ab786103f9608ffd37a4bd7d490"}, + {file = "cryptography-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:99d4984aabd4c7182050bca76176ce2dbc9fa9748afe583a7865c12954d714ba"}, + {file = "cryptography-3.1.1.tar.gz", hash = "sha256:9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d"}, ] dataclasses = [ {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, @@ -1522,8 +1550,8 @@ enum34 = [ {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, ] flake8 = [ - {file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"}, - {file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"}, + {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, + {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] funcsigs = [ {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, @@ -1549,18 +1577,18 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, + {file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"}, + {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, ] iniconfig = [ - {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, - {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.4.2-py3-none-any.whl", hash = "sha256:60a1b97e33f61243d12647aaaa3e6cc6778f5eb9f42997650f1cc975b6008750"}, - {file = "isort-5.4.2.tar.gz", hash = "sha256:d488ba1c5a2db721669cc180180d5acf84ebdc5af7827f7aaeaa75f73cf0e2b8"}, + {file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"}, + {file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"}, ] jeepney = [ {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, @@ -1574,8 +1602,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-21.3.0-py3-none-any.whl", hash = "sha256:e7a17caf40c40b6bb8c4772224a487e4a63013560ed0c521065aeba7ecd42182"}, - {file = "keyring-21.3.0.tar.gz", hash = "sha256:22df6abfed49912fc560806030051067fba9f0069cffa79da72899aeea4ccbd5"}, + {file = "keyring-21.4.0-py3-none-any.whl", hash = "sha256:4e34ea2fdec90c1c43d6610b5a5fafa1b9097db1802948e90caf5763974b8f8d"}, + {file = "keyring-21.4.0.tar.gz", hash = "sha256:9aeadd006a852b78f4b4ef7c7556c2774d2432bbef8ee538a3e9089ac8b11466"}, ] libtmux = [ {file = "libtmux-0.8.3-py2.py3-none-any.whl", hash = "sha256:b628121f6db98e34837f78e06aa4388c1a0c53518b2336f437b023bd95798c09"}, @@ -1628,8 +1656,6 @@ more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, - {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, - {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1708,10 +1734,38 @@ pillow = [ {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, + {file = "Pillow-8.0.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3"}, + {file = "Pillow-8.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302"}, + {file = "Pillow-8.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c"}, + {file = "Pillow-8.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11"}, + {file = "Pillow-8.0.1-cp36-cp36m-win32.whl", hash = "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e"}, + {file = "Pillow-8.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3"}, + {file = "Pillow-8.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09"}, + {file = "Pillow-8.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae"}, + {file = "Pillow-8.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a"}, + {file = "Pillow-8.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8"}, + {file = "Pillow-8.0.1-cp37-cp37m-win32.whl", hash = "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0"}, + {file = "Pillow-8.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039"}, + {file = "Pillow-8.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11"}, + {file = "Pillow-8.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72"}, + {file = "Pillow-8.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792"}, + {file = "Pillow-8.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015"}, + {file = "Pillow-8.0.1-cp38-cp38-win32.whl", hash = "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271"}, + {file = "Pillow-8.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7"}, + {file = "Pillow-8.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5"}, + {file = "Pillow-8.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce"}, + {file = "Pillow-8.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3"}, + {file = "Pillow-8.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544"}, + {file = "Pillow-8.0.1-cp39-cp39-win32.whl", hash = "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140"}, + {file = "Pillow-8.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021"}, + {file = "Pillow-8.0.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6"}, + {file = "Pillow-8.0.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb"}, + {file = "Pillow-8.0.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8"}, + {file = "Pillow-8.0.1.tar.gz", hash = "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e"}, ] pkginfo = [ - {file = "pkginfo-1.5.0.1-py2.py3-none-any.whl", hash = "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32"}, - {file = "pkginfo-1.5.0.1.tar.gz", hash = "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb"}, + {file = "pkginfo-1.6.0-py2.py3-none-any.whl", hash = "sha256:78d032b5888ec06d7f9d18fbf8c0549a6a3477081b34cb769119a07183624fc1"}, + {file = "pkginfo-1.6.0.tar.gz", hash = "sha256:dd008e95b13141ddd05d7e8881f0c0366a998ab90b25c2db794a1714b71583cc"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -1736,8 +1790,8 @@ pyflakes = [ pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, - {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, - {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, + {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, + {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1746,8 +1800,8 @@ pyparsing = [ pytest = [ {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, - {file = "pytest-6.0.1-py3-none-any.whl", hash = "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"}, - {file = "pytest-6.0.1.tar.gz", hash = "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4"}, + {file = "pytest-6.1.1-py3-none-any.whl", hash = "sha256:7a8190790c17d79a11f847fba0b004ee9a8122582ebff4729a082c109e81a4c9"}, + {file = "pytest-6.1.1.tar.gz", hash = "sha256:8f593023c1a0f916110285b6efd7f99db07d59546e3d8c36fc60e2ab05d3be92"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, @@ -1758,14 +1812,14 @@ pytest-cov = [ pytest-mock = [ {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, - {file = "pytest-mock-3.2.0.tar.gz", hash = "sha256:7122d55505d5ed5a6f3df940ad174b3f606ecae5e9bc379569cdcbd4cd9d2b83"}, - {file = "pytest_mock-3.2.0-py3-none-any.whl", hash = "sha256:5564c7cd2569b603f8451ec77928083054d8896046830ca763ed68f4112d17c7"}, + {file = "pytest-mock-3.3.1.tar.gz", hash = "sha256:a4d6d37329e4a893e77d9ffa89e838dd2b45d5dc099984cf03c703ac8411bb82"}, + {file = "pytest_mock-3.3.1-py3-none-any.whl", hash = "sha256:024e405ad382646318c4281948aadf6fe1135632bea9cc67366ea0c4098ef5f2"}, ] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, - {file = "pytest-rerunfailures-9.0.tar.gz", hash = "sha256:895ac2a6486c0da0468ae31768b818d9f3f7fceddef110970c7dbb09e7b4b8e4"}, - {file = "pytest_rerunfailures-9.0-py3-none-any.whl", hash = "sha256:f215f2b6da866f01df2e0d12c25687d7f6f0182cefed541afc442230d2d94e6b"}, + {file = "pytest-rerunfailures-9.1.1.tar.gz", hash = "sha256:1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2"}, + {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, ] pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, @@ -1789,35 +1843,41 @@ pyyaml = [ {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] readme-renderer = [ - {file = "readme_renderer-26.0-py2.py3-none-any.whl", hash = "sha256:cc4957a803106e820d05d14f71033092537a22daa4f406dfbdd61177e0936376"}, - {file = "readme_renderer-26.0.tar.gz", hash = "sha256:cbe9db71defedd2428a1589cdc545f9bd98e59297449f69d721ef8f1cfced68d"}, + {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, + {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, ] recommonmark = [ {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ - {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"}, - {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, - {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, - {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, - {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, - {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, - {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, - {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, - {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, - {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, - {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, - {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, + {file = "regex-2020.10.23-cp27-cp27m-win32.whl", hash = "sha256:781906e45ef1d10a0ed9ec8ab83a09b5e0d742de70e627b20d61ccb1b1d3964d"}, + {file = "regex-2020.10.23-cp27-cp27m-win_amd64.whl", hash = "sha256:8cd0d587aaac74194ad3e68029124c06245acaeddaae14cb45844e5c9bebeea4"}, + {file = "regex-2020.10.23-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:af360e62a9790e0a96bc9ac845d87bfa0e4ee0ee68547ae8b5a9c1030517dbef"}, + {file = "regex-2020.10.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e21340c07090ddc8c16deebfd82eb9c9e1ec5e62f57bb86194a2595fd7b46e0"}, + {file = "regex-2020.10.23-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:e5f6aa56dda92472e9d6f7b1e6331f4e2d51a67caafff4d4c5121cadac03941e"}, + {file = "regex-2020.10.23-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:c30d8766a055c22e39dd7e1a4f98f6266169f2de05db737efe509c2fb9c8a3c8"}, + {file = "regex-2020.10.23-cp36-cp36m-win32.whl", hash = "sha256:1a065e7a6a1b4aa851a0efa1a2579eabc765246b8b3a5fd74000aaa3134b8b4e"}, + {file = "regex-2020.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:c95d514093b80e5309bdca5dd99e51bcf82c44043b57c34594d9d7556bd04d05"}, + {file = "regex-2020.10.23-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f4b1c65ee86bfbf7d0c3dfd90592a9e3d6e9ecd36c367c884094c050d4c35d04"}, + {file = "regex-2020.10.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d62205f00f461fe8b24ade07499454a3b7adf3def1225e258b994e2215fd15c5"}, + {file = "regex-2020.10.23-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b706c70070eea03411b1761fff3a2675da28d042a1ab7d0863b3efe1faa125c9"}, + {file = "regex-2020.10.23-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d43cf21df524283daa80ecad551c306b7f52881c8d0fe4e3e76a96b626b6d8d8"}, + {file = "regex-2020.10.23-cp37-cp37m-win32.whl", hash = "sha256:570e916a44a361d4e85f355aacd90e9113319c78ce3c2d098d2ddf9631b34505"}, + {file = "regex-2020.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1c447b0d108cddc69036b1b3910fac159f2b51fdeec7f13872e059b7bc932be1"}, + {file = "regex-2020.10.23-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8469377a437dbc31e480993399fd1fd15fe26f382dc04c51c9cb73e42965cc06"}, + {file = "regex-2020.10.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:59d5c6302d22c16d59611a9fd53556554010db1d47e9df5df37be05007bebe75"}, + {file = "regex-2020.10.23-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a973d5a7a324e2a5230ad7c43f5e1383cac51ef4903bf274936a5634b724b531"}, + {file = "regex-2020.10.23-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:97a023f97cddf00831ba04886d1596ef10f59b93df7f855856f037190936e868"}, + {file = "regex-2020.10.23-cp38-cp38-win32.whl", hash = "sha256:e289a857dca3b35d3615c3a6a438622e20d1bf0abcb82c57d866c8d0be3f44c4"}, + {file = "regex-2020.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:0cb23ed0e327c18fb7eac61ebbb3180ebafed5b9b86ca2e15438201e5903b5dd"}, + {file = "regex-2020.10.23-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c53dc8ee3bb7b7e28ee9feb996a0c999137be6c1d3b02cb6b3c4cba4f9e5ed09"}, + {file = "regex-2020.10.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6a46eba253cedcbe8a6469f881f014f0a98819d99d341461630885139850e281"}, + {file = "regex-2020.10.23-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:240509721a663836b611fa13ca1843079fc52d0b91ef3f92d9bba8da12e768a0"}, + {file = "regex-2020.10.23-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f567df0601e9c7434958143aebea47a9c4b45434ea0ae0286a4ec19e9877169"}, + {file = "regex-2020.10.23-cp39-cp39-win32.whl", hash = "sha256:bfd7a9fddd11d116a58b62ee6c502fd24cfe22a4792261f258f886aa41c2a899"}, + {file = "regex-2020.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:1a511470db3aa97432ac8c1bf014fcc6c9fbfd0f4b1313024d342549cf86bcd6"}, + {file = "regex-2020.10.23.tar.gz", hash = "sha256:2278453c6a76280b38855a263198961938108ea2333ee145c5168c36b8e2b376"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, @@ -1899,8 +1959,8 @@ toml = [ {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] tqdm = [ - {file = "tqdm-4.48.2-py2.py3-none-any.whl", hash = "sha256:1a336d2b829be50e46b84668691e0a2719f26c97c62846298dd5ae2937e4d5cf"}, - {file = "tqdm-4.48.2.tar.gz", hash = "sha256:564d632ea2b9cb52979f7956e093e831c28d441c11751682f84c86fc46e4fd21"}, + {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, + {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, @@ -1941,8 +2001,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, - {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, + {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, + {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -1955,6 +2015,6 @@ webencodings = [ zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, - {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, - {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, + {file = "zipp-3.3.2-py3-none-any.whl", hash = "sha256:50a4ef266c31c9409627b46012e206382eb8d23f46fbd358065a8335cfbf7d8f"}, + {file = "zipp-3.3.2.tar.gz", hash = "sha256:adf8f2ed8f614ced567d849cae9d183cef6cfd27c77a5cae7a28029be0c2b7a7"}, ] From b992f5740196ffa604e09b3337d5eced89e3f490 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Oct 2020 10:26:37 -0500 Subject: [PATCH 0598/2998] Lock poetry at 1.0.10 --- .github/workflows/publish-docs.yml | 2 +- .github/workflows/tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index d08770e87d..a700246d70 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -30,7 +30,7 @@ jobs: - name: Install poetry run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py - python get-poetry.py -y + python get-poetry.py -y --version 1.0.10 echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" rm get-poetry.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b077c871e2..d3b6881ec3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,7 +28,7 @@ jobs: - name: Install poetry run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py - python get-poetry.py -y + python get-poetry.py -y --version 1.0.10 echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" rm get-poetry.py From be43fa82e76d6f6b3e9d97614f45deac2c41b5f5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 24 Oct 2020 10:42:07 -0500 Subject: [PATCH 0599/2998] ci: Add tmux 3.0a (instead of 3.0) and 3.1 (3.1b) (#633) See also: https://github.com/tmux-python/libtmux/pull/301/ --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d3b6881ec3..b63e5ab096 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: python-version: [ '2.7', '3.x' ] - tmux-version: [ '2.6', '2.7', '2.8', '3.0', 'master' ] + tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', 'master' ] steps: - uses: actions/checkout@v1 From a6704d24006198a2d18d83aa76c96cc88d37f81e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 25 Oct 2020 11:41:21 -0500 Subject: [PATCH 0600/2998] Poetry lockfile: libtmux 0.8.3 -> 0.8.5 (#635) See also: - https://libtmux.git-pull.com/history.html#libtmux-0-8-4-2020-10-25 - https://libtmux.git-pull.com/history.html#libtmux-0-8-5-2020-10-25 --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0da87ab58f..d54464ce61 100644 --- a/poetry.lock +++ b/poetry.lock @@ -500,7 +500,7 @@ description = "scripting library / orm for tmux" name = "libtmux" optional = false python-versions = "*" -version = "0.8.3" +version = "0.8.5" [[package]] category = "dev" @@ -1606,8 +1606,8 @@ keyring = [ {file = "keyring-21.4.0.tar.gz", hash = "sha256:9aeadd006a852b78f4b4ef7c7556c2774d2432bbef8ee538a3e9089ac8b11466"}, ] libtmux = [ - {file = "libtmux-0.8.3-py2.py3-none-any.whl", hash = "sha256:b628121f6db98e34837f78e06aa4388c1a0c53518b2336f437b023bd95798c09"}, - {file = "libtmux-0.8.3.tar.gz", hash = "sha256:a4c7379604ccdc684aa865723211184709f9a2b45511772989b5f26ad156650e"}, + {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, + {file = "libtmux-0.8.5.tar.gz", hash = "sha256:1d35b9f8451944d31c5ed22ed9e6c8e18034adcc75718fcc5b27fbd9621543e1"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, From 20f167422ee8618064c146104acaa2bebc31e9dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 10:27:58 -0500 Subject: [PATCH 0601/2998] Remove repeated mentioning of tmuxp --- docs/developing.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/developing.rst b/docs/developing.rst index 3c9f12ea7a..0d07de0b9f 100644 --- a/docs/developing.rst +++ b/docs/developing.rst @@ -1,5 +1,3 @@ -.. module:: tmuxp - .. _developing: ====================== From b20cebd65aa56dc50832a29b03c35e558cc6496f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 10:32:04 -0500 Subject: [PATCH 0602/2998] docs(Developing): Update to mention gh actions --- docs/developing.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/developing.rst b/docs/developing.rst index 0d07de0b9f..3bc9df9073 100644 --- a/docs/developing.rst +++ b/docs/developing.rst @@ -214,17 +214,17 @@ this will load the ``.tmuxp.yaml`` in the root of the project. .. literalinclude:: ../.tmuxp.yaml :language: yaml -.. _travis: +.. _gh_actions: -Travis CI ---------- +Github Actions +-------------- -tmuxp uses `travis-ci`_ for continuous integration / automatic unit +tmuxp uses `github actions`_ for continuous integration / automatic unit testing. -To view the tmux and python versions tested see the `.travis.yml`_. +To view the tmux and python versions tested see the `.github/workflows/tests.yml`_. Builds are done on ``master`` and pull requests and can be viewed on -the `travis build site`_. +the `gh build site`_. Testing options --------------- @@ -234,12 +234,12 @@ tests are being stubborn. e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test`` -.. literalinclude:: ../.travis.yml +.. literalinclude:: ../.github/workflows/tests.yml :language: yaml .. _py.test usage argument: https://pytest.org/latest/usage.html .. _entr: http://entrproject.org/ -.. _travis-ci: http://www.travis-ci.org -.. _travis build site: http://www.travis-ci.org/tmux-python/tmuxp -.. _.travis.yml: https://github.com/tmux-python/tmuxp/blob/master/.travis.yml +.. _github actions: https://github.com/features/actions +.. _gh build site: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests +.. _.github/workflows/tests.yml: https://github.com/tmux-python/tmuxp/blob/master/.github/workflows/tests.yml .. _issue on github: https://github.com/tmux-python/tmuxp/issues From 5c716c4b1c66f7ff8cdbd6bf2934aaa4824b25f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 10:33:52 -0500 Subject: [PATCH 0603/2998] docs(README): Fix link to build status --- README.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index f16f12164f..350ea8905e 100644 --- a/README.rst +++ b/README.rst @@ -142,7 +142,6 @@ See the `Quickstart`_. Want to learn more about tmux itself? `Read The Tao of Tmux online`_. -.. _tmuxp on Travis CI: http://travis-ci.org/tmux-python/tmuxp .. _Documentation: http://tmuxp.git-pull.com .. _Source: https://github.com/tmux-python/tmuxp .. _中文: http://tmuxp-zh.rtfd.org/ @@ -158,7 +157,6 @@ Want to learn more about tmux itself? `Read The Tao of Tmux online`_. .. _Examples: http://tmuxp.git-pull.com/examples.html .. _freezing tmux: http://tmuxp.git-pull.com/cli.html#freeze-sessions .. _bootstrap_env.py: https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py -.. _travis.yml: http://tmuxp.git-pull.com/developing.html#travis-ci .. _testing: http://tmuxp.git-pull.com/developing.html#test-runner .. _python objects: http://tmuxp.git-pull.com/api.html#api .. _tmuxp.yaml: https://github.com/tmux-python/tmuxp/blob/master/.tmuxp.yaml @@ -205,9 +203,9 @@ Project details :alt: Docs :target: https://github.com/tmux-python/tmuxp/actions?query=workflow%3A"Publish+Docs" -.. |build-status| image:: https://img.shields.io/travis/tmux-python/tmuxp.svg - :alt: Build Status - :target: https://travis-ci.org/tmux-python/tmuxp +.. |build-status| image:: https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg + :alt: Build status + :target: https://github.com/tmux-python/tmuxp/actions?query=workflow%3A"tests" .. |coverage| image:: https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg :alt: Code Coverage From 1a9f8b8a1b25fa619bdf81ae2482848dc2e4e1d2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:56:04 -0500 Subject: [PATCH 0604/2998] Support for loading configs with periods in directories (#637) * Support for loading configs with periods in directories Fixes #212 #201 * Update CHANGES for supporting directories with periods --- CHANGES | 7 +++++++ tmuxp/cli.py | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index bdbd94d090..bce1b028ad 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,13 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* +- :issue:`637` Support for loading directories with periods in it + + ``tmuxp load ~/work/your.project`` will now work + + Earlier workaround was to do ``tmuxp load ~/work/your.project/.tmuxp.yaml`` + + Fixes :issue:`212` and :issue:`201` tmuxp 1.5.6 (2020-10-12) ------------------------ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index eddcb95eb0..3ae829b354 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -308,6 +308,8 @@ def scan_config(config, config_dir=None): is_name = False file_error = None + print('scan_config', config) + config = os.path.expanduser(config) # if purename, resolve to confg dir if is_pure_name(config): @@ -322,7 +324,7 @@ def scan_config(config, config_dir=None): config = normpath(join(cwd, config)) # no extension, scan - if not splitext(config)[1]: + if path.isdir(config) or not splitext(config)[1]: if is_name: candidates = [ x @@ -831,6 +833,8 @@ def command_load( load_workspace(cfg, **opt) # todo: obey the -d in the cli args only if user specifies + print(config) + print(config[-1]) load_workspace(config[-1], **tmux_options) From 3ddc4c64a35930963a6fab25d2ef2b659ad08952 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:56:51 -0500 Subject: [PATCH 0605/2998] Tag v1.5.7 --- CHANGES | 3 +++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index bce1b028ad..f7e54b2c68 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* + +tmuxp 1.5.7 (2020-10-31) +------------------------ - :issue:`637` Support for loading directories with periods in it ``tmuxp load ~/work/your.project`` will now work diff --git a/pyproject.toml b/pyproject.toml index 0d43bcb633..c636739c59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.6" +version = "1.5.7" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 1f1ccc8e2f..962811f3a1 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.6' +__version__ = '1.5.7' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From cbfd20d3fa05ecd805b9361f104b53417473260c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 12:00:10 -0500 Subject: [PATCH 0606/2998] Remove print statements (doh!) --- tmuxp/cli.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3ae829b354..aa518bbd73 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -308,8 +308,6 @@ def scan_config(config, config_dir=None): is_name = False file_error = None - print('scan_config', config) - config = os.path.expanduser(config) # if purename, resolve to confg dir if is_pure_name(config): @@ -705,7 +703,6 @@ def command_freeze(session_name, socket_name, socket_path, force): else: sys.exit('Unknown config format.') - print(newconfig) print( '---------------------------------------------------------------' '\n' @@ -833,8 +830,6 @@ def command_load( load_workspace(cfg, **opt) # todo: obey the -d in the cli args only if user specifies - print(config) - print(config[-1]) load_workspace(config[-1], **tmux_options) From 646985754ce1be6f5275c981d124feb27c103383 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 12:01:34 -0500 Subject: [PATCH 0607/2998] Tag v1.5.7post0 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c636739c59..0f331e75f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.7" +version = "1.5.7post0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 962811f3a1..24dc616762 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.7' +__version__ = '1.5.7post0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 00950017e039606fc321e4ded4e52de6489f71d4 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 16:39:59 -0700 Subject: [PATCH 0608/2998] fixing the start_directory and -c bug in tmuxp --- tmuxp/workspacebuilder.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 2cb3649260..df402b391a 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -137,9 +137,15 @@ def build(self, session=None): 'Session name %s is already running.' % self.sconf['session_name'] ) else: - session = self.server.new_session( - session_name=self.sconf['session_name'] - ) + if 'start_directory' in self.sconf: + session = self.server.new_session( + session_name=self.sconf['session_name'], + start_directory=self.sconf['start_directory'] + ) + else: + session = self.server.new_session( + session_name=self.sconf['session_name'] + ) assert self.sconf['session_name'] == session.name assert len(self.sconf['session_name']) > 0 From e4a99bae34fc9a40ddfe391132526bc18da350ab Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 16:41:46 -0700 Subject: [PATCH 0609/2998] running black and flake8 --- tests/test_cli.py | 4 ++-- tmuxp/workspacebuilder.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index c59b3b2bd8..e966a4d849 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -522,7 +522,7 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): (['freeze'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists ( # Create a new one ['freeze', 'mysession', '--force'], - ['\n', 'y\n', './la.yaml\n', 'y\n'] + ['\n', 'y\n', './la.yaml\n', 'y\n'], ), ( # Imply current session if not entered ['freeze', '--force'], @@ -554,7 +554,7 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): ), ( # Imply current session if not entered ['freeze', '--force'], - ['\n', 'y\n', './exists.yaml\n', 'y\n'] + ['\n', 'y\n', './exists.yaml\n', 'y\n'], ), ], ) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index df402b391a..d24164f5f9 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -140,7 +140,7 @@ def build(self, session=None): if 'start_directory' in self.sconf: session = self.server.new_session( session_name=self.sconf['session_name'], - start_directory=self.sconf['start_directory'] + start_directory=self.sconf['start_directory'], ) else: session = self.server.new_session( From 764f25167d459b09bf72459aad4afcb0b18cb508 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 16:49:40 -0700 Subject: [PATCH 0610/2998] updating the version to 1.5.7post1 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0f331e75f6..606c83f3f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.7post0" +version = "1.5.7post1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 24dc616762..7795b24e4b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.7post0' +__version__ = '1.5.7post1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 086e1187c7813765c4168f90bee922f4bb37825e Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 16:56:37 -0700 Subject: [PATCH 0611/2998] changing to version 1.5.8 --- CHANGES | 4 ++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index f7e54b2c68..f73699869b 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,10 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.5.8 (2020-10-31) +----------------------- +- :issue: `631` Passes start_directory through to new tmux session + tmuxp 1.5.7 (2020-10-31) ------------------------ - :issue:`637` Support for loading directories with periods in it diff --git a/pyproject.toml b/pyproject.toml index 606c83f3f8..502c97247e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.7post1" +version = "1.5.8" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 7795b24e4b..78db138f8f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.7post1' +__version__ = '1.5.8' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 6ef935687bbb7c19b9560e563c314739e3441ea1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 19:16:33 -0500 Subject: [PATCH 0612/2998] Update CHANGES --- CHANGES | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f73699869b..bd6a000997 100644 --- a/CHANGES +++ b/CHANGES @@ -10,7 +10,8 @@ current tmuxp 1.5.8 (2020-10-31) ----------------------- -- :issue: `631` Passes start_directory through to new tmux session +- :issue:`639` Passes start_directory through to new tmux session + Fixes :issue:`631`, thank you @joseph-flinn! tmuxp 1.5.7 (2020-10-31) ------------------------ From 77860fd10d01450e566ae296e464eeccfd9c1afb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 10:49:29 -0500 Subject: [PATCH 0613/2998] New command: tmuxp cli (drop into pdb with server and local session) --- tmuxp/cli.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index aa518bbd73..1584ff4dfa 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -661,6 +661,46 @@ def startup(config_dir): os.makedirs(config_dir) +@cli.command(name='cli') +@click.argument('session_name', nargs=1, required=False) +@click.argument('window_name', nargs=1, required=False) +@click.option('-S', 'socket_path', help='pass-through for tmux -S') +@click.option('-L', 'socket_name', help='pass-through for tmux -L') +def command_cli(session_name, window_name, socket_name, socket_path): + server = Server(socket_name=socket_name, socket_path=socket_path) + + try: + if session_name: + session = server.find_where({'session_name': session_name}) + else: + session = server.list_sessions()[0] + + if not session: + raise exc.TmuxpException('Session not found.') + except exc.TmuxpException as e: + print(e) + return + + try: + if window_name: + window = session.find_where({'window_name': window_name}) + if not window: + raise exc.TmuxpException('Window not found.') + else: + window = session.list_windows()[0] + + except exc.TmuxpException as e: + print(e) + return + + try: + breakpoint() + except Exception: # Python 3.7+ + import pdb + + pdb.set_trace() + + @cli.command(name='freeze') @click.argument('session_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') From b8aa53d3b456ce6ab3a81dfd17f86e8b87b0db05 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:02:41 -0500 Subject: [PATCH 0614/2998] Make cross-platform breakpoint with versions earlier than 3.7 --- tmuxp/_compat.py | 11 +++++++++++ tmuxp/cli.py | 7 ++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index 36f5bc19ee..b4b1298686 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -3,10 +3,21 @@ import sys PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PYMINOR = sys.version_info[1] +PYPATCH = sys.version_info[2] _identity = lambda x: x +if PY3 and PYMINOR >= 7: + breakpoint = breakpoint +else: + import pdb + + breakpoint = pdb.set_trace + + if PY2: unichr = unichr text_type = unicode diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 1584ff4dfa..22e08b7d0c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -693,12 +693,9 @@ def command_cli(session_name, window_name, socket_name, socket_path): print(e) return - try: - breakpoint() - except Exception: # Python 3.7+ - import pdb + from ._compat import breakpoint as tmuxp_breakpoint - pdb.set_trace() + tmuxp_breakpoint() @cli.command(name='freeze') From bc1f3775dd12a83e0a567f56d3e2be032031be6e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:16:40 -0500 Subject: [PATCH 0615/2998] CHANGES: Add tmuxp cli --- CHANGES | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES b/CHANGES index bd6a000997..4d7d60a3df 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,15 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* +- :issue:`636` New command: ``tmuxp cli`` + + Accepts tmux socket_name/socket_path, automatically uses the current + tmux session and window and makes them available in pdb context. + + In python 3.7+, supports ``PYTHONBREAKPOINT``:: + + pip install ipdb + env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli tmuxp 1.5.8 (2020-10-31) ----------------------- From ff5008ae08af3cc2ef14f4b5155d663314a3b164 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:28:17 -0500 Subject: [PATCH 0616/2998] docs(cli): Add tmuxp cli --- docs/cli.rst | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/cli.rst b/docs/cli.rst index ecad270da8..7696439cfc 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -22,6 +22,53 @@ In zsh (``~/.zshrc``): eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" +.. _cli_cli: + +tmux CLI +-------- + +:: + + tmuxp cli + + tmuxp cli + + tmuxp cli + +Launch into a `libtmux`_ session. + +Automatically will picked the current tmux :class:`server `, +:class:`session `, and :class:`window ` you +are currently in. Pass additional arguments to select a specific one of your +choice:: + + (Pdb) server + + (Pdb) server.sessions + [Session($1 your_project)] + (Pdb) session + Session($1 your_project) + (Pdb) session.name + 'your_project' + (Pdb) window + Window(@3 1:your_window, Session($1 your_project)) + (Pdb) window.name + 'your_window' + (Pdb) window.panes + [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) + +Python 3.7 supports `PEP 553`_'s ``PYTHONBREAKPOINT`` and supports +compatible debuggers, for instance `ipdb`_: + +.. code-block:: sh + + pip install ipdb + env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + +.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ +.. _ipdb: https://pypi.org/project/ipdb/ +.. _libtmux: https://libtmux.git-pull.com + .. _cli_freeze: Freeze sessions From aad13158c43455fd1ce2af52bf0c5fcf8bcc7bd3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 11:35:24 -0500 Subject: [PATCH 0617/2998] Update README --- README.rst | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.rst b/README.rst index 350ea8905e..32deaca112 100644 --- a/README.rst +++ b/README.rst @@ -17,6 +17,41 @@ Installation $ pip install --user tmuxp +tmuxp CLI +--------- + +*New in 1.6.0*: + +``tmuxp cli`` launches into a debugger with `libtmux`_ objects for your +current server, session, and window: + +.. code-block:: shell + + $ tmuxp cli + + (Pdb) server + + (Pdb) server.sessions + [Session($1 your_project)] + (Pdb) session + Session($1 your_project) + (Pdb) session.name + 'your_project' + (Pdb) window + Window(@3 1:your_window, Session($1 your_project)) + (Pdb) window.name + 'your_window' + (Pdb) window.panes + [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) + +Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including +``PYTHONBREAKPOINT``) + +Read more on `tmuxp CLI`_ + +.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ +.. _tmuxp CLI: http://localhost:8031/cli.html#launch-tmux-cli + Load a tmux session ------------------- From ce711508b309b00fde531ba1cbd9fce25b5cb675 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 12:50:55 -0500 Subject: [PATCH 0618/2998] tmuxp: Pass -c to execute python directly --- tmuxp/cli.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 22e08b7d0c..140741aaee 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -666,7 +666,12 @@ def startup(config_dir): @click.argument('window_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') -def command_cli(session_name, window_name, socket_name, socket_path): +@click.option( + '-c', + 'command', + help='Instead of opening shell, execute python code in libtmux and exit', +) +def command_cli(session_name, window_name, socket_name, socket_path, command): server = Server(socket_name=socket_name, socket_path=socket_path) try: @@ -693,9 +698,12 @@ def command_cli(session_name, window_name, socket_name, socket_path): print(e) return - from ._compat import breakpoint as tmuxp_breakpoint + if command is not None: + exec(command) + else: + from ._compat import breakpoint as tmuxp_breakpoint - tmuxp_breakpoint() + tmuxp_breakpoint() @cli.command(name='freeze') From 916523bfcf78a7f81ba5f0693185826834f62fe2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 12:57:50 -0500 Subject: [PATCH 0619/2998] docs: Add tmuxp cli -c --- CHANGES | 27 ++++++++++++++++++++++++--- README.rst | 10 +++++++++- docs/cli.rst | 26 ++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 4d7d60a3df..7589496d45 100644 --- a/CHANGES +++ b/CHANGES @@ -12,10 +12,31 @@ current Accepts tmux socket_name/socket_path, automatically uses the current tmux session and window and makes them available in pdb context. - In python 3.7+, supports ``PYTHONBREAKPOINT``:: + In python 3.7+, supports ``PYTHONBREAKPOINT``: - pip install ipdb - env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + .. code-block:: sh + + $ pip install ipdb + $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + + You can execute python directly via ``-c``: + + .. code-block:: sh + + $ tmuxp cli -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server my_window -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server my_window -c 'print(window.name.upper())' + MY_WINDOW tmuxp 1.5.8 (2020-10-31) ----------------------- diff --git a/README.rst b/README.rst index 32deaca112..9b0a9916b2 100644 --- a/README.rst +++ b/README.rst @@ -45,7 +45,15 @@ current server, session, and window: [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including -``PYTHONBREAKPOINT``) +``PYTHONBREAKPOINT``). Also supports direct commands via ``-c``: + +.. code-block:: shell + + $ tmuxp cli -c 'print(window.name)' + my_window + + $ tmuxp cli -c 'print(window.name.upper())' + MY_WINDOW Read more on `tmuxp CLI`_ diff --git a/docs/cli.rst b/docs/cli.rst index 7696439cfc..de84bfe80e 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -35,6 +35,8 @@ tmux CLI tmuxp cli + tmuxp cli -c 'python code' + Launch into a `libtmux`_ session. Automatically will picked the current tmux :class:`server `, @@ -62,8 +64,28 @@ compatible debuggers, for instance `ipdb`_: .. code-block:: sh - pip install ipdb - env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + $ pip install ipdb + $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + +You can also pass in python code directly, similar to ``python -c``, do +this via ``tmuxp -c``: + +.. code-block:: shell + + $ tmuxp cli -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server my_window -c 'print(session.name); print(window.name)' + my_server + my_window + + $ tmuxp cli my_server my_window -c 'print(window.name.upper())' + MY_WINDOW .. _PEP 553: https://www.python.org/dev/peps/pep-0553/ .. _ipdb: https://pypi.org/project/ipdb/ From c13e0ad6a48b092cde660c3dc2dada2776e59ccc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 13:54:31 -0500 Subject: [PATCH 0620/2998] Add tests for cli --- tests/test_cli.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index e966a4d849..950cade6ff 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -406,6 +406,64 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output +@pytest.mark.parametrize( + "cli_args,inputs,expected_output", + [ + ( + ['cli', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + [], + '{SERVER_SOCKET_NAME}', + ), + ( + [ + 'cli', + '-L{SOCKET_NAME}', + '{SESSION_NAME}', + '-c', + 'print(session.name)', + ], + [], + '{SESSION_NAME}', + ), + ( + [ + 'cli', + '-L{SOCKET_NAME}', + '{SESSION_NAME}', + '{WINDOW_NAME}', + '-c', + 'print(server.has_session(session.name))', + ], + [], + 'True', + ), + ], +) +def test_cli(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, session): + monkeypatch.setenv('HOME', str(tmpdir)) + window_name = 'my_window' + window = session.new_window(window_name=window_name) + window.split_window() + + template_ctx = dict( + SOCKET_NAME=server.socket_name, + SOCKET_PATH=server.socket_path, + SESSION_NAME=session.name, + WINDOW_NAME=window_name, + SERVER_SOCKET_NAME=server.socket_name, + ) + + cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + + with tmpdir.as_cwd(): + runner = CliRunner() + + result = runner.invoke( + cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + ) + assert expected_output.format(**template_ctx) in result.output + + @pytest.mark.parametrize( "cli_args", [ From c68c9d3b85247554162277f82507e4735684ce19 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 15:24:04 -0500 Subject: [PATCH 0621/2998] Rename tmuxp cli -> shell --- CHANGES | 12 ++++++------ README.rst | 19 +++++++++---------- docs/cli.rst | 26 +++++++++++++------------- tests/test_cli.py | 8 ++++---- tmuxp/cli.py | 4 ++-- 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/CHANGES b/CHANGES index 7589496d45..63ad1ca9e1 100644 --- a/CHANGES +++ b/CHANGES @@ -7,7 +7,7 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* -- :issue:`636` New command: ``tmuxp cli`` +- :issue:`636` New command: ``tmuxp shell`` Accepts tmux socket_name/socket_path, automatically uses the current tmux session and window and makes them available in pdb context. @@ -17,25 +17,25 @@ current .. code-block:: sh $ pip install ipdb - $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell You can execute python directly via ``-c``: .. code-block:: sh - $ tmuxp cli -c 'print(session.name); print(window.name)' + $ tmuxp shell -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server -c 'print(session.name); print(window.name)' + $ tmuxp shell my_server -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server my_window -c 'print(session.name); print(window.name)' + $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server my_window -c 'print(window.name.upper())' + $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW tmuxp 1.5.8 (2020-10-31) diff --git a/README.rst b/README.rst index 9b0a9916b2..d4769dc796 100644 --- a/README.rst +++ b/README.rst @@ -17,17 +17,16 @@ Installation $ pip install --user tmuxp -tmuxp CLI ---------- - +Shell +----- *New in 1.6.0*: -``tmuxp cli`` launches into a debugger with `libtmux`_ objects for your -current server, session, and window: +``tmuxp shell`` launches into a python console preloaded with the attached server, +session, and window in `libtmux`_ objects. .. code-block:: shell - $ tmuxp cli + $ tmuxp shell (Pdb) server @@ -49,16 +48,16 @@ Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including .. code-block:: shell - $ tmuxp cli -c 'print(window.name)' + $ tmuxp shell -c 'print(window.name)' my_window - $ tmuxp cli -c 'print(window.name.upper())' + $ tmuxp shell -c 'print(window.name.upper())' MY_WINDOW -Read more on `tmuxp CLI`_ +Read more on `tmuxp shell`_ in the CLI docs. .. _PEP 553: https://www.python.org/dev/peps/pep-0553/ -.. _tmuxp CLI: http://localhost:8031/cli.html#launch-tmux-cli +.. _tmuxp shell: http://localhost:8031/cli.html#shell Load a tmux session ------------------- diff --git a/docs/cli.rst b/docs/cli.rst index de84bfe80e..848a476a5a 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -22,22 +22,22 @@ In zsh (``~/.zshrc``): eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" -.. _cli_cli: +.. _cli_shell: -tmux CLI --------- +Shell +----- :: - tmuxp cli + tmuxp shell - tmuxp cli + tmuxp shell - tmuxp cli + tmuxp shell - tmuxp cli -c 'python code' + tmuxp shell -c 'python code' -Launch into a `libtmux`_ session. +Launch into a python console with `libtmux`_ objects. Compare to django's shell. Automatically will picked the current tmux :class:`server `, :class:`session `, and :class:`window ` you @@ -65,26 +65,26 @@ compatible debuggers, for instance `ipdb`_: .. code-block:: sh $ pip install ipdb - $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp cli + $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell You can also pass in python code directly, similar to ``python -c``, do this via ``tmuxp -c``: .. code-block:: shell - $ tmuxp cli -c 'print(session.name); print(window.name)' + $ tmuxp shell -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server -c 'print(session.name); print(window.name)' + $ tmuxp shell my_server -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server my_window -c 'print(session.name); print(window.name)' + $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' my_server my_window - $ tmuxp cli my_server my_window -c 'print(window.name.upper())' + $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW .. _PEP 553: https://www.python.org/dev/peps/pep-0553/ diff --git a/tests/test_cli.py b/tests/test_cli.py index 950cade6ff..aa0b86620e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -410,13 +410,13 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): "cli_args,inputs,expected_output", [ ( - ['cli', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], [], '{SERVER_SOCKET_NAME}', ), ( [ - 'cli', + 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '-c', @@ -427,7 +427,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ( [ - 'cli', + 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '{WINDOW_NAME}', @@ -439,7 +439,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ], ) -def test_cli(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, session): +def test_shell(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, session): monkeypatch.setenv('HOME', str(tmpdir)) window_name = 'my_window' window = session.new_window(window_name=window_name) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 140741aaee..71d639d0c6 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -661,7 +661,7 @@ def startup(config_dir): os.makedirs(config_dir) -@cli.command(name='cli') +@cli.command(name='shell') @click.argument('session_name', nargs=1, required=False) @click.argument('window_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @@ -671,7 +671,7 @@ def startup(config_dir): 'command', help='Instead of opening shell, execute python code in libtmux and exit', ) -def command_cli(session_name, window_name, socket_name, socket_path, command): +def command_shell(session_name, window_name, socket_name, socket_path, command): server = Server(socket_name=socket_name, socket_path=socket_path) try: From 9a6083b436bba411600ae2f26b49e82de46241c3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 15:41:58 -0500 Subject: [PATCH 0622/2998] Detect current shell based on TMUX_PANE --- tmuxp/cli.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 71d639d0c6..3f0979d974 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -674,14 +674,27 @@ def startup(config_dir): def command_shell(session_name, window_name, socket_name, socket_path, command): server = Server(socket_name=socket_name, socket_path=socket_path) + current_pane = None + if os.getenv('TMUX_PANE') is not None: + current_pane = next( + ( + p + for p in server._list_panes() + if p.get('pane_id') == os.getenv('TMUX_PANE') + ), + None, + ) + try: if session_name: session = server.find_where({'session_name': session_name}) + elif current_pane is not None: + session = server.find_where({'session_id': current_pane['session_id']}) else: session = server.list_sessions()[0] if not session: - raise exc.TmuxpException('Session not found.') + raise exc.TmuxpException('Session not found: %s' % session_name) except exc.TmuxpException as e: print(e) return @@ -690,7 +703,9 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): if window_name: window = session.find_where({'window_name': window_name}) if not window: - raise exc.TmuxpException('Window not found.') + raise exc.TmuxpException('Window not found: %s' % window_name) + elif current_pane is not None: + window = session.find_where({'window_id': current_pane['window_id']}) else: window = session.list_windows()[0] @@ -698,6 +713,15 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): print(e) return + try: + if current_pane is not None: + pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 + else: + pane = window.attached_pane # NOQA: F841 + except exc.TmuxpException as e: + print(e) + return + if command is not None: exec(command) else: From 890c06642bb991dc89b7dd532e02fcb0074633fc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 15:45:08 -0500 Subject: [PATCH 0623/2998] Add CLI docs for tmuxp shell --- tmuxp/cli.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3f0979d974..9d93512012 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -672,6 +672,14 @@ def startup(config_dir): help='Instead of opening shell, execute python code in libtmux and exit', ) def command_shell(session_name, window_name, socket_name, socket_path, command): + """Launch python shell for tmux server, session, window and pane. + + Priority given to loaded session/wndow/pane objects: + - session_name and window_name arguments + - current shell: environmental variable of TMUX_PANE (which gives us window and + session) + - ``server.attached_session``, ``session.attached_window``, ``window.attached_pane`` + """ server = Server(socket_name=socket_name, socket_path=socket_path) current_pane = None From 9507b3c0ec79645dd17c4d7d4b00fa468d890e70 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 15:50:46 -0500 Subject: [PATCH 0624/2998] Update docs for tmuxp shell's pane object --- CHANGES | 4 ++-- README.rst | 2 ++ docs/cli.rst | 13 ++++++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 63ad1ca9e1..fd078d067a 100644 --- a/CHANGES +++ b/CHANGES @@ -9,8 +9,8 @@ current - *Insert changes/features/fixes for next release here* - :issue:`636` New command: ``tmuxp shell`` - Accepts tmux socket_name/socket_path, automatically uses the current - tmux session and window and makes them available in pdb context. + Automatically preloads session, window, and pane via `libtmux`_ + api objects and makes them available in a python console. In python 3.7+, supports ``PYTHONBREAKPOINT``: diff --git a/README.rst b/README.rst index d4769dc796..f2b2846371 100644 --- a/README.rst +++ b/README.rst @@ -42,6 +42,8 @@ session, and window in `libtmux`_ objects. 'your_window' (Pdb) window.panes [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) + (Pdb) pane + Pane(%6 Window(@3 1:your_window, Session($1 your_project)) Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including ``PYTHONBREAKPOINT``). Also supports direct commands via ``-c``: diff --git a/docs/cli.rst b/docs/cli.rst index 848a476a5a..f15038bfdf 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -40,9 +40,9 @@ Shell Launch into a python console with `libtmux`_ objects. Compare to django's shell. Automatically will picked the current tmux :class:`server `, -:class:`session `, and :class:`window ` you -are currently in. Pass additional arguments to select a specific one of your -choice:: +:class:`session `, :class:`window ` +:class:`pane ` you are currently in. Pass additional arguments +to select a specific one of your choice:: (Pdb) server @@ -58,6 +58,8 @@ choice:: 'your_window' (Pdb) window.panes [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) + (Pdb) pane + Pane(%6 Window(@3 1:your_window, Session($1 your_project))) Python 3.7 supports `PEP 553`_'s ``PYTHONBREAKPOINT`` and supports compatible debuggers, for instance `ipdb`_: @@ -87,6 +89,11 @@ this via ``tmuxp -c``: $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW + # Assuming inside a tmux pane or one is attached on default server + $ tmuxp shell -c 'print(pane.id); print(pane.window.name)' + %2 + my_window + .. _PEP 553: https://www.python.org/dev/peps/pep-0553/ .. _ipdb: https://pypi.org/project/ipdb/ .. _libtmux: https://libtmux.git-pull.com From b8694ec4c4d733dc8149804a145ddb181a410903 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 16:23:15 -0500 Subject: [PATCH 0625/2998] ci(shell): Fix exec issue: nested function with free variables tmuxp/__init__.py:14: in from . import cli, config, util E SyntaxError: unqualified exec is not allowed in function 'command_shell' because it contains a nested function with free variables (cli.py, line 734) --- tmuxp/cli.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 9d93512012..7d65796082 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -684,14 +684,14 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): current_pane = None if os.getenv('TMUX_PANE') is not None: - current_pane = next( - ( + try: + current_pane = [ p for p in server._list_panes() if p.get('pane_id') == os.getenv('TMUX_PANE') - ), - None, - ) + ][0] + except IndexError: + pass try: if session_name: From 19a14db4dd37d58af9b98b611a23db331e7c2ffd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 18:30:40 -0500 Subject: [PATCH 0626/2998] Add tests for window and pane --- tests/test_cli.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index aa0b86620e..4bed46b6b0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -437,6 +437,30 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): [], 'True', ), + ( + [ + 'shell', + '-L{SOCKET_NAME}', + '{SESSION_NAME}', + '{WINDOW_NAME}', + '-c', + 'print(window.name)', + ], + [], + '{WINDOW_NAME}', + ), + ( + [ + 'shell', + '-L{SOCKET_NAME}', + '{SESSION_NAME}', + '{WINDOW_NAME}', + '-c', + 'print(pane.id)', + ], + [], + '{PANE_ID}', + ), ], ) def test_shell(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, session): @@ -450,6 +474,7 @@ def test_shell(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, s SOCKET_PATH=server.socket_path, SESSION_NAME=session.name, WINDOW_NAME=window_name, + PANE_ID=window.attached_pane.id, SERVER_SOCKET_NAME=server.socket_name, ) From 619e2719b2469c9efba9e2ab9abca02c04d5de38 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 18:36:35 -0500 Subject: [PATCH 0627/2998] test_shell: Assert TMUX_PANE env behavior --- tests/test_cli.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 4bed46b6b0..40e73d3d26 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -407,11 +407,12 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): @pytest.mark.parametrize( - "cli_args,inputs,expected_output", + "cli_args,inputs,env,expected_output", [ ( ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], [], + {}, '{SERVER_SOCKET_NAME}', ), ( @@ -423,6 +424,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): 'print(session.name)', ], [], + {}, '{SESSION_NAME}', ), ( @@ -435,6 +437,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): 'print(server.has_session(session.name))', ], [], + {}, 'True', ), ( @@ -447,6 +450,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): 'print(window.name)', ], [], + {}, '{WINDOW_NAME}', ), ( @@ -459,11 +463,25 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): 'print(pane.id)', ], [], + {}, + '{PANE_ID}', + ), + ( + [ + 'shell', + '-L{SOCKET_NAME}', + '-c', + 'print(pane.id)', + ], + [], + {'TMUX_PANE': '{PANE_ID}'}, '{PANE_ID}', ), ], ) -def test_shell(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, session): +def test_shell( + cli_args, inputs, expected_output, env, tmpdir, monkeypatch, server, session +): monkeypatch.setenv('HOME', str(tmpdir)) window_name = 'my_window' window = session.new_window(window_name=window_name) @@ -479,6 +497,8 @@ def test_shell(cli_args, inputs, expected_output, tmpdir, monkeypatch, server, s ) cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + for k, v in env.items(): + monkeypatch.setenv(k, v.format(**template_ctx)) with tmpdir.as_cwd(): runner = CliRunner() From eaf2e30232c19f9083d87aa931da3093f6f3baa3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 08:25:17 -0600 Subject: [PATCH 0628/2998] Tests: Make socket_name available independent of creating tmux server --- tests/conftest.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index eb2d34db82..7ed9c2d2f9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,9 +12,14 @@ @pytest.fixture(scope='function') -def server(request): +def socket_name(request): + return 'tmuxp_test%s' % next(namer) + + +@pytest.fixture(scope='function') +def server(request, socket_name): t = Server() - t.socket_name = 'tmuxp_test%s' % next(namer) + t.socket_name = socket_name def fin(): t.kill_server() From 3a1689cf06198051c25127f3b3a73bdcd5f65e9a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 08:27:08 -0600 Subject: [PATCH 0629/2998] tmuxp shell: Catch when servers not created --- tests/test_cli.py | 34 ++++++++++++++++++++++++++++++++++ tmuxp/cli.py | 13 ++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 40e73d3d26..09814fbe5b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -12,6 +12,7 @@ import libtmux from libtmux.common import has_lt_version +from libtmux.exc import LibTmuxException from tmuxp import cli, config from tmuxp.cli import ( command_ls, @@ -509,6 +510,39 @@ def test_shell( assert expected_output.format(**template_ctx) in result.output +@pytest.mark.parametrize( + "cli_args,inputs,env,exception, message", + [ + ( + ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + [], + {}, + LibTmuxException, + r'.*{SOCKET_NAME}\s\(No such file or directory\).*', + ), + ], +) +def test_shell_no_server( + cli_args, inputs, env, exception, message, tmpdir, monkeypatch, socket_name +): + monkeypatch.setenv('HOME', str(tmpdir)) + template_ctx = dict( + SOCKET_NAME=socket_name, + ) + + cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + for k, v in env.items(): + monkeypatch.setenv(k, v.format(**template_ctx)) + + with tmpdir.as_cwd(): + runner = CliRunner() + + with pytest.raises(exception, match=message.format(**template_ctx)): + runner.invoke( + cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + ) + + @pytest.mark.parametrize( "cli_args", [ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7d65796082..2828c8a6f5 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -16,7 +16,7 @@ from click.exceptions import FileError from libtmux.common import has_gte_version, has_minimum_version, which -from libtmux.exc import TmuxCommandNotFound +from libtmux.exc import LibTmuxException, TmuxCommandNotFound from libtmux.server import Server from . import config, exc, log, util @@ -682,6 +682,17 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): """ server = Server(socket_name=socket_name, socket_path=socket_path) + try: + server.sessions + except LibTmuxException as e: + if 'No such file or directory' in str(e): + raise LibTmuxException( + 'no tmux session found. Start a tmux session and try again. \n' + 'Original error: ' + str(e) + ) + else: + raise e + current_pane = None if os.getenv('TMUX_PANE') is not None: try: From fd017604ebd3ecec5ea0010ea2eefd269fdcda7f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 09:55:32 -0600 Subject: [PATCH 0630/2998] docs(tmuxp shell): Add screenshow --- CHANGES | 5 ++++- docs/_static/tmuxp-shell.gif | Bin 0 -> 153463 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 docs/_static/tmuxp-shell.gif diff --git a/CHANGES b/CHANGES index fd078d067a..85051dfb53 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,9 @@ current Automatically preloads session, window, and pane via `libtmux`_ api objects and makes them available in a python console. + .. image:: _static/tmuxp-shell.gif + :width: 100% + In python 3.7+, supports ``PYTHONBREAKPOINT``: .. code-block:: sh @@ -39,7 +42,7 @@ current MY_WINDOW tmuxp 1.5.8 (2020-10-31) ------------------------ +------------------------ - :issue:`639` Passes start_directory through to new tmux session Fixes :issue:`631`, thank you @joseph-flinn! diff --git a/docs/_static/tmuxp-shell.gif b/docs/_static/tmuxp-shell.gif new file mode 100644 index 0000000000000000000000000000000000000000..26f0d36c034ace32fe4d4b8dbf265d7b1ad01830 GIT binary patch literal 153463 zcmd431yq~ex-I-BSb{Zp@Zj!Hv=k?}YoWyn6ev)<(1zgd?(R;}3J%4kXpQ1hTC_lg zUiy9e?6c24d+-08d+&emWsD?aWUMiG)?917dFFiPvsBeoBqXifuv`IC0ATt>psj3Z zpeV1aEX*&61p=dahxRl5JC`FEWE@(*$akilRu0Non`A>+0fX)NlG zfU&6OBAbc_W8fmPthzlt!B|iQZn#==>8lh@gKCQ^D^N&=pzUa`T1)vvj>N;gx35|% zrV8Xj@affCD`!fODcqK$tyObbSjFmj>QAfZYfM|5-;F-4S!}TCkEYjXt6gqE%~e~D zwbi|8cV8dP(`c`M*X?(*_in7c;loQb76F51N8`u-NHU(g;~h=w!-*^!`I?>0n`3s$ ziSXdgmhGuR#TW*yu2!c;BF#cT$bTrNUH~`|l^ZeRuFUv}Km6t#Pau z@7k2SUzHgW`Mq<04;so$R8#ic6kDR_bfz~$q4b=_?Z@jq9v7z>Q+&J&Uo z19u69l_+w;$HJ&KBMpt6Hq%V?w}PV>{2D3T`#Mo{vAl#mmT|X_JJtcAVkm3;4NImi)V0M6bl45f75DSGG+U=iLaYg_TLRiP-!8Y)`87kr;M@q=N; zi!38ogZEk6xU@1CR$+SHm3D=ZZF_q)SB*o}6i`lg++D+zd?(uq#q6xU7$@RFMiU{p zB)T$y_^`sLx|(~xWm<)&E@J;_yHRY`mU&ei*Ag5QC{5f64t4_97!eFH=M)iY36Jen z&kgZ>d3L(z^A5V=Vb9pHLX6&OKiq}0!~>sc?v4bp z%w58QN%WXh&_wVakFcr|c)sGSs68HK$R9r*6CCC}85do2Ihl~yu05HQIsbGrC5Oj% zI;}+IdOCyTs5_n26hAnf(^cg=du?dqdNyzBSa-Hy;d^klXcfWtb;&Nn_3JXKqVDU8 zOZ&msH}1oH=Wo3hUC-b7ZP%S&y$?J;IRAjgg$mH%=h z)x_;`Gt;sDax2&O^W}D71pl|4(hRq6yOkC7-}Y+TKY!bA9OnQ2sddrq`$5Nc{rAt$ z&Od+u(t{`P<8XlL!H=U6j)ot{?6%S4CT};!Z#V|qwG2i6O1h) zbVT;ktQ>|*j2996j`TBpJB+xJBP@nRAP1Ofjv|qo#iSV{1ME^qQM$3kf;X9KeEF4#Hk>o zVjm8v1R#8f5lNck#7NCjW-4k0Lc&6DJTEH*YquY%;u-pw+&GXGMuBam&mB0<%BYz6 zirBL`mdUUexQGM@MqsIQylez}eyTdna^SYuDFz`Y4U5slH42iL%MSWvFTep5Kx0X>-+n@X`=EVL6q#%i9l$MLsSdRQWb0y! zur18W-LuJLUtE>4;o%)>Q&u(?94?nZE};cah6J;lK5Yn7jZTM4ofh#1vfosUoTkuj z2_-G#fI#R$DE;C<^UGm~K z8XYl8Pd==87szVO<`zHO=85ALc=wS# zzx216#PYqzUo;jJ%zb9{szhUwx?hRvON9krl^d8vqdfL}a+gI#@h0frZZe~ve>8N> z!jimuL%n@kQmZ8SLDjT;N@Ha$&atU~o~m$*)a;0MTQil~Mh&xA#ssBj;9}M*VU;^G zEZAS!A5HY?hfqv>SU`mcJUgh0%$Xc3c=exz99Cj=*gE>CCJ)1yW)&K|rGN2R; zzJZ5FjExP$!z05dpdcWmBqV~v;V@cS5(WkmI(lYC1PcczDIXuXloW-pFZ@vebyOsE zOY5_~zE=wiOCLY3@9gXy9-f?@o?l#k|Mlya@PzQ+<{A)R0Ec%;uCY)agpErhQ_1wP z4+9nzHS7>9R*IltyIYE!E>?-97kgZ~qi2g7%O-Z$JyX9VER;{o7_myyuMC!OQXc^1 zFyUZ)g!5{r6*?Rr3qktM$_j&vB`+=rIYh69V9{_Q{E&?x93p6kTcmpr2paIoshB}Hl>o2oG& zDpta!Z!~0Nzp@`{+A7#M#AbbnkF%YB zg}`T%bX=P1!TVMpP|3W;dELDx>T_o8x8i?-f(KlKG6QA>hycp}1E3`Q1(aTb-=LuW z0EOThl*EtMpwQoKL?0Cn#nH2wbB>S{BSR>;GnFJrH?dO~_0-Yul+rK=jwxxWTqAml zKvGN}SY5>gV-qFcbeAyfMH7(Va$2sm_6Flo5hJwB0W_u*AKL(10Q#F-Q31qYC7|S*3SIM{Yie`NYyOth{O3o_pXcy5m-+o4t%9*2H^~1J zmvMeO(o`~>fKZI4Q)}Mn0b^lP3IZO0M#|rEnb%SJg+SO1%g=Ow5_q9?c-3*vVRW>f=UL2v~BjmzBBLdrQW*Iwc_oc zT;{??2kec*01GRW>VrMQj`{&KyTxNHUxv5$Ukb63sT36FH#C>r*Hg2JO zgR@&)e0$jm2iy?X)p4{wq9N_=?9b#7TqODBF8sOk@%~cF{fzzBHR|uNpIn*$nxtVe zJ)90o_%Qk6`S)|-JmNxS$!^$csN79wlUFAe-BhkSa_Dgum-OC5 z9^Z0=nb3PLCk9ef`IoCWsYn{+**EVdTC3J?CuL&|8rwazBn9$|3q)vRY^FgCaSRR#Im_Mr{x7RFPFy?_|sJ6#p+8j6bkx}R;yi=-`qfHYEg<-+1=J_ ztE#B$%`{9SF5|vm-m+%S9n(+wIvYr`9Gx+I(N?-{e3oQZU=QB#>v0?S$gyXiWU2fn zz#58e<|klTV`FNYHoqw!kWTQMU}o zs!v^E))ea7`X=2ltZ$7o^VH(tO=-!JQJM+VLNprZobNBb(j1hG{rv~^rdb}5& z-h58I6C4xKv4->3&EF7QoBnk%P#d4Oum>xwtyrDvyO(^k__qKTEJ9;nGXu&8pDpvl zsP#_fm9Mg_6_`euVR3*Jt; zq1uy_JC`G7`p1l$;~YKnt`q1}7K4*?apA4FdIX+f%ug?Dj;Ce>Hzz>a^$>j){D2#5 zz_|Hma#GpTPY1UrsNc6suw@_ha{4Fkt;(S(gqu?%ysz}A=b-1}a*MsFz!4kd=Kzr& z+D*=|a2n!;bO}keWG;X=iWY>sI?z@5nblPK)i5zcVKfr|iI!n%GQ5Ix`e#BIh>-bL zele$TbQ9u%T_Ih}k^p=8c09+70S+ED@3*uW@Aa9Y%Wv(asGo_U`MXwBMI8#a_BeRv zm&tEvd>x)wYf_W2n2T@T&c=LF)x`nOu=x?8vp{{myCkfNey^XWD&L6b7G2{N!Qo^G zvX5EDN1tCDE2l-48MoRQv=^&#i`KhkDtWCs6}brs@hvDTGMPr?$nC57|W5 zS1|CHn;gx}WoKulVCurY2fmZnT%1acwP)6{rBj`HWh@XpYQf-59COnit-+S2p)?Y;RKB@}3Dj&sJL5~}F$#_5D-00|C z585}_$w~6MiK?TN)l-`cWn6DGVP}koMo`h#;@z4=sJ$E;GQ;TH@|q0S z6#eSB-uJOAe!DxW+Cl^IgMpiDC$`%=-zs7TaRmyKiF6%ua#R{(yyYDyhTQ{lCj0ok zp5Tu+E;FQPu7_4?mC#CF)tmQi6L+X_a+Bn(k?MKuS7D{>>7#kh*tjftWWF0wu>Bn9 zmZzvR>7N*4Z;`r>r0f{El3%k|)B3b3qjj(pIA=afJn=L`{)<;ij!~LVxUJwzKKO~4 zYaKPg19pbaX=*Zu9P*z!g?nG7Gqkfy<_30M!8)(9w7olX)dmTT1!EE})~X-<+_$>% zT@Qx%+Dwr9$wB9P^GyBMHWSW~Onj*~@3hbHI(Hj5(@9FQpCxuK{`>+Bh}TG|Jm=az zW_pbGYz=D2BdwsnG-~6%Mx}Fko;r2(9vnR*7cm{I`Qo^6QClO#`C0Q$&}%p4z#Wqh z`NZnRo}-hi>-5L|3vU?2>ZwZE#U6|-i(%U#DN!`tqOR@_#V{ z`!f&w&+pfn8Au6^6a1L4h_=c+1u>got6sLT;{nDgvOCn7(M?>@U1Q94b0WUetpl#n|DZE(S*8D&8}G z3e}fisM7>(#7a@P%w(BQ)GO6|<#^L(K~Wy|Zz?liHbTA+!2T9b2NX7qtp(7SZec*wkJ}iui*w&LXQIC=49~u)}gfRiisBtSz=G^KB+b3^ToqB|CL7 zPmVe=lwBxK*K^#vcHe7y36uZ1U%mjPyV1oVQjcs*-( zJlN#Z$nZK`MjCCkqIe(RV*hc3umOC4SLJWw_|K61S%mqAs6ey;5GNd|EC2V92=)Tl zAP5bo`ymh<3=(8ub+ zjg0ocjOhQ=BH{dAB;&sc<^R$mQT<+|>l)oPqcr&^`}SWg(iK4Qn^7XrAvph_I_CVA z^9T*ZgGmChud8Ef!3=oOGOvU`_J)9Ag{;&1R^yT4)Xbr%!XE8l0no-H*>ioQbj17k{ z^E&)MY0?@DH~_D2%fh3szn4Un>b2IPXz#Kg2^{{)cl~W7pg(1JK~{1+UjUW8xAe?< zY7aj-BY)@7<&HpB6!;qAGn@uhKOK}v67{x@EKkSz*~_~9fb zXNgZ-S3>KE#BHY8-GKr@z~}}u+z628YFw4~bS+zP#-==6lE+HL0gP_e zmCN0?xurtk0PuF0MC~X;L4VnXztuW|0Hb1w?ctkHgq+xYQo+sY2X!CPULc) zGT;M^3Wb?oJ&d-OvzD&LpGOCP@QkblI`LmS2#}C3ge6*5qCqXhb`*x(lmWFmxJo8V zfsNTtX{p0uCUtHjD^Uw=UoV&Q>MSS1>x_hgL`|O>;7b=o6ePveWG-Y^)m!a7t(grJ zlHA*J`^q)&xm|^5zDi*zo?0%Sa<9t1DE;h?ZhICkLcoP;Urg?vZc%BzThB7CrNZhS z^_}7GIO89Bp|1E={rIISa;bOqp4kR7PL=IjtgyY&jqc5twzmzAYg=})1|^D4Kgs)= zGA2jcUHF1$HuShj^o+c&=bp9kTPNQ8cLcM_=zTsvo{8g`n+eFv<9gIV4LLG6s<%w< zw5{=>yn1_AdhfV^z&e`iRZxEoM`00kf5+P2Ijy7s7pqz@N#xDXY>>(a`Zsb1`Sj@{ z3~s6qx}ofx9YIkK83gnD1}%&L*BgZb3ne8+-;nCxt6*Ew(6}D$TlSAT*Dd%yKZuL^ z87jGrS1VDIASBjStTW)Vvub!Xq&4@XEUHdW-?THR_GNg5i^Ths8!Kn_O34jhFI~5_ zSOZqtKTtaW?au<_&mP{k+1t#?*?&(_Ns<-ii37R^3XKpNn+W%llUjTzM zc6OIN{5FOV2eV-yXNX-$hlPz6z<-9ojv!AV=4K5@Jfe?q=#zWS>dGPLVt!21l3INc zsc;1@G`~Z-kOdALxHog>-jll`BCq_X%virVUFv|Qr zy@Pyl=SysRuV(UNPRVpAfr#>o`pQj5jE zlEcv>H4339@L|AC!bfOzc`udg%g%l(g-8KK_ojqbP>fv25s~17tvUfxGGxwayfDQs zLzqh=LN3{1AoQgEr5Kr5S4cDnw9N-TZcZT{u#i$lkyl%2Ja&yzL-;BpFZBrHeqAZh zvNM7ybl+_PgOU}MpVU-IR9MAYy=apktBwlPNAlq5X*UwvaMfgP3*5jNRUlDFA>M^5 zHR!QLVAzMFk}8U=EGpS&JoO^{o$>~9lBlm$Xzk#H@@-IQjN01|$_AXn()#*wVv@TNxoQ|$+E|3b{{b`vdh zY7=pvuB~|^d8yM*gWqWhU{`M872-wdFq@Ah-)u@wGg8A2YU4C#_TC59PN)V&DrMXWvlFaJrKpDto4wtVI`5p0tM{tVc(-SM-nBGQ@6$f^ z?sLF-_bO3?-|(N+u^p|3fW@)*U#m?zOS~Hbw>3VbV~3@;y>nIh>__7J*~D|awgHW& zxf&bWY`RfZrxx)2!#K>OAvTrw5x(X}d@8sBo(iG$k3Or|!;A()BI|r!%{9{QbAzO$ zyVmcENn@-BO`UHcG$)mkiY=xTRbofCbocbDNKq=W`g2W`Y#9xi(P{ySBju)(qrn zZc9B97tos|wo9biY&rDr!(Dz;dq@Cu{=BZ^bgo#tWyqEEZHaiKZ2S^jcewO7=It&k z%oCq*TJ}M)L9#fHF>8)I`Wz+WPGdo|2B{f@O@%y$Q}|Qdb}uQ}!akgCTCx)KVEKGo z?BRDKIH}&gH-9i?dX)yZT&oRp5t@nLbYYyzwpG0)9i3WUP{u|$FNOR4&1$*MZG+rx z!>5!=pFIQ`CS&GA*`S-#Ik2kpUw3avNy`@ULH+kGaJ zJghcwIow*h)#Yc>tyo&?Xnc9=5H2R6+LfaD&WUE467=Y8%tTU`YW{ReMdSu!xBs_N zdg&)$0^a`mJVQuu)frjw?2UM!@524}pR0Ud_3xciX(e17M>}eN@}9~Z7b!ox|3$_T z`Q=ec=+*0f##?;yRp$d5;%C8l&%4XMeBVobapCYFpLF-izRG{kKRxVagXx+lH)4Jy z(uS$bi1j2hx*q;>IQsZ(bL#9c!u+`A#mm&e2T#VwZvT2z;oDg8WS9dDj0FB#418qr zLjt}ESQV>hFIBiZ_VJD_-ohZBi8bqr9e4AAuR z16A6nSB7eFVla5<)bmjM$gr^CM?H%$i;hrT(&o>x`=`b!*6g8fc5hD$W+u=4z z2{$s0a2Sc`+YbLx5n<>Tz?>Ob1b>{#8BGO=cJBzUKt_yEg}=;jEH??SfMALiqwZZi zDMUv54o9gXV*>F4A5;d+;>8ehhGS<&MK6ZIz2Wk6@({5|{uyVP0o_uFz8>ZM=`FW1 zL%J1-D1YUkY}1&Rrs4kZ_%c*{)ksVyB&^RdXde}Z+KKN}O=$3o^{sp|aN(1;9o%l3 z;N=&0Tp9b)FMM7#kozKPFfxI)109$V`l}-vSi;zD7|$t0hLQ5#9Ep+4gbN4X8(>Ca zBY*-XrgLSbO+QRkM^sm2GfTYPn6AYX%VrGdN60veZkGh{SIk2lzhf9mTVwMAuQ<&T;#-(IA z)}<`XzTFw|9F^6w8&iwQNOnpCJ0*_p1TsdVUyVG0E&IOg4DXM6!flon6O~#nfx(wV zt6yfiMy4s7<%;{qckL#IU->4ELotg^x$fbyWFY?sBuOw&rS^^1W>bEcsZ^Ne zPM$nRos#%t>ms~Svip~?H`L`6M3U;_5M9(-x!@90Ca%QLlGK%r= zc_xaqk!O(nSTQ_Xe#I0Z$k|*lu~y~;D&ONG(Jm{x;LM`ZdzdO;Nt|R}CrsKt3?uVV zv-D7NJFQ}|X7N`S4)V~$Bcsg8Cadlum2mV1D5$^5mn>V``ZR|KGg0t=Wu-AdT`00S z3flr1^yN0dG+?y$c_V}@2G6sh^Dk&H-67aaL=&_Okb0x<1c*E1)o;7ur z%0rZy2~VEF&X~xWi!s9#~c zQ&W8_&G5&okeW3q8EU^z;KC=QB{a`qFk z-RD5zFBlCDp`t0HOj$$NcO$)H68RKt20W0&xEQ|kbT@Ik)b4%FHNe55)d=j_PZ%W(@(_{Oi?iRwE8=VuUFR{ z$4LA8aS@@Uj@{fP<&I?wGOp5*`x$!pTeXB|an;n$LI#m5B&3R%WRhh^<|c(n(&QyC zzPne!^?M|y&?JRcUjrq4xpZ32y#S{;J5~3MG%Yd4oaQRQ?ibcch!F2qwdSfS60$7< zq=U_irPOkbiblStb*akzZ{Q)J?E#ynJSxetsN}(B$*Cwk z@Nv6~lgV@WKm5SNHwO&+cSxW zJMgh=8J4bd&OD;3o1e6y<+(E8v{&P>ATZ!_h#Su=B`FS;>qR_^5eFbz0nSd z=eLI*W!B@RLS01dC68mYT+%r7q(&~ejg{8~)}<#-9`@hc^pK+%G5c0V$nCpM7wBM4 z+CnzD7g#bqSV{V^kdFkw+aKDum^!M;B<7k-JS*ZoqD*(5y7q;FZ%yYW0WC(8*m=`f zj??+&)5LLJga_u3pVQ>;oJii8lUdHtXgN|H6w&^iVOyN}PB_a-@5Vgg&z2WD+v6}j z=wWQAONqx^%%%+P4ZfO z`>$ICt|e-S6hH!@i(CbIgK=+A8g}Sf_l4Ym(y&?;7Nap>d^vI}0Ih^g$Acd$A!j=P zuyYxU3MN}Ch4NeeMgRLl;`)C>62<#_N%X%32IQYfqJOBfcyMgNo}K{^9@vl^LTcNO z!In|iM98tBW8gP(W06U#>N#Q*e+$XqNuvMtMfu+s2Nr<$??PztpKA4=aa=p&|0;n( zlmHMN9C?Ta{ktlS2O)<{yB8`&gNED(~F)$o*AWE0@RWLgb12T(bb0nPfRsbPz zR5X-Ac;Aii-;~#DnelJs&i_4HuzL{*8;%3Vw(9BW0YSj5Fj#US2+Tr4er;N^2QYZL zUiyIEL-D_^ z!pb1z{xsJq>FWN+9)&-BJrMv9NDlY>-J?L1&dMchuZo33$RH<2CXbHAatW~DN^(>! zfCjsfS0`0!M5rX-x<-kz8lWzxGq?%pWiY2s#H5)Ix}Qr;-H+{VPlPh33GPP z^l#djq`U^OXW>9@j&)m|5N6_hw}mC;CNVu+^k6ZqNnxVyQR6{MLfzeY{7cWzV_A|3 zI6r7n8z0E<==@fU%Xh(Iy9$J6h3JuL^DkE~#3J*yv;b^;QBeS~?GFfcE)pVye+Hya z9i-QI zI4zdQm2m0O1GO{fED4a;5k2P2Nh)tKf?XZfkr6_wTWA6dbj=P@toAX>sh-Os=UdRl zmdjODW$puy$6GeRq_Y?0nUh6k%z5tlRd8f()$Vpdi~@I6emF+5DDN?i9NJi9rqnJG z99p_^7mv_=-ogr0xv51WY^ZN><^HtPDVd4HJp)w~y|I@9ukJEyh+lIkimTqE+HD%7 zltzWwGtfFT_tL2E6!Z>`?6@U_Lq9d&>@%&5NPm3cTD+`}Uzzv*vt(6UZ29i}tc)$O zeIsca!?H?+>embEmC^g;&P+||mZ@#b4rD+XH^SYgd?nhoWUu^DMPrO`#C-wPrrD$`F+8QWD9=0 zslx39Jc3ZvQY~N?wn+wCWaJ1BMmuzfcVfEU?eu3nG6?Q#4C{Fl6PplKd1ybicBnayDFC$WWa$VXcQ6>=-E>TWo)qT{#jqz$#V6Oe|fg zoB<~hu-qtqWrL;6CtDfawO{-ndK8euQY%OCe&Zz!=Oe?i-;NT{grx{PwGoAX>rr?$ zf|#sJN{lUK)dN#yvxYv}7cnP)DKQimc>}bj_Aytx_*IBi1(O$V!Un9lF*|VxAqFi= zH7`*&BQ6z_EspZzuF}Zr5YBkcns7;4ENY}pnk1(LVYdgDPTFfl+5b=%O^cG<5!H*J zw!H*eOl;4*jW&TF#qh}H%s zSFR5{Z!(l|Dm{bh24;H}Dqu#Gp&8CbNTHaO*QHEW`GR4aQr#)05yi<(b!w*D`q5<= zx}J1K`cK}?wx-r@=_NOVSnhMu&WF7AVlT}i2vS;mo(PceV_jU$ydZp(f-&_mxS^+! z`$?Y>(Ho|rlAP@1=1InW>lI(mS#l0`y4ZV#Gd_jrS(gbX3l3MPdc#JM-=`?^6^76< zlYm)^=6!8XZabi1gF=OjnVxf*js0P#>vo%TV@G9M(`M9m&>b@U?9z-D+$cKdPwFW? zZQ{r;Piy=PAFlQn8z3a9-BBMdbmts)xhh;8s+^T27ai2vo8OTeco!SI$KdkU22gNY zvz40pr#RQo&fmMkYhz8Z(Wnc)H`~a{)4r3gx)!B@G}Y9JsB9ZKOa3&|968nj6V2NS z8%auGCE495MckN-Qf-QXB~4a0ZIe%BT-KCca2rUQI1pVqJVI@D6t;*F@~7pH5R5{{ zW(;Ltso4s@O%5um=$HB_0w}~boJZ>1lrL86*?ZII3`SZ*L@4eTZrnqh;F&rxn7UUj zZ04}?HemPHTAhSVvffzAt*bq)EtE+zY;k@r^z(H!s7pO|?YPJ4ZnJJ$s;PzZ?D*oC zciI;7eQ=|p*Z_aCqO$Y0SbX|(NSONzG%c&lucdxWdR<67FR7M)g8y2ohm_DA#@eb5 zAqx$}K_z+Ff<@R|UVpZYb*dZJ;!~-!YC(-GBHh`(Z}|tg$1mx#-z_YS7Axa$aqsR` zW#XbgE*do_<1~MuNLlQ@VL#GjZ|-h5soXc=#-e@IuW#U#5#CSS%+V$vm@xybZIkNV zZeDCp{uE8KkqOF+?5<9mB|_HN`Rm{Kup!xbi1cc=QGZ^CvO4%QQp`)=6(;FC70H^r zP+Kjfbmd>hGWK=@-vn7-mO48S(6Rwx7~$U^)n??{RiBT_eG^2k-hsZk;SzXk+5C_! z{QO;V-QY~%>A0uQ9erz(Arnp~usM_c*`b^Nq`C2!?8$sZw#FL|$EJDN4^mwymtUnR zN(YJBPdgq#t-0zVoLB*@lmo~ssFp6T=80TspnA06;C}Ac#tPZymv(IYah+4E1}k4% zYELC;U)UY+{pzwB?mi8IsA@BKgsEm7pSE93{Zuw*WcyH1{7#n?y`T8v`;N{N#+PC3 z1EKeRJb$RhR#JQQ?ai;Ni>a4a=TpC~u6r;5I2tU0#x_Oc`k^72X#5T|;SyQ^^oST9 zOuB>~6Ah;H3x;O~({uzUV>4>6Ar3jP8hxU5bpqh)je>C7Ys6?9{0iNq*dn%0{Uk zurSEBNUP`t(;Qh1E*cNCd)F=oxLuGHmy!w=E0-A4MHKHg{6g3SxBq2k6)Gr~+%5kG}d%H9-81}qeYO6(Zv^N^Ss#pLJ^ zW)OA^l_z47Mb70|W-;?BMl_Va(I94LR!#*;HEznIeeAj!c3Y~9w4{Wm)+R(w7$ww1 zI&Ke(TenhEW6@quC0P@FO(tHMw>FdZk;;1XfF zQ#P?E$(JSU59frsu(B*ewB|36JWjU-I~mWBESa5g_o3OOUQ(eY$uy>B*v(rM3 zG7V?l_PYpm?Mr*eJ#$yq1K6w}v)GR6y7Va;pg(FYXhgeS1RdylCt7};d zS==uIYQ0l|ZO z)iLUYWZ79O&h?+G$#Vs_oQgbgO*W{q?&>JKNTP~de($PHj$H?@cQB{2bDJca94 znjX0k5S)xyLhu+EP26Ev@f`W*0%`|!=8#~C6wKC=w0rOvcXgI&={=fF2{i~JzXU@3) z1vLckcSQg5`po~IdyN1f`0Y@`0Um>l|D!{#C_U)^a}lqdwN$?yYJX}Y79;Mf!Pp?0 zzuw>Q*PbWmK)Bvt?r(V2TsHRa_css#GUTR+ib-ra0>D%k5iAENKKyKfkV9ZV5HxX* z+8_5fm@p%wQ#mmumPy3OY46@(EX4|ySSfFpg+K0Z=q|J~i8@3Y4AEypu6)ap=uc9?RFt zaW<>O;#mK>>w^G~69l~6vgp3%X%PF8CpE%!f6KJPyNvf6(Y z^OyS@=4$Ru{qA`>TpugYdHLe!86=xjRPf9e{PP?Knc)egbI-Q#OcTqNXN|+omBXgt zOazSyDOr1i<0$T^rf_AZMc`<$n?&GyBW*AY(Gcp$L=vy!sPrs91coCVUJ?yaL&0Js znk!#hQBqiC8{jfen>jlW`NNX&IGxb(bjY%V5rs?#r@Qgr1r#J|PgysCW!ojY=#C0>gJy9~v7~rnzf-p|Yb^D(!Ra zqdUt>QrAYdQ0X?#TNrH*b?bZ|wM;py+efJeRy=#D+fUTw+0xvu?nRjv0*c1rR{5zrE0yQcp&!5 z;$fUkyUDPb-Y`Md{jH9K@XMods+3NjQs>(i=S!Ai2Mt$x`bPu4ZZ*k+M$;~`d9YdB zqs0s$h^aP3clPFI-TE}@J2#bQ^$ET%%=1?tEE+k;9`7XDjKP{elwX~_Su%fK*Rdn} zi0`dB9P@J$U9H`Y?t^g4C5t8d`Mc4UN5RF+%tmVxEMk_kJz zlu*=ybJiH;#jV!h!;nGJxfVOTLEd_#kEYk^olwI>0J!cj51bmt9#FyLh9SV{WYwKA zhPtOm@lQyK)zF5+Vr&0M8&Q#(WhF{R-fO)WQO9s36J@dD^Sx60ifT?NEY&))Qcj&u z-Q+57nhVk7sxFV!=WRN+;dGQt0TSE#X+d<+Odl|?z2ED}Vs!ph;VH6FMbx4uy> zzFkEc8T$|zzM5l`564RKY97j-CLayOM^BZbV)G$lP%B&*fTgDTZHnOJUG1y!h!P=In5vpfiGm{j(RV%+Y8L0l)P`G8@tk~)aVWc=#^A{R$$1)?XChZsuwm|BrJX<{! zBxOppI%YO?CD!#iH6k!VA!xXf7V=J6l?te8XjL^Mfx=KQHh#8&TAa3~h!8tTTW}an zjq-bl+B5ai2Bp#QB+WV2Fu2ccPgX4lMkne(htg_t4~9_O=`@KUlr9Yx`H66c$v#S{ z)r92gpzyTRyuu+(N0Xjh-fK*45I)j!NK3>mvN2!FP?lEuijnthp4r{p;pwyLk4~~t zJRhO)sIkio!w?(#O->_bhy;sM`W!X5X!P0RkRtP+p`$PCA(1WB6c63QV0-b-w{ILf zKjty3cEvwQeQq%!U_z$(69=8CD#ZS>OL%e@2s6f(%j`S$EqteG>SsI=bq}$h1Kb(7 zw|`8lGdW_7nNDi*u-9b?i-pBE)li421}tciRsPk~6}KVjmQ3Dy>IoZlE1gLY9k zP}ZUnXM`NC+b$sDS{$Qw@VUd*#_l-EjKGcUa8@Y!s-U-H;EybM%uP7!eQE`j{^P5O z@=vWlUvxNS1efGrEvtbJD*(TRILRQ4c4TU6_Q80p86o-9u>276GRpb!l^AuYyoM)A zgZ}D0U}5@_qCE-C;xX=XO3N(ro6WtQ>AYOh~KQtPIR3CwtNp*Iwm`qGsf` z@Yh#_%>`K5sgJhE#0WLul``McXxRq~pOPIo_inyr%i0=;_rA;LeWb!_5Amzpg|=P} zA~rTBwKc^eo5TFpsX{!9b!N8fgo1XXuT(NS>`*DCC$~%CP-X&Jz#%Xq`wr!Ts8j1X zzx-y&JGq>U|H0mOMn#!!S-+K_ie!-sBZ(bCSpE z{EgqP@)$j{FjRrx%L|LjtI6}T^>a;RFSwj_OSfseSJhQq>$>4BnBHTCyI)Tg89|#P zc&ydq1#G8TD(*Q*XfTSp`nGDq+hFTtQxnr+6X^Aw9 zBC6)gsj+>lyW4kH1tis3w6GSlo68sa;rXRgIxNQm?KDGq(i^@Aojk_hZmauIbmbJR zDLrr%|Dv>H3jR{-YLJ$|ytg$04Xd7-oqW2rGdg61kVY9j^QZZob>;l}q{NlSO)owt zKu^Ev<`!CXeeKeAHk9|`NmX6RLY;o9{A~v5i>F^-&^EtycILy4LiJZk7;l~nIn#Yg zp_eNTxR);9VSo8Pb$6&RdHZtA*Y_v;zqHtW`@(ztN9F-JB#wVC^Z0|8=?`w~?4RMr zz+})yb?m%qDi5NFsl$^S2WA#`31?`rQ%#aW)Q@ZEIeu@Q2Oqvn|CmMo1B>9=zmo-d zSbt{@MXU&oHE=098bYfegH9EsM53IEmU}_`iuHDUVjQY?D#2gcS_mKK z*X=d`o5Uf}A+i1Uxy`RRMR)nt@EIn-IpH=PHtIQukrogxX`Q;<42#=_$xcBTzP!bJ;btHZR}9_p+G zu#a{dkfNF8Mmg|cNAA$>owecf0KVFR9L=&Hs5ly%3XutS z>-;bS!NkqpugO}uI7SdA;oZROU?Ii~)WJd`?RQt(ATp6cBQjo3?nDvZ=?V)=AW+r8 zX@k?rvd`BZadW65eNLEd5+mb@^Kak$`qQkSlwGvJ{N0DG3gKhm<`0H67jHC4W*BS- zM!ft(ZGy!ZzKW`nSh%@ia#%qMv^3@fogMZ(x2b({BDIVCESlHehZ6hS_ovL|9JpzWRmObHQshWzS6p<)J{f@LIEt+B`Y)=vJHQGR+${|3=#3j1 z6anvQKa%(uA2qAV;aZ=D!kcU$8XAWLbEiy%QteX z&KN%wsh9SzX&yLzGNf#b=<9KIaKCTGoKJ=h588fB!~dE?rDwZ|L!lvghBC)VRfeH+ z6y=``FMV5?2R&k;tqe@{En_*zzV*tbq-E6?7y()VZ)K?Z@+c7ASR01H*G+J(ic>WlY^tZZ4MC zzvKuq$#<9n^)z9qWtW}x+?&c=ZjjF9o_IIO=u+*v^pk~}-4czZVXWh~3s2E-;vOQu zVJG6w#Hwv+A*|>SRzJ)ve58e@jq3?6Q0rLtv@%O+53fG|Pw~M__-i0^#5vlOA=6+; z?l-p@j>RpKeTuD4ChdC5hT zW+Iemt8il34Gq&A%oiywI$=~6x<8Pow^&~2Q)lO{Q8NDUQ(xh(!kYPQ()k8Q_GR`6$`~syTI_rSoiXRCE8R+qEV_RWF{FT_0gQ7OFHquN~(!9R5*B9m**=) zBjpl_ropYUvotF;-DLe~thg1`_FaM`4tEB}o)wiLe=1|Xqn05)Mu=AFHeyeo2OS>^ z1P(lMko%Z35?>)vsWI$g_Az(*Q3XL1FxlGW09A|Sx(6@knQu;@9-Njqi6nSTL zN?XaC_q0|M6W5+dtNEnSkXI`KK5CW8NFPQwDvN_{j6lr!G7(j$i=V*4U(0CJ4fe>% z^*)VdKS&R4awReALYzoiJXUsEN1!Bi(4bJLtr{~taK2P?qQ-2e#$>q0=*Hkg9ZSnK zD%xRVerPFP$xh9I`E`Ps(!dwP4i?5?=s>~vun}Z z1D6*b*Zc6f)izRK59@79W@~zfZ+wxbTYn6meDSoj2sS`Bq$Y z!c2v>S+pA7KpCoQY#%zFXpA*m7_`>h5x%}%X(f^x-Hwzxn>jMpHe#0A75+;9AY;w! zxm=nL7||WbZJ_yJ!nkWTP>_e{jm{vasAtRP6N{Ff*122LXP%5biCrh-0EfIxBUx@2 z&wa#U(W`f$8*}ZHQ3{E$V+y+_1C>Nn5&a2S+7=!~hujpy2xpw+r1KWBQ%HT80AEvD zm_vnrG>dOu&aBrHzQro^U4}{xO2*POfBRDw=SHq}3pwRK5aGcy21Y~0@F*GGu60L^ zbFYe?anaw1#_Pr#Lfo!W4PsdGFQ3kt(YAR&)LjiP5_dYzP)GZz?7_ym`dqrjbBCu~ ztj+Y*f^JlS8^>i5^qvW3h0b5kh)!K&Xt2Xu`aK&!h90!cnMM6u48rS2EC6j3j(S?XCC-GUgdsj%;lI-Yx$|i zK%kwbJb34NS)Jo<^1G0R^XL1Hm2**!Kprami6?r5sO|lWsh{a+^PiglR9pF zx`2MZ+VSZNy_Oj2U4dheLXdQu&$o*GaGEpLrjMH+bdp_Jq4T}-<=q#ROqGn+Ixjey zybI~R9!#r74$8-SFPG_1hO60LzP^?1>t=IoqG*bZtK39+Be-OIbXE|05xacOkVN*q zPv9wwAY#7}MfD^*F3(oZ%NbZPQO(31r{WZi>hosdAkASz+)11fM9SIRK$9I8bUxie z!di>miQB=Dx>m&!hQ1u8s1>z}6|*@9v)B5#Le({HiVvfyAKppT4(@p6@z7agx!qD)NeqPDsDLyA0;^ z)WfhaxK0Ed^=2oUsXcnvAbMaY>S~pKYL%|BU?Gj5PmOP`G>k#|5Ba=dRS-qbMo>(Q)l^al$;zD0RMe*@((flA8F*j zfOvuY+Yv8ERM5XC@j^`CT!enEko^(71m5g#@=3S^0HQ&uHv)fK2}@uMW1%M;?oB5b zD~3aepz9`VWk4#mf{Tjj51|V1Akwg&i4}C%c)DZeBdwz|3eE&dy6B_?AsDbvM2{pir7L@Q5tba=hk{kyY zp(uZ$1Xl)Ag?~u8hXY75bTV5nJ_R6yYqMc(us9CpzVN`7>Zg?$$5m|+D;ySjmYB@R zq^I&8SpDpQHi_P)@k2@XI+|CoFYXW|-Q8n)+>~ob2{;rVy|qPT(D15Gmw)rd)2b6*U!AA7K(&ZtOejIA61TDP z^RHjj9mg#|;rEPa;e-OMyY^ZyR)=rxZ45ppNV>nEl-nW5AhNdB{{|&!c?w@bm2(hM zm|y)RVe7qM*}0LP%_J2D8Y@MJKxBr~KJ&eCkkSdX3HYHecQPoJRwWa3Erttw8GJhu z<<@DsLVJNzRNd;_{S#wt{b#c2BH+(>_F?r9DSF|lQ9FPa>g5myD~N}CAM+v+1g zBXiC&TAjtv+<0?TZOjtp(a{64qEwyMBZ3n5fS3lSlQC^>yGyAWB$xAVX>cfJ z`)031-ld#C=GjIV_JG>R(bW;S%=U_cgM7c;LZF3Qy(YMwqCcgAJ*FLPn9vrR)>xF0 zS*p~ON@82DM*?T94%=XKYoVaBH+8UrNz$~Du(v<8Fy^-Esm|k`M@CF3`Md%z*9;1$ zoY}ZXZD^yndo2+{8)2<4|8=`g*}-f7Rq{-i%e!m@P1gBp<3!Y|C*n!RyN3I#{WM_9 z$Q>KN2E^d0%yM(b{oIv6rZruKuTv*0iJ?L^<&>-vB3)l4O+J<{dD*{fh}YPq)kooF zsH|n{K~CSwj=7!!6jsZ`ZH zILFGZi>6Z7FCI+MK2$gTEZ6i|k`!CT2@AN@MLhQPM)X;?#5#2Llsm?F5zM;3kWBpk zry-ZV{*b;h!`Dx(`;GduKWpG<>p{k_HGcP6)0K;$NHz&RMW z4E=lBduNO((FdVEa`-o!_=7!t*8Sl1v`@|z=B)T=L%3uG5$KV5_YBqTc3Q?F8D{`A zq8$t66MZM!k3E?dXHpcF;aOe7XI?t|6L?<>g5<2SPTimduOeCh1Szc2)R(o4vL*JC$}y-T)ODI_4~F>FHw>T&CF=K zNDWS%6Y(zxZx3}M_8gEi>(tVwn#NKV?pC9_8oZHWiSUK#R~4k3u>Fc#3S9jhtYxTo z%|p^@B@H%s0n5J3(XJDMv%OH?^v(`<4LdR{10)`4BBd@I@zK4G0J7eFF_xow+{5p! z^birEQS64@I2UE!*ktl}H&um01nV`;Iuea&7<;ZbvA%4IRQ&laGp*+lr~eCsxWzZCvOjG<(JaOke5QVhD6fwV+N(Xg zA?4I*W5++Fk(NvQ)k*q}EO)|VerigU4P`~SN0(gFm`~_C%eVsmunJY7LI=R_I z%md>O()M6z0#>RP1!JH=oTdOnCF4#^&L~EwB2i zEADZZ<;&7uY}_Z6RQz1wcTMo}yX4Z`;gDlD6Nlh{b)^P*xqUP0WZ*O2Q@h@i3RSKYJ11?|-lq=u*bTmzsF!Ab zIxJ28vgP1vn(1}!O_jFpdDF#^{(IMcl1%CTG}^HC!T4ZsvoaCffA?VbwZp+u^_{PJ zVOKw_U;S1wdUfH$Re+BHyzV=*N>8YpPWHrJpf|kQge6<2r-){yigu=+W+t)neW-us zj5VfR6Rpp&0OB@ItDGoOi14Np+=XFq>wZLE=(lu4+# zIxe)*cWvrynsj&*FSn_5xE3mWstMQT@8P=U;&#?wbl3B&qmVA&Rl|U=j}P#)AFmKa zgq`jPqwk2ofFfMZMsmpbs;^zykBnF|)^nO>qMc@TG>OvjjG9e}3UZ{QVnY4!=W){x4z<1P%Rv zvtm#3f8SzH*uNTcfE*I$zs4N?mvk48?D%82;eRTdKI(-2HPG_V{;zVG@63&#zbOe-?%z1|Wb?<_}Yf2`U1=L@Znk0Fj~8J+Q!k zCOk`DXd4m$g4y5s%{kgH==w2=OL+}1*`Hg?4+DGKC_B?>dqIh%&q(|KTcOUY9@g6)vy1W0*qCdHvepe3oztQx-es~W)_{$dkE1Mp8 z4zH=lzcTH=c1;n`=>OESvVeww$mE33MGHM3BDk=&2O6t}1B-=fql*^%!4MK*m1=#f zflP!_-}3sX4LF{Yn2yitqxHQ61SRylm@_dz1PD$3FzApB_#R1rvl$P`02E4n1pO;A zfC!3YgX?jqhJ%RA?VLue6{C+SxZAI_3&MZ!Tf6HY{ zJDqi|XGHThgm!q*lsbmr(p(j(Btky!+L{5RTtJ8NviO{GX@b zLVw7eeEJ4cG>!H5l~7M?2o~-zZ66YU)pUf zQAs%*JbTo*bn;x^kHNF_avnetFBXC1k;s-Qu2e0dW>kyDTJ`DTN%0)vNZ$=Sjv`Ym zpP)TGNkrZtH(@4Lc{q5M1nNoyOqT$3Dk7Rq{CA1LD=Y!>$?p~6l=Xwdf_{8caPmlD z4{X*4voaUL;Mw@CnhUqcnaI*#x47%Y*t1GR3(&NzR+B^V!tfxEu%g5pB!CWhm;{BjxFT%xEcoGgNRB;OE^RT4iKzJ0|%ibCz+%m}l; z`zHRFR)P5mq>{_#;@bnaZpOZiN$QL8_qCqg{PwNwga=@G?5o3zbB{Gt(nA7I$joAq z>8j7s?-V{GZOCNpo`-5Iz~-aaawCk-k&8+o?T9saF{Wr|Nlc7}VtaZpt!`tkxfZ#h zMd+0Mx=l2isBXl4$zm1hFt4LGo^s}k_ z6*?-p)hVf$IN(?Z7dd~7k-HyJ)@45qA4`uwC7Mbl=hY2rJoeMZXdx-NCZBqwP3u|_ zL^0Q?Fw$t2EkS-Rr7 z!B_kR&^Bkxh5gQ1OK+l$hu6zGUug=|bal@P))!9BTxyP&(n@J`Qu=A5B|ulutr})J zxOPqiymCB#xO1)8q@*vRwmnGgN@dw|63vrUL&Bu)H$J?3R$ns9qxHJ_&I{MZ{Ow7> zy4wq4kKR{pzMJ*vt%)Sb#~}Nkl~~Qu33>L-y$}$+)4A2<(#QRtWV7#U7pdEjn@cd| zAni{io)7a^zHGHDO_GY2H$IqKhmfMmOK+k_>GKDu1?SxRiI#-6ZY{;;H9rv?nrnRg z`1BXi_S11e*Q;BN>b7p2vnA)x*_~zFes#1Yde0 z_>I}^g3Xm{9S_f3$)}t`IJ5jTG+v?O`=-FKC{Op+(4im9Gz6Xc$a3INDUI-gUOEV5!!l;|Zj)<-&}buw zZa=+A>2O`!{d~;3$DbAX5s&ar3-eLhCMmT0@3eno@N7RCecEN?9A$($RUC?!(~@7k z(n0M0u=%AJ?OQek%7@aHvMkm$Wl-(buBxycQJmA9VRonJJvJ@;sHY zr5-HK&(kZsZ~*(oNSS`$jZbPzuY|)thrv=m`t(T3 zaL{SlT-Dr2_IsKRicT#VrEPjSE(htW%nHlYw2G?N$k`H=fu54}U~2hU9G7eQQALCiBqN43%tOuxOb^95)H_9u@Fe5NjH*0x z&8CwveW**_P8JlSD+i)sxq4@KqComFfNh76y{s|4$metp@t8&JJz*|+;6)45$Kd2# z3h}!7Q;#x7TWCZb#vc20FJD?Eqy1bkab`~y$UdfAb#tTjj2^j;{6HY%XqDm9Tu(T3 zUMQ==;0BwXv#&nKbNb-17XD9M(S+l68YK4>loe6sr`+DM4Pt&>cdKix zIdq5m*cVpl8!1tW2yFr7gs19;G_qv&iE8{lSWdrp(Ui#g=E73L<%3S)%E zFzy%0)?1AXWI23vQZwFWSQR8&iXUs){K?q0)-Xf~@l2)c$|z0q&9~QVjMXcaHnw5{ z%;t;GTX)~=yQv?9ynPwyuOeqmDZ4IH{wT`q%XI1WWks>>{G_R-Cdv9%Md7dcQ8cDP zlrO7w_bh0Nq9+thpI_GJTt+qs@!SUM_7CDZZB1NLy5;@1lR=y>%t^$%Ne3DYufX7#52o)j8uQ<( zGOdOmAMyQ`uBE>1)~Km=-O2ey`$wzK$NExyo@J5+_IK!XZ_#t$R%{WGdM@1`>!2aL z8dvuXYC_ZM50bu0I=|$;vQPCn#`x}gag9jkkKN0bRD9+!thhEX^?t&$wr$RiFVbmw zdnpnJ%5Pt4akeT+7@YQ4I=+~tgcw&KE0cWo^h{`}oUXS*MA{igWi+XiY?`++C;mJaOFoWa%|(0-yFH9*iN485D{FLGUAj!-XGS`a^@l& z$5I-$w}mB>k)b_*l?5*QIqT|q6D~u(NPCnF*;Bb#WyLSlIHUD&uWTixisUT_E@vw| z);o-Co%_IZ9UB@Qxl}6R;C)(ZDdIvE?n0Pcy0`+jQ{>88RK&V~OmuXP33|T;Exvvd zT7@o!M`9tT`JGM|ltzClJ(*U5Zk-Ngb;3qZhrBXA9=sLW6(E0^PpN$|PN7vgT~WDj zTJYX(oDNm|quuxsRKl1{!njGoq!W^)2!QJm=D<+S>?V+WNLZ{&0H-8ORdGX+0IhW* zv^e3FIueWlh|mDhX5tI=#Lra;OVLSd>f9S0iC<(u@0^g35$aC?Nq{VJaXQIR34o^o zGbYIjpp+Rt0HO$x%qQ2S0^rdEYBpfGBWW6y3~ z9zT%3jbKfnqp?bJIA3%&P*Z1}+HpJ@LWVMkHDEKwLrJ2^P!n$F;En72dvs|e zH5?UWh1TiGE@V-;MBiZ59Xer2$JEyN2wDacn5^|(a40R9C{R(K5?6fL++bumG%je@ z3}X|A0p?cT?ZhtEDPDhB_ZU7410KhPpe;e;)d#%uiJO5R7aWYAJ&!b^vjfEy(Go~1^P@c_P5J1OghLxh7qVuIx>!7hD zn~Y$-NXw#Lge&3hm=Eyf?oW<1dwv6>3v$X}xwy#;<*!w@SZ%_cubih%ZoibEnmcXg-OJN?Mggu|Lh{6Yay_x*h@(+E!gc< zt2Jnsp$ruP1~6DqaL~+Jv98=FdyAa)6c>RSh=$aNcQ|+FQgJ?IW^tuxtgo$db3yK_ ztF_>Dfs)?mrZr8?6BQ#R#dN9$I^Fw&vpQBRsB-g-{LB+6#`ddu_3&l~r|jvCjH&b< zqw2R-aBHo1x7z)ljo;8SRBO2XiKJ|{^+Pv9T9E^HZKIk;Z+db7=~94tX<-h5oB(dgpe=}M)3>rwsgl@4J$pa(5%*7Z~>t!QigcWiLW3VfE zy%&Q8(yfNF$Xe7aWZPc%q%t+>GNHah;>Ql{KSZJan*DkIP5WUaG)x{xO9b!W;v09= zft?BzKz6laN5jDqEEuaE`;kg`DVUGJ2MYq3_>Y}JTcH66F*uw%n;MJDxJ*v<#T2uo z*U6jI9y}m&St*rCa9`C#%;RMY?3bcff`f+u7t3FY!ImQj4^c@XY6_Yv40~TBj6q3g z*P{d+g8*68W+QRf2nabJ9I40I8wEq6n6Owb z05?hi=a@v~(4eysFcJ~F7@A%HFev0PkTc}&g+PT#oT?}0r|Z@4f>FndF7>uRszVKj zCQm5Vd)}si3TD>cuL8(W%-X39=sVO=y5k!@i^Fk925EOb`lZJS$P4&ZnKW5&%j>3-AHW^Mq-BDqhe{(dC|07%2+FpUT}I38k|-qX<;yT6WYMBk+r5mX`DTV3jbaKBfWn`!AA zbUJ@sc)Dj1def|sF8qSO5_CH8LsYo;H}>!e@@-TOs#!;rq4?W)g_ zZ!X^h_d3wO#(aGB-l6H>PUuM2o7V{Vyc7VSS1#OK=VekaFlY~a#!SvgSKr?FVRHSs zT><7@#AHt>W=9$n=Hs^}Cy!4+P)e+MaZMe|vZJ z`upxLpRUh#9pFhf(G+~w^zzP?yedn4qU)NR2BLy`DxaWDpN@MZmfqA>Liu_09E0H{ zA&Yx%!DdYdI$8n+q~65MN=RPW4@#CP6ME)XW7^i8<@~!co*>B-&4*OoRa(7AvBR|(qawLTY$o$eUUHxfG4ZytlDG4wzd0#ayNw;^Da_nn zhC=dlEfU9_gE-_v?#zn-6RoLDx@qRjOA4`5HzGuCn;@4;DW4fSqeTU?o$6@$-Bgf( z+g^XlXH9ynDjnDCaC}=x$NfuQ#GOk5QWG8LBL$7+BfA7l%wL*E?WJ4neb_VinbC0! zNTSmr0zqt4H^<-Ro!-5b-C;JB8F03uZX^bCku}ZFCspuN#_b_X`OguOXKq)$ien1V zalD!(0q%MREmVE2nk$kHdlzJ-_l5mYlAr3CtUS9wPyV={<{hcyg*F}OhR%i0wlODQ zVnvXB1jSV4Uagb?2{OFFH=<~ot_~Gpa&zQ1MOGh-XCo{?3Ej(xR{nOc>YRPP01?`%enU$8!P-eIFphbFLIVB-eFF$;MOItC$6{^08y?!?y`r; zY%RY;j^t@iUa7}~BycTnS)Jtvi)gA^0m_ZmY z7^9ptI9`objnar%P)ST}t}x4B*9%cMD3rVQlR{!bxy_PVgXSd8Zh~D;=T#)dmQw2; z*=76NE|%scH`aDzMD&`q>`Pi%`Gk3j60I}O4A}^rW3-R(loSYQ<~UB7J8?ZK5V#l3 z`><=b{=_5C#~RV}rjaPArr6s$brfM*#MAb58xS<$##b?UOTgMu>;Q?U2%E;^GiyH) zdY{KQS$9=pw2=Thj;lsf`!-LM$g<5b|7DKI)}40MVYiqfst$+bKT$HS8XF$-yr^l(*GsHNYG&s7VRu%;UNmFqk%6G3(X)>S=_)waIFGQ` z&t9I6Qy72Cn_+(K?4J5{eh@R0EJL%wH!)g$4%yf04_vI9UCwbZ(rIYQ2OIYEbKPU_ zdU{PkBxLMD5$~|p`1YU!{}p?G7vt;tr(Pv- z&OYd0IjEe4cB+hyIc&pTKBt^dAq)>PbFDH4S4BLtS7@+6_8-XZ($fieMDU&JWV|zb zX;jz$hMz1NXG=G?&>fx5T2`8q_>;@RCrn3bhEw{2_VywhHde5yB!wz%YS~F%qQagh zu+^whbTB=<=|YK{Y2t;f>o>Yu%zaos!z;cm&)q~hCk30yfBN9JGaT=Cfk&{w>9$<- z!+Q=%Pn8qTJ~VQlsL(pcLyTBfI$f1^dg(LftBys+rrw*)=kM)%oHxNU#@d6m>7i4) zLOFNy*H11|yIlACEVHVRcq8!gYQpt9cb(tnNLRN6Wf|(sGPkdkk&C3$8TxZwgZ8ea zkkwz!@TMHF(00%fZwScCdAORPe~emZ^BanKfhF8{Bi_SR{^0Zt7<4~YMrnQIUQ+*- zKk6Scr-(JxOr^pSWgPS2b7zz5?o^80AQ5=i95nDDRhYX&D689qYs(=g? zFWiZHnpeI&)XB)<@)Whix}#`-t5~*!JRkMRX+zOz{8nlh@hIM9Ck$R?c*exaCW=lm zn^GnEygJ`b^`<3Qs2)Z^wzN3Tt5w@W?wW zkqXgQU8~&RuSF_HMLv#-a#;_vc@RB4>9WC7v8%YWbqoY3s&{b3=zA%XaoMVV%Vn3r|$JFC~+O?q4LH#_CtT%A+Wnlmw;s_Sos`y* zw%&oGL8MLZrWLCP-i1f-W#cu~Bc(MVwju^{CCr3QzC}?sZAL02F`}& zvY8HnnNB&GE}fZ|W-K*NFe?CR z1%R+w`(s(O3)#@(tmFY?I6oz%hb3+x`?Ed(76GUUZLA_77zXg<&jHQnP_yNP$O4d} zTv%f^6kx^6f28j zQZQRSyBv};wumRUh&ZUEH84wF6Uf^r6=f`@-oI8{4fxEI$_ivZiMa+w0*L)m5J^5f zsEmt*wUQq>5LgCF228ukb<9o<@E1zCA z)_F(eETq)%d;Lv6GARu`PQr|$!*Uj{l7UPS+d%^lbkCz}Fv@AJT`|JEClDJ68rxEZ zFH~fuXmcvU_JUQ6IcOPuISj%e*sZzs^Vi2})a-S?nx*vM!i>vr2DD+wn6qZNDlkq2b*mKLDpH7 zZAxslEcF$%_g@N#NO-kdICN`Ijj;b}fU^q9(KcB=)NFmix>E)oxslF=Gg)oDAkF zWfwhd@H))OTKNGtI^VqbMCOYq5;EF!YgwvtPDLW5h%J7Up=@4{b*l<%&4Ta9OanEp zWrb=A#2DI2P&snw$Q<-9>7Vi9<;qlvMR4k!A49Q38uMhAC#3jRPh_30r(I5#T%t6QPF-=PPq?OG#8O_$bH8d~0)4jy8eFFc0E)d!I zu;98|SLNwvT-~c;G@Jkn1riG)o|bymu9N6jVnaa}?9m5RaJUdMXF=*#uC*9Fe#@(A zJ^3D7uvYLP`2}L;pjk$9v4Dn(4Z9wa6m8L=^^z~ecjp!_wYZTa5ciy$tK)OVl)3mi zTOTv?Pal=#kMSIR#?5SClq5^Xo!g}URzgYT%-gp6$G>&>7}m%#`%O;=?*?rHa{=KM{#edgi9ANnZ#*Pq?Pr7EYno7 zOka$oWn2;7UoR6+M}G(7SO73#=lv*xJFK(*MOYnv5`e%_>KNc3*I838tB3ul+7mu3 zs^cO2dlY{QYW_o1olu(wcLperit4a<1e8M}ngD8s!C(XgYm)%1gNd2o=#jU2Yz&u%rH?umt(ieVj0$i@VwFL}PW4>T=PPyaVj;~w14tglbX8XYF19WE0Vt#3 zBoklCQhyQ~y%N_CjQNNvJA}0UnzbH(###u1W?g2pv=5-x%Dfc~aDc${?2OP6uXz9> zDnHiBH;;atAqm?4BHOZZ|C);FgWw#WwcZ#yUjYK`&7+<`TZf;^-r?+z5F`E}5_x3w zZ{nwa>J!Hv8BGw#2Z&&d=ITgm#RxKbIWE3UEH)ZO3HIRg=)nQUMP10MlhL?jO6F81 z)I1s=Lq+TkW%J+!fvFuMA8Cj$0}z3*lHeKYVl0F+a7zWbwca1EEG?$GEAD)^N|kz! zOyK;|M73H*%@?^5F0~vBY9F7#Pu!z8T1cyJ9Mz(EHUj)z`{AhS^$-UCJ2?1HxfA(k z+@WT0naf7Au6hS5w-=L{MeTt+XC}N_Wb-=hyd$ezpcmqHn8O!zOL{74F5Zg8y+^vK*RxSo!|fO#UA}ElK`+)_VUan8yG5 zYzKSv6Am666^LotWPTnC0Z~y1p|NZ#V3-O|V-?Z{$b?vnF{xvF9wx}Z(ApwB*glAW zKZ(qyIA3q^8CWaVwD^X8E;Nr~j^DdPBbQ&CZX0e;HgTOzR5(xL2XS#k2pTHqG}S~yd-Rgq#C>==u-3=#msNsw?Pya)i}Nr>3sBAX>W;V?2d zm&bfDJ{-iQFEK!1o-$a8DP(|;%V-b_^8=db7M{B~r-{4B1Tf`~^Vw;c5~`aV9wm_Y z{~X|CKaTKoyFxpdv^buMOs^*t4u`v@8R~{GM_VHE76R zKwwMMma~yq4H(h6Sn~n>Wfel*eT_=Y7=Q;TVQfy-Jv_Pzr>S4fRay1u;Kc=rB4k=u z#^TQ*q?q{|v7j;*!QAb24}m8Q;M=E{QGf#u%tuaGAS{5t!E&rNMBd5@cjGegZ1C}q zLcMLI&sUlGJ_8oF0}ybUTWRwaxBNaFXsd4t;jZ(ZG?rkbSF|WKY!GmALAQSr)L0APj!TJZQXp2XTHpH z-GiGKa9+#cJEK>U27YSC&Xm*Au%YL6-vahmDRx|ndiDy8r_Q~1|9bmf@9npAFTLy+ zd`$x9pSQjMh~OhE)>F?V*aD^%*DU~2sSZ}fucH1KPzy|EBwQ!vAyNZtDorT4VnX(W zfqhM^ugXdK0cMT&cbVdZ-JOb~u14@7eI+O|3zRd8?b9@*Ceo)a$P5G+;H2L=ps+fh z#+j9_Xc$?9%lLL)%Ra9uRe>W-;j+|+dBP^Id63-GbB8p^p3e)wOH%r}RiqmgU_*Dt z{NSAo>&5ITT$t}S=8?Xh(QiG#{x5{|k@c4UWa~Zp3B)~)ikIq?44{Y&M=>i2SpjxR z31qa;M!pdMp9R$y;5&SkLwJdm3`FL!I!S!~gdw@fJwpl5C^;wwSbJQcb!D&&(Zdaf z8QV9L#rQZ3#KUAAU~%J|5B}pFd35AC5Ul^Zhu5F__TOt@j_MEo(>oGLK*C9o97vJI z64iJJB?TIZ#`Pt!G1G}yHFFL|Q$Q}!m;kupR0#RB3Yv|x7YqYxB{YCuG?*HOVcSrt0LU7HO_Qsi;LxyF23F#ZlMOzwyj%U4 zmDwh?ki<7|8E%WbU~>8&H84bnC#K*3)de~_F+=~d^#Q+m-v0Bi<-!BRmNoG#)j{O}NV~x(_>bzAqrDONmyO5%k@3I3H|W_9_XZZ13dj*9%g$qg zBwli4^4>>BbqFll3@Z1b2ZL7tG4Ulg+79MO(lViou&)g>*`+DC5L7GZL`!kHQ}FR+ zrV5g8$1-z~_6g5IB-dy}AgE%M=6ol-1#PNaiEkVTW5@wS7@$@;8tjPQ=2mVw>;`&EV zw!>AJM<1O~T$rO1iW=Iuj^w@vg~D46cD=B;9LPly8LYTHK3~E01yewetu9`amW6LO z)xJLgqJdWlY~_5ArcI5K+(TM_zYmT=zTmg){ZnVs|NaL*YBI0*%MRfG%MruZNVpQd zhkXwggg~&VS6lUfq5x<>IzLU%U=~Rvl~7O-TB#Uhw+|&uR9Av%{y*ZrDk{#c+p?-~ zFWlW-f(Md9fwbIp>-aVWBBp)l4;jMa*_do6AHb=A}phiTfP%Y!LcSm$jPz_A-3`pO?Yk2LZyu zqEZk5eqS|7k-%xv4M%=3q_|*y=%Aqp@C7C!t)(-?LY`P8(G`-a#Zn2cgZ4YY0Bk@Tz+ zI6K#evT%s-sBf;mQOTqW0|^)&k|^Z;;ho8n$GHwh{P|ws9h70yO!y-R8|$_?{S7Dl z6`a@e-(JB#)qfzWq94WYJ2WgR4x(S5e;GRz@5q1q%iI1}KR*fug}XiUPLG6SOM+PM=O2fRNTP_y>GviSTN;Z+5kMy! z0Hcl-HEy2=faQJn2;1@Ps4q*zizzQ1rywAefHXyjG2VDIUJZrpDa;{%!T;}S&kt=( zpezI|pydBn|Mh=Ul%TNYKfa)>1?~SF!u>b>7bYbDfJ-e3iTe-MqT#nyD7IjnJv7rM z3IP+6w`xe&4+qvR*&J^yoy~;=CUm96m-QzLA`tN~B$mhrps6Eg%lwrdNXeGnrp73j zst3oLJ+|ZD4@2Bop*Pu5y%B*z!X4LVcnHcu(0`T2yh}R|kM_jIF$oAT3c!FT*5{}z z*)2sUbAt6=ybztRdttRbmCmHl0mc(gzVh?etc5!#s(yL(tq&m|*ha=`R0UJ+u7$Bw zZEt`437Se0iUNdaAr;0_V{E#e8}2g`UM25n8=m%X>6BCpzxV+`K=poZOqsF2xcYXo zh%jogX{`!i#Wb8^o~vC&0N7IVvDQHYgaM|ZDGKuG^!~btX~hOGPmHE{o?rrDy{|Ye$#OkAEzJvIIxF*Yy=BlK5C#}Kp>g0TXFtRA%bZm)yn!!%gD<=~ zFAMwTeVQtY&26zVG;1_h!|^twBqmyTB+i6tPc5#gX~DCi-r$zVLR8{ZdrA3Gn1)3{ zHauOWMaVOqHNQvz0Evs%f-e$98?#D>eBgz*ZZ6a(X6exGKe(){5maSUS|b`}uDNB! z&4iebuV_?JNXVHDyJ*YBjXVVqt>{*5xqN;j!#m1s7=U?nVHFXqPTmxU#;s+@-p^k( zzV>Racz{RbY0Kov2-evkn6Ra;)}njkD~Ln*J~;*n`AJnC4bPP9qoVvu+A^tI#5?oC z%XUkRivFREIJVg%+Zg+nkp#=mT}1mqV&aw;j-MBriJyJTUBZb>x0vT|eb!6)M-^Fv%dGY@(osB z6kh(vaD+5XVpo3ZvF=V(Uh6XrS;pRy#u_}q^k>aS~lI4Q^-Wc~2 zn{h8yxw-iMBGSa%EhQkS&aijxeCvon@gBK&=XghLk$|9=2lloG@a6bDI}F9u zz<3qS0SueAgW;86#@E>2J~qt2zWPp6BQFD#&C+~BTI-D@EhMTb`P zcbuEPX)xm}KNj{!5(wie%0~t=w6JN<)&;>8a><^El7J_*rI%RE!%aX=0`sv4b*U8T z+n72?92SC7MaYz=CCclqjYSQ`xaEtf`U~yPWf$^3(ovaoA^C{wG_QHnwI-HAIUYn5 z%OfAsjlP?xl_iyHrIT1l$1hWu|FkuCT(5w1RD8TNbO}ZDuZ=XeG_FRCHfc<2f=0O^-4wy=%x5G80!4!Ps-Z@wM~g$L)0MpU*a1c~EFLMUX7fVUMi)_YO|y+exy5sPFF>t7d{YPxrF)2@ImG9J}_?4ocJR1todI0%cRO zacU1rg>1qwOoZZ}KzwTQp32Wbi#&LwVps-pPZOXlSa$Y>=qPjeTv_k$-F%^wl!7)n zU3ia!7HWi?@8y)kO`2H|KB*}%L34{|By(Ht}7!xxfr04P#G$~TphZ^HeaENI${ zX4+|I9%hoDY{vJJ;d8TWNe}_*%a|*8l}`#%R*j@snaHIZq~T__1IXHs2|u>3Vp_Y7 z<-d4t{Mi29bIdZSx2QVaszxPJ-1rR*Gj7|te{UkCpFChbwU2;uPH?ZqqxvnT!g4(K z!BK^9sZ=#3nkHs%RP}Q?u8|uy$s9dxUf9%hoxgff{#FBf@@|r7%7@Uo{QyJ6R*;j6 zMLflYXP->UiA2WYq`smwo$T9~gitf*y_JI)@s>f(r&n6XImAbZIODh zZB64wus%QCs5jHa))Pohav98N!R$i=z7W2j|<@(3#**3 zTy5e%w&O?2H4MSWw*Jy%*?_e(&zENldPyJQ`qZM?Wmls+s^#JmwT5p|?HZ+{6S0SU z$$xao8_>&lcANg31NI265qRTj>}t)RIS`wByBl8RpnL4J?ZMW^h-D|(&u=>SSUXR+Hel=_Mw;56r;2Mo3 z8MXQK9aEaX<@=J|Y7!P!vLkAGJW)C(W?eklS`6HLJh?zZx<4D0bOJ*=9$mT}h5++t z0*27hXKF#WggXS6K6(arfjG=vB})QD-f$Q4_{0D{zF(^ez;B6a{fXg2%-rd0uPu^J zDUA866JUwZN*shu zA9Zw(Crmu0a;RTS_p=Cq`zZO@J!6}x}>(y~ah;*9X_l!=l%txN6 zT=NfATIn@}-lgf8A1oLW*D`W7v)tNkh8{998AV6hmGnoY#Kr>-w%>bV7YBc*9-WG^ITo84tSx#cWsWqPcnpND6x3|Jr(zPTa{C*aHN z8qJC+&wSPjY&cC)f5=5_%|Z*$Ic#?!kj!x?OJPAs+kVK42v7YK{^BV-FEKf{*&-vx zBBSFW8`tv%zIMinMKUUN!58TQjEH=E)ONMAl<0#PsttZMb3-c}S~ zBuFF3p$?GOz#Pd4!vP@B0RW->Y9I3>5kS-nN>>3NDjM-A>yaq{w@Qt#i5saS>v43N zK>4-Eeoa6K4i0m(PktSiVw2u(lfiD&FPS zY?XTnF!rj&Vg|TW0z5JS&Xdi~lTA32weFRzn3JtoajjUg0I|$^nB7(wU>oSVE=#9n zou=s)*aib>V2ErGVs1_5YEYI16#r=Rl5M%q03bseADG%2D{DazfUInj%XvpsXS3pu zwkVzUR;&6qvYqhx?J67X`pS*dUSQG8Rvu6u{$^8KKdoor$1>|Ebq#L5JG z(Shogx_c zyWy%B^(H%!C>pTk+A)NBth{>BNdS=Z{&eC&jg9^R*>)V}F4o9ynk-hZcP)oV8~Sy< z0C6j87NZhM`!~Th1LayU3$XFLciLf)sj^dcs%bc~{aXc&CQGNTP;G7D2)k14FWFjy z{*jH6k#geUg0Bs(S)<7Qqn?|iu>S3EzFDJxBMm&iN0fi-9sdhP8tFeh^Uq_xHzq(B)y_2y^<2OvI@Pb z3YCFAm7YGml?t7eCApg$nY$aAks+nEHHED`{RcxDS2ucZUplC3ovw=tRK97SXyTD? z6=y}0=Sm&mPYSgzi;f~rOC<^lp-<1GulJ|QE1)ker>kwCYwM(g8r=ofIza)Im_F~p zD9V*|N+?3z*wi)Bp7zIbZeU=1d3kkrcmL$%?CR><&CUJyhadl;R{Q-U{QrJI5uIY) zusRCAq<`b6ssCsAi#H-gKoF8L14&n1{ec)Nq1@lLYET{O-?nN_Xa7QUkVyqOk>?Ag z5}EWSntq4B{GRAb&Y!Q)Y_!~(Xs%rOoip3*?o##JR&5{%0Hlf};iqX(lfB>F>_Gma zPQnGMm7wyWOu3b9t23(eTw}8Jngd~wGZLK3m${o9h9?qIA#rg^CCnlT2et?VhHXx{ z63UVo5#^&(kup^JG6aU%M5n$ro66EDh#^GOngsjWhed@q+fmDHd(wXkslq^}_f>?u z2rkA%e>K(J=~j~X<@xA&u5dIouneQ1&Pc#V>>iO%<0;;h@@M86^<4pt0Zp;A6JNiap<@M(N}p|x7?sPv&IU$ z<-A(RudWRJaXweC3@DbZVU6 z0?_u!9~fN*KQo~k=>%IRzt=GU_c2u_fmc2CDs83@t*mBgZ!&DSx`@uJlC?@xYpEfI z*?#RaerL(On3RK7O^-5{_3JZmpM#Yl=NUFFKn=DIkPK#}_z0=auE;iB5pBv2{Ky>Y znL55{55hPHjFott`@4ienV~OY^f{+jgJ5=t13k;TV5*XfgGnC zMG%@FG80@rQI$6gqB5+EN#TcvEKW}m3Lp!XwDp7uW}?ilR@u!okH&o5!1&IBb@$x2 zQKH_|^Tev*k^p3zj}nDdn#8Nj;b8OZdShyt6(Sw=2!Wj?O%37HMvWPrjY|CI(wly+ zrILZ?FoQ*gmNbV7pOufm))78fK?2N;`y+U;#y7~SWJgP5(KA0wceRIy=>KJf86LcE#2aYeBA+?a9|{qQ&=z4pl$zO1O6 zDeJYX(h+M9_%ma{)*UI5k%aMCS{|wx_~~?M(K?Px(zgJdR}2dE-0~78OUgo zDrM)87C|@&(A}!p7hz1g(x2|%5rM46x!FWI!2I}#5UV19r;ScYCY~+kTn1k5{v7%Y zVTrmd0>DrriumLw1ej1HzUuz2fZT^ob`5&hl`>!U7RFfrI&TGU-u;VmO2WXc>LH`N z%dBdlr~z~=fhp+8k2Mj?AnUG?cOUVJA5#?HdR4Np;!r78GZ77zYRSLl>aDi4rvjig zrRur-D7J;sH0Y6PaGU_qpE`i15gMN|!4b-t5jDNbRVvN62BuP7C%2XnU?10G3nqR< zb0$k_Cq$)B>GPlz6BL(ftfrF|MlIk7l}_WXu4NUt64A|AeMwwK7jcnJg}gezbvp-f ze}Rpo^W@yPiIeY{X|Y~f6xV$#-7jgTOR*$JTmFslQtCowDlx>6RSi$s_vU#pnZ!X- zs)a;Z_Qugr$l|8xnKmfrJ+o=8X&oQW+9Y?{l0WRHhbn|&3wROHGU1hXnH1@Y22`F| zV#?wDSe7Tr;+7grgdk#_3J3zV;%<`pYI~xuG(>2#Sh8AlD(7*DWklB?(-GV}9yJxA z*d=mR5Y9!ECkNwfsl{WX7+}31<^GBJ45QD25mEOovLrv~%gi`aalVtcTO_tm)4lN2 zDyMakm4V-P{$63a&s!(G_hp@4I1@XZdz+Q*E0{o`(X!CDxMO3BLn^ACILcJ6v> znnS1Yy%U@q9q29k^QZL!--nHuUuG)8uH5(M4%<86J;kk%+%=QD*Oh1W&VDT+MMbA4 zW#cfphe!TSiX03?;BYF89;V1vrenBzW>`wWQ8}fEICV4a zg-;^+RvULqJQx#eSR%Q)nu{pFWXz`8XdJ(^Nz+e=4K%xR5r} zRKhBHB(FkK#%z&LDk*PCvG--smhBto$Dll`>!29)Q|?l|YAnq{?YQrC`HY!qYu^_t(#_;QjEtA zWy;v~=JX=FrUH_1x?eVJZmiciR!_$eJDL7M8z(lltO6!U+&&fGm-kZ}`|o`{XZts% zb*X<+tq`628nRwg?%zttV013o+B&!){Jbz9mF`Y_-l*7LKj*>l>a#$1aC$}hiMv;D zp8WZ;RhIZ1fbg(k#^z{WYIe%>g=fGg=WgVs{+d{<$MXHdWk9Ie%6C__Ed+EIP;}O% zcWIf}>sZW&W74(dS09_+%{(N3@%~cwq3goz*G2fCZ??f~>*4;k^KvfPuJW-*)r#+r z&f_1u&&#o2OfVkFTD>3oGF&aO*e%y}em&ALdVWcKmUznId)+0-{-P`}_p5X3)~e#9 zN8igFqJR%SRj+cN9*-5gcQJY&UySxV-{)>jpRZns)LZXMyaH%qejojSnC2%_Z;LN! z{c{vI65kSS!4Fx}A8!ncLcpZ;=pct*{boSY{dO9~_=)ABFH%DJ;aOK}4eG(eQ>uZDW z`G()camWkR&7Q~Y!?m05T}$}aQje?^hkX8s;nLt*de5vj`#MCgpCJ+1QdTeBBL|P| z;oTxTTkQy?Y~tzNx(WOj>BBiO-DARZL_RuhN=7~Kxmg`Jb{t3Th4{X4^On`H2}g`( z7>#NxiwTuOE*F0p>E##>6?N5=IVL^ z9-~FU6|J_k$FWif(H8viBdeifC+2zT&(U1?af|{n1!Zn&p>9*D(d!y^T5rNZ7K!=y zZiGlaMCEP?sa|DaiKG_pI-_>4Eh59moWhQMDcjxX+JlNTlXlxe->xPQ6S#ADBy**E zULr=Q@<*%jdESnCzgvmQ8A~!3h!d0cs7dou5s2J2i%$%V*YSuUCQKYiiLq=88ZL{u z40)+_8k0@$a>Z|LSRVF+KgBj(ZS+1FSu%B=-(j}Y*Dfq9lhEgY-q)+#3y#qTCdK-K zAPU1Gy$mTSEIlOhI799(?Hgjo^u2euMFyc}Vzp*kJYkBIRC=yfL|eO4Z&}=yWbg%j zSm#OM%XS3+aP5lJCi4 zX8Kq{{~B3cxj7^)_HH~DGcZ>SG5s51N}E&`7NYZ0ITf5Xu9#z<(RW{DOUtL#JY&if zabW%yX1GO2Fb-3=@+mgV9N^bOK81`q@j5n)J%Eg;fFYwGnh&64SitmHz!BlVvR*(> zRLJXDSjbz*osr8&l(^=W#jhP8*ipEV;@w9W5NP&cM>^E@d!gQ#3k83{gjxRH3R#=0 zbJ3brAVCp6f04K)fnKS%>sY#?MpUSI@S}8b=V^-ZS@KscE9F(sRgVON^nBfnLZ!G; z&$9x<$0AG}peMAL8D&9lT zg>=HreYpBsc!5WXb7(odS!92it;Bjs$5>=>S>$B9C6<|$QAKE6gkJ&?oPuJxrBb~8 zLq=*_c|^M_HIw^$X?F*ND$DTnGtCltkMxqVA{C;vH7%2O?oK^psmnyZA3ZDeDoS^V z;N<%%&HFPh+f(3AtI$Rhcghn7&pf*5PUQF#JXz3o26-iz6sr93NZ`(5uJVKsBEwL<<5s@ks z%2SI45=$)&g-?7?wNb$z9kP$Hw>8%}^078;!S<}S$nwVummhZBl*QWu&0doqV0K!S;{Y;XIHbO2f8P4E zk`l4_R{M<9Vk;j63IP2&R09Yn%h47vQlEZT<}+5MK2g#-`2nd8R>=@RMO2kS*BM@s z%Oc%1{%mD|0fE{t0#-J?7@`jIr8dZ#OgWe?77$|8nwc|B<}qx8&-&z zapxKHEwlGgr}I*})lQJ&2XPpr|!m}JPyE4X8MK-7CkU^Vbf)R5f8fW+pIBFV6_(6FlRu)6oKX4Y`66AXwi708jG4d|;5p1=wnHgg}WNNeM_f2c`joWQMU^voN1O zT#WcwW4dsSA&Ahwp9)9fbDaWq4pBHn)m@~+`Kx>g1Ip8#o!?cg?*t&PXPdO0OgtB337EkYalrnD~g>!+{ zXMvS<9_@0%U~~3I7ua}ej8C4Lrfx2tWwDfGB)MzRa&!7p7sw$z36HjfBtH@5Jw_lr zZuc}}`?OR<@-ftUB6M?d1vFuwFq$wm-taVnfH}GzRGyHBVqAfB_M`PjE9>zJrG-0^5ww5_zDpq4 z++6(Bs%G}8xXmQ@79L=0^27+F%QAaGf@u{smw^V9pC0a#n>(1lDJN zjOw5N+O=R|GeNVpSi}MsvpHqn{n6ih(=cl}%zHY1YEy@FYvOr&mfU94CVPb~Y}FfW za|3PJe|l@+=iE%ymf+TWi|}0AC6E?vnLv11TX_1=2b>hW_T;@yo4p-M^65!#krJ{X zRjq2OyB^xT!X3R1d%1qn4Xn1=5SCwWN1JN0nM5U9!eARSub%Reo8^<=E{GcQs#5hw zU6_tuS=3z_Lt9z0*_%L{c8=bp*56yr-tybp-6feMd9|}WJ+WUk@?v`}UT7D+X1maO z;ngMhu^Z?i_lXtlpmchzdJ~T)Z%2ysQ}@&;v+zb4=|s`g0kQ(<{q$Il?qLh+{1fU? zrqDRu^T?U-n1?q$NzWd|%qIKx9uwQv2h;@@-(v^gt>-116;9tkzL?by)1$(^`+L*- z0-yKaZI7GjFGXyD{aN9Tqro`UBkyZw;)Iq$yJmyr7rS*~RGwGc^%h{Zhc|^N=(kpR zd``PJmtcgK-@N*0XuS}sdk|m^LY&@{c{le0{g{Dl%SL{0!RFWjZHxZ%`Nxan53d6K z_4kAHPK13=T1YNQ<h%x?FXanzBl z?fLcRnVOmzZqb<=vhggT?Jw0cf_Z)ZlE=#bl%*r1l#|D%t zQ2S?(M9s_<%3o(d%}aG}OQXJO<$TMOyAxtNixXXN5&g=#_3d5k*^lb|%bzP1Pb_OcgLIuTRxu&`PcZ3y+d1C&fimm=%cCr6i z#rCf#iGRjCWtz(V7tFJQ695c_1(?&Oxtveb0Ki0uvdw>Co)vnX%S=NcQ=|bGf%_fJ z7WZ#wTfYOZV{FNnlZoBl`NJBc{L-6htKT1u3)RNWYwqg zFV100F=^^_vw5#Oy9d8UlE3W{+UPUkgVBsO{MomU2wzIhuyfWADlKl!`SoC_{&+X6 zk>-WyXSVH+NLRKKz?WaT21GJdU-ODUg2q?FA}MC*l`27ND!hV5hV%Wfi=PXe`q)kc zOUub#B!)nn7U%*OHrE@8I}~DwU~y*z1QGOoig^|>D-34{LEMK%Nu1Jna4DG4m`P&c z^o3k$Nkf1Lh~U2W8m^=3NjR421rcvc%8xRvD{v2;%RS(<-)Byjt2qIO+T#F?*8++; z0RPKggYGiE-@9xl1RjTu;NP^8 z|J5#gCk4dgV6m5OESb*y%Pa4XRuY+XeZDUk1wQQGk@e<^F*pJi#JYbW>!h+REMrIn z3~7I9C0p(HCk~NC#NhqWDa5P%{QEb1{a{eYsJ2Ako{mgO7cSoVI>N#@lUq^?D z$;{^fm?d(PP^~hVe8-I;G67D8{&Yw4`AVHbff{iqG_a)2X@A7isPgk~tt2_w3IGHe zN@O;e>1zLWJO_s++Xca=DzLi`T67fxARZ4y}iGF0pJ;S z{9y6ScmC`$RNj-FK&V!7HwZ`Fd^ecjec5gZiR;O3C`AavUKmY^`Cd2_S>OA!%Q${( zCApW)_oMlb%JyS~?oRe&A@Ga`apJ!NOQh(^e+QPF9waLMV_*s6Q5qCkKT0?MYnQd0 z9%b5(Fdk<)FaOp`9+e;Gc;B5K=la1jo#X}KS)SyF(N+BOF6)=x`CBVllwx^SURF|Z zR#DY*c2@aZH^OvY)wFDRUfp(7abDAPcXnRe2hV&_H-u+(Q9njkdC@S%dw$V4C&7H# zw4`nY^~!r+dD*h*3iZm{31R-+b`X;R0GvqJTLMnd75|f09^H;@8C)JTQ5@mI%Ch%l zo2U<1MCZrRgUWXSMb;&CD?k7e$n`)G8Oy~mey+?_Z!Wr@EucK2%C_u+X{Ww7Kf~G* z7Jx_s0ku3b*TIr|Rj~Kc$Z|ktbKx%>W?yeqI7}ij7;?^G@m=05DoUcUP9Z7UoXyvh z^*NWT>gZVl#j*ALO5rwH&V~V5B-|ZLA4pqD%`1hOreKmyCP0X5ji4cpX{Rhl3;y+lLBum^`-;g24)xigdeImU~!W^l#&(sWM!{ zj$eFicMCCczMon2R(X7K+edCGEgED2?$`%LISuELDKHJ^-bHeD=0#kv&%vNJUG>k~ z)ja?K)`oY7n{Hoz-Yb$%cfc+cRW!ZQ3~*Kxou^jtBPsORvr3xCGD>|3H< z-`*&8&evBTd)tfAOxvCG_hyP)fHyYgSbYY)zHW`MH&J%zEZcXGcOu)#m;OJn)h^fZ z+X0$i+=#E104y!sSM68998pH?bERyq^VZ(nG~_>KaGRs?!gC+vc9VUkHyibuF&(B2xJi65gV%m=Yn{>-RVs8W{np^?OvJ$RlM%&hxLFksmF#?(!?L5& zzT@Px+z6JuGUd`btBOl=IP=}|I)s-&F^Sf~%sP@D{ONacTHvT)s`B60!z?PfQWxtE8zdW$&f=0TK~Gq{4*O41`z#u zCLih|R0L(Wp%gZhyoS=&P{JC@R{x=@p*;1USj+z)rvI?gP(J!k*xG-v&;LO^|0Bx` zJ(Gau|0mZWf){^13M2RTBT?(UQZ>xpjidJL&Ix2iQ1_nP+zy#u4Mez4kL$mZ;G`5kb zb_y6ouiZzuDHV>PL3pFWBwgH^k-0b??UF99){rJl2P^PQLR-ju_Y3SQ-KEO|e?oMj zGzDQle|R`D67#D*KX?QL_-Ax?u%S2b8e`@q$BtpgeK1~zv0??Kg*PfDqIz6zUY>Qp zFX<#d?_g;Ml|D+p^hVNQnE&-NSUEXn;wCxzD_<5o+x72 zn|_cMqnlAUk#!rD2?-VrRkVKgcPbG?!KCF7l+R;@Htv{=CQe@2VJl9O=uH3^btS*` zICwoNQ&Cig@HtC3!n|x}c$~RDw_OVkeZc!y9DsC~=Hsn&WNG_;5&WG}pf#>02Uz79 zch&3-@~W0nK)O~lE@;9fc-b~P`{*FKM7~`!9&Y|UIDb@)fT$qWQXRkO4ci}5 zmK^CuBNfA(qdLvHB)kM(-+1GF`ls$tu*y%|1MR$@MtJ~{GtfzCC$5@e|C_%2=ABZV zk5*;y;+RWzqQ3-*wKe*mTh{DQh+1olwU}-QY+{}#?G#~Apw#dWvbF;V)-RO)ew5Qn zjnQeO`?VezpDe}L!B^pqQI_)+T*c3LhgG6{#6z?q`r0T2Ej#(G)$p6RI5({*B8SKA z1T-8J{sG$$pCLf18)uaV3qzn!AQ`IeJDfAx27qCx54#;LvYcrMJhm!(ZC7wNuG149 zDwP^oOp*6FxTfW{?333y9J8hW58fAICipq_we|wc%esj_C;YTpgkP~l*sG=RmK8YE z^v}TDdS9kV4qDj2EK&(8x}mFanEBk~SBi8Zs_ET|;Z0f1Z*D)QbGle!(ha+dyA=MGMVU{`bt9rxW3^9u#_U_0_6+#4|XipxHg z{6_0KT@cnrl+8n+>Ew0nT3;G44LxJ$!0($WvkO{y-+9_HIm$`7t4gBw8^p$%8Ubmo z%yF5XfKq&uatt5K@P%u|q^@bri1#Fuh9*@DuTG02M20gKChGV|P)n>$mm}j*Ma0E| zqGki1b2xK16ii8`b>TtSWB8c0SiKZn>_NUdQiBCNaTkbjABg(Y0i{lK?8z2FMTO{A zIF7kxeYO-0i$wnL$|EJ*V9P_IDI&C`Zb}C!YZ8|DDC_;aL&Y*Kz9gL}sL);z{%dSk z2X$23SX`)*os5?djV_fI&6^x1>qMHO-kGC8AsOWa(jn7us)Kfs?YcN$D=LQLyHRCF zmQXl>2+5cf;>03$zSbfsHZ#%Iq~N!j!d1m`a&Ly?=akc^*NPRBkm9kohnS|*F~$7C zrqXcg*(ou{IV;yN-`@>oqFTg>a7a^XrW~*?SR*R7F(yXtvS(iWbtcVv3evy;|86f| z{~nl1gBIm9(4T_K|3&~>aG})}T4cqv#AV*gDmf~vdu!;1>KiARnrB=7skzWn`=`kM zV`2T@o6J9dffn3<9+>*w1YiRVH~**2TZ8E!BHf=>Q#O*w;BR>im(t#EdCl7d&JW0> z&{k6^LNFHE1l&;j<-w6d%qf7Di{Y>o5b%{E)5l5_a#TPhctA7X7$Ji-&Bbc48HF0v zug{PTromnE6&yeW1dE^s!0xCP3yXq7)3D!v83CCbUdZihU?(cN6>i!`!!H39TAd-n9OtGv=!&u&wj53U z{nlIPO;#GBus|@PA-!RT*XS4;%QHfVew@hZq&f^=$}6R>0~3*pFL!zbjLbrFBaPko zKa@Dd{X)X&1Hq%2`}u&szQoJSukplde*E`_0@Jt#+$yhG5n z#hHZ*4#Ls+^_I+A3@8{(?Lv7O1oH$nAyv+hI)zMCY_PdHq zYwhS_#^5NjqB2zr83<$E^Z5LmGDt1i3Y}RnkvdbkGiy<$y1~cwa@z$Y=KhL&w$Yrt z$zs7cATsxjUn6Qm>S4fyj61jqoLw;&_|Y-gI%7XVyF40g>Q=*HDWEJ1ww39CRn&Ri zf?eF^ly^CnbN&R9i-QF*G0@_S%dA|bD^aowZy{QQ`B~Dc7>00e{xL%veVtZB+2LL% z?16D?L!Ho!BssAc6Y{Aa?pOj6isKb-Ch8th#iAicg;Oxi*(q%^J6a$|(6%bf%PxY9 z(+7417gf~Qww;z}1rw7e-H2uRdTF$YIIS3t>cV6b7g~@-SBSizPvYsmZxP1Kd7*vu zrP#SpgV+tgk6-XClEV3f)21;{X)kUyK$@g#9gar{Q>KL0rep7e*9L=X-|@YZ#E!Hr zS?9Kd&oDSQox%&AQeo~uNhcz%pex>oPM0Udx9Z6DXDRI=0%;t;x6d(})^=4{m`k+7 z>*(ESQ)K6D{igq9mqBf;T0Lx=O0Tzw1hTZC=o+zV?ZytXY1=@=b^3mc+>ej#(FK>$ z`vX3gxBMC&UdWh>9cpX)88BgVjxdu>x?dwk+AWb7^`2o+0oYux-7#eWIaawaS8i!c z#g`OM`&fxOJhB6?wru=zmYqjJrN$r^{*N&-UEaTX!h+Z29Yrya7aHeIDK2eKgGnIboTjSB z;p(!K{{^u68r?{N0uga>p#gi00-0S0F}z4@xuxSJ+iXzofx>#gNrfb@th^?15hQ7B zNL?`AKq&}Wk7`i>@c_;EvsbP`K#@Rycxd92^y&_WOZtZSC=erUim3gL!o}#6xtFs9 z5GRoC^fM;fcP+!@W|cCNa40st9E*(8gSWYk-e!Aq!C}Ee{?qNO;UUh97`poS4(XQ! zm}iS=^X+%?XVOQyJCAQ6gu@Ea5AWmN!yJoDr9i(#Q+PpSrUcn-&jdHJ@y*cTemuJ6oBNBQN*OB`tEeHBDCBDlt(loxUl43Y-~YE%B@~Vgkuwo zH8zD4(ISo&l#CHwsf)2d&806e)P42vZg2xM7gLS{&Fy!-!7C`n*J3}Cv8ZdT08ED;e?cY-zUN zeFHnp-+cqLCx9YLh)`+mUuaUF-(S52&+lUl0DX`HhWf9*;s4(;_IKa#C->p6zJZ!L z?@##dzageas^$N}vi=~Zm|x}os6^pF0KY3>5WEsOmLEW*Ppne2QO2Evf+?s$a2#Do z$KGls#2TLs_uLr(3-3xex3yu<1VF^1;E&^I2JZNyw=t!hrREt_;9`3v^SfLf1jUx3 zTU*=Pi;ZJkg5F*A8NtjNlLjTn0sQ+xDCm8!{4}o(J5$L|-sPoL_Ep3C<6Hj}yu0w% zVc$@d=V%vMfJbZfdC6g?kL2_~g$wWpxPjIOpUJB>Auo&o3n*NWZo&qWdu$PvrY?>b z-rrzJ{eH=H=bz+m3KV^ko%2x5g8*3!6$9Wo7~)_qr2RG^9ny9B_MtqfyAUL{Hb@{j zmNSt80y?*`2oNtRC+x!Kp44@Z_IAtQ$1uUZs#!XpS~y5g6YP804@)B&4IC#l=5f8r zeapzjohK_~xwK{9gn3{X=1VcsaC(%a z^4@Ge+nwy=kw>geOHTZiGzF;+EJy2h20XAY(=J080<1Gw48**Xa}2@q{_q*XuRVAoE1JJB~PeDm!+tc8HIiht#GtsIyeoCC~iN~LqYRO zhIDGLW|oXG@upX)2;LiN*5R4@fzX5j7B0G<@r;UypYduSE20NyqPVuFxJ^ImtqK~2 zc@0wy$80L8%CK%K=Gu|g(vN!q`v>ZF?{JaUV$cEWB*2%T7F?Jvq(@eh9Y;&G=s00} z`#jWaf@?3h=F{TfG9>!BVO&|3xewq7=Dsm%{GbMV*bDsY!7faWg3;a2>2o=(f#+&T zh}i_(v-azi4Gr{?UYZ@7@*{SCooa4i>z8(RowrBn<73gxiXXKZZ4^7O3$pH#u&Jt9 zimVj2Qr2G4t5z!mkE{8f6}-;M2nVv1pQr(C{-x#?^mH<~_P+UBpG?KLmfnB*ti{7O zj#mTUvadf(yB>tW1vn2z-H`I5BKrBvLMg(>M-%Y|1sJe8Z(#haGMH#fPd(` zf4s;P7chza8BQLjiLjhJ9rkvLabG3B=ENAYU)wH$yNDMpkDJx1@0vHXyGGpRogZbc zC3;y!KLdw4+D!z22aaS}z%a0pN@@$;xDSm}QmdRP!%Q1~fG4>uct=Ffa9NFdpOi)f zI5(k{bLfQ33L^wqA96ki%E3(0wXdMns7RkhfKZa@;6)Vy7@G-K3H*Zsf_>2|o%@;t z1s%KPED?{QVWsY6RJ=Wr%o{||6OB;}PI*qe1RD`F;@te1qaku$c1?u$G_F$(3I}B> zGj$`3vH2oXmQ1aH1NWu;RWT#mri#Uz%qa$+$I=I~JAb%AuXLwbT1sGL}krzp$g zt3xcpbC9MJ2~uXL_(kHJ(=qr*IHPxeV?cwqYzK0aqSRVqc;`L>2# zm=J_-2rPgcixke}bS0hjMeb-OH8~qRp>(Ff`ZRV~L}@?ZOe>4X*X#07LW0V^H+8$# z&C!%riGUS&X=KI`eK{9eb+o+~E(zc`*!E(H`w0y_iO(8jH!U)oz z%@~BO_==2O8{4LBwgs&|%0-N_wpLEmbA44^ED&c^Y-bYJCti!Ba0^*fVnYhd)Y#I# z?^vC#aeYy_a_M>Bxr0{gJ}SHYHRHbPM84K@WpewjW2IBlv(}q^V54W`Uctw4%qLgb zpzwx|?i-4#@A)9-<7W+qUp5$dSW%ci5KmvBs_O$+ZzbJG)m(VAB=#J z33@4%1d#nMMfrwPjpSmO!b7v4iLFi!k7N(u4s(PiBsWUreImLf+h`KfsjRsiCI$K7 zD6T?-G(>I(MC>ty&C4Z|Cv-rnBW^@-I2EV5Y21JPeUd+fLm^Jrgu^TStsL9_^M_(o zEOKTK8h9@b$yGTVu8p=y$(9Du6I}_+^R;2t-EZ!&awoWUs6`?Tjp?&pZ>Uya$Aj1! z1L#@bp=}&5I7m22@>H8qHfkQLbO>vA)jUG2(_ z<-p}HxgyaPJYuWMq^!<Ou+(H%>Dyf+1dQ6>rqI#a|m4PFZJG%Cb$%dMZWQ?I9X zSTi-}{q$XPRnT55oV%~i=Cnk0%bzLyuo+bEscYeTZ~l(2qbCl1vvY9z#Pv(Z`t34b zH{7-znMwPn74-X_d(v|a6!cAu*WCTx40d$%-?zHy_=;)SPJ^AiH(A;4x}T}ZuD|d7 zu)~sU4aAibA_ z8hYp*=}kaDq}k|AMNm2x5TuC;s5B9G{QEpJv*(?6=Go62@3H6DJ74&`?t87peO=f2 zJI}+|n~I}%AK$MTDf3L{Ki`sO44qu~xk(dJY<&64-9fjIVJ}Rw`jfT~k`s|i_mVcr?K3@sivlm$? zS$=$cW$$^*@iFqr=z{I(fwfX-!mE`xv146dEiZ0Grd*Mq?A+{HFT3m6t@G$~%jIVo z?cT9DO)MXyCp6|ZR z7)OB%Q|t~l>-H3C@OsD}ZWOWO>NW!SN-g-KU z5j~0h8XRLc8Ui>8Q(_7$=!*B7k78$XWIOSCP8x4o7@VOVbU86b*Uev=$y*+hkX7%; z*%PPTkoayZu6`?mD&J+NKJJyPcf+RVy^z?o9a-F2h!46h;xHuY$*9+q8Ll%wphw*& z(=9QL3HQt#_ue(|IunkxC+cTCrWEHjOyZq<5|%d!ZlO^Ti+2@s$6+DO8d^dvu8 zNOWdQ;vWrp*qw6IB90g5GgI&5i%gVt3pI7KOO?qf41Vl5P-R3u4ScU;P(+t1W+YGAZVNW0Tw`CH9HxRSRw$JlG31}!m`I5$OK)K z6$Q0<(x%mF_q44I;pkL&5#2TBDVd)VspRFV03ERsbcMqB15^*_h`d#2zXJ^-I+5jo zgo?V1v^hR4zy2UtD)UsEE0=sqBf$5#{;1$u7&oQ|#H>Ye^i=0unFC=mVqj|t}3%1t$_j&u#;+(;VuJjK$QRwCZObgkxPjzxus<}kw{oS&|fL63Li<^ zux{FDUszP|m*U`MG7f5M!7lDnWXJGrvpNRYTNhsL-}U-NSh9JAAC|9Zt?D$AA#f`U z{$8Ff5X5G;-3+G3xZMqxw_>jSYZk0&8Eya=O=e~&f&`Nbx3p;^H%jXDWcgJ{&Qq!r zA_U>D@3=0VF$WUkwU&Ea=iH%wgAU1if90lWPqO54-SqHg`J^mn#OhJh?`DpR+i$M){a8_=D_I=z(T^y9eVY=HB1uMmHm}<}E@# zeP6IM?rTwZO!7Wja;tASTK4MxbhP3-CUX2bPz?U(e31gge%GpCg6_f{Q2U>-p8pQ? zB*2{nZN?vzlOW9aLvRv=8UJn?_D7ZRzmCHG4}qA3mhR2}NIkR-9R{cTu7z=JXrc^a zk=PBU_YMQutV+>r6CKXzJR#PmKrN}Nv0^!Tf-RNb7R7Cl{bbt2z2EAgtngVV2sup6 ziE!Ghz;5d%D{I7#<7fG17};%6`(*Gs<0c~h`0v-KUxYjd3K+wl@G!hpYWD}OsCJaH>QSBpE2%o25j)xAWiDB%3o?_sI>P*c#*$q>wy`Fg#i)KRwi2{TBf`%JC z4}Fx$S&xl|HTr|KJ?#|fLWZKUz?!z(6yIi!;>8I!`c^Ry59BHd|1|#fo4^fPodOG!i*JP8 z&L($nyig8OSWTWrH#H^~4~DL_RvVeUtrPm`!JJGJ7P{U(9zDJ zbGNNU%@@4RP!eR~Nl0>8HN0gcP;U)+#z3}Nh>_L#q#Q-X_@(r)bz?c1N-n~f^vZks zjlv+bynE|v6d0r%P7kI{i*a_hSYA|1&Q zbYG}c6$!)CGDltRzgf7E(3Kklf%Gx?CA`TYyw2W;Ht$6&>i5zX5YZ}iH}&-5mVUh%gqtpEqAx*nQay+(7gF>}=`mny%#TIhZ* zcYJ{cQq*jt^hqa<-r0|Rnt5dStH*jM?p^*Z$aCPMBCFyi-oQzj7Z$$HrDB?!Hs_zG zec3E|bwZR7k%-#H`YkzIS%x0{H&aV1r5KjvO}$_;0fwW9!;=r=Q!9DJxrrs0S9&zL8ZSlla*#dF zbH`?yoi-9*?X$#Pqy9;erjxr~Y*LK(OZ1oMD4j6-{$SqknG-OaYDd|%pI8rXLZisC zMOn!CqBq5XiKmz}prCI%R9j74(CUC`{L0FWNhz$r@{|kiA;fPFT$?`N@)1Fn|B7 zou~8p6$?jDR}UeQS7+JE(m+_2E{!ug5^dA)&Ey}qdr#&tAGJQ* z8jqa0PcpBj^Cm0w$J1F3Q${I!XF)t2rR~#cH)$1)4ynClcmqUB$WrSt^^nxs>KPeo}3N#94p7TZ83ahpXzWVN!`)%5;xPdnD#JM%+QCGa4T5&`U)kDN*Z_ zr)O}wc+2W>Wkxp)ecpCBQtStMe z^5os{!bPiP9o@gHyT+5Iz#3_ZdZ)#yZr-vKftr1%~@6MKwAD=wGYro2R^XJ*|699D^hP2f7;;5h> zqSqG7_-vKr=4d}@a9cb-Wj0OW>L4Eyt1KL8PabhHM3mqgkJfz;W8EN70XR}!J3EfNR(7q{LutbdID(H}5btXWsv*y8%4_F((kP*lDZD6`R)`sO3 zALMI|hLZhB2LQnBiv_|^yJk9FFF^w6@|$h0=vyq$U9WcD33;=6P;Lbz!hHpVUf;tG zo)Pnf9#Ry0eUxMzCUWJ&7N=hS1Rz~q5R>aCv+)I(ng3YPxpI^u#ecqd=jVuDKUQg;oQ&y5Px!B%Z|grfTX=DC z^x)Ue{mdulTl&AwR(@Taym)eP{NmRI!RG?NgaOH6z!n&iPz-^XB=5mcE@G%pFi<8e zOb!bt5R;);Li!;~50-5a%W;B5FvSwm5C0I8ge*P5zlg~_4WM8)qiOqbX-vQ^Mqo@&w5>(bE_;Cke6 zI}3m=LcU^XbjnHeWN7rW?U>5KXdTUzlEU=mp7hs?=>!~&sz2$odHTualta>t_lwap zLtePbwQU<6}d{Q>JuJxy&yMgkZ!pU}4HoVI~_Utv58WWjtZ$IPFt+ z!nS$*&24}fDoF^7qY;N1ZO1b*XCxz`cem3K%-LK753Cd1c|#TlX9k}@YJ_GSn^vj| z=S7^5R_6W|o@^-rB9GtJh-*Wp(l7&GE#l?LvbM)EYb}x>WO#RrRN|eSM2oakWTr}3 zB8eqFK{Jg8kjK`K7Yog6h2+5+Gkn}KZjEP&hep#(C**2o6EYBePV+_Oa@bIDk)hc} zq1i4)IZnMfAv?K;8bI5kyzj^awZaU=#%OhcJXUD#4f(X2mbuZr(VvmPNJtuuc)U0= z#|V;nppj;_Qz&bZharpeLl!2VWbIroo^dPw!k;#E0{Vt5h&@U0wJhlhE9ud~`ZK5W z_mo7*=hq-hzSbAlPNakuW*;MSgA4Qb3QKo2O7+Q#q>G|I_W)&kl9DG%oh~NwJ{Kg$ z_9Wf0#K-g`Fld#$PA;S}DBtG?TJ`1;4HS^dm-Wiu{$_dmXd>n@+3nND!YQWGCzdfA z$KlEX>`mP#d00IZlYdFHb3$ej0(O14w{)rpEkWcltw z<@d!j>*V5z!VL1hip3Lr0Fti*0@<_M-!-bH!pccf@>6E2 zh8n7#7ZyH5rW(3c2A|+)+wwmam7)Zz<}Gloa;eDOs+N-^`=YeN)1rW#YJzIcCA`i% ztmyefwvlGOM|f#5^X=H}f?K<^_RG;AGTdFw)CZx36jl{!6VYMCwKXr7GOz9c9$BWj z7NzQGmWXYa#<3J%>djq5*5DfwZ^>nW1mSer(0zf-w&c1hg{GROWawn3PEq-GNRyXf zJ(+vGXHyz6OH6KGW0O@ryb-puSjsmUeP6pqy!{S%H!;DzI-n=#UU8ZWXT}q&yaU(9 zT9%fV3N5o%Ef-tOAA4)(`&wQvx4hME5{KNWu!wtS)w&tpx?TKt53KNi&2pprU2F0J z5QG6~4ME*cFasjk01*s;{#QBw|4zvNk1Kp2Q2_qG)q+I42%B+y#b6?o=4zVUKtG5W z%C8QdUIk(kS-8o4S5bf=JS~}`8^Dfp5=YJ<>|2BYfw818Rj2(5fHK)-TCf_x&uQYe zDn9}T1#)R*iVDDN_5qG2jdTuEipi$6arrj2(wnq)K)XPwYW zfF1=LWsB^eMQTwnA_2a3gxrlHkdU^iIA$Br4DXhe+wUL5-k~5CC9XhKfPf5$$Pu{% z0GI+SUPnKU0>l!7|7P$F`AvYlAv_0vf(ca(DJeDKM=+iu_)Re}L0MR!tgN&g9JB

    F$0qBNo+wMeSFdG z`C{~j^|ALjDt7upz9#U~vEt{WqZ= z&F_>)6_7q5-HHzIJLQq!!u1ESfhZI9I+XBS(O4oX4%LP>gffcm;6N*kzWvck?LT=2U>+bKYlMA*c$1oo_4HrrNZ98xPM1PB~xd6vN`hU1F_1_d| z{~zi~5#)x1?RMioYE1nVDf>5(hDJIN9{F#?-5s?$DL`^uM1>WkOkO00sx_D6a^>Wtl=(t$Xp@tToo=t6(a{FUorcgNUu%bRn4R z!~MaexVi|3)qab%{;_OFmAYqK+x<_A4z8Zt;EyL}pXjrK(UtW?UBuW27?B6PmXjhT z;Ig*LzV9S3N!3Mh&LI*qQRxd^=!u<5+#&7wEzP^=*u>pc`iwNP}yb6?*=qDib zJ0c*HA@R2$h8a?LBmm?Gx`6?LDLOU>i7EQ{pt0nVn)V44+4&Xdc#+Tn6gFsaHIBBg zg2`Rf7gI>VD=N#Gg3#1_p9+!KdYxf|UQj0QT9d_tUmNnH!OVo*Qi=~U{Tn1SNP+2y zRhc3@DG!sXaMyC&)CWJ*fIN z>rj-@;#Cx5%%fZJ(Xsn3ene4)_zXpL!Mse73ImLDAyqGyqK8x9Lyle_s;1spl-V|t zbmzk*baAh5UCafqg}6a8Fxyf{jWgaZtAdCVw~b<>wAw0->sYEN?91NjKz}Hfo=L7CElhW$8sc>&w z(cZ;m?@6F(Z^}uy(+}ae9d9XIF_<8>_XUE(ZFQiFB=W`8lU_pKjh~WJ8tedwY2|M{ zxcsWb=@ZeMyn8LlPL%dnWp>INoiW^)qRxJx@i6mCIy4pAvWfLJXm)gdqB&)pVFO8O ztk2X(;dB!ryiH>Gcx#>{YUSvoEHR*)g0ygY5GYC4dE;HERZ~7o> z$BZ+5j|B0DB+9n}2Yt$3z2-B1zz|FI(FMsqeVXs`#Cb z(5*v0F*?Km@f;AS(--uH_kg*lB0szN&4vN;!EI24KZdRo1K^{rsDTv1W_M~l$ZRS| z{00F)gdLDpdJZ6#nBCdz9Pn+Wg4}#ud3^S6f;f*B3hVaZn$MELyL(E7CyZL*baew}4qARrDbOrid z2NS4>Gt%VxF_Q$j7qu|nk&ibH}dfJw`GMH3Pd(BL#*_1f7?i&tM<(oM503 zt(Y27FfALz2ERXf-&+EPc>T@6qA&7^c6q4*--o9Vju^F)>;SbK(9P`oniWFZ*ytUW zx=<_Wky(dNgQ9HhGTWmtD%H`ld$qGbHdhWM2nvPG?ibOg>c{uq*rJ!`z#wx&?Kd@P zrPCuGDhz!@|GH2=;MsKP>g-#8t{xaTl8-qML)N;^$Yi3i-b?nkzq} zif0RiAeffjK@#KdJnn^s7-5wSlitPMp1Az#MxtTEY@l*_V!zIv16h1BiN&Z*Sfq>$ z1`W#1XATnLgA}`jr1Nvf=rMQZ`_B&4<{Bz-?5`)ncE%PmNInE^q*2HYJ7wwnbQ*^X zOqn=FUtAY}2545vmaBri7M;+Jd_4V`wa-UhYZU|e4U8qQ!Eg_WGPgQ?Puayyy!`jg zm83W-9y;BK&-LsjZ=RD?1?Q_dRaJu%oH0crXHNNPPfr(SGwzzt#LIJRu21+dgwo@v?iu;OGQy2Vn?w#l?)zaReZfy?bMrg3VAaxfvs+F>qZjf|b7R!mO){wE3}>(Sa4gn%RzJ3? zjQx4ResE<+l=f@hWEaEXGnLHxx2bckm-^o6FfvCR3#Q9sUSFNGF(OUpE9?1^NtM5K za3$@`eNkXHO2^7vJEr{Tsb)$f_hTF-MdahkR~4e*yKzh#SH)>I)aC&*?aC|xy&SeEw_<(_d;0_`f7cJ`BC zD9S2mlBVk2*BkC?x>Yc4*q?D8gz!B^xKgzK|5IYo{DJhe0FQnbmH%%+dKTg;Dp>d* zNN+5Sf!X0)^Djt`G|@&*vX%hp5j5Zx16;(#WY(i;q3A&sGNxDtuwWoR5jiWT0TiE$ z)uw{vb0`Y#W8%sbqm+MhcjnC+Ioi%WcA&uyu!V;;w39izH-&Bo#Y&n$ z^fDIY!y+89id`E5Qc5HDS5a}KB+_zn;=cWHfP8{tt6~WYBu(TN>x9DN=F4j&R1p@H zfw8e6WTW|o6@li-bWq)j>5x?r2{`oLTpQ-HQEYF>v8Ye!W#fj3+tg00-&R**Nmv+V z4JxoslPm;g1oF$S{}@}roobF;8yui$l9_F>vqu;#b|1K!K(DR)JQR+VO$W zQJvnTZ3aw%*fRG6qw&>P3J=UW3V1fZin^+->4XOx%Hb23Jmi*K*gf_w(8h^9P{Y&O z9tZEP@BFvZh@K}x3(+lgSYoTw<7<sQ7C%Dc7-M79~gS#!Vf)P)-~DtNX5rZ=HMJ zCQ#Wmd_dvlO|TIxp~=8hQ7)&tA{tA(YIPOr&ex?RbMglDp_``DagoYfuED0tVR?x) zRH2L*`}LMBj0>yavH=*ceO65T-BNqAklD{vK&@<(*HyV{uy-TCP>In#PN>oYs-8Bp zD_F_$%%d=L3F~TEnFK60@K950noA+7j3{}K)5^S=9JnN#mzYR+4EPz8{Dsfo}6){OqtGYT)9xhHOF* zGny<-SHKVuTS1XQp8N7ouP5cd-g7`Okc5K`AZbr1b+083%S~gna*0Gly_itk z${4Q#@4!F zREwpe=+O;l@Sd%wBkn4*l5AB;X8V^08{zdF|I^FK`>&VtUtI~Wk?p^a5M>(}A&D6V zlCqIA?aTmx$vSylq0F6t*+#O0?9R|t0dx(D=A1|2{??0l5RLALU>2WM6M~e%j%?O( z0B`ZJ&ZH=7V>s1M{_jENe{H;9|MbfKo0kKCl!Oh1u>*`^iOJ=Lm*_C#x5)#kl~5H` zm@L?BQE&29cT5AMP9Z_tz+Ji2q(z&u$rQ1Gm45O#ez6Vkw334&@tK05opv6x*8IO- z4lsbwA7NHA&>T=pxWEbhazcCSkAMCj^ZY-~`Tt@>@Q--r|35X%{};=G|6LXO_iFUN z_)92O&HqBA$N>p?=(OwXw;-R19jHU66Y*-!r`5+ z10>wv&sqemKP%-90TD0f)K8aOQ{z(d=s=?5xeYYIP~`-JGL>|_(jsYB^P-!?7nCJI zALlwQm6>%WcWx|Y=-ht%fgG_r++;sdCDX7V@~&Iu2Z<>%RLpD$cd289xkKDy)O?P^ z%ZiXPM<>V&9TtKoOw#5^)W^4Vx{mhbaJ~y%l)e9I-eC(w(p${6yW+8)|5ocb$ooxt z*ssLvOkD@d3Q%|W zyT|o(+EcdEfg#83_pM8>nLhsY<78kgH#&MQXk&3F>g;rRd% z1G3Df-@airk)CD4NSnWu7fTMM99{}XGStL^uRPkm8FWC#Seh79X38CXIkAT!*zR=B z5pzX$vBK#xU)U-}MNhNHBlGm+cHBtsNKHCLY~i~!HHD-suN5s*I9M>fjw_5P9SJRR zZi0deXe2c^FcUNKH*zfJwbsDnwUxIQ(GsET>X zRDbIyttS2kajkDGioXsCwIwg}El*n-NM5V5+*Mmkx+vas&(}9U)4CLURe||VklbYW zVv;5(Ob8!1!(U(12oqY*kj+w)pCuHnkD+DOk7v zke6+~8y2j!bk}ZEv%cL#8MpTU&7yVdK^`9jS-Z;OakI2}BqF=hwJzQ$r95xKw+Jj# znjQN~K*85`yf@;FM@sRBy@Eo8afyo7=hl)*5%Zqx7{L;qhJwS3UJ2u;-ZrA;;Z5ON zO*cP#l=Nw5l`Kv_sv?%2(d4IUd8u>h`L}!e*FH(#R@U&Ad1)Nsygz58Ub(Vo@rg424-g=_UC7G>9oT{q)8%gGt_2g(r`~ z4z;O4tny&JH;}aHcq;r|f&?Iz6ey?q;8T%G=Y!9^UrZk!4Y4{Y6S>n(hoV=+UW8Qk zx&sDD%=kJ{B>Q7x7!V^5egMSiRMAh)B#giVnV|px-To6wD3pl2A8>xO08KWf2%sX$ zM5(^2l49NnXRv>zgEWdI$?XTfqthf7#sHvPw}|Nhm4{~212l=^34&nGeML9u47LqK zbXrQOrm0NVN@!K|TLVdTyFu)A)Co$`17rc3s$a=6Ks-<^iVFpdnW!Z~_@XN63ZTTV zzeJI1_7k6MJ)s8}09>A7fa6Fg@#imTloFX}qgB2y8=^{U6Xon;4P(irnz0P0h!bti zK6tQLJP6H>2A`^Y$jeOL_{f3I;2(U;Y=qzx22z_NuD&#cCFDyFa1LCCvM3n(asm3m zM)Fv)&b^@aoE(d~%gkb}cHs_Ajw~}hAhFGkbmxsrMBT;%*w;S9l~x0(BpuHTzx!n} z$Pd&@S5068p}9nB{d}ywP1fm-#3VHiY@!tktVLAzOobCtfc_N7!^JyN0o*xGCxn&Y2Rq!|MCRk+zCP^cRW zbDXcM1RJb2TD+B{s(W7PnqTf!dXN&7!1>dK`|0VBFT-#y8$^iQ^Z}^X%&w$S<^t!+ zUo`*l^K}Cyzqh0y-}doEvG%ySFn{7)bifPb?6L39fswu%|Zy1y=YB*Yv9B z{3?+vO;)T;_`pgf2ihlBpsG_+iQt1)UdyM-2jsMm?l?nkct=bUG}{2(2oKvw9)r0HCzD#&ew zbHxzA!D3_UxmIk&LISYv>F971zmMP^=cYbE zH51fG^70cM_Qx{O#Mfd|qtD!5n|NTaC;`!*_)1k5`rw_dYH>H-;0+C=v}BF3dT?(K znIF9oK0yuNn?3mJRi(fM{`U{r%gx0ii3O1UBNVU$dOMf*SIw3iE~wHk+1!P!2kF)| zf3nG=t>6KN>ISFi)f72WdwnQq_YW11hJLYoXeFR+7+#TmCAS8^Utk6)*;D*xw{>7L zP7sAd`zq(CP{_5eWtyMuqD7F7lw3=Db&MEwPOtiRb z7uo9b562{rs)M~By_pVU__3Tr=?Rm#C)ht9@%e(|SZbos%{0t-LQIFFbYE_L&Azv5 zgXwFNS(~847Hw*?5Y$9~?u)|#a>}`-{1v}bk!knwI+?>~cU$_SCF7qZ@<9=^6sq4X z5Bqjy(*4MyAH~+)bZK^<4HoL-FA9=>k?=6*zsA@5ZcRr->lCd-fe z7}h_^zTr=|e%UE#SU@zJtB@4C%89+|&-F0Nb=Wn4n=x?kh>t@JdAm!PY~06--<`sr z%Z?;+{!o{f$)89fq_bOBg#;*E=)-M?Wn=WW3kjE)kAvako*Wy}97{V%x*hSu6@%T+ zy2FHL!g6H1Ifz|C4_%+<(h?&t@rx5|SX?Ci=_%!Coj@FtIPA=3g59FahZ&~!jXWT`!MI3zGOC&q+X*^EKLN^*0 zMpx@+#*6a~=DL?8{eII;Kg)0o?z+9HE0?5^H^L{iz!fFOTz$ZB%iP7vjk)e1LA1c< zU57yTHdpqz{F8<7o(5=Vp?q5pog0q(j;5eHLzK@!+&ow66^ZEY5-A|l@HvpaVc^v~H(e zF@{Kb7I<{xiH!pYpm7orHs<^c&M`I4DvV}nJcc)uvJ$)d=+8Ti$Qh0dJ3lu~o0YgF zm<5Fe1ZoVVu_WKXb)z9@KgED-3OW`fF6eaoLbtp=`tGJ9j7alxk@zg=hQw(MEH8(t zDAcGc1m%wZsF4yF;GnMJ9$W2TT2y5fHvUg}zpzjml{ z?I`Y=VXX;J8but4BI`tbdd2LnY?^Nv{Bb_T0a($Fu1GS3&gWg}mq3Vsm20Gxd23Wf zh^;s_Dk|W{HADc84fxyp*VS_?0n?RNW-94+FTEWp6E>;j%%x?p17>tEeKRWOA7T@V zD>;G*Nek*|6R9q~=uz&S>NFqJA2{(m9}8GD4Cd%| zQc8lB8dfa7q@Oy_*zD!C7}R_hsCCm+yMkW1VTftO7%pN3Um2=m!_e&x>$&=wLE7uM z73!mEvq_8Lmvb{CVMly2rxYXR5P3WS3WECvz`bS8Bk zORGcY)PHa@i&(N>6eK*Ysl7qY{2)$(xjiy_P?&kmbit%vx%0XsF<>pP(odm^9#F55 z3k}TEOD|G}&uhw{H6KnYI|tG6&LZW)MXlHMo4AA`)Fd6qg%q@>cg)JR) zg~dQMZHwY21ELuNq5~5e8MdMvsH6s;y1J7Lu%hWqmt?>&P!=R+%zId=B_m<97j&mL z9QvTo=m@C7hk;(MRi^!!I?A z)KkZr*T#3ItkCgRbn=J9zjbWYV*(5pC9wOrcNcQAK^A zp<4B}h-<{THv2=RZP;j~q!_{DDAwTzLUx&AOTtr?egix3WmC`<3F}=`<40EQjd9RR zR<=|Zc-mcF_->G`U@mm!>7$J~TSP7)-;sGgkbN(^NP38EsPeJQ*<))Rwj}M#M+rBz z*X`=T_Ri>%EG=okX2E9M6TO-zR#N(VK?*|P{-@min=1W|ad*6GWz!q`;Wh&dkpoO= zw9F3&7+ybNJ0B3<96&rna(gj37cmT24w?iEMxY&$aZJY5xx|ixyC7bd>cO;^7_RdI zdA=USNEfL+sThHLVaIAYO3BjRA>vYj%MXWjbfBZkD)KYlLE$KD7x^%bBt7ETpG;y*a&RCAUWU1cB(!CkJMlwTNHuFtpnx5_Nvp3;C9h;c{5gnUE8tMtFONT$|7^pDR}Ca1Hj5bP-Z5ttk#JIOvE7CliwYn+CcQ%<-ZD|2hm z$!$PYgPIR=-r07~F|L9nf`QTIy$V(BNza#~K z1?44fSu_$$S)oE<;LC|lBxaOE+F|XnC?aNXzuvwAkvAo|IL7u9G~qhEl;!xh7Ovrb zx+k1axFSAG4f5oHnea?SJlQZv$O7g2MkJMdVeNvv#)tjN$^ODqv&)cg;R$VPPd&DL z20zVo2+Kj8XQZNzKE0uL8i>xKABPk3;1C92xD5#gm0vasgiy=5K>-m;wf*k51@QgE z&Ap=_FHl+`7RX6nv*N)cE3HgUQft6QfhohpqGUw)%QBd>#JSbyc}L3(R+$saP#Uyw z9ttfNS0*%(!jY53TWmoYnL3}@V1%$ZpNX}(Z4oc}BeUD49v46yT}-EoT5DR+1xDr}Q)qte^^vhprKQDt7x}W=Qa|25thfP|gYk3GU=ZO20ZC*Yxl}8s%z8d+=o?d0bUVvC-#`!RQ^zgUkYgsS$Tw?p~p<3SGAA#zP+bIN9`F0M?q2AW6SO= zi&n>{GHyIRNG>ndq(oPh;hn$^l)ydKGF0tKXID>(&;7H&HKn4^=nL}N5n3(kxup%2$N$`7bGpPzi?r1$LykhoANnMvLKzBp)SORz|$vZT4tTe=$*`bsYI z?&IV4clC`5Hf4?i#5`t|c<>+Y|M^W!fBh=Z~MK&sgfV%f()bSvg6>iS8R$s8U# zR1ggewve9j1xKHjgM}C>b5S*c-uK2yxZe*XI!zJ2qLR{N2<6KGemY6^}0nz9oJ zol~>VWw4>i^iCC@T?QuRi-QC@kV=&fKTC%RFn@fBYq;!lkS^H9O`%>f##v06&U0_Q zS0O+lF3r&1A`(H*&ZUyZBgtc9Q^B<3mZc&pWCW8V3pCk=veG&^%k6Ss;_c|T-q(=n zoVJ9FS{yUdo^&3p`jeo9Vb9VPSp4$OC{I%&d-^u)ynp$L^@h7vB=yz zGnV(1u_R>|x*R;>)v0V^saE*_`i^P%A+bArxo>6kjlWUQmiLOu4J+u^R&%3i;RYG4 z$wB%?RN-}lx`nZCwGtW0Lhse5 z?j!VwYw5NWoaX0(67h!(=AuF``TA1Z%h<)!P!TsCWJnAUXH`#bsx#6Ue+C1uJ6?Ej zhOUWT1uKjK598>IH{%qZ4W%l!n&tke-pno#J(Zczohbs@>q(7f*LbLz6Fk#BzU6#* zguKSvQmPyhW|N&Qg*MXI`5^1}(3<{k8S|Nw7m0fEvxBEh1I(5Su=$iVBfUxCPl$-{ z51G)ek3*u|z@nayOKHZ%H zVu^G~TEL2#6UFtTIm;(A&czISNkOb^d?}}Q%)B%mD3m{nmwUebLT!JYi~S9e##YcT zv$E?*Exi{$r|LUKch#c;t8*4r6I!ISAhnJzE(7C5JDsoMgf!;z!oIdOOYtOMBuMS> zPEo&jU00gs<*@P&Oz$A1w`I#HRF*Ryu#k0s!ri-^&F{yG6Y_g~q~Xr`OVioyoR{*~ zl2yiV6p=PU1)Q*-A}V#}lUbR<+VjLc--Z0c6MV`m79UWfI&OkN1Dqm@BU8bWU2pd6 z*yLW{=Q!$G`T05Y1p%d-I)40vfYQ-CTqV^H-R6vUNceL5ymjm0@MUnBuqFeMo$c|6 z{EQl6%acYP64GuLFKpTTFk0{?Z2IQL)f?Z=*A*a6&SZ}P{(+dQ32I~o^|&5s3g zSt}yA8~can*pmzM{#&?x6|w9M&o@7%*C7W3G=Ncro#eh)%LThexS!|D51+9Z6Sy(u zjCiw#3{4K~HZ4n`F-v_G%bfv{ zXkAUl`1W|VeMFl-!;Ot-{uvzFBDu2aO4>GEU{;(FG6C2Vey;%g&NZdm^+w~kw}3`M zD^8DNn2-D=pPd`5&)h1|K9RYN-};_}2Lu@l;^K5f8pY9_e}jwMmjoaL!WZdV7LtBy zXcoNGx7$pS8WQN^64K=20JL3E1_E-J;^|k>tA-5venP#<*LHfKr4WFMLxwyz^eYbb z+TP5dFcmN!b9W*99FlORsV;DW8uW(^83~^=g$b|09$F+;(;=TQi41Cr5c!D^*()s> zMR?BXdl0cp)rcb3utpFaReJW^1RG)j$GrQzNLsP6>I)o{E2F?LquoEFrCW?2ExtAr z`-4mRsiW{gVJ2D={=N{V+Kc~T5vAK3e!P*}>52hZMtAY&)#4IBoD#T&sK<~rcegAK zN7;EP$qRFShxxR7YGKc4)8Sb#tXVW!k3hwt*jG@7v{pu9dprXIcMg=!b^=DfDp1yn z=alv(PDGCRdzcaM@|#NUX=EM8`|kb)KwaordKmC(t0 z%E`vR6sGM>$r!=jAo21@wp%@t{lzG=)P?U3DO3!&@~(kLK`NtxRH7y{LDzvPY25`m zAWdY*SE5-+V+4vI16=nnpc#yRFdyZUloxjqS~l#SK%`mfT$DgrlUYV9pYtl*Dp0 zp%U&A4$VkTEiT&2hI|6DDJ7jb3C^iB zYmE4`j@o|(FIA_lnjUiI#)YVvQ@sBl;+snVE6jow*}0ZXls zLam8atyy@jMR9G0dCB!G(3c=k1p{m+KV-O@!Pz4O0gkc>x6KKr#pc)1+z+$O4O=4# z!!N+U7Sy|thx`huBZ1#qO0w6Dr@ctZ1ramo$K+mj&TVjp+v+6O%Qe->DU@d^z&sTq z$1NMZFPmgrr58^^*B!KT-)o<%+mejfp^h4K*Xj$;yxtNO-4+b4OH@|U2zqkFD%EcG z#7}tl8v=gcUx3U9vAh=Q}_t#c!R2BZE0-g%9OA@x`S3+RD&T8uXwulgQV zW$4~wv{R$z%z5*>u@|vvib4sD-^)^l`=zYjB~yMine0qny&D_YFsHlHFq4erpmq;@ z_D;%=%Xy+Kt@V%s7(CjEDXDoGMU!paNqi&uC3C$RbLcOmrNdy(E$Oz1_C-g~b~?;;&UP*6ZnP(Z3(q=<$4MQ7%j zXYbkjd1u`-yR7&9#9I0AUpcu7f3E8|erNcbHXoyFz63m$_VX{99fP-(-H_GM8n~ zXQ1cb>HblT@w&7D3U01_a@TJ;doick!m7iGy6rhr# zQ?d?L;H3}ty$VOa^&9%;FX|j@Bj_Ix8k;xYv8&aT8&T)x)n?3+cbW3uSVPk4hG)5L za-Pt9^NpQ;QGZRgs#)Pnl>rza=QDbqWvRV~k$2y8z3F4Ho$7XE zR(K|P|A1QQ^y+<(;$TV_2z+hO$a4_dKd4_nNb_SbBs2`RJ_xfOqT>obhaW=q4?)|L zY0HLKS%<+=k>NuyjLnLP+gp!gT?LDGgIQpR?iw-!d{bN+GZCI0L%(!26J8#IOa7>S^f}wHDw(+9=k1@v| zf)0w~uGScrYvZ2Nu)oS%(7zG0C;umj*U0u$KwKT_7cbNzn{VfEH^&A;1P$QR;p z)v8n%n0nhEe2R*Rhl@dl(LuY~7rc1 z7aZr~sCh8D5BI&*$YG5(Py8b~ zTTC4kiFtm8&ZbC;wqp<@muW9rI3?hkmEVFP-{JGZ;`q1Ca9&I<&f(J_ga(SZ-Qa-# z+(Q=2AoJlzxPRTqIT7IjBIe0kaM!8P?nMK|lQ**uFFoeJC%Ya+Q{0KD?I{0|`B{ zHF%j`3)@g{&o#G#JvIav{+PZeE3M#Gb|rZZa^5|I8X4@6h2~m&afL;BX$#lS(OzfJ z?qNUV#hU(L8#K+<&J%tbxmb%Y3_!`uIxOBwu*LU1hZY4u@SluJqp2)w@$qz-?rA^t z@-b<&^BQ}&TsdQ4bn`veDsn3PC%YrqPvFn3j^?yV^RTxA>w;o4U&}QQh%j2f3_jU zv8(1bm5YpE@13KEckl8{<&+NyiEP4Mpwx||Gztaswd<$hi|?F5__+!Um+9J@>h9A@ zwHq)5%5RxzQ5>%%v7fz_r!;>!SuN(QKeldO4EJeRa<^q$eKzNE?@AHnd&HBgY+rRE@2Wmshu&I|Ucad!aM~6fTED*^0TkNXD|a1e5vA}Ffnvqfp2xihFvqBxBoj3KP z4p0|WM!3R$y;t(BQ4NJwL{)@D)pQ+$LaXBULwB`QffoTmnn;JgV7K63rTlpgGWK69 zC5M?BF^PV%JqTt-($q2;S6_zU&Qak?4ISs=X>+9C?}^nJlCc zAETXRe?MY0_vo!g=jDeIh2~dZ@?|vpMt#eephm)>H^3a1YorW9K&&7CS{?o ze&skYh=)!UTI#4wB7=c7&2d92DQpZO&gO#vtqc~Kh|C9K0QG1v9ZWGV9Sb0_Q6tut z8LD+-DG7A5dx1NT^2jnm5X3e6u?7Rid~oVq{nLu`lp=@b2th)W@&nuJN$s4&cdS-> zU06)5uqQJ05M2r>~SJ;b~OEE*?_E_o?D}n?94i5c+Rx`>c>Z&#wQA zYv;e6a30NPg`BOOSw3+-jcUd`=IarDwbOOyqTlojJgotd@Q_dMB7)8)oD6S>bNGVC z@@@3f`rzHat)1UU^qxv;X{WvG89au}L6^EeP$0!|KO_%_C?8(rQ#H@IV+J#t;CC2hs6~*#mGu zkX{K7SZx0dfDDwRy&6G0>uf+y2mX{7*g&cQymVyM3~bO(C8LIR6cDOFX{?Z=F{9!hY=r<0vW ziKPZ?;chZ9YF|SWEAYP&dYtjb*?U|9oq@p_d>%`4nOUv*fXgUKvy3iN`xAgf0x6r) zG?)ONk!**OxHY96j0@cF3qV;)9ZkEe)&(>bLf_+R4DeV3oH3VOFY@}vg52l&s61NH z?I8CMKj-mVGQC1CWLCII%tPS5cg08rB}B18wLU8I^=C_U4a7t5P~V90}HgfPUc_q z;nAgR;h0MVIl&cW)16k5DYTydokaf+4dTxY=IB2$m^Uf$bgHrdJTV3W6GK>}ZjFG* z4eD7F#9u2Xo+I;<(p)3r$e>XnLI$O08U!*?0Bn!pA*KVNqg;F)8-}qU-Ir3hwR&R+ zn96wiEDKey8UkiDm^H=&K~6I~(-H93KoFJg0GmCIxX{6I4sl)J_`~lRt!XJ$8Aay0 z)tW_Zj2|mXxuV~$2y-2|T_BfpP#gYbJflQ~p%E(nmp`}X{)XiL-*LhFKii!Chu69P z_~HK>lJA`B|0@ASMVhs&oC_brXN*JVI>t=qP$|f(@@4P<68Lq>yZPF%dhxm31!og_N z@+W+zKLWBB|I|#;EzHKjdm*6V)a}(pD+j8Tt-JCwOA>Czcey!Yx*Hu;r)vGVYv=Fh z{edrt-7-FJL3Xc-$x)#R0@TZC8PC$LM;@A}?1Y=y$5`;o8bkxUUDhbS>3y}+1EC9X2jEiaYnhpnJ;l(KQlqb_|DoDOU_ipFr~s4MOmcU*x}R5Q!TD2 zE0MWihRDlz+Tn%Jv`Tj88XFG-BY}SP+MDrIF|O8`v9ZH?Tn^7`E6t|npOwIhnX)3U z$UVarzM-tNGiCw~nk%0+@gP8caqI_ge3@b~OrEq)dZK*HNF9qeWyfoajhvrMW!*_1 zPGqW2ol0oDU5k_x%6}p<_Rix`y4)I-SKZf=F7m9rR3B5@!{^>fWdb`^UU-EMDfy;6 zb>MJ4GeH1f_h{~QnG1}5EtH3E4H62N>O`%wPXzO>9}}2-Mr={)Z&Jt^js^Xy2NtYH zU(I!C;Fq);4YaR`E5hnTEVQBdA3}m%Qm?_ORhd_HXlNoT<@0$&l`CyyMR9@ zP!x$pfy*fim#h3FW4E`5B0{h2&vHvCzUIqe&KzF~Vg1}MUXr*iV zQqW|3*^R0GL~uco?O^{!f$K}NYMt4!qv(`K%VWU<8d`u;5_NzS7c6Amm-qVIqhyin zs2NO*`c}Fwc;`aD0>@oF7RQ(SAK=`NnzxJ!dkX3;9Xn{LF30XgKXjc6>QFws<9Eg1 z;bCb!j%_Yk?(}lNLp-`RXSki*5+OB{>#Z*NnM)`ECXY3j?oRbYRz|(?T$}A4V}3B1 z%=L+yDH$U*o&|-ho+wCCMa{xC``1m0FQ6P!Rf*N)?4 zM4xJF{E%2Y6sYc&%&N54C+Rx)C5Ssc@V110hH>6Afv4l{sOY!k)M#Uwq{|xJwVoFe z@3d>{FV?8Zh10TSjLUS-3-d>NZ^db9i4=e3k+CPM7E{^RsQ?UmjnL?RNq;cyD$l?( zcCA{7Kw zY69`xwNk*2&?HEVXb6&bP9#XyX*k!@XFsY0aT`EQ$4+MA%`eoUfkcQbhM|6(w(*|f zp4^QGrpYM!s~e4p{%8Q`92i#svhXzG1)0=_9AeG&cmN z^rxVPU+;A1#)YO!h0pA^r~tG?dotX;2OtUD^Cwg|AfqOZ9OXx%;j@RJ%}LQKamDk+_>u8yz1U zBppeaN11Iy{X#1UH^Zr7?^dcvFV~7b5LGG;ERzU;3~Jw{BMt&bRg!Ee%83gpra;Q> zv#qrc^qi`6j7e-T39|9xS+9B9hz*nV;MnT|+(T~Z_YRG&uUT%F-|U$aws38@y7WG~ zz2CxSC>XL&h!P8jh<13`rxENcVcCPu3!-6NmZ=k_LJyB=zntpmL~IGTsoulWwZ>er zY-MITac&{(_XkAmT>7>=RA3E^ zZduU0c=lmF1AFzE2aJrkch;zgo3mA0iMe&W=WvL7@*`EX;5Nw*w`lUxuo1Gc8GY?! z;AloO+$tXyM>o1OA|k1UjB*9YGA*?|`q<{tx~j-h!%H0UroZyWlg>-w@fDX(0lpHz z7+oTmOY;+sOM4D2pI^uIh*+7Yy|=V|^hD5I82|3xUjCCaD(MLuI6ol2cTTkjf7Gy7 zT#k*rg1JCW z{@}F4^%Beb536AlS3qtz-m*?8yprpVe`&g&u<|0pSE`dul=X2`NK-7o_y8x{;k5>H zK;`w%x5SArkes7?dk?dmRe#o%#@&l|8+-XM;Npj2@4{y9iSDfRl$RGm!H;CC0y5=b z+df9mFcTjYrh(pT*3=h2$m|8U#)~XNKUzFKx5#fDeR@B*T6AgXQrTMy5N5xqUizT0 z=6FZv?FPIpx04_$+<$dIM|4PS&CZJIk%;j)?)yr2drnx}kqvh$V~+;x0BJWD2aBe# zd&mQeg9L1wpegxal({gZJBjxh;WZ>sa>D;y0xT>Z!S(fe$1{8Up=N!-$NijBsF(aWG?Xv(4o!2ygEmwh#2bicw>mSP|dF&diw zw1@iVpt0t;v6kJj)=ROrUt{gjagMTa&gOBhVR3jq{f;fjed154y=q`58Hx0kf1qT#k|^W@x=i z*Ww+NSYV{TxRAshW-n;&b^|3Nx)db|ap#5F#Jj~)ckxqxcDmLoksHOLkk0;NSdkek zAmL>6DvkaoR_p1K5G$5-YD~~!pEn^rsaDgWm)=b)F7Ro5T58wzMGA{dq+_PWZFCw> zt+*KcwH6HG8Ii_bNf5gpb%U1S)YybRMTt!ETn~%kXNe#CsUFJLzbqLhp`|Y}Suplk zWbkHYxJBXPudDK>i_hIw6_yPC@~Q#>U!$H& z;V(|fB*<^CXSk_WIvL!_@7A=KhA4~MoV=dPq`T9dR~Ks7`!#!TIkUooD?2Ej*IBD= zvrvEpOHsWLlL(8p@O*O0r>WzAQ^uIHB}n4yexTBE(iUIh_3G@km(69~_h%%IO&g=`K~$Q+4Ts>RI;NOUVTEymPb9udAGf zmn0xB(|s#t?k!_|UdH~d48vTGl`rSAJd1KL(Am+|;D<9MMN?+!hiR1W^!PH20q%R0 z?a3P9KKntXtyxU6rkzbupG_D^1Q@>ZT#JoJaO}sb05bXbdvb3f!tLM7TmW)^B zUDQd{$RTr+1e;UC>au|)x9o}H3KPrS9Lt6U%ezP`=(=N9FhkdZ$3RtZNq9Ui4r}ll zdoi70$W_GPDQ#U*mUkX?jybm+ODp0cw|rwZ3VP z;4MeRIS7_IJj=PrPVRUWU-h{Yz-xMi+P;v_MC6?A3k~%u$bQ z5n%Rrxkv5-3o|#a4)DqLcmCF}R8>vU9rIDXfib>%^w}M-AMsmN_0YGnSao-RpL@Ct z)=)bwJQkRj0|d;58<{m-uJNdjhxK#&3iNO;l8RuCo>k;*o7(h!7WJ*_URy3+-P?Ei zHEPNIPrW+wO}uk#2J2g;%m`sMmG@jpNc)CW?lv-DEhfo5F3vY-QQ)0xMO;@it-=*S zOw(~E=Qn9sx@XH%?d!M*EJ&mN0z)e`US`lxjxj9+SySDi-G*5rIKOGVRABPm6Ug6p z^}<7Q;n+5Tcmi~=b9Ji|3~cB87Dkm8#O&u2yWW_(-3Y*WEj z5f^4HNbjQ2I?);8tkC9nwNuCnwogR@uXWN60!`fS_Vad0?eq|NT`Kz8s=v4LItb$qxuftz&}KsH2Kv{B@h>r6l49*k=V~?9F@oZl@y)o4)??<=v1Wy1)-I<65HO7vk&P(?%`I-4rKY#3b~FCHOR&#z$1BTnIVsw-^on zkr3K{*19TodVWHDCE@%@MqA&wnpOK3xxznk;)S3kB*lw3O&`&2Z#!wD0py>R1^s<(K=wIvK<>Rq6d$ z^W=s@f8mMZqt)t^`?`I*S~Ei)6R)n7q4ch#b>v^FyAd?rb&Ex${)^ zHr;^er>PhCq;gc6g?B_bJ18QvxCrqpVGDFl%kWMqDFiI`&AXf_6zYI1pp|F+25VN}?M% z`4azZWlRGe1{Kt|2PeMYAn;=1AEMLt*yu;dqdq znnC=1y+e0jM>&4fl~X-!9l$-WMj{1O)05h@3t(P717%9Nwq}CPnMozm z$CT^E*!y9*ON9CjJ>sx$CYyWBR_J?ri z-*hxXw)u&l0+^@~;&Cd)28GEw`MVr=(rbaQTB3ir4^5$rkVdap7ZoK#MxGZoZcBu+ z`|iv|T>MzdLM%0Svhn=T_36%Hct`2Bt=NYJp+?3pWqfG)QsURv(kr{JDxPJ2{8jd! z-sf>=9oOEUo0%OAYqOSkRW5zvoNby&)f#|G&^9=3EGlfpA$RVDY7e{GoVexkD!v=C z>bxD;QS!7T(CS6-u{ps{-^TZ?aYF`RxPlk&PbWG9WR77o{A`=c*DfN z$maROfh1|MeMq9rqqY}yl@y$|+-l}a-?M6EF%7w6lUK>s4Zfmk%6RpruRYaCY>>Ke ziH)-UF9%Ly7mL@Lw%BOR?bvh?-6DrOON`!rbhBEj zMr+2?@=N~GboK8;p@=U9Ycw^o6Izb~^1qxN3h@eR#A_qH{V;s823p^$^z&3H@{Ug% zcXa2wqd+a9CC<*A>NhoDk>4coO3O6Lg58WH*Zs08@UAP@)Icy{KGx=mn--UBnzj%5 zO}Zw{GH5vnP=_n+`Ck43o&H4XPA25$)NY<_;GAsSn0B*sjh}P9VVZpsmVL}aBT^vs z?)!$Q11V3HbnVM1z7F>bkVk@Q`<->DKwHE29xBG42w?)6r9W0I&HIKkkj}9saLq(2 z)?9`T{FH&^UJck7mZ1}Ff}7|?Xv1U700@wH{Pi7Nl1nQS;I~p$ZZ-V!1XJeDBFp z=gem?1mIUn{`Bkf4pzOLXq)j8fo4R0KNvm}FXddtH4+bK>S_yj8aYFl2eC{L6g^`O= z$J}?WoTIk;gRtpE;psVTsSRU}4-H#1Y0zW-@oc7QtyVm{=Htt7zH)(M2|7hzQwnbL zuO>k^4&RGq78z*?$uT7oLd3QF_SJ3_bNAa^nAN`G4M!4>$K^k0pMD%HY|hZ{suEXY zFXRnlnpf@^Gw+1L)O24Jv4u`CWbr2@PdW-e^{7rR!!;9y{|d7U;UV zC-go96ntOV)$i(kHuE8*@B3<|+T@;VBHPudg4VNETt{oG@2y#GanoSf6Rtj7iZ}kY zpkQb)%#fr#Wj!j6w$N6^(52C9LGopKS?>QaoqFZL7Dq7sQR%5as%VKOUz$#UX$kim1>5l}&=AoxYbJW03#oS)BOKM=za5AE8?m>7HU?oZ>MW%BF5G`oQp8 zW>^lm3I$qDqeTf7DjsPBl-N`}CkrDyyG}hM{9Hn+kc>ft!SBs$DLrvDq0$Hf8H0%= z%$4^>L%bx#A`;dfI>70CdJMbDdl`u$(n!k4g@)6A)ie|jq@Em zt-lTlpkt0j4T>%7km|;rg$(4G?d8Zwk-BY>#+f3`8SHJ6(H)$k?@gS}jVkD0a5ip@ zM&S)uTNH&PVqjlm)N_fDxoaFM0E;C6>#XkSoQAR?TJFX!zCt+x9hN{d8GD1n<%Gdn z_w}VWi~+j=K$H0h@)(@BdxRm6D@a_O6=KDo6G|^`i-RUCYs5sllllp;l`aWd9Dvmx zWcXQ7EleCKiRE(yC5Nh@Ym@uGD&=b=+8ue~hE(vXWEnmZrxvP*FWUf zzgV*&OlM~MhI`GD%{{Wvfi`z9aOit;`m1Gr$RW*_49P-74en@_drKPkpuxupShX}w z(G5*TCsw%tnVVp7K%IXDA$Z!IzFbxNmFtCuP{tKg?I~kzJq_LY4WYM5^l4Bhtd7x>nU0F{p{?U&te2eG?QMfvS2KGHSl^Mc7sRMH12jN>IkrxLu>(aR zV=x_JN@XttCp+Wtz_8 zOkHK~zGdciWNLGo=FBHGHc8VtWS279+ zw@P&I=Y>IzknX`r-iJn4#*hIWgnGH+EJE??M9f+&^2U~Ar%OgqusRnk%T>j4$Hi34 z1QW?*DL?_7IboOyx7^w?^WpReyZ{P{^|&(z>)28djDS}{R9~3z-IU{R+=ZR&6Z|`` zc4+VgAyt7H>LnIAsNNuOTekj!NB@MSV7^pGRe4($TsX;@KO*2pPk0=G02eFkH^YYm z0rylchq&0-se-gn<e!hB;n3Eiw5u)qa;&Nih@dRmd2T0>2*r=k#rC5 zDKqZ3P1^D($cD!yD@9~Xb7ou$Bn>m<1{0!YI9g`dp3EKz?35JrsC{maZt%DnSJI>H zdAnSlzaDiz8mWhL;q3EQO{6cXy7R$A_o{d|Hv9^W;njQ9y`=BCWm+y8ayk!=jJXEY zOBCR5nGEmr!F2j;OZXW=`10EnbhLV`eZs3c=bLIX`)Zal8JXG#qT3ZiGk||ZvKaq= z7n}|Gn+EXt3?BVI7M%S{1Bm(08i3H>HGs0eYXHjsa}9tjUZ>z9S85OzR85fv7dq<% zeL40br~06upO8)yszTaY49M{!-m}KEXcC~j*kgS!QVoqNw}`%BGJsq;!a%@0b*2d7 z)3vp13U5sK->?NU^;q5UvDUzDkp#edANF-XTj!Gfdu z24Z6PS8#?=9zlOl6eWW0ob@140Mf^d;wotvk`35;Qp1}Q(T|C)0r#D{)%YsOZICo; z7_9UAw~wP%DF@7QyGlvZX=fV18dE#@++Q_-QA@YKY5;x(!e`X%3N|7E;I{3-H$H1{n>%b!0bq=6qxoM$!AYw zUdgE>orZ5SE8{<#8rU)K$B{r_pOY7{cBaO72%}yz06(rK!w7au*R(A-Umpf5_|&oB z6eL_No0=!>xR6VpG$sct*jOI3#>-HJSK5-TcGZ$=MTRhEFngP(RvL&H&&QfOrV{-| ze4uB+XTW$^t@8R=5O9G+V?5>jBaWn`GR3m z6Ad=^vD&NnL;6j=^dAoSYiYEwyggjuFCn0PCcBE<7VBJJcg_M=tv2jQEV}*ao<~C= z`HTk4=sp&J*XNs3XatNMorvbUZS)Zbew3eS5ZtR8d+oN|%V#HZnkf4yy4>o@PFgj9 zZ%x02SXobHishWSb+7i_MhXZuujx;1-l{FMY2m=XB_OX8Zn5%-i+-A?hY|EYqWIy~MloZ#R9V z+l@5So#>3V1m`y8rm1~Cob1)syfh^L4{zt+i}e3i1b!j?|0d;t>X&lxi>v=PJr4pP z|NHaG&k}IYnv9>d7ynCs`QP;j2>=j{)||xw|2sXR832qUr?3~o*gFw#At<#Q(XAYl z8T2~LG|=C8`S0}YUtjmnC8Yn0D02oaHDZ>}uwn#EOEG`I|8yHyN)ExSF+HgTRRS_4 zguk6d+}6o7c+Mwg?W&ZZB&C1K!K$Vjos}F_b&g(J-eqNzSNqR+`Ja!e{=dj)_!sHf ze+ramrezi)5;=&m5So}wbBT=yB%rn{tLECEdbH>T6rWh2y=Dpr#S&ug%l06c1A^I2 zJd>!SwewD|p@V8i>mVfpOZ*G9Q8fmAX9!rjy-K46GHi4ysC@9Y_guA$Y>Pea-ytvj zQ>FZG@@0N|7{6fdKetf+srg0wU#mZuj8gS@Y9Nj5tWovMnWNC0`8A_Lw@U2_C`(St z^J%<9sHIXp2CokR4KNqg1F9ak7%4es${VgtbeI+W-Iw`4YcKp8m;Aq2$gO`#AOQYD z;Q3k3dGJ}_`Jj`2qDGE%$0R}kRL6dmM~R3e&XiC^iEPyo1cwFYZZ}r=w~y{ONlA~GIC=sBH;BPkRnn5Ax6MHEs+d% zrCDotR|ZgA1D%DmW1f^ip~h0Pnf8xMu*vZE@~PVkIWQKKeVtU5Hsq{vMf+Lf3fup# zamAmvnEn|f;J;|Z@ef1wZ^@?rt#|ydwH*G7n$8C6e?c>jbAP+XMf`6~Z~I?;k4yd6 zynPO8B%G=oy58(Kgrpb#owu(MPkAZn2RgtZ3CU+9rE30UT?@)-QHjHUa-Jgb8QcNn zF>nvT1nudZDT$c5Tvn?HXC@JXX3gX>kO%u zRamT_D~A+awBZYNn$PlkyNu%# z?%CG&Y)RYL0;R{o*I-1dPTAn3j-IGd+~OTz>Z}$5;6K}LfJ}2FwG&C;~ zPJMe^enblb$hQk9mx_H>r#Dao;%q!XJ#H&ET$(WF^|TFRQllj~x(kBy*+NX*G2ElZ z#ybw?_O{Q0s~N9Ci=oVM$B-OH*HXE7LhvoU@g;8_z=My@MpPo(F?VXg(j8>mWevIdO2$2 z^3Zz~x#i|Ut#0tQIov)C zHAJ|vXj8YwzbHHJ%X~LGH$7+1@Q)~(rf{rh#P&mb`TFX9)LCB-{E0XP(DPc+)i!so zK-9tG=kz}9mcDAb!ggWoKj&w!;onOcOI>DTP@Rg{u36C3QnFmIHex$ka?bHNT6X^* zWU9(5Z2}o*9PeRlDuzx^_dyU{he#S%y**zGRWojeWMDySxQ>i^-(G*$HB^zkD7TnFI&izq*0Ts--b!u>v7NfgEshFzv z1YsA8sI%K>#U!Vd(+H0~J69rP*!eXG0@B!KO~p_PUr3aAzfsqMV+%+=z(gD9C);HDO8CgeV0C@D#{+uN5@q8k;fnS0HTtI-XW^uWg=LRHzWcg?#pQ>oHk_!)*)ODa!?}((&HGg^*7h9<&Q2B)PE;Y+Y(M?H5 z<36`90aNnYgG|;>R%Z%X3x;_r0jVEd+3o;cec!yhpr{@ghx`=}))bow>>_pcK;y4KWq-A(M5CD+2C{4}x}=fZ2LqBU^MOpY%4 z(34sNto1p3swBLV+*=M)D5|2|Euk3>akN={aQeiwlD;XSZpQTDk{{u9hRoBvYXAXC zqUX41)M$?^B|~yJV%TLun#(PXbkp}q6{`58N61TDYHccc`*vk#i&v~@`s=9OyEmzM zQ(Yh05Re{)m8IMl8N_>Ol$&6U7NYw62WS>JZ^x!KNT6;y^Lz&VLtGR0Hd3qU#Jgi~ zQ(J<>k#L9CDb>Yp+v)LkTa7N3H>=xH-*HiIBmg;FWT3{|UAAy#jf^!L!E1~zV^A({ zg9$RZ%hBiO3N2c}M^Kb%nd~2< zvbVwwJi=7&Hu*!AUW)LmOi!Uow5aC}hr%bnX2AYv7QiJAG02F1Dc--Jxie)MHgg>* zkS1Ci>f)6?=akAvx9r$sv5Qt@YLfp;Q2$H2|m&=v@HMhXFAs#OtL&(5yAM|gcs`}7j)=R zz^e#tmWxN{u6$QXMP#n@^%{!EaNGg{pDiLgI=u+eXwn=X@fap3VG48N(gHG8l?ytV zqB!uVrL!c|*TUbQ@wPbz?lRIRa-fAsOu|Eggmf6=29|n4qQ;E={UIz_TJwlE{JgvP z)|jxa2G@QUN^FQrl^%r`XW+mwZ0~!Pk}I1IiM=t!JgV_?nY-pV#1d~Nu@omo>mbZA z6x+CgRNO_cQYgy0Ash@vs9Qw@Gh*IF`9nA2)`4Q})gpJ`36mj6G*04j1<(FN>ZQw+$Y*&CX>FnZ!RkCbjOP5rMYk zP6-po9MW^*yilJiQj`sEyq%LHYntRim!}^YA|cbE8J%3)BH7ce=aubgmF|?|$`pV_ zh=)jh36Yvug5_*;3hXd7sCg??JEJ7s(yOI+cBCHig-nOsI=_C+aMD#rI%U&5Wjico zH#g-?cgnk^ln=Y~5hF6HZMQytm2x6D83v;1$(=q1Fj6kaZtx+SQ8rjpcng6(PvyEN zw~wWS;#m;nbcJW0gE4rSW7@<@5~-@I2LHJP@0C($STuREg#EB{%XTyIv)aYf9PZ}b zR1{?z(}PpkL^Oxw3HQFTXdJmC^NG|QP1s_z5(ks*2uQd`C4FNOLE%BK*Om_Ip=Upm zybyjqEe2b_BeH4)`&?muci{qe54#Z1;=2*z=a)v=+sVa(45mr@EN5DxvDoUFw6fMeJ>AAE3MqRE;06<>) ziQQDNq9XNgmN2d(>n zz5N+I{by(6<)q9_<-JW!wRL4^nY^x{*1oYB0Hb>Q!9_r-K5eP0bPy~F44CXOnmZ)} zEG+9^V$f*=13C`!)IO)##=vZ1VQ#7>Ld1OEN(}%}cXdqnp)o#)#Q9Dl&MnwfXIYrQ z=_{M416kMeqt}VeA_%tVUMZgT&zhQKS0PI$GPt~8p99XA+=(!_hUKo@R$OBWj=@>MTbV$7+iP^ zXwzEC@Z8QS&kn7PU{$|N)oI5lZ)O;w0wg!?HfJvfnGk}@In&D*Ab<~Y`1&4`O1TRA z4k6~= z4pz#XrQKu}!Bp6cESN*S#p;+veVs2QMUF+FcolS9@bH;Vgwk|E3;Ak^} z@WV^W4`5%$uazZ5s?T|U2o~>e$M&SNzA=O!2HUAeAij;|_P?>aI0~Po)R)QBs(-31 zJ!;1!Z?w~U(b7Vi!PG%ay&T;E2;{5@BsmtZ%N(dQ>oKYNnK<(^z$K_;4whih7qwT) z9Ip%TlMgxSY)f#GH^W$3;0jJd@}=>TEe!53af{mmeXT+-PFsZ+lSNqCg2~z>tlD7T zr9ob87s*@w#m_`L7Y>w^ZC=|6AHS4Wx}t}qqE)I%Tl-32>tS@Vx?q~2pj6y;J4#E^ zJejR|$xXej;|{db*OKQ_9}}KAo|QUm%KMY)#A08|SiY%Zj+SsZ zPV#%v)E;JFx`+LPkoDR>{mR?6C*vI<--S}Jji+zSIaDk?zZdw{cUxOzS}1tfX!T5J zWDYBL#^{vWDr5@n2{{}p4O+O~rtZ1pm8qXBTJW$(t*(dXX`1U%0iHR;GN4PNpf|JJ ze*z@t+{*7ED3PlmE%!p9L$L4ai>_TlcLkxBGp{-S221xN1(PYqzLmGeD!_YFIuczk z`lC&2c=^+wyp>=3o?dfx;7B>W+$*D3p*yl|U`)MT%snE6CB8ziIh^`_#CKhHnKBxC#mYK-~P=yrG(i`rYjKwF(1NF{v>OyE&P`%vm3V9wdX3 zGnu7S${KL%B}lN;W6~IS)k$2YP;PV(-_%W%e&MEH)F6Qxl_x)wfb*Cj*Q4c8nmTkH z1D(H!s69i!%~EXnUsi^9uIZCJZqU)R3}bBWpt@2rEnChQ@JPx1D$kAz2%RPMYvl4G z2N{eVq$rde&}13q%|d=jCC8pF|uL@1QCbNb<601H+}ygJK?SL(W>34OJC zMQUzvlyc!LC%!fUB%Vxl%&%T@{VNc?cHL+}BNbvmTUkm1Er!1G1aTwRaJs9E@Mti< zEG)jAO$|?p)kFXxvO}@-dS?VTE{QzrFatF4v-*tS7TaN^o~0agA}8PFGYFvq%sROu z(n^O_g)%7sHt@1kkSe~3*X}A-%iyKvQIlzw5#V$T6bW)rGsqFj%`3^Jmd-7?aYddF z6Y0s$lj>96;}aQl&kS+_61S-vg7Qi5`BK6X@Nzknv zx;<-EG{VCu314T%K&=QYt%?xTBpNlGn#YA~sq>ZkrBfnlRA1eQ^-uN61D$@`$|pa0 zzHS$Jx>KDGT90ruZE0D1-V8eVhH?BxAG1@+$?xe-$-N>ipelTCzQ8)2N|lp3dwZ!6 zr!<_!il3=7zUzX!PQmEbFkJI78`Q%1sge3b&=?A;g0bh^Z(Z|lr51nN+-&i4f+vnv z=X*}Ekoj!$=p*eH2yY|31~kQYpPRW8&jrTcYYBRE0-?;4RU5cH-+X)(y4i29FOMpQ z)uotFxl-;{*33oyqjj*pp@d$jS)G4r>Jtufy6n*WSpR}mtS{Ak<^-*uJt5yZSr_o& zaeb559Vat`qh$}`kB8W~uvv zXZC!i;R`iC^`IUB!ekZR8#amHHE)RydHoy!WX%;rK6lH$*fMFFH(Q!t-}WJ*AXHNN zPLhPu5gyR}lReEp(MaHRRRY;F&RZqQp+LYg@Y$ChvNSiu)4DtPem3eJqM2KtOiSFo2lQP#OvPjWAn89SL3%?4roX+6zdt|Q6x#j^ohA;d?P*@I zA=#5j!X?0w{||d_9oA;o?|UX82~HD&OCce+ySE7%T!T~GrMOd)U_pyJE$&dXP^e&S zDJ?Bdp@v)KfkK4}J@k3r{l0teIeX8UclMl_IWvE9UH5gf?v=IHoviiwetrQY`Yr@i zk*%hDK1052tx8jbjLA-ua+Of6rg2GuSCtARiHcEC!>RJvT;GQ)JgH`goESU*?I88^ zuL|?yD2_ui?ySOm@x-_Q36>&cM%<~G&=O_=L$+<{+Gx7(r(=SXtq^2z(F4#QC6j`T z^Ru{?2inzQnULM(OPcFK*CjzF5~^K%n!Sqksk<|othrU#=OuUkIEH8My`{(Qdh=7g zOp@>l!<^Jiw#N_(&uH|Uy#+$e;cu{>aQ zgCm#i3;ZKNB-LAg^q#uxJBNDWPB&b!C<1VxuCS1!Qlmua--?>c@H*8K3~10I31boX zH21Pi1_hYPB0p*+9{}+6Ks>^ZSBtQ_y|(KE6;|zJL1yx_M-ub-XU0{B#N6{)6s`$W z%JPYrj{LD3rSo2#4j?gAZ2CNJdWtU00G|7@$tnkAXx>xB^|MlkFT{*ldR|sH>#=x3 zlX*@aZ{|C*k)kT_!wV4~Ll}wf7XxNZ$n%qeLaS+(_Vpxq(|o0Q_hyXcN?mV6Z%s6U zEM6%0G|{*n)h6S~)0!k=2}*94j-AEwlkg)gx-C?QDQit(CK;99_9TY_3{IQJDGskk{ja%m|3pTU47q9=0u`->IZ5?lPvSY$5!F_ZCxnJ9_DsOv+*It>or* zp_-Yeba?SQg&7xOmqf(!R_|2BZ+RmDJQk%a9n_jY0S|U7vV%4My#ka#{QyYjQY6w& z#m^5JS^j*sPX8ma@e3PDLOL{=LoJjr ze<`}keJpV?Yio5-w}?Jk%*c}dm7~Dmg5O;+&nu5!%1HJWmy0(w1RLenHcTw7n_pJe zws9s_QM#m@UN?KjR2}rmIA(*+g4*HunN&a<&v%@T@mOJ}^?FD;I_`crDk}CO z{LL4}<`3bGx@vFqjz$IiXURo31U6mXUR%h!e7v$O8=C#ryi!T;_AX;Kf5aBUUdXIq z%I+$t^nIr?X-`|H2N~bss$&{&!dN1*G4=8#?Wy1gxMfCHF}i;<+PEdqasuL1 zi?yyGDmIySlpfhWrHpm2JP-d6;~|76@$hA5ezB+Aw$3ebSxtzq=kfS+#2N8}4K z!(@Ym;6t-A;DdyCD!|x!!YN=l9Hps^fWZ*}iSiwG7e$F(d@>*?S>1xT0OuCT<=WfQ zkO+fwFUGs$oVF~yHh0*4g>Y;sMwBf61to|C9GO6pjHDuWyGh?SCySV2pMo%-G&6iD zGJzV%0L>ug?P!3MtUMyaGD_WENvW(U`CSMQP8JpmlDk2v>o4z0*$4A2NqO@Cp2TF6 zu_SgckKDQ@_%b-7XG38SM_@5^V@~3^IVb-|6d5_gLK@W~GN%QNC~iMbA!x!U-B^-k z)u;FX+!HyOd~l3glpCwBy_L>DgK}wC`n`v+R|_OJN)^}9>`|-4;F65ENU>T_p6iil zTyAPKiS0V;se-{~?8pPqsHWP3ewGOYH>I9ZDuU}-DA%)G;0H#omVVt2a2IB3ixQ;C z=3E4X(wD-_DB!E=+qnx|L7dU%2`5o1KNZRFu7p8GUVjqv7a;FX3-Wv(@{0?`xDi9Q z8B~#)rN&fPE3KK4Ytln3=01$Ja|^FsiaKSIucNjUE!`g#jJy;uZuVd?q8VI>*L8n; zU$^!Yh~rc)?ys+$6V|13sh}A1$U%!H6-f@+MqCODT3QgnS{XikqzAoOL9wK_^W32+ z%!DX#y);5!b|M<~(7=$w(16d7VeR^Zh+t-GQ;WQaF5M{8P2-j0 zYi>zKN4+pdc~(~4=!+gTOIomd@-W6>qidliwD1~+UO2mc`I20DftPGRm+|XkW682| zi<4Rla4nqGvnHvUR#Ue&%wlESTq)P~A+wc`^(AtF$n8G7{U;N@euJz09=k~E<*^$7 zB9vpx<>F0iCWxh^yvSEu%kp6U^)Y?v`|6uW4?F4%LPM?bexRg$W33HNqpQxX-stqI ze4)CwPJl=yG`ESZ&n9EuvoB8

    AP<@V3C4;R_`p9(p1`9+6<%i9UPz28-Fxw(1JL zY50l(1?|)%DcCe#Z&vqiN{}IxIc*5fU;;!M8RKHbaPQpA0SSRgX}X9_v=MB6wKtm%k!&2JIkf*g>Rz44bHzjWaX`OsCU@g z7VPasoM84Ivic1N(dnCC8kax$U;h?RnPiHxN=FyzBMGi%wB4J&&TNI-U9U(fG&6IT(EglqkTP%kfd75Jf`%G?L zOMk2{{~+smXYD40&r*nf5M#Q?8(h|3P<`QZ6t|y?T~Yt*ZJgbZZCtYNIkFcU@Sd6cr7F1Jo0Y1*&v$;6HeVI-%xRIM zPQ9?Y)_t@U_y^cwTG$4=aJfqe4$-l+&-0J6AAaKLVGU*NPf~VoVN?$fxLI(S9Espn zyDMUM!Q_^D4RmC&i3c-ORerz){AEa_`2)#@{uMj4v#`=lYoMP!wx0g zTbi_RE}enl{MDz|L|F}ozdCCGYG^IbOZl4a4(C8Qp8Jy#s3cnGjqWhJuHBjBvp6)} z&?oF%HKvmLV5f>yO|8=v%EIXYsfj#U@ zn>wP?3W2XiQ+G~dhN=!p)jC1b_q7~WUFulWA_{i*q>XOrs&fYAe}(D!UDmR@rtHVqWTN# zZp9-dBd*{Py;_ZnkckZl)r5jQ@f%zi=1+O@2;s|aDOE;vNNENHL5W~(PFfWn128@5V_qEES_6b1xK_tz%jV9A`-4$JM$QVW`P_J9cE?neOqq1Bk(xTEB4WPRDI*#6E8`VaKb$)xT z4L{9ug9O!|!DD0w%N?(xlEnJVtyE0YSatN4z-BS>d!@SS&i>e!r7AGj^@e?cfy8Fk z^D%ktD$nhxOQG}apsli9e^B%ji=l*lZ{|mR^r;?qA5eSc(2T)|YhrnR`zl zrTz1Ye?k)WFKm|L_cZ*?r2i+=km~m}zrpQ4ulZ~G{QIfO{F_Dp%|!nfvFLQa@x*_g zu_pbW!xPEE{47GNFfT(A1;erB*U%~eSks9GA0*eTTZl;(a3DLQ=ZUKMD2QIpwq?Bo zGn2Ej9KYq6mbvV{cli4KPA+CJ_|FyWPr&-0XWrBQ_a6fY213ts0c8Ht6OSuR6Z8rw z#3lUM{?ro#V3^@hfsr#ku>^WA^i1Weku~bxi~*49Xvpd4U8WYx2HkdvLMqGMhmC3! zxZcvBYHbod?SNqnOTc_10&=s`PNw4@n(03u=l5v&=g8#$5w`Mwx^4OI9HRRFiX384 z6%950@0ZwF>??y!{DK%61tw(DT4Th7@?14?gv4ujg|PRBnM8T%w4!FKlFrD)HuOM^ zU>Z>SjyhX!H;m)ncCAM!^Zb$c`sEa9(1@6_TB->$OfTR|YE$C&6N%@6qC7`xP-ByR& z_uF8@P9za?fay$8*YJ2bQ9*#L5w^ToOmAF7%iO+|tRIkF84#4bR(#JESE6EbfJ?q_ z@Uh6zO2#YwuDC>_I1Cd;e9(TxqOe6-%nt`ac zrUsZ+nbQ1nPAC&cCgLdtgG${9ttZ(A=8&?#!`8T7rWC~HV=;=Zh z@0t2faQ{(y{IafpbK`vSNxOTMh4@W5Q0iizjx|=wTxdJ%u$o-pnV@a;CXe+|FUi%D z=;4|cwtkXpCAs)zrU1~XZIdsb{fOio$}oSu)B)eml<5*uXj+QZ_%>hvj5#gOpjt1d zuEq_%xM~!VJl-qR}a&8*gnW`ugdt`F5dbh{NhXkd|d`IT}} z=;V6C{0-2n^d{4#amLz#-P7+dVb-LSl%<9tRC7}{~_I=W3iNP$O+vE zd+})fen5}m`^Jx0BmT+~L!zU1RhS8x$&!EE7uB z2AT$WF&5tUIcLLcSh^f%IZzY)N8&5mwa?_^(#{FP7~~V2os7F&j7wb-vCBEvj*@A0 zLGo-HxVnLkr9U?ZAbKh>?_#aNe2e!|Qfm0w7N-QO4C=Kh+4S9Oof?Qu0+ zQszEVFFT<(l$PNJ?tx6%VWziXEyvQt1BJoEtf0(Vt{vP%m6gNns3*1OzYOG1`eP_w zy+HBo*_=o45^%xFBS=bNPRV_Kz9z@ zU6B#SD|?9WnFA54-DOS1>g9fdl zlUteKt}>O=aRFQ7X#z59`no(j63Ao=i%Xxg`-p0QVmg7{Xm=nxxk(FBMW99VQqT@y zpiILcI#6!La$6Ade4C@T5-hO>m2=BnXMuxyfmmk_Qp+ zCQus>n-DFBK~%i^ingY}nro|QEVr*&`MzaM10z7=lbL1O3ZO1CuPGHgY<04SZ!`|& zW$6U)QELzx$*X+uDgaI2ED)vyXavzT3^5VR$RfNz*4~;jCfPEKSIO#~wpu+> zSy}v?-(1HeYKwmix_rK_83Nz8qeOvN3|HF`CBqIEyB}X#|D+Rh2kvBBWj##8Qisx} zasnD4t_q;*bMOYgV0B_!Obk8o-vrInyq?r#O@o;+`li9ZWvN7Y_kp-p&s{?n?o_(h!_MnDIpMcc;2CElXG1N+6u^ z>n;v2#c8;;kn$0hSr40Xbnd?`!N`BaHgLFGGuqxGeUS8@S()UOKk5A`N3^pweIX#K z)K&qPNZJTr+ZPL?NVxL2#NY`?rhIvjb>K`j2QwRMVW*%DIs$e*eldpPt6uu-WQvn$AbDXCgUm9ahs&bz)ULySGRWf#S`(?Yh*~hNSI=3LYvz zqh$1qRXGQR7lT+UpPkKJ357bMqmS0oqa3Q`lZeUgH-<5Mh{J`zOl4-AiT0FRrVndTLv&-vRMSUXziL$JOscK{YIOBX$iq;OQCv$r4eSV9A}6^#EV4X$XZ@W#v_yq&5J7LFn(F?r)4j=0^}c^a9DRVU;ADmd*)c3 z_6W>L<@~vC^K5Xj|LLcW*q?8m&ka3)X#BamF=vlKkH;AAJ7{NG3?ZdM`Gc+l>IwAl+syJwVt2pT3Mm*qT6>gd zoGA5Lv?%w-D)M57RMC}4QcP)D_Slg1=z%>dm*a(LPl@!@1R;ip(FtZEu9DR#m8xuX zO{u%=k;S-j&<&cZ{l1e&4vu_j`wH?^wTfCMk^$oK-xnHot;2OIVdw+<>#8y7VOZ zSVTcQ9}lBGTBzvHh#78hymw`x(+IkTq-1FisNt$sv*ojZ%2-N;OXqcU6u?@udS31;GjOjEPq? z6%%TC@`&iO!qfNGRP*sMCZH&cw16CvP0mc<>AL90Sta3hc6~+>dmG!CP_7~uHW-0_ z9K^C5DwUW=a6$!nb*pEXr-Z?In$NbA&E@j(CZ`FXZG$y0hHHpf+h_=yk$v;L?rrdt zX$m>nz{oXh2~h%3P&NXYWvpMQ<~iz2G(0&fKERjovDhuen@y4=@paAXGMu;aqp;Dq z*AM((D$#9Ix4?&qQjbF8DYs%0aIKSwd%wPZ>xQA|i- z)-@{|ry|^g4h-dclc!d;mVRv>A&Qk4_?VeBCYsrQ#aKwXlfZ@IpRH zZv&>#n6v#txh2jZNnIlPh+Ik^up1*vS4W^hnI6OEgX zUB_nHtjV;ZCDv>7JnH;0C_WWc-CG?WuAz8e51lT|${urGP44_fvqZp`Q$R@bBq2>Os2I3aWCc)ikOPMmmKag!95pQRhsH58;ugu8-x05 zk1Y+atwft3oAd^o=(@ZW*IVWf8$ly2inC2rYerm5&48We;F;E7+gb`U)7Xg>@vef1j0ae4p9NLf3450NN8k3Wtd4wfDP;i@iqI{iMHpjG!QZzCh8rUb73Vb#<-cDIlN=bwxgyf>;0QAOx^^vSO@Um9;<^mJgh>JX-ARE=UxF9&+01Y%EB{m?qSplUPO zwSjbbYo^gg29)eKw!0c#2^RL96s(ep4dTB%>blZ%)VH6dMK z4FGi6BJGO?Thn)2pRBc3g9F#M8$8ScQGEl8kMF-Ldc=mmaVTK6>)H2H`0i%tgF7e% zH5aCzi}Lx1JJqxzIg|#${z24c{_-=yfZM_6yt>UFI6GcGUbjEn2yC_^p0bhfaeCSRHlhMw*m zPOYky`whZ2#2T1^Vdni|9%eT`R7@Q`iR}eGJ9Ov}wtO}nR_EnAZDxsx=4v&|oVvs@ z!>B&PbSI2Ce#Tm*f$h$WPUDR3&J0(3C~v#=u!?SPh3+xv)IiWti%-1uBvN}HBDT@e z#v|VB?fVQyUyJyr|LpKt;>w)QSP@@Vb;ACf0!Qsqo3`ewDgG=S8TC0GM@d80JDvWI zmcA-2`Y+T!ZqVGBHEmm1cz3(z`^5X`jw|UAy={r_>9ikys|p`X41cV|#MMD~G2!;) zsVmKF1&hI&*nL6W#r)+Ud4e-F6vH6MuGPHK{mg^oWhtYM*AKlivrK39$NAq6`#)Jxeiaj76#n7UaH;sn^ERw_W?0bF zm4_lLN#k=GGID-x+T+3$cm~ z9*#>#KaGFAdb7Xsps0ewKMuRWzCavboz|*nxYl+smGJ0QJv>mCm0`@_eF!4Ep8fO% z#j7>+&o!jux=-(#_TLV$gaG1yS(*PIvy1j09rOIVQ=k9tpJzuw_P>vUoHHmn<=D=S zg4Qqq0N20lqRC!LvVjq(!5r)%Vo@OXiF_e$ow$K+$aoP@jo{4N?eQR2EckA(EuxWz zky)>eP2W^#CPy_|qBp2!{V|El7#8GBLrWXDV)LtvE5vEyzM48C zpF-HgYU1~0)^WYiKRSLyOOMm^0DhqG`=(;rgA}#Kg*GEvctBQ9$M}ojj~ks_qYC_w zPo$jF=rB=KIsN<&w~8Sl^9DA3TjV%#8c*f#o_;A=s;Ze4M_P%`!Y}uH(9gjqKAhQd6a4mlJRW_02xjDEipDTHGdw-MyS%&gE*A1X_a@0ahLX zYqK=7*c+}axI3JNW0yyLEbXE%#lWz7TLxRfV4hM@%&ISKmmaJwAwr{9quUp>&Facr zO#oSYL9BDAncL9FdamFc@#;dIq;^bhgf|KM`oh*szqr3a&h@t%OnbpFZpECG>TT6& zFzmNLISK`^HaCiQ$Zp@ki1|DZow zjfo&$2beF_>sn;IDVb#tq+Ae~oEZ==81i;~^T1&Qv%%qo0=~@?Eu0oG_U*m)=Yu>RC9@N2pn+7mu?a2<0GPYCBiK6L9BGGX44|gRvUP{b|SFSp+uD`ITk?DOaFQKa#^Qe~a z8A*lO*E}EcvVT&0geG?!{n}tngC>XoJlG9^G?&nv3+;c(Ypfha%%l`2GfsN@rkrAq zUk4ST$9NeeofOB{+jlQP(>p1D=2uME5QLnh*3dX_0yskZnf{{j(BmPD#B1!A3Z0Tj4}(Ncyv>ARzw)Ednv zwP4T_GYDYcb8?vd>2f?m>E>x$rF=ALNZ)t7;%nO$=D9MA`B)cnuV6?0qK`>Xw{XR6 zrU^|qP1SHKMgZ@TfN2rLRJscdXaL+0zw;9hy4_srw{jeOBsI~A8(mhSr@ke=_? zMIj#%pqfHoWl9VnT5e2?`8PQRQtN*Bg6>=oHEM1 z|0cRMcXOA@v++fL4S&a}3qn-V5B-bku~Ehr*{|HAzmc1{lPuO@iqe?QE%31kUv`}Q zRx1Fa?pIh>`$MS9-ZACCdWf%nrxGkS^q8T(1!BwTvX z0n~&H!}$*S=9>nA%6c&C+(4UJ@#S}EiS?vCkfg_=IQiYBIKAifyp8Uaby0ph7Y`PW zk=E_yiSN+`%`#tXiV#n%vMQ!r3mHct(&+@xClef;Ns|%X-7BVp9*JyzBYe`!rtcna zIH$4qn0C;fCXjx3EMV9LALLB;Oi$)^_I*S?~-!i%Z0oPtU5z_fN!3@o11BnnMaa7x*Msre07zEIC`c&6w!6a?Ffy*p+IuOR?)75Zis^QLc_y2p9r5F zPr;mM`zECTe)%rWRngX}#czl(xlnrVL@&s-dqsdmC7*^~mdMcaJ(qQh)%TuWKooX1 zzwkf(3L;)MX6%Q&5_qM-%Nu>6Ak?h#)nn=m!_1ag^mA>+yNUASsDSRZ7!Ij8v+QAp zd*Pd+_Ady)=9g}_Zr70uqP3#${6WIeu07_`&pjy)ysSXgn0{e!5gF^;VkDlS$p~FqDXR*+FdtXbRln^f@!5ECceic%7yKwi#mr3 zbIM$NEhWj5DEW+!S!INY>noeuh{Yi^RJ4~R011CJl`?Q)tq`Ici-J*k;LIfihUc1Ts#7LPMqQvg<|wt`cFN~I-J9cn z13!OkCT-h&{(Ua6je_TsCXbgZ%gKho?4khmxPD=Sd%hW`G8n0c$JCW1i@74X^N^e& zNFGL%oCZoD1SKJ@j6r1RQ}BJxOV0-Z2FZM$)+pXt#=!x0$r*LED8<)7iB~M zQs{P&A?~cyYoinxe$l*J6u~C|T9tzGDmZKK*rH7T=tF;D##4BRSFy=_w+QrXWPVVC zli)K=WfUf$V2OEZE3Qa0EhWzxA#m_j=NUl$I&ysDYB@H!B9E|TB_ydKOQPV;x46o3 zM3|Zg1UQQ{kVMXO$*r?2#YZaQyrRA4DtFeiK-Hr7bw=Tn^BcLR$@X8E`aU~m_lgC5 zVvR(mZ|5fl))NohL#i*=;vns_)ccfDIJaV}}EMy=mlJQpO(YDs{*6uM4awN3-T ziKLclWJkC10#iY;RnbpI_^COF)-sT;#6}dGw~t798Kuo|lm&vHKX;fXBgc9w%_M1- z5B?~vw3sb1l5YouyQT=Xd15@DYbhSdJ`82i_ra?4Xo83Zsz6z-6Iq;QM%kWVr7d4E zP(sp$OG`HQ9I%M=9097&tzRqKVwShiETRAw+xA=tWlxKsR_I*km&7XA;x6Oy`S3N| z7K`Esp~%$IOew1rkG+y_UpZwra`I17Ns zT7c?Lq6v&P>^GX3#^Bs@$TJbNG6lT&-5jWH4)ozDYimG7BAQ>3twNL-f)Q}VG$!7$ zDEVVoZf?L(BRuP(PT_+wWQQn%h)~URHaYWxlTj*SkrOyTBg4C75(BfNf8tWPu)*o z8qpe;ZPH0%`Gq4ztz@dpG=mQt%T>sv70u^@1U05+abU7)cw<&eLbpn5uU+fSnAU-^ z*1^Hn+bgX>^NDxAB|M6t_E^{B_nQ)>+q%-5!n!k~X+${rgN>I= zAGa8L*TqTe<7QVJUw>5%H`urJv!t<%$+;3*gbIqH;np6@193k#{`j7qMhO0-ETQDJABhd6J> z5Y{w1U8spNO*dSHtJn5Blk83}*_7NM#`tU>RS9P#s|r;=OKTb@@!Bj_{1J1*UP&x3 zolTmv^U&v#XsksdF%efTs3h964KdV>Z3olTern-l?Xmqa=zBS$6VG`$p@c&@BbVhx zr{4E#CVtJ*n->^Vqw)83|%Jci&~) zdHdq-!BFcTocE4t6MiVdkL>S#8@fU#1V0(N2guY#?!kU>4nqxfFX1@o%!Vmn4hLD1 zY2OVqa%nvig3T(y7uZG+w?|&fiqva}oZo{{+=kIT84+mXI$v6Zn7PLhH!6{--K{q) zsWzqq9-%iIm8%$2H?KWy9lOvb8Jm9ZqT0Ac(wJ74iMZPHgp9NYbrM00|mAwsXl*?rJ?#N(q?B0FiuR8cUL;7>fQoC zIhdk?szxX%IJmgjlvc5XSqSbT?)@+!ak7fl4wk;w2)*7Tt;K6Yj3ALn)X?G*LWFG^ z0%ll6h*||f@xm_`Itj{-^pA=aZvTP5c~$)-BS@M6H-t zEs>x~77C_S*xeb90u~J69Nobi%nhPIl?J23ba5aDz={Z=fIwabvs%>wl9W-dsw#=TZg0+R>y|7c=8cN3;=Q7}JpX83?h|+R=I&BW3PogY`>! zC=js;2XB;f41ax&Nf7C+g(iG!YK(>MCBLE2@g>xGw}>|ry&%|cn;P0KQT%7YQ!lPm z_!Z^pAgXAQ`9KaEXZzI1ySIkJPATapy(&Z*EO*k{%l2#{jix5&J6>&-PG@Huc?eaI zS?YvxGhcrZBGA$-59jFl9+YY_E1jvaY<#ErHR|%d?x?ht`_HNfW*k>W zdxavV`@M#2A^Wf{+fRGvbEpdouGeX+ymg{Dg_tfAXjO9T^5$ijh&RhmJ%P!q=^Vb= z?g5WlLQ|SEa@xLLS(3y8<|YJOm^yD2-7vxeTCs0`PITP+(8pF+Tg)8iK3YUw!qa>1 z>lZtZSmA4Vb}+K(bHFo8L~U=xwyD<=kr%Z9*NypSI7_h`r1_E zlyO63rmlO7katIRrz%zAn-2Tma7gHHO7tA?zl;)v{JtOMf8G7)f8Xyn-}qldvC;x4 z{_XwF0QSG}vr+&c9UCr)0Qh$nWm8w}bg;N5-S9N;Loyp@#JmvW=0pyZ0`wu zaDS^W#m|=Z+OwR%SquNQm--C!{|oW|@9y_ftpN~1Y&cUOf%Kc{FEMo<{H(AN^!kw`_HT z13tsLi`G|?Mf+|nSLsu{bSz^Xd7a{RnW3(g_rSTE^2PZEsyPw;#0=?kY8cG>l|;zx zy8%tM7~6ci&`W`t(Jgy3d_107XFoH{rh3@lfK?9^E~hBF#I`{0HjtfTDoyNOHX2>4zt!zy@;xR)k|(er=CQ)U(#Ep^-9Yr9l^ik4A#h0_y0Gb8*wzb%!j^^j;bT2$1D{N}i zl>5jwJjV0sy$ZLb{iM!0aQN3~`n&D;pX;T~|JkESIsD&@rpy0kG^QFEA&;^T^&t0chkrazKtJ+PI;dHTQ9}Mx3Zydi30uGXB(va_&Wu(54K9+0TanR zmlp%$IQ!q!3^8w_>5JVDHfTV9EysU)d7u5$)9%|p@c#d3aUx_(j%gY7}BL8Yu;QAJ6<^V4E51z8KXiXnm^lw7!=5I$g?HuJRB zF!P#4GMJ8uE~7_~P@+vsh8)Q51Cz~}lM3yt+Gcv>xg|U@3Y_heK(9Gq_5^|>L~w@2 zk^^w~hIlorMNDm&Kp0Cq5^;Vv@W=1~{W%yLYPfN!y~-P7Dc(QdW`B0y(m&mO z2mhnpr!;-Gwo@RlfPG{z_X|NV7+28myaa=N1J?kf%i}B_w{N{^7A_Byd1wU+^`r>6 zBrpSjmrx}#0v1&?-?BaQ#5aIxnM`+cw(%YMz-hylDgqD!NMhj%BD}-&sIGzV8FOoM z1J0C_^--*Clf^tsG-2tCQllgKwAU95g6dr%nQIzWm?a6XfoPAK%^2GeAc)2l8mM}+ z`caNxmkLwPaRBZ~NxO>n*WT)xOrL<2&p%;Gc1dS(Z8_u8FWy^Rr3TipzoLSFW-xv) z_45DJ3-R>NPCE;^fuX-cZl=WH6bM|SLg^5xoyH_9(yIh_(*SUBqF}>Pb=VvbOz40r zj~75e1*!n&E!8;xuXp8nFo74W4P@D-y1H2^aZM6RwbY2MjnN18sxNq z&Z+=>LHjEW&jZqU_VL3uXH}h`{6lp=l(x5?II-UN>9A6@IslHFL^~V{;yOwwZs0M> z^)Cj4OlDcgp-o!s5(pA6`{s{`SiIj{E1NFjj^uCQ+5%Iu+|f zehyB58-{vv*+$pAVwHa1zn z(`x`%7I7(-;b&(FC802OLKP6?mDSL`7u0OuLGcE~)HaME-lj2bVQ%XE@MeTSJVk(C9TwB|)hx-j@<_SC@tVI*3{P0>w>v6q#k^v{f zR8wR_;M%z~r<=Ah)kbrZU5o{LaRVRU{>uXR=bPg9_s4&(>;C@*@bCIE>;HvnS^w!k zM>lDVj{X&(&D9?JGe8>!13XNpmcE20qsDcUMY&iEeRAsWGfP=x2xO_vaV8=ypba_f(skgfbAB;gHi#Yl5;T-1SvXkKvc*Eah1V>9!~B{cy+kFo zf|yORRpEno>|x$oH^7=wQ$vweuS?zH2OWg)C;+1#q+y~gWXF&x%>r#@Q^0F}%fHq* z-uHR?vqxePEtW2f-LBJ6qn;eYY0n2;9_2B{xufBBPapx2a^w;h6XsHU&lMpqIhsLq zuHVl}yt8vzS8az>bBVP1zJ#_Ux>_yiW18{3Q{O;6$KYsc^`3Kq&E`XxS4`Ivzo>Da z1|-kCiS?9@uZlR_Z%#6gO}w@9CZ@U`{U-EM77K|+s&Hq)kV;)>!9uiZm|Mfdh@Z(8 zxzM|o^1AB)VNH=+#1;;q;-9vjP`0$yI7j2YX4X`HypZ~>@V>3%)E%v9TPc1hAa^P& zoF&6Ndfweuq-oVQL)s%{GuFC{E#F8>g~}yCVY_711N3tObd{zw&C^sTcfP?YC%3*{ z7isz>KlJC`)=V&IWSK)lbs@|x#i~%dw!naUvEdTk7WG2#d1`Wn9xSN8yxyw@R+J(s ztfb+Zv|Zqo^@Dp!ASodRov%waDugASA_2qRy2dFUFN{UmtY1_Ja46$jhr;W2EPJ_+ zmkb1^%6zZ`#yY-DwCaAomzugTB7IKVzAr2Y9uPqP59-}n*91Fv^W?hvusXBkE&>xk zBvWs+W_@H^!s2Z_XPG&A-h1!%LNfnlW0~fI=1UCB`^$+`H$Hm?p09_Aw#MF}K@A{1 z{ipk-*yY&_E}E5?PV~~yGNl?KwLXNdcCetag4^R#2Epudp`(|}q6?xtw)X>Y16DpW z_hlg5i11C)eeM(?H4pdMk=LSFJ+$R}>pR@RZ*BY-^pfX1?uYD$*bK{u*=nw|{0PMw zAGNX%Q*(PRO$%kbti8fHw`_B2sLKDigiwh;Ul<58WPW zZ~SuRBvrkb20DY)5G4N)dL^H1A~nI_{fBu;un0LI;LeoKt0gRh2TO?|M@*x+nG2BL zB2ACT9ym`yeNF}M{@}ffYo*(}mIp9F?^)+bN`8;doQ0OQBO>ytm4~nL{Pjano^{;G z(l`A3#E;BxUfPAl-d%}wS<&aX&G;_N(_H+6Z>d@;i3!p@xJ z{f1ikD$R@WN&^-1yPXC1yEoAWw{U|4so>IT{=+Bcw+Ctj_YBFnY}7Qxwjfd_&+F+2?OWg-*}vDaZd6%%^fY4dsPZ7QQEf-> zS=M@@vOJ23{N%X_mua zn5w9Fmp-ggqpk5<7l5)(#j>0vUju`<;pzWMQ^AQXmdY`D6@w3|Q7>CztbUU>F5IZq zV?x)8JMp_7OOkT%$tjvck zP`n5Vr19!6kJZToAk+ld2vX{*sPFvr}>>jqjBmqh_j^-_%-c8a?P=J7pu&){M+%X)C$Wz zf$Ij7>gn7TOnh6td#YeSCLo_n5Lg;uU8QTWa-9Z|m0aBEufxNp zKw2du4s1BRRxa(mg!J(Y{ngjwNQiDLlIs+*ZP}oLDuz(n%3XbUH`?I6wTE0CZJ?$k z?_?2Us_QxHY-YChQlW9{`WdpTuCA);5w-ehdL&N*Wyis{g-~Rvu(rvXec1vEdMSd? z5dhS=*zTL<7O_l+PL#0Jxaw`)!BWnXkbyTBqD}RdpZSWgDf-ybyH0%0R+y5!A$!r! zL~y<>y1wE`hdgtP2QdJeua1Lk@ZC6-gZhcYo$Cm%3_*bB74Hmvdahan#1hmlTK#+I zr9=TBqT4;NSFT>zLySxAKiXdi+{L6*)Y*p~Q$1msVCofQtm@Fgb^H9*(jxoilL)*3 zmd8{IK}!UdAy_n9t!Cl`bS6Tk(uOUZZf-*jcaNIMp11nl6qS;^dcPd`c{fD{;~Ea| zkgoH=(hksP-E&18mv*>v!W9GvnrX>J8e1lEp#dAX}Wz5=v`=d zMAQ;1)qOToIs!%s2p98+clzJTURbLm-8v4}rx;)t1>;BV-y@k;_FdxA&n1-`XYVw4 zU01n(4~m>j$c1!V>n$3+<~Q`DeU!c5-wpEk#j0G|+M^d*pzBxd4NDXxQ6~N+?`p?g zBtJqD$i0bz)XmYMgtsLH^DdT1rH<+rIyke4rZD0Oj1DGayK~IY=3MLJF7K5H^u7Fj zemD1mQO&|#qda$yQehOiCICkeKpUobyrT z`o}`_`VxCagiBu~ZBJ%!q(Q`&5P|DL*D7fAGBSL-GHpvBK`>j7Y`@UqeLL-QbGao{ z&tmM{a4fxuQh94kroF&WvVeGq+-9baIfWrxMVvi#yqlOovp6%Crt^nYSHX)wJ<8Zw zzXZ>A{~`ml^1_W|ERl2t)Y3=iD^XNmMRYxsG^gJ)xJ85sD5;6f_~$+$sGlejHq}khawCnUU1~ajFw)az)hTo$_6*k))CS z@w&khwCG-O|C&gbRrw@`wJ5#==U3di#EPLLRf!FL(e#(;YEkN~1`)QavD55e$_A@8NGes5Eb8)lM{j)N&va-9fa@Vr*FMr3EL4RPZF|?VAt6?OS zD$EBa{Dm$wHen}Nr0ly^p3-Vo=cKM>IhNFYmh-rxHyD)%+czm)(tiZWdp4m6 z)y(TFReqtU{DQ~4l_LK&MSj8geO5nahlvO*cV7~qadTNvdzf*zti#T-<%o^RsEEUo zyaP0eLy3&Vh(-9x2sQJ(DJ`kFg^$^etoH|5vpg=dFJ+D&WdrYtpiO)O>~)J_IOg2Z z1^D5}<1~%y>%}B2B@p+LH)}a%Iu?FoAX-j4@Vo`HUg5lT_INGhPV9CI}RaZ ziU4xe(z~L(-A}$A?DH z=IUyEF*IREC@xY@)E+1pn_q19Fx~H2s$gEyz>L~RPCt~GUsyz0q;HiNwdZ@< zrcic&V_k`53DWF}rs~huTS`zKWv4Q(`aMU--!1m#zHK%fPF*Z6pB7M|oejEtS{BSTyO?G-~8& znjU#%YxChF-$m!*XO_F{Y736Kr75G$#*na%VDZB)usbrJ?@_TawB|sKDiU?V9-8hD z`dX*JFtQ?#rzcUd=XGg?DNSW=RZsjxkL-Sd@oIZTR_|m_@3e7v+*=d0=<&%(?P+FoOn0>8L`Iv!;A7l@ zH#PnCBS~IIF}6_&yFw8U42P^GQY{@az{grCQE6Nb=>ijhg+9p=68^?j;S9A}3R$X! z7hbrRk@AapHpgJY0i(W8Pg&CM`XxGJ4a<%!3eK_wM~o5xA=3>Oyg4q>qA6W@fRHp3ap;U*+eDTjr`1y&&1@%Pj~BhN`1T3cN{E|4Y>I`GwsF5*V1Vs$FZgiK{lGQsER^tc(wpfrO{b41| z`Cq%d^_OExZ)Rvvd4qEqIn6*C1jkk!#;?= zR_f~K<)|w9P@3J;&(V{O3s4z229wV%@e%kPjIu;H5ifEQIE_hENF$r)Y;$iN;E-eE zgV*=*sSm*~BGQRl(O?=xcS@;bQpP)JZo$c&R>CZeL2XU}u@X1~p~_(c2_8SRb}CFs zV+bK(a^xjB$a^Z?m>rt*r16gK;S(;r=TM`*w>c)}M&YBoV3MEambACZDXL$v)9TtGko{}n?@e_^$0|?Z%BF-bTbsgxdH0Z&p*Dx(d$-KC3Zafz?^`7(@ z!i?*$FRN2Vp*6hLX^%;2d*pTTV>;e57U&qb5?DP+pAg6sm)M^8qDuW*Aj5awpT5#r zBPY)|UIMUV<_07Hwfb@u(tt0nbp$7=Y2k*7vI7_I%V%;fGz@3-Up+yO9$(jQ?**}XIox3`yoyPi(c1%YU6m|4*}0y$3f)b*(Sed# zGdQ5r?%^i$yKkQ_KV4qw|Fl}AdX;nZ^b7GK)8o=uUP8xp>G18u@22}sA6OM4FP^~4 zIb^*h0=M8)H)XFS&&pv=pK^29lyxsoP^4b;^mQu=OaAfK=Trc4ZwI}*;OSfl2tz&;Uapu+yrKYoPCV4}WpL^w~z z`mmqmS9E)8(Qa6Em&>A9FSdE5!d~S?u&ft7d(CKBldQ zRtTkR-z(*>j={h3;1brCqw$Xp%bPm0=mBJyRU`}||!Be}p zT7}PecZ>z2m51%sGbU9k!8(PN{tw4X%}fl%`6MUpJz6vA^SBYld#M@W>^$5s)DHpK zBFfMcCBbRhDaXA&Aa-kbL`L=gJRg)QhF)>jN3l3dY zTX1^IH}C-a!<5bk6s!sXBgZjTGc? z;umkZ623-GHt)5=N8$caMuAOHf+Tdd$+0{UH$t&yz0D}FiwJwj&^F51KF0nPN6tpA zovNhdY+N{QewEdmc2aPv?p6!m$Ew`5MY*}qt136T6ni6llC%mc-9#yg15-80Te3<^ zoTmQI-xGs_pcV;%9^A}dR=G?OE#ycr1c8TEASm1+Dpni^HDiS(RHpPKm66OqZt1R>Bw7oWHjy7KEYiE5<}QU@Hi zO>mWQ*2t{6)FXt`l|{lbW7~g@hiJGDH=94stE61PU(ECQ6zN?v%Ax zaPQj^?T0#{x6XU@DU{Rop)a_pwfGOdAtcCT83c6*NP7lB-+34g9?dwZ@ynmX^{uSJop4@p4wX$#!bMYf6N(yug)zNqP#? z3y=Gnefnl(pw@mML*)6LhPxQ(U7u`iE<;=Ys%D4t)=S} zlsZLXRynjQ#!d8|F(R;8alFiq&NZTz^fpGcaAcKR#?_caG>iQd(kZoJl-4`|4>BkV z_h`)E>iuDHefM)4Sx&RnRmBb(ji`?Xbo1tuX(BZj+FwMBx%HTSq*)4j>9Y7Js8Gfj zLQHsMEj30>Kb&8GdXsf&m%&&hu~G(9nL@!P0;&|zTgS1S5z)p$X3!{N+Ow5( z5tj7w!qmXf(!5H9@gN?(WiY^HlD(A5*rd@$4x(%}qlt*2!%KZSst0VpFIr_B!J~g~ zB2{K030bClpC?s8B3YM`sctK~lpT10>!Q{PA`(rpFB2lg)}{Sq-t27=nPov^V_Bu+ z_e@BK%Qm;x&?}&fCwEExiaVD}k+IlEXN@A`ZD^h{N0#+^REEPR8NTH>`Q^MBk^F5Q z(y}%XDNTNcLjJB|^cz~zKTbP1{|`n-c3}n-G6)8 z)3KXD%s#C%n%UndAGKY1Pkr@Aao{3v0+lgy~5myc4BQ`|=5 zDLL$h6A=6FroUCh$qY9Mk6QIyK=JHlnI~QDWZSnJW;}H3=6RFrwe0XF&u_2lO@7d) zgEs|8Y~KCChgpjIs^PpDmC_45hb1=n0+UIli+3gyOO^89XqG$MDpjG@MB6)qslpI zArrY(n=&anS=dz0tH4)j=o47rcClN*Ui)#$(Z2M_vkKQ{TdIm(r}D8|*XpGP-0GKtjmw@;)fgW(B${KiH9eyvC%QIG#PYpm_WH){wv0QUE9quToOsQ8^%ClY$5a-+2t2h6QE9BDmo1u!zH)ay=2K%;fuswgU z{pcQJ?VbX0Y|?hmo`H`{MG3e0;k%~0E-CH_v|l6ZAII+=N9@&qecSu_?bmk$IO-(} zZ3K_@#!l%T+0SzGsaH^?g);(~pX+dx0d}D-$srT-&8N54heQ zzA+5`ic%u}@$C%jY4CT?R|$`EzP$Tk_2v7=f&&F=IB+}C&GCkL9<-AVBG70`3{GB7 zU&_Y4dTPg0lLPTy>>WC{4sp>k0U~hOK*@qCgte1+UEl%A?x$gXbS#7<;?lH`-?H{U zB(cE1nS31cFB&mCd=)=ImZ30QdP$v106-=LABvl4&{Qmo#=(K%CN=`lVazy6!WtiT z;4uXB*mIE>MI8zoy3dYuH%Ebpfvabg7#$uK0xwpDM-zZ9#816@O>&NBF$0pQbUUDp zRX^%p$X<}7F6&GvH;X9$0GZ=tF{=cAP>g%2Nd%e1A2NO7pMvof%%1t*m*o7<#=}V( zJ0gzJvqb>#8^Le@P#uCr3@CHZERg}qk_eaq4)L{-ai zJmddLW+`1n4k^c6V)8xjqVXN`=1#JL|B{oE{uaUi-7)>Io1^PL$MfcI&(Z(7@%*xK zy!+eZ`QH|X{)hJQ?=H8r|N55jg1hPGBShE;h6y1@fH(~JGzaqlV3cwis~>GEV6h4> zBe~UYlLt`>C;7%M+4kmXD2PO5lsAdfs2YYtWsbLKHJE5{RIZbiv@;UpEXZnpbzv(g;m7@)Qo}ph`0`=b>&VOd5{f`$4kYXMjerC*={z;{V0D%7Ik%bDAn#2Mq6&L4{ zm*>*b<}x+oa&_bK@#P8%=ET(6n0RYrnr+-tto)0dLc_VTa<~eMxhkqS8=5&gdpI%u zHX#k3n2MYDfuOdkn6a+Rm5I`$=gt4o2#5O-AcortL;P;GdEv$qGE9JdO?e9g58WxK5WO9*IUG3@{6p?u zCv8JG^4CsA2%!7fAjAP61!5Y6Fh|4x))FDi(GX})^A`<5Kg$=$Z{m)OH(}feFzIN9 zOHH<4M?;f|XC)Kqf>x6{;-~?YObTbAAb-y-2p$QCIgJq}HZF~j+awf@7|_Dz%aVlf zP_h8aut!NqfzZM?qjiT@8ZAkZ z!!nmKffgR5!*>*bh|Lr~Jp6G7!KMu?5+NsI^Fjm)2Z!#qVBz2(3Wdc4Rxkyehb$8l zieuvDi^7U%kd7Dr^wMB7r5hKwU#7Wx6rNi_nmBL}j30+1VD6SSWJW|#_<3pWoB!GI zdeN1-cW@%l83ddX&1Iht`hq&y2-&DF>YIH#$H*)GXc0Sj+)xAX-9lg*o*M2}2pvTxM;Kwc z9=((lk^Y=H7jXm%1g>*nhgMd)0o-+ByU*c}$DX$;w=&b^~>}-%^GHdWu8?m&w zFsfAcnB$^171)WqT`!B&ue#=tU`jt51HgO8Z({{;R2y9*X zsFpHow7lV-5>8`@5EVgX5>SkA*AjZnaMnmNMYEYme!ZLNDdf_S5t-w9Mmxdel(;*d zC1C&ysY8bI+%DS^S)s$^W^?cf)!>VytB(T)zY0Q^5t-+^Z`Wk@- zq_g>(s0gt%--jYD`$gvmeYHL*v|tIT+hL)HR$}KpT7$U>i`Gl*E=&O``SLbr2bkQ> z_j0URvy#eH4LS?QteUYB$DKcqhL$#e8lN!cY%Ux_uI3ClG?kI#{w&tJhVgx_E)Xe|iz26`I%Q*ff!U+Et*W|xFBBGFJ9H4>6?_0XFa*MuB4ekW-x&Z<;fS)knU^3^=ztX5u#`f%2m&CX_?&k6 z3c)i)qt|6P1<)XQzbPwpS0=c3FR96 zYm4FEAIX0PVEm6m*TgrgaQ<+x@mnlIoq(m!*lrZ}j zQsS2%^yd@#_m*ACe`#PSAhrsbAkrK;f@#Z&W``Hr0kOz%7@*N`lqx`;1K&PdqjUjF zBZ(|`^2~9$RJlgec+aX35B?*y;n%o+ z?p%LwT>r&Ii283KTkwCP-0PSz{S%an3&8z}a&G~Co?1$N_cZ=)W&GE86;u59C%OKw zf4~(1kV3`bP!t>sn*eqjIsgNN;}GKC76h=MvB3CHK^T$+6oLzD%J4VJ=fZAQCVbij7T%gF}vs zOMy>7NkB+NNJK*drDI@ZWrnfAVC?Mdoc|=2qouWXXlP=2d39^+_5S|h>FLL_v(Fco zU;p^@E5NmW5#68J^s#+?Z7QjQ+ zo#){82z(M(Jq05-9_f6!5~VyPUAFmRG9DSY-#Kg^Wl9iyB3^{XiXmqw4ANi$J+EWi z=x4+obRO)sBT%XoggP!gMq&{V(`)jrG+8#`%Mj|lA8YpKk}HJIAt1QvEQGl)Zg|?F z$v9~U?_@W?AEUKv%x1oXY(>W6UH5VR=wb7`9pbTfA<+S!Qo#XT@BE5&xICW1=SzbC zY0vvLlz*RtpWyT`XWuJ$NLjPo+*NZ$;Ki%a`gR07*umJ@0s2I8xHaVa`0lOm=)){6 zBz&;X7WM501@PgS1Sa6fC9Q1D$ys6`-J3*+9pzo9={M&-Wm9PpPO0JZ676Q_qh~Ke zRB0Ts_^{AW-|D==&=er0QS8ujLoUy9w8<_%YRz9kBOW{`J_p|0+Rb*63KnGXyj#7x zjD#kR6`DG8oUcm(UoDj)Xk7PqGpZ~^fF=|alqi4YhiRM%;JBrw)FjfS!iRQik*mn0 zIO<$&KeEqeiRBLk?fi`g6}eN8pDIi3!zC4sq@8Ig9HdOq4hLn3Jf0jwqT|mfo42OE zhFEr@K5V}AgCbm&#gc+0fmf|JM9nJ;$o4m)TDR%Aktj8ze51JdC~ngrch0ivcWLK| z4NfPM9OZLzIaU6Viko^_0jzS>{uSMqX+;zYFs=$K#m2HYP*zQa)ZyWhb#h2KZ$shg zwKa`+LAojKX8$}qYbitQE*nIelGEuRZ(2Y#oW!0Il}SFXbWKmD>y4wPQCy&&u?%9_ zWuS#Il_LosMY!416FyY~kIN=J4ZPHnqnjwq7pa&eGs>)=1+yK0e9Grg?NU*I9(9S9 z;?uivf8(x6s_73Ku^l+&NOfjFkEJOSO4_4O1m%C8;Z(vbxtMQwIyt*Z~QV= zzF+L+`rh>$%*RA2?U!b_emSVDsQ+?U+o6`WRsTfb>oJ9QMXPh`oBBXqAUAYLUpk`q z>*)v%B^=mK013*W7&iO%ajt;^i8IcpzB<<`+wlDpr>gqH5BI$74&!D$A6#8h`TyuU zABees_si*%r-@&Vux!4buT3@lxWb*k|5*LRI1_LwKLElXdGuo;>V)dkT`WnrK-^>a zxkvNBnD8lzCWr}irxAroZAH@(vV0cZ2NL-3PE1 z`H;jGnPe~KPb03rePqG`m;*^@V8Cmn%+QR^#|K23KrFW{KysxFr_uW$px-tQu^W(t z0T9L4wL$r$vkwG-`Qt;8ID&$sg3(PrLJU?6V!}^AOaLq<7(n^0zWj%>xd7s-VrI=} z@;bVuiO}~&p!qO`lN)dVuE7A)<;9aQ+z)~jwU|X-H4z8XO4?tu=Bj(9AZ6Q-YHf|n z@zqaJ(^e>{g26^kqiXWoJefpij}0$Li<0=2ds>jSImA$BFqE(*bCjX*lrwo6&ZHfM zreNd9a6lXze)O^E+PR6CVEjhYpYSAZTgZI!&>--K7*5iO;n^2aeBJZ!y%)}oPO*>poHbME zL0O0;VxnjfqLZPwR5vvJMkXa%t-|Nb$9<;iR*|G${7_pB+hw(kSNF5(4-{nt*A8_9 ztMz)C+vZ+bC272(rCVv;$Elk_``pp;VW_wK7U1guQG`qcfo?=-F<=#BDyvFwiii9zLAnPV@asVOt7o_2pA(0FKq_hg*WZFvDF7S>8ovPm8dGtN&yd+zBpn7} zQj&pf4vfTLv6?v>xR;E?lHfrJ6C16DKwumgg#;7;N@RdAP#8R89Rgz0lg%l3Zoxss zSPX9db34;TL?nr~D=BQH0AOQQ;eb>YP^Bgbu3PjRKm#llrPX?n2v;j3>Jrk80+bn4 zb9hqC`K7#FOjXd7^R8Ms9PFq110ur!N?AkR7Nl8i!><|&*#IUCrRu4m!S(10zK zKJPx+l;S;h(}LH6+Vnb;Idj2ND^m|n9Ma{ zpPT}I50i=kW^?SCkwwaDq;C@KSSQ>IuL2W_jwC{Hua{PFf|(l!1_@w|r$abOod7hP zvKN5JXV|=yDi8?Tl*;zvJ(CVXz}8+BAzlb-kVK}#p($9JbeedP;WYEatj7bxX-bui zAnbxyG=~+p@JFgD^sAA))mLC2$Hd?Qy{eIi1!Ua3RkvU4Z^E(hLyw|*(yO7!Ry7{} zYSU+vA$7PCPDhO-N(B7Xy4_zK5VPox!-`2>7QT*EVwsb+w&Jg~@bz+DjgD#`{I^XX z&;fic+jJMT!ISv}Tc{tr;PT9_vO+9kP*$Rp^vzX4w3Hn288FvAcmPP?{i;ePAL{%~ z3PMXD%$>);m5K$$2F_QKDSbK(fuE{YS4~soH44e*t10q6s;{mL?IR#dZRxC%;^7}S z{z6z(Ro^@n@>IXOQYQV|u3z8;EN_Q@(_XMF>k5>XizfQP7#@?GTjIs){NP~bcgn$Gzpbr9k@dOu~W?} zt#`R+wR8Dj3gJdqy^O1YINT-p<)YV_&V<;nd!>z$TldyXae;&VOwCA27Pj8xIewo1 zG5bAgjaoQ3b@$$*{tq~HGr`|RHy-!FkFhp`(PPC7h7HO}urvfkW+F;3w?teP>s`o56%dYkK>4j#L5gJW9N&@l5R%X?kz4;IpB@iz9u$w=;@ZE{W7P8WZ? z7_9k%9<=P}C(8L4IX2wpo~Y8eo)?WO%PZoDejql16XJ_Au+Hp!O}eB z$T|_m@Qq?1J4H;c)H1L})PWCVrm!VkO>o@{VOi3gH*Z*5vZ|Eg+!zDJB4DbFd|3ovC?pjG zcCgd0MoLSAPleRRpy3q2c}_0Ywu3dHSa>Vv{1A>>NNmgl>?BKswZFJIqfYS_ij;Dt zt>deR4hzX0Zp7U$;-UB_a8o`u#o_&%k({BWL>x>?zA{fth^$L==`@%gc(Y|Nv1fT{ zb09_}W_Q3<*fNgeIh$2#9LTqM4%@3E!s!*V)rujw7CH|FqDoisWNNZOPMq%hL(31j zwaF}&791t`_`0uW@1d9AU-oNn^iQVYzF+)s7`+k_RIRLIqESaPq8~=_$<+6Rn})=A zg}my#9RGXPGI5Q;bs^EFw6=qH0|pCw5Gvy}m7FE+DU}b9=E{Yl0SGIAoV-BA;wgDeG*0wnHH^pN1`92-vGYStDJ{YHZMer$(tUNNpqyBOE z6xO9$@6$2$vdp@pXOpPG?}_rO57~bK%Qn8Of5yPFhTzXr8&_XGKL!vtB5_nULG%{` zxN41P>gi4FTNi`S_{LB!l`VYZiy@lX#&EHJ2g@!-xYe4X^{2O~dM-u<eyX@Vf`uN z_U4Qyxvv21Thn-}fQhUXXS16H5_k@_ExE%-dty)gXZ_S%^G<5_Zh!5n47_`j?Cpy! zVb#s2#KdP=aqxYj$A!QMIpGk>hkLBTM$a@ud zMMmZ3L=s{IoAmK+`H=$vocUvc6^5XMrxpbJMtF1=)9qh-kSy$50Onvs=~AETRXY+u zc#4er16GmzWPCRMIZG$_`!4zx<}MocKX4cQ7H|`n!QLWd5CcJZbriOSFd<{OnM1QY=UaJqb;#pvKN%4A)I_!A!&ub^`2XWUFA36m~2*(fVz_EjEmFQOsJw z&24`omtKSQ8|?>7B%y#et8PGIl}eEewN{zqDO$Qhzt1Q)dJ(o-q%UUTXVg^p{5P}^ zs}JuceYgFva-|N1P00JngSfZ!UsnlpXwV3jtm%)vtcio#w+)xVFkmxi9Vu5g9O=VmTP0fn@ zk$e1ai8l;v#c-au|BiV3EgSd;f%n(soG507Fen)e@B-Na%KkPvmzhELr`Y+Q^K<{L z*c5{@5r2g;_Ztydzw*K&8;7vsA=l75+(J8}N!;WCDidTyVF{4??Z3%C5gr3K^AFa8 zI8=1$BZ}_!(s{QTL8A%?si$ZKJ^_eDQ}xqyy$HRBj>(o_0&`&Y_c!7vjy3O)GhF{v1nT5sq3uoTst zyLY?yb|O2qJ>K@{9$CdLHCR%0-f@>(XypmobQfV?<|OQW_tU- zf5qicXv7~9ifrW21)yx^MFuk92*aHmI0;QB25)*iVa9bFY~7T7_z+p2hzA85v-g{99Ko~^*B1u=U-Js}T-z~An?QAD9XrP;u@$GO9FSa9i`;cxdi zP3|KA3~m(o{z(eK9@IQ3L*AVZ_peITY}lNMOV`UD5R^3(`cy+j= z*y(Px5>d7cadax#K4i@(`w~H4wb0GGl0HiY9&}v*?K-3rsKr?26U@sew%cKUD$luk z&-1Q##GS4(1I_8DX|(Vj%`t4E~tlTJV4F==V&XcokAMP5G>h`Z>pnG+0m0s0tqb$hAV5UhHdF7SO?4W{hljwfrMx;}TS zsa@nbhsZfR!A=>v5{eXZq`Y!++8%o_LgY*&HA-dT%(LO-5ul~(*)v`F@&(V7_lT>y zZ;7tQ!goItaE9>b!Tz;t&kCjWfS^CNZ_e&zj`CiXB?jM^K%*YsT$_`B`b^Cy#=vWQvSqd%%axkyRPoJAT|vl)J{r#@ z>^fBsh(EUJ#T;AugZ@-v9rddUVEl_u>B>dZBImC|Ci0X(@S_8T`?xnue{@pze}Oc5 zi&))%Y-?8)-sO7Z?mQzRUbO26yiWIooT=NM{V{)BBMaH-(+|C$GJNqy!k)zx5pr$Q zZ78U?tXr9_emaMpmX?KIQO*%W!@QyNQMLDfY~>!mlD{=)5pES)O`yKLTl>x1C7M!* z?5o*o2D9Wq`1MkXi^UJ4u)P}F?-q=i=BZrFRLABBiV5iFGOEJ)NN*ft*05|p(Xm4N zyK=X+U<<1pyzRsOD&V!Xp%Sn|@8PWD&&ujAe012*zSWev@a}9ya!w}nxqpYJbxy}5^%bl6GHQKec z-Hfz91y@1)V+q(9u3BMSpC{A_uOM;XOQX8wKpKOoV|E1YbZXc})hgMOnN>*(=lc6elvVJX;#Yw?aw41KdUjvQ8rNB zUgVDCnAu)8S{;-8)HKR+WPi7Wam)axIdi7gmZ*BQ_QJC{Chgc(UU~glxLnh{ug5l2 zPV39vpW2`jSI0IaAlcRRPwky|D(&*lRwl8jItGa9-6E7!UJ5r^* zZT?BJlY0dvs43I?jD))F7PqLo3Dzl);OmOrlWZP}_hT)DA)>A7I@cW$)0_D;;kA-` zPgQ`&YXvjnw^Buf;^(>7SU-Onu=Q?Eb;#XdR`+j{m=!WlIDXB+);b}zcarkb@$O1< z=P31F^p)&Ej=}tNX7+=tde2xbS8B#+ELf^P-;bT0(VdZJ8*fK;_J;(mU8E0cT*dp6@!&U%eF?YSZ7?v zFUyZyPqJk5Y~OZDF3_~Kwwbyd$XU^@-e~u(c~H9_^-Xd$O~fsts`t6|=k=M`FyTIG z7aQ1vH@$~?ZD~*Ic7ng^-2kq%=0X@>2gaS$t$+>NGYaS6O9N)LdTR0Zqr(omD2$na?WE)A_nqNbh$=pG&$& z_XN(oYyZ@8H2p#5{@2&gjDxu>Owx+_t^J(v?j&FzgWmAkuI4-c)v&jE)hoS&R!`gV zW@bGbd?lyh5n{6(Oo!c%2Cz!TZcZJYxIH4LFVr_{8%zpvbbBOzdaQSmj{5%5Vuf}} zjJW5y6T{wDN&ji><>tZrd8dySjMrk`G%tAH{Sr>Vu(>AcGA})Y>Q#Oy&Mta9myrK_ ztwMO$t0VBG*yb1TJ&{j-^$&I33j$w87-2!+4JUlvK~aGF>O=)AA0-sO&Aaws6$>Cg zrCe>id>dGhV)qsR5I6;5v2T9eSARrk$R7+L+{B`zL4J9o{>UFv_#Gw=z`pB-{J8St z2f%;PuUB6!IsBCUsyUwUUgAg^Fh{Ic$k7RLO z3URCBT+7@sYpZbqWO1)(;xB;l+XnGZwqpA1;}69dx-#RBF5*X6;!edAWLOf&DSyXp zGyOb4iGlu5^Zqp~{{`Lue9d3O`)j{XS>ymUfZi`9>Tl*+Mur2!T>qx6|KO}0nK3-| zpE6*K2KcuC7z5h>qXrlw0LG|)fB#nh8mnWVwb&of8cPI*DKIV?j(}21t`V)(|=zCR-h3KY)f{5o*`xcDW6P;e)6qOD9?iLkY;eKGou~U}2+( zVYf@&P{5%)Xw3dG_AJA%wIH$-+EdPK$Wdx6?(YKHAM?I{UA;CX&0p z$ijv~FZ?>LBPxSCK*YDb1b-5^d}h;~zX{xYm9FO9Uj*)SSIe8HzX;s!)`Nwg1nx|C z+b;q)U$y5KfqV37rso%dOTetw>$eTY!Ig_dx=HK-@hBKHpzy+v=&6>Q9VP$(@^HCB z#Oi6h#AP_}dE5Ps!tWoD2MdEKkL%68?d*=HRos94%H!+l*4hf~!>@Sbv?w6)1#=*T ziQ@N!i~SZ!kYm1)0Sf*{eqeRCs00A9^y}eGwQn3( zp{re7?v@sn%IA;wqZ@Eqn4IU{*@r{u_;DMdA6zo4TxwJve*S#WJ4Q{W|M1)PhZ*Gj zhqjkqU0%&A`uZZd-(YBLynw48jLd0{$44!S1o795YmeU6DN9$p2tKzMN`K$2AOHBy zr>oGUjDn!Bc`^Dxz#;X^M`x6N=IGBntAzoz5b;;Y1%$oXqt-R*jBw_m2uYAo21#!m6oLWKgC`5Lz7qcf3gDvOjxp%5ZN+97y^oh*)T;wWGJ#p zKok^|)tWHERKgGeBZM8Ittgp{dxt5d<*BM)eMnxFcK{J=4{nkt&Jgu~}b7JR= zY?o~EJ>=W)mY-f--p6_sii}Dbka)Mp_r6;9?0JcDG2SuP2fW!cho*e$+Uk?XgDEq7)GJNEth^KckgJaPZf%&)(Urt2@h9y<;ePfXOESzKVq z-d=n=+ogXv>G|z_zy10;x7=^>-7hm+-n@NV4xlLfC)dBGqn$WV-*XpYb!Qpa9RC}8 z)r>@ZW|QRv+qk6TZ4wEyDZlZQ(O*#7;cFXGHJu(oVcd4vOAU05qzX*f>nrq+lEliO zZ~2UST6R63y|Y%mS4M!P(9r+2GU7j?d21^H-u1m`{)4M3Q`LH3=e6Xj97;E*fC)v9 z4mi}dpllPb36H2omYcwP=95#?C5cqs;@AiWr1V-V4jv#d8l26J>b{*lZHvYzePf($ zqT7j(o=Z-3oSlY#E2g1iIy0-=|~ABVjr*y&i99iZ3Ze}NK^hphL|@;2DyXge~c+-Lv}?ds=Kmc z;T4+Opo$5yI9N0;l^hW_Y1;=k9FJuq{eRp(o{j*%zXT^M3BK%y5cleoruK_76kS@ zj0_RSb2&&1l0OAogmKMTX{hr&7JRi*jAe#`>kd%j5fWRO-2qBG&PYRiSm*qh_Db;r zU8XGD(V=siJS6MTR(j1gdx-2hXSWvG_2t`PXq*b4ec_RAHWxXRk9yunwN+GX?iFR} zHgekE?rpu5Kq@)folpZ>s!?6bCO(esg*3g5BPYt{0@LnrFQWZagdQfStUq zb-BBS7F@RBj$%PgoSv$-Wpy~c1j+4L;GI%n`OKd_MaWRG@-FdW#dMWsfNGI7CkbaA zcYtaU*)Qww=aHE8a$O32Ph|&TmJRfQ+0xeO+?4*~#%|B-9W}d}MmpIep#42sG zTx`=8^?<>Ga*Iddhki>q^l0dIRbbt-?B9BZPMbz<1r`d5pi=48kOjK{RPgSS?zyXD z-M1~Cle!Uihl+2-JAD-*GP+Ow^%@)r?zACm)N$tpzUy@fb6DnxVDANO-y5eP=Ne0p zm@$^Tx;yXDpF z_K0PFUl?ST=GC9M-Oyj!-tf9~s59VvjZolp(9TS@@5q~=st11Vwx)gt*}H7+!}%0T z1DB&YbfbrsJ;P@6!$(*u(!TODFDs3|o>9{&!1YL2Nx4nBFwZ+~hq=iBi!D8#5_DGY z{%#ifT~wUuXSVV zLT`FL?lC&kIyPB%Qz>GqG}fcVJk5P`$odu!F1BIRcwGp)I>ccP_b~HmLq??i7OBhm zw`zjV65<8B^(A$C_VnXDUStHw-yFG>kjg3B)dSlG^~rOMUB{W%n6^4M(sxN#O?8Z* zMM3-h%~@ zV1YXLd*WamUkS$F@5_4rG%OIk4G@!)qx1pvWT=?LCJM2_iU~tN=~QfmB?OKpu_uU6 z+S33@q+A28x+7CrFZ`!j*L?QdsY~Au&VovTL8PTK8dR*(;PU3|;wY8t*;o`wn#{q|bMaEi@2J4z zt|Mzij;ea^53$d~z%a9v{E+TaqQ0AeO0K+>E_>KyY|@?E#jz8YbWVuU`mPFBZgp34 zyP8|Q%c;3#RXJ2>lHb7cHlYgQ(;E`749XHfAQW~|uqu{mnAPS=XoJAEOr$6P&gJ6U zWlL-bADh5EX=4yJAmwHa0x5uuZl#mv{8&fnYT9FV{DC@1j=`$)aP0#@l#_btgplF6 zr+2cQPrkaJX@LLF2Fg5a8;lJAE1s6_pPJk!C;t)xF~-LLnY`^j{ICu zdnqbnsx`B5Oi(7jrHB1SD#(^iNp}m@YSP?VW6$txnjop%En0QPuZh>Jy*$csi8(_c zu+Q&Z{3rL$76#xqH&Mv|BVEBT%L8q&&N>%mD63R|P8DE6kktbjXVq?`>PKX$a`Oqj zP>aOD*4OS-*HZE9b20WY6@AAj8|;#L48t9=bt)FdiU+0~zS*U*s5&LHZaCWwwcI~s zX*0W4G++1%=JSu{SOb93{^{2Spa2YJuAr%ft-i_B!v*R9cY^G54D|<3#~TC)j&D+2 zXuT-;q^H6p1ZlA_t8u&BNsBlACW_a`^Q;OL@Qgp&)e9@a+Pea*C>*_u39|?vi;JqX z7VavGN>Zgm*9HZ?lOqK{Tgqt=xHTU#a1C(wCae0qwlCX9BOwy?^akVq5NtY>WFO+m=1W=;Mx5z~tad zDwaTJfd<2SO9nFvh+C6WCy7;z;|3u;Mh){pHfiRJ(CLvmjja`Cw1ol9mt6N8u@lHh z?!dTX-Npm5r^EApymP|uTL+9|pY}*4Y`KbI3FP4wP50lE?LVdi{aP*wG+k!iQ^85S zFRu=GyM^|b+eSXVZ;zw)7F#OwT8pE?J9wTu0-Liwb|GOa+AiT=*shviKon=|n9c`X zDC4^RM6(9^w+_NU|$H9Gga!Ped=(4)EO z#LusD$w9>30^9XW2-xb`WiLkzX}vWTkU;N$rLnSJ|LqK~h?cX0G1aN&S zxIPpv4+Z>jV1%HALdvml!H_IPtul5C?onHj)-Hvlk#hk(C$ytGo9bVvS*0l}LXBTb zaeFGHmwAl_W1Zgt{LO6RKgB8^Kky0-;{iZaO(_wHuNup^3AAAA; zX<$YVg686Fp;%fz9g+#xYTudRs?y6eakdj^6@)pTuwX1EnZ^Y67bBK|A%w!c4?80S z29`>{51)Ro8~NQne?lb$763r-aujSE!5zVnX3YQnv#M0?@5I6?T zkpn3K(MDnYX+RqVPNLn@p&tlsE83Vi)mkzi=3Kd1QF~`bRDD~mqm~24ds*A7AZ$}3 zB({)0e`CJSV?{>*5aDQO%RiZqyMz*~sa-}X2@blp1d>sruJ9;2pA11`2uhP@=>jGM zi+1&&3$;NY(3pnF#!6^0@}R6Ub(Bm=h52rd<3&(IlO_YRhrn=%4#oCh;<=y`{qKkyxJSb*NaIG-#DP*Sp0!z zOL}3UpZa%p3je2ea^;ZQASg{qqHC0zZK0@Vrw(}=AA&%7$>Pa4P`thoC5P>s2N)0t zMhV^b9gxg$5hr-GL}}kG^{6osI4rx>rE#45K)C--Et|RoS2*DGukoX(w1O*^UkOb| zV5wmISWU^2kvCV30((coiDGNzqJVLFt_VtkjF)QbJ!z^8R-w!S35uisw;_^w0V!!O|p@Uo{i>R+V(6EoRFDI0_F6-ApM7@9v$>g8G;7~@fJYA zsycuFQ2-9n6s6nu0gw{3D5(821lnL5aBDS3NgB2cl*_osi0dP(RF@LFoP@&g<=9wE zc;bc8${#KIPjUV~FuCkwCQAtkaQxG7|7ZSPTxiGgPXk-QbN=0aBM4YmY$cQd!@}|1 z4FEJ9X)5uun8?4D1`|<=^5OtJOgKs@PCkzVz>W0pU87+G1SJ*$M`Prh#`y)dvD%tg zl7?NGiwyPjgnPi9_YuNUVzmy$`I*OVeLzW=Lz4o&0>E$%ysQ4(#A;gVntz^K1rw`g zA98LRKFYaqqretF;6wH%P(cN@_>ni^5ZeN}Seov8rTrlt$xMyyJ#3MFei}F;xf4vR zhP5H&bkJTc-_>m^lOnp}6PhM%&3q9V?EhzjcMK481~pxo@-sEsn?gOP&qN@l|#-*?5uU^luWY zEiax3l`*$kFU~*ht8y%NxpL{}XTyyV4{u$${L9Q}$6~g!vQIMn2n?{v0J~Rq!cjUW z$`3CFF8qxB-dBkQUH}M)huv=X1#b^95`c4eK$WEVZIDSd7Cm7eF*<6A*s19Xg{-A> z5@86wN-{mi<_8sGtj# za70Pk6ey6gBL?RfNz6VxEPAVE3<9BWo}}zbm<+TeBID^y2d3Qaf~hy%gcExncQKBI z+=&|}&q9hq>AUR!AUl!(A7vZKHjHQ6A{#;zaj!GWze0!_ks&FYM@B2soi!oH#Yr^k zQStg;CV_nf2UaE2V2a9nZosR}b;srSgx3OldNc}t%Dcy^6tN+af&H~wSYEV({O&}& z4`r+Y^>X19yXoGPTET(Pi>?Xz$=t{3&v4Ip<>&=@Le@ypGx@WF(cwR2BEFn>UY@($ pU(^_+IM}G_(^=<58RvlD5d0xp3>EJlv_B+dugAVGXraKy{{x*yi=hAj literal 0 HcmV?d00001 From ff0073e53465ce83ee8adf80aee5acedbd7d204e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 09:56:37 -0600 Subject: [PATCH 0631/2998] README: Move shell down --- README.rst | 88 +++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/README.rst b/README.rst index f2b2846371..5a7fc26d02 100644 --- a/README.rst +++ b/README.rst @@ -17,50 +17,6 @@ Installation $ pip install --user tmuxp -Shell ------ -*New in 1.6.0*: - -``tmuxp shell`` launches into a python console preloaded with the attached server, -session, and window in `libtmux`_ objects. - -.. code-block:: shell - - $ tmuxp shell - - (Pdb) server - - (Pdb) server.sessions - [Session($1 your_project)] - (Pdb) session - Session($1 your_project) - (Pdb) session.name - 'your_project' - (Pdb) window - Window(@3 1:your_window, Session($1 your_project)) - (Pdb) window.name - 'your_window' - (Pdb) window.panes - [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) - (Pdb) pane - Pane(%6 Window(@3 1:your_window, Session($1 your_project)) - -Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including -``PYTHONBREAKPOINT``). Also supports direct commands via ``-c``: - -.. code-block:: shell - - $ tmuxp shell -c 'print(window.name)' - my_window - - $ tmuxp shell -c 'print(window.name.upper())' - MY_WINDOW - -Read more on `tmuxp shell`_ in the CLI docs. - -.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ -.. _tmuxp shell: http://localhost:8031/cli.html#shell - Load a tmux session ------------------- @@ -126,6 +82,50 @@ Load your tmuxp config from anywhere by using the filename, assuming See `author's tmuxp configs`_ and the projects' `tmuxp.yaml`_. +Shell +----- +*New in 1.6.0*: + +``tmuxp shell`` launches into a python console preloaded with the attached server, +session, and window in `libtmux`_ objects. + +.. code-block:: shell + + $ tmuxp shell + + (Pdb) server + + (Pdb) server.sessions + [Session($1 your_project)] + (Pdb) session + Session($1 your_project) + (Pdb) session.name + 'your_project' + (Pdb) window + Window(@3 1:your_window, Session($1 your_project)) + (Pdb) window.name + 'your_window' + (Pdb) window.panes + [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) + (Pdb) pane + Pane(%6 Window(@3 1:your_window, Session($1 your_project)) + +Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including +``PYTHONBREAKPOINT``). Also supports direct commands via ``-c``: + +.. code-block:: shell + + $ tmuxp shell -c 'print(window.name)' + my_window + + $ tmuxp shell -c 'print(window.name.upper())' + MY_WINDOW + +Read more on `tmuxp shell`_ in the CLI docs. + +.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ +.. _tmuxp shell: http://localhost:8031/cli.html#shell + Pre-load hook ------------- Run custom startup scripts (such as installing project dependencies before From 2cf24d51b541a4484d8830ddc2f09c4b65ce531e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 09:57:58 -0600 Subject: [PATCH 0632/2998] docs(shell): Add screenshow and update copy --- docs/cli.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index f15038bfdf..7a0dd8a9e1 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -39,10 +39,13 @@ Shell Launch into a python console with `libtmux`_ objects. Compare to django's shell. -Automatically will picked the current tmux :class:`server `, + .. image:: _static/tmuxp-shell.gif + :width: 100% + +Automatically preloads current tmux :class:`server `, :class:`session `, :class:`window ` -:class:`pane ` you are currently in. Pass additional arguments -to select a specific one of your choice:: +:class:`pane `. Pass additional arguments to select a +specific one of your choice:: (Pdb) server From a72297d33ef1a2ae03ef48b84f09700236d6fa2e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 10:17:27 -0600 Subject: [PATCH 0633/2998] docs(README): Fix URL --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 5a7fc26d02..dc9f150d30 100644 --- a/README.rst +++ b/README.rst @@ -124,7 +124,7 @@ Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including Read more on `tmuxp shell`_ in the CLI docs. .. _PEP 553: https://www.python.org/dev/peps/pep-0553/ -.. _tmuxp shell: http://localhost:8031/cli.html#shell +.. _tmuxp shell: https://tmuxp.git-pull.com/cli.html#shell Pre-load hook ------------- From 9187c30c9b5de3c8b6d4d2b3ef4aa3cf7b15dfce Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 6 Nov 2020 16:52:45 -0600 Subject: [PATCH 0634/2998] chore(poetry): Update packages --- poetry.lock | 158 ++++++++++++++++++++++++++-------------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/poetry.lock b/poetry.lock index d54464ce61..3aa1020cd8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -50,11 +50,11 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.2.0" +version = "20.3.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] @@ -235,7 +235,7 @@ marker = "sys_platform == \"linux\"" name = "cryptography" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "3.1.1" +version = "3.2.1" [package.dependencies] cffi = ">=1.8,<1.11.3 || >1.11.3" @@ -643,7 +643,7 @@ description = "Query metadatdata from sdists / bdists / installed packages." name = "pkginfo" optional = false python-versions = "*" -version = "1.6.0" +version = "1.6.1" [package.extras] testing = ["nose", "coverage"] @@ -770,7 +770,7 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "6.1.1" +version = "6.1.2" [package.dependencies] atomicwrites = ">=1.0" @@ -891,7 +891,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" -version = "2020.1" +version = "2020.4" [[package]] category = "dev" @@ -947,7 +947,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.10.23" +version = "2020.10.28" [[package]] category = "dev" @@ -1065,7 +1065,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.2.1" +version = "3.3.0" [package.dependencies] Jinja2 = ">=2.3" @@ -1088,7 +1088,7 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-stubs"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.790)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] [[package]] @@ -1202,8 +1202,8 @@ description = "Python Library for Tom's Obvious, Minimal Language" marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false -python-versions = "*" -version = "0.10.1" +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.10.2" [[package]] category = "dev" @@ -1211,7 +1211,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.50.2" +version = "4.51.0" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] @@ -1346,7 +1346,7 @@ marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version name = "zipp" optional = false python-versions = ">=3.6" -version = "3.3.2" +version = "3.4.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] @@ -1387,8 +1387,8 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"}, - {file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"}, + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] babel = [ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, @@ -1513,28 +1513,28 @@ coverage = [ {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, ] cryptography = [ - {file = "cryptography-3.1.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:65beb15e7f9c16e15934569d29fb4def74ea1469d8781f6b3507ab896d6d8719"}, - {file = "cryptography-3.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:983c0c3de4cb9fcba68fd3f45ed846eb86a2a8b8d8bc5bb18364c4d00b3c61fe"}, - {file = "cryptography-3.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e97a3b627e3cb63c415a16245d6cef2139cca18bb1183d1b9375a1c14e83f3b3"}, - {file = "cryptography-3.1.1-cp27-cp27m-win32.whl", hash = "sha256:cb179acdd4ae1e4a5a160d80b87841b3d0e0be84af46c7bb2cd7ece57a39c4ba"}, - {file = "cryptography-3.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:b372026ebf32fe2523159f27d9f0e9f485092e43b00a5adacf732192a70ba118"}, - {file = "cryptography-3.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:680da076cad81cdf5ffcac50c477b6790be81768d30f9da9e01960c4b18a66db"}, - {file = "cryptography-3.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5d52c72449bb02dd45a773a203196e6d4fae34e158769c896012401f33064396"}, - {file = "cryptography-3.1.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:f0e099fc4cc697450c3dd4031791559692dd941a95254cb9aeded66a7aa8b9bc"}, - {file = "cryptography-3.1.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:a7597ffc67987b37b12e09c029bd1dc43965f75d328076ae85721b84046e9ca7"}, - {file = "cryptography-3.1.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4549b137d8cbe3c2eadfa56c0c858b78acbeff956bd461e40000b2164d9167c6"}, - {file = "cryptography-3.1.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:89aceb31cd5f9fc2449fe8cf3810797ca52b65f1489002d58fe190bfb265c536"}, - {file = "cryptography-3.1.1-cp35-cp35m-win32.whl", hash = "sha256:559d622aef2a2dff98a892eef321433ba5bc55b2485220a8ca289c1ecc2bd54f"}, - {file = "cryptography-3.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:451cdf60be4dafb6a3b78802006a020e6cd709c22d240f94f7a0696240a17154"}, - {file = "cryptography-3.1.1-cp36-abi3-win32.whl", hash = "sha256:762bc5a0df03c51ee3f09c621e1cee64e3a079a2b5020de82f1613873d79ee70"}, - {file = "cryptography-3.1.1-cp36-abi3-win_amd64.whl", hash = "sha256:b12e715c10a13ca1bd27fbceed9adc8c5ff640f8e1f7ea76416352de703523c8"}, - {file = "cryptography-3.1.1-cp36-cp36m-win32.whl", hash = "sha256:21b47c59fcb1c36f1113f3709d37935368e34815ea1d7073862e92f810dc7499"}, - {file = "cryptography-3.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:48ee615a779ffa749d7d50c291761dc921d93d7cf203dca2db663b4f193f0e49"}, - {file = "cryptography-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:b2bded09c578d19e08bd2c5bb8fed7f103e089752c9cf7ca7ca7de522326e921"}, - {file = "cryptography-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f99317a0fa2e49917689b8cf977510addcfaaab769b3f899b9c481bbd76730c2"}, - {file = "cryptography-3.1.1-cp38-cp38-win32.whl", hash = "sha256:ab010e461bb6b444eaf7f8c813bb716be2d78ab786103f9608ffd37a4bd7d490"}, - {file = "cryptography-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:99d4984aabd4c7182050bca76176ce2dbc9fa9748afe583a7865c12954d714ba"}, - {file = "cryptography-3.1.1.tar.gz", hash = "sha256:9d9fc6a16357965d282dd4ab6531013935425d0dc4950df2e0cf2a1b1ac1017d"}, + {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, + {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, + {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, + {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, + {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, + {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, + {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, + {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, + {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, + {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, + {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, + {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, + {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, + {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, + {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, ] dataclasses = [ {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, @@ -1764,8 +1764,8 @@ pillow = [ {file = "Pillow-8.0.1.tar.gz", hash = "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e"}, ] pkginfo = [ - {file = "pkginfo-1.6.0-py2.py3-none-any.whl", hash = "sha256:78d032b5888ec06d7f9d18fbf8c0549a6a3477081b34cb769119a07183624fc1"}, - {file = "pkginfo-1.6.0.tar.gz", hash = "sha256:dd008e95b13141ddd05d7e8881f0c0366a998ab90b25c2db794a1714b71583cc"}, + {file = "pkginfo-1.6.1-py2.py3-none-any.whl", hash = "sha256:ce14d7296c673dc4c61c759a0b6c14bae34e34eb819c0017bb6ca5b7292c56e9"}, + {file = "pkginfo-1.6.1.tar.gz", hash = "sha256:a6a4ac943b496745cec21f14f021bbd869d5e9b4f6ec06918cffea5a2f4b9193"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -1800,8 +1800,8 @@ pyparsing = [ pytest = [ {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, - {file = "pytest-6.1.1-py3-none-any.whl", hash = "sha256:7a8190790c17d79a11f847fba0b004ee9a8122582ebff4729a082c109e81a4c9"}, - {file = "pytest-6.1.1.tar.gz", hash = "sha256:8f593023c1a0f916110285b6efd7f99db07d59546e3d8c36fc60e2ab05d3be92"}, + {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, + {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, @@ -1822,8 +1822,8 @@ pytest-rerunfailures = [ {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, ] pytz = [ - {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, - {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, + {file = "pytz-2020.4-py2.py3-none-any.whl", hash = "sha256:5c55e189b682d420be27c6995ba6edce0c0a77dd67bfbe2ae6607134d5851ffd"}, + {file = "pytz-2020.4.tar.gz", hash = "sha256:3e6b7dd2d1e0a59084bcee14a17af60c5c562cdc16d828e8eba2e683d3a7e268"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1851,33 +1851,33 @@ recommonmark = [ {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ - {file = "regex-2020.10.23-cp27-cp27m-win32.whl", hash = "sha256:781906e45ef1d10a0ed9ec8ab83a09b5e0d742de70e627b20d61ccb1b1d3964d"}, - {file = "regex-2020.10.23-cp27-cp27m-win_amd64.whl", hash = "sha256:8cd0d587aaac74194ad3e68029124c06245acaeddaae14cb45844e5c9bebeea4"}, - {file = "regex-2020.10.23-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:af360e62a9790e0a96bc9ac845d87bfa0e4ee0ee68547ae8b5a9c1030517dbef"}, - {file = "regex-2020.10.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e21340c07090ddc8c16deebfd82eb9c9e1ec5e62f57bb86194a2595fd7b46e0"}, - {file = "regex-2020.10.23-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:e5f6aa56dda92472e9d6f7b1e6331f4e2d51a67caafff4d4c5121cadac03941e"}, - {file = "regex-2020.10.23-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:c30d8766a055c22e39dd7e1a4f98f6266169f2de05db737efe509c2fb9c8a3c8"}, - {file = "regex-2020.10.23-cp36-cp36m-win32.whl", hash = "sha256:1a065e7a6a1b4aa851a0efa1a2579eabc765246b8b3a5fd74000aaa3134b8b4e"}, - {file = "regex-2020.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:c95d514093b80e5309bdca5dd99e51bcf82c44043b57c34594d9d7556bd04d05"}, - {file = "regex-2020.10.23-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f4b1c65ee86bfbf7d0c3dfd90592a9e3d6e9ecd36c367c884094c050d4c35d04"}, - {file = "regex-2020.10.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d62205f00f461fe8b24ade07499454a3b7adf3def1225e258b994e2215fd15c5"}, - {file = "regex-2020.10.23-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b706c70070eea03411b1761fff3a2675da28d042a1ab7d0863b3efe1faa125c9"}, - {file = "regex-2020.10.23-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d43cf21df524283daa80ecad551c306b7f52881c8d0fe4e3e76a96b626b6d8d8"}, - {file = "regex-2020.10.23-cp37-cp37m-win32.whl", hash = "sha256:570e916a44a361d4e85f355aacd90e9113319c78ce3c2d098d2ddf9631b34505"}, - {file = "regex-2020.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1c447b0d108cddc69036b1b3910fac159f2b51fdeec7f13872e059b7bc932be1"}, - {file = "regex-2020.10.23-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8469377a437dbc31e480993399fd1fd15fe26f382dc04c51c9cb73e42965cc06"}, - {file = "regex-2020.10.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:59d5c6302d22c16d59611a9fd53556554010db1d47e9df5df37be05007bebe75"}, - {file = "regex-2020.10.23-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a973d5a7a324e2a5230ad7c43f5e1383cac51ef4903bf274936a5634b724b531"}, - {file = "regex-2020.10.23-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:97a023f97cddf00831ba04886d1596ef10f59b93df7f855856f037190936e868"}, - {file = "regex-2020.10.23-cp38-cp38-win32.whl", hash = "sha256:e289a857dca3b35d3615c3a6a438622e20d1bf0abcb82c57d866c8d0be3f44c4"}, - {file = "regex-2020.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:0cb23ed0e327c18fb7eac61ebbb3180ebafed5b9b86ca2e15438201e5903b5dd"}, - {file = "regex-2020.10.23-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c53dc8ee3bb7b7e28ee9feb996a0c999137be6c1d3b02cb6b3c4cba4f9e5ed09"}, - {file = "regex-2020.10.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6a46eba253cedcbe8a6469f881f014f0a98819d99d341461630885139850e281"}, - {file = "regex-2020.10.23-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:240509721a663836b611fa13ca1843079fc52d0b91ef3f92d9bba8da12e768a0"}, - {file = "regex-2020.10.23-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f567df0601e9c7434958143aebea47a9c4b45434ea0ae0286a4ec19e9877169"}, - {file = "regex-2020.10.23-cp39-cp39-win32.whl", hash = "sha256:bfd7a9fddd11d116a58b62ee6c502fd24cfe22a4792261f258f886aa41c2a899"}, - {file = "regex-2020.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:1a511470db3aa97432ac8c1bf014fcc6c9fbfd0f4b1313024d342549cf86bcd6"}, - {file = "regex-2020.10.23.tar.gz", hash = "sha256:2278453c6a76280b38855a263198961938108ea2333ee145c5168c36b8e2b376"}, + {file = "regex-2020.10.28-cp27-cp27m-win32.whl", hash = "sha256:4b5a9bcb56cc146c3932c648603b24514447eafa6ce9295234767bf92f69b504"}, + {file = "regex-2020.10.28-cp27-cp27m-win_amd64.whl", hash = "sha256:c13d311a4c4a8d671f5860317eb5f09591fbe8259676b86a85769423b544451e"}, + {file = "regex-2020.10.28-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c8a2b7ccff330ae4c460aff36626f911f918555660cc28163417cb84ffb25789"}, + {file = "regex-2020.10.28-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4afa350f162551cf402bfa3cd8302165c8e03e689c897d185f16a167328cc6dd"}, + {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b88fa3b8a3469f22b4f13d045d9bd3eda797aa4e406fde0a2644bc92bbdd4bdd"}, + {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f43109822df2d3faac7aad79613f5f02e4eab0fc8ad7932d2e70e2a83bd49c26"}, + {file = "regex-2020.10.28-cp36-cp36m-win32.whl", hash = "sha256:8092a5a06ad9a7a247f2a76ace121183dc4e1a84c259cf9c2ce3bbb69fac3582"}, + {file = "regex-2020.10.28-cp36-cp36m-win_amd64.whl", hash = "sha256:49461446b783945597c4076aea3f49aee4b4ce922bd241e4fcf62a3e7c61794c"}, + {file = "regex-2020.10.28-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8ca9dca965bd86ea3631b975d63b0693566d3cc347e55786d5514988b6f5b84c"}, + {file = "regex-2020.10.28-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ea37320877d56a7f0a1e6a625d892cf963aa7f570013499f5b8d5ab8402b5625"}, + {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:3a5f08039eee9ea195a89e180c5762bfb55258bfb9abb61a20d3abee3b37fd12"}, + {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:cb905f3d2e290a8b8f1579d3984f2cfa7c3a29cc7cba608540ceeed18513f520"}, + {file = "regex-2020.10.28-cp37-cp37m-win32.whl", hash = "sha256:a62162be05edf64f819925ea88d09d18b09bebf20971b363ce0c24e8b4aa14c0"}, + {file = "regex-2020.10.28-cp37-cp37m-win_amd64.whl", hash = "sha256:03855ee22980c3e4863dc84c42d6d2901133362db5daf4c36b710dd895d78f0a"}, + {file = "regex-2020.10.28-cp38-cp38-manylinux1_i686.whl", hash = "sha256:625116aca6c4b57c56ea3d70369cacc4d62fead4930f8329d242e4fe7a58ce4b"}, + {file = "regex-2020.10.28-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dc522e25e57e88b4980d2bdd334825dbf6fa55f28a922fc3bfa60cc09e5ef53"}, + {file = "regex-2020.10.28-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:119e0355dbdd4cf593b17f2fc5dbd4aec2b8899d0057e4957ba92f941f704bf5"}, + {file = "regex-2020.10.28-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:cfcf28ed4ce9ced47b9b9670a4f0d3d3c0e4d4779ad4dadb1ad468b097f808aa"}, + {file = "regex-2020.10.28-cp38-cp38-win32.whl", hash = "sha256:06b52815d4ad38d6524666e0d50fe9173533c9cc145a5779b89733284e6f688f"}, + {file = "regex-2020.10.28-cp38-cp38-win_amd64.whl", hash = "sha256:c3466a84fce42c2016113101018a9981804097bacbab029c2d5b4fcb224b89de"}, + {file = "regex-2020.10.28-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c2c6c56ee97485a127555c9595c069201b5161de9d05495fbe2132b5ac104786"}, + {file = "regex-2020.10.28-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1ec66700a10e3c75f1f92cbde36cca0d3aaee4c73dfa26699495a3a30b09093c"}, + {file = "regex-2020.10.28-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:11116d424734fe356d8777f89d625f0df783251ada95d6261b4c36ad27a394bb"}, + {file = "regex-2020.10.28-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f1fce1e4929157b2afeb4bb7069204d4370bab9f4fc03ca1fbec8bd601f8c87d"}, + {file = "regex-2020.10.28-cp39-cp39-win32.whl", hash = "sha256:832339223b9ce56b7b15168e691ae654d345ac1635eeb367ade9ecfe0e66bee0"}, + {file = "regex-2020.10.28-cp39-cp39-win_amd64.whl", hash = "sha256:654c1635f2313d0843028487db2191530bca45af61ca85d0b16555c399625b0e"}, + {file = "regex-2020.10.28.tar.gz", hash = "sha256:dd3e6547ecf842a29cf25123fbf8d2461c53c8d37aa20d87ecee130c89b7079b"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, @@ -1919,8 +1919,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"}, - {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"}, + {file = "Sphinx-3.3.0-py3-none-any.whl", hash = "sha256:3abdb2c57a65afaaa4f8573cbabd5465078eb6fd282c1e4f87f006875a7ec0c7"}, + {file = "Sphinx-3.3.0.tar.gz", hash = "sha256:1c21e7c5481a31b531e6cbf59c3292852ccde175b504b00ce2ff0b8f4adc3649"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -1955,12 +1955,12 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] toml = [ - {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, - {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.50.2-py2.py3-none-any.whl", hash = "sha256:43ca183da3367578ebf2f1c2e3111d51ea161ed1dc4e6345b86e27c2a93beff7"}, - {file = "tqdm-4.50.2.tar.gz", hash = "sha256:69dfa6714dee976e2425a9aab84b622675b7b1742873041e3db8a8e86132a4af"}, + {file = "tqdm-4.51.0-py2.py3-none-any.whl", hash = "sha256:9ad44aaf0fc3697c06f6e05c7cf025dd66bc7bcb7613c66d85f4464c47ac8fad"}, + {file = "tqdm-4.51.0.tar.gz", hash = "sha256:ef54779f1c09f346b2b5a8e5c61f96fbcb639929e640e59f8cf810794f406432"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, @@ -2015,6 +2015,6 @@ webencodings = [ zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, - {file = "zipp-3.3.2-py3-none-any.whl", hash = "sha256:50a4ef266c31c9409627b46012e206382eb8d23f46fbd358065a8335cfbf7d8f"}, - {file = "zipp-3.3.2.tar.gz", hash = "sha256:adf8f2ed8f614ced567d849cae9d183cef6cfd27c77a5cae7a28029be0c2b7a7"}, + {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, + {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, ] From 8644fa59c02f118b591230b9f1d5e80b1a31c9f8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 16:08:53 -0500 Subject: [PATCH 0635/2998] Add tmuxp shell_plus (credits to django-extensions, license MIT) --- tmuxp/cli.py | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 2828c8a6f5..1bb268e50d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -749,6 +749,147 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): tmuxp_breakpoint() +@cli.command(name='shell_plus') +@click.argument('session_name', nargs=1, required=False) +@click.argument('window_name', nargs=1, required=False) +@click.option('-S', 'socket_path', help='pass-through for tmux -S') +@click.option('-L', 'socket_name', help='pass-through for tmux -L') +@click.option( + '-c', + 'command', + help='Instead of opening shell, execute python code in libtmux and exit', +) +@click.option( + '--use-pythonrc/--no-startup', + 'use_pythonrc', + help='Load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.', + default=False, +) +def command_shell_plus( + session_name, + window_name, + socket_name, + socket_path, + command, + use_pythonrc, +): + """shell w/ tab completion. + + Credits: django-extensions shell_plus.py 51fef74 (MIT License) + """ + server = Server(socket_name=socket_name, socket_path=socket_path) + + current_pane = None + if os.getenv('TMUX_PANE') is not None: + try: + current_pane = [ + p + for p in server._list_panes() + if p.get('pane_id') == os.getenv('TMUX_PANE') + ][0] + except IndexError: + pass + + try: + if session_name: + session = server.find_where({'session_name': session_name}) + elif current_pane is not None: + session = server.find_where({'session_id': current_pane['session_id']}) + else: + session = server.list_sessions()[0] + + if not session: + raise exc.TmuxpException('Session not found: %s' % session_name) + except exc.TmuxpException as e: + print(e) + return + + try: + if window_name: + window = session.find_where({'window_name': window_name}) + if not window: + raise exc.TmuxpException('Window not found: %s' % window_name) + elif current_pane is not None: + window = session.find_where({'window_id': current_pane['window_id']}) + else: + window = session.list_windows()[0] + + except exc.TmuxpException as e: + print(e) + return + + try: + if current_pane is not None: + pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 + else: + pane = window.attached_pane # NOQA: F841 + except exc.TmuxpException as e: + print(e) + return + + if command is not None: + exec(command) + else: + # Using normal Python shell + import code + + import libtmux + + imported_objects = { + 'libtmux': libtmux, + 'Server': libtmux.Server, + 'Session': libtmux.Session, + 'Window': libtmux.Window, + 'Pane': libtmux.Pane, + 'server': server, + 'session': session, + 'window': window, + 'pane': pane, + } + + try: + # Try activating rlcompleter, because it's handy. + import readline + except ImportError: + pass + else: + # We don't have to wrap the following import in a 'try', because + # we already know 'readline' was imported successfully. + import rlcompleter + + readline.set_completer(rlcompleter.Completer(imported_objects).complete) + # Enable tab completion on systems using libedit (e.g. macOS). + # These lines are copied from Lib/site.py on Python 3.4. + readline_doc = getattr(readline, '__doc__', '') + if readline_doc is not None and 'libedit' in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab:complete") + + # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system + # conventions and get $PYTHONSTARTUP first then .pythonrc.py. + if use_pythonrc: + for pythonrc in set( + [os.environ.get("PYTHONSTARTUP"), os.path.expanduser('~/.pythonrc.py')] + ): + if not pythonrc: + continue + if not os.path.isfile(pythonrc): + continue + with open(pythonrc) as handle: + pythonrc_code = handle.read() + # Match the behavior of the cpython shell where an error in + # PYTHONSTARTUP prints an exception and continues. + try: + exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) + except Exception: + import traceback + + traceback.print_exc() + + code.interact(local=imported_objects) + + @cli.command(name='freeze') @click.argument('session_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') From cb83454bd29bf193530187c8d9c3653e333d364e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 20:48:47 -0500 Subject: [PATCH 0636/2998] Add shell_plus example --- tests/test_cli.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index 09814fbe5b..7f2c7675c8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -410,6 +410,12 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", [ + ( + ['shell_plus', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + [], + {}, + '{SERVER_SOCKET_NAME}', + ), ( ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], [], From f58eb93947c032898025339300c67626b2356d85 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 21:08:01 -0500 Subject: [PATCH 0637/2998] test_shell: Also test shell_plus --- tests/test_cli.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 7f2c7675c8..c0fdb0c85f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -407,24 +407,18 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output +@pytest.mark.parametrize("cli_cmd", ['shell', 'shell_plus']) @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", [ ( - ['shell_plus', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], - [], - {}, - '{SERVER_SOCKET_NAME}', - ), - ( - ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + ['-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], [], {}, '{SERVER_SOCKET_NAME}', ), ( [ - 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '-c', @@ -436,7 +430,6 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ( [ - 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '{WINDOW_NAME}', @@ -449,7 +442,6 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ( [ - 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '{WINDOW_NAME}', @@ -462,7 +454,6 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ( [ - 'shell', '-L{SOCKET_NAME}', '{SESSION_NAME}', '{WINDOW_NAME}', @@ -475,7 +466,6 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ), ( [ - 'shell', '-L{SOCKET_NAME}', '-c', 'print(pane.id)', @@ -487,7 +477,15 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): ], ) def test_shell( - cli_args, inputs, expected_output, env, tmpdir, monkeypatch, server, session + cli_cmd, + cli_args, + inputs, + expected_output, + env, + tmpdir, + monkeypatch, + server, + session, ): monkeypatch.setenv('HOME', str(tmpdir)) window_name = 'my_window' @@ -503,7 +501,8 @@ def test_shell( SERVER_SOCKET_NAME=server.socket_name, ) - cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + cli_args = [cli_cmd] + [cli_arg.format(**template_ctx) for cli_arg in cli_args] + for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) From cc9948301432514850a861b9f39013738bb1beaa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 14:58:15 -0600 Subject: [PATCH 0638/2998] test_shell explicitly --- tests/test_cli.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index c0fdb0c85f..b0ff112efe 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -516,7 +516,7 @@ def test_shell( @pytest.mark.parametrize( - "cli_args,inputs,env,exception, message", + "cli_args,inputs,env,exception,message", [ ( ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], @@ -548,6 +548,66 @@ def test_shell_no_server( ) +@pytest.mark.parametrize( + "cli_args,inputs,env,message", + [ + ( + [ + 'shell_plus', + '-L{SOCKET_NAME}', + ], + [], + {}, + '(InteractiveConsole)', + ), + ( + [ + 'shell_plus', + '-L{SOCKET_NAME}', + ], + [], + {'PANE_ID': '{PANE_ID}'}, + '(InteractiveConsole)', + ), + ], +) +def test_shell_plus( + cli_args, + inputs, + env, + message, + tmpdir, + monkeypatch, + server, + session, +): + monkeypatch.setenv('HOME', str(tmpdir)) + window_name = 'my_window' + window = session.new_window(window_name=window_name) + window.split_window() + + template_ctx = dict( + SOCKET_NAME=server.socket_name, + SOCKET_PATH=server.socket_path, + SESSION_NAME=session.name, + WINDOW_NAME=window_name, + PANE_ID=window.attached_pane.id, + SERVER_SOCKET_NAME=server.socket_name, + ) + + cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + for k, v in env.items(): + monkeypatch.setenv(k, v.format(**template_ctx)) + + with tmpdir.as_cwd(): + runner = CliRunner() + + result = runner.invoke( + cli.cli, cli_args, input=''.join(inputs), catch_exceptions=True + ) + assert message.format(**template_ctx) in result.output + + @pytest.mark.parametrize( "cli_args", [ From 65444affc6f74a9f2ceeaffb3ef286a3d76acbb5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 16:25:15 -0600 Subject: [PATCH 0639/2998] Add tests for missing session and window --- tests/test_cli.py | 73 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index b0ff112efe..7c8cbf5188 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -515,37 +515,92 @@ def test_shell( assert expected_output.format(**template_ctx) in result.output +@pytest.mark.parametrize("cli_cmd", ['shell', 'shell_plus']) @pytest.mark.parametrize( - "cli_args,inputs,env,exception,message", + "cli_args,inputs,env,template_ctx,exception,message", [ ( - ['shell', '-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + ['-LDoesNotExist', '-c', 'print(str(server.socket_name))'], [], {}, + {}, LibTmuxException, - r'.*{SOCKET_NAME}\s\(No such file or directory\).*', + r'.*DoesNotExist\s\(No such file or directory\).*', + ), + ( + [ + '-L{SOCKET_NAME}', + 'nonexistant_session', + '-c', + 'print(str(server.socket_name))', + ], + [], + {}, + {'session_name': 'nonexistant_session'}, + None, + 'Session not found: nonexistant_session', + ), + ( + [ + '-L{SOCKET_NAME}', + '{SESSION_NAME}', + 'nonexistant_window', + '-c', + 'print(str(server.socket_name))', + ], + [], + {}, + {'window_name': 'nonexistant_window'}, + None, + 'Window not found: {WINDOW_NAME}', ), ], ) -def test_shell_no_server( - cli_args, inputs, env, exception, message, tmpdir, monkeypatch, socket_name +def test_shell_target_missing( + cli_cmd, + cli_args, + inputs, + env, + template_ctx, + exception, + message, + tmpdir, + monkeypatch, + socket_name, + server, + session, ): monkeypatch.setenv('HOME', str(tmpdir)) + window_name = 'my_window' + window = session.new_window(window_name=window_name) + window.split_window() + template_ctx = dict( - SOCKET_NAME=socket_name, + SOCKET_NAME=server.socket_name, + SOCKET_PATH=server.socket_path, + SESSION_NAME=session.name, + WINDOW_NAME=template_ctx.get('window_name', window_name), + PANE_ID=template_ctx.get('pane_id'), + SERVER_SOCKET_NAME=server.socket_name, ) + cli_args = [cli_cmd] + [cli_arg.format(**template_ctx) for cli_arg in cli_args] - cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) with tmpdir.as_cwd(): runner = CliRunner() - with pytest.raises(exception, match=message.format(**template_ctx)): - runner.invoke( + if exception is not None: + with pytest.raises(exception, match=message.format(**template_ctx)): + result = runner.invoke( + cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + ) + else: + result = runner.invoke( cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False ) + assert message.format(**template_ctx) in result.output @pytest.mark.parametrize( From 1182d61184c4a3d1cd373cb8e0036e0ca0cd6dbd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 1 Nov 2020 18:31:42 -0600 Subject: [PATCH 0640/2998] shell_plus: Show helper message when no session exists --- tmuxp/cli.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 1bb268e50d..59306f3d45 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -779,6 +779,17 @@ def command_shell_plus( """ server = Server(socket_name=socket_name, socket_path=socket_path) + try: + server.sessions + except LibTmuxException as e: + if 'No such file or directory' in str(e): + raise LibTmuxException( + 'no tmux session found. Start a tmux session and try again. \n' + 'Original error: ' + str(e) + ) + else: + raise e + current_pane = None if os.getenv('TMUX_PANE') is not None: try: From a1227de4fe5a8420bc2fae18bc2063da28fe7f56 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 6 Nov 2020 20:18:49 -0600 Subject: [PATCH 0641/2998] Update CHANGES --- CHANGES | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 85051dfb53..50ce47f452 100644 --- a/CHANGES +++ b/CHANGES @@ -7,7 +7,7 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* -- :issue:`636` New command: ``tmuxp shell`` +- :issue:`636` New command: ``tmuxp shell`` and :issue:`638` ``tmuxp shell_plus`` Automatically preloads session, window, and pane via `libtmux`_ api objects and makes them available in a python console. @@ -41,6 +41,8 @@ current $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW + ``tmuxp shell_plus`` has autocompletion + tmuxp 1.5.8 (2020-10-31) ------------------------ - :issue:`639` Passes start_directory through to new tmux session From 13c77da90c604cb31b22f398208f1d33ae40b4b4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 6 Nov 2020 20:21:25 -0600 Subject: [PATCH 0642/2998] Update CHANGES --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 50ce47f452..6ffa7e38e1 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* + +tmuxp 1.6.0 (2020-11-06) +------------------------ - :issue:`636` New command: ``tmuxp shell`` and :issue:`638` ``tmuxp shell_plus`` Automatically preloads session, window, and pane via `libtmux`_ From be35db2e4d2d927987b15e0e409628d049da5377 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 6 Nov 2020 20:22:20 -0600 Subject: [PATCH 0643/2998] Tag v1.6.0 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 502c97247e..f024273be8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.5.8" +version = "1.6.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 78db138f8f..859816bd08 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.5.8' +__version__ = '1.6.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 52475abb22a849a8fe48de9e8e844c2f97828085 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 04:53:58 -0600 Subject: [PATCH 0644/2998] Decouple shell helpers --- tests/test_cli.py | 6 +-- tmuxp/cli.py | 130 +++++++--------------------------------------- tmuxp/shell.py | 84 ++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 113 deletions(-) create mode 100644 tmuxp/shell.py diff --git a/tests/test_cli.py b/tests/test_cli.py index 7c8cbf5188..651970cfa2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -13,7 +13,7 @@ import libtmux from libtmux.common import has_lt_version from libtmux.exc import LibTmuxException -from tmuxp import cli, config +from tmuxp import cli, config, exc from tmuxp.cli import ( command_ls, get_config_dir, @@ -537,7 +537,7 @@ def test_shell( [], {}, {'session_name': 'nonexistant_session'}, - None, + exc.TmuxpException, 'Session not found: nonexistant_session', ), ( @@ -551,7 +551,7 @@ def test_shell( [], {}, {'window_name': 'nonexistant_window'}, - None, + exc.TmuxpException, 'Window not found: {WINDOW_NAME}', ), ], diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 59306f3d45..f0f219f588 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -16,10 +16,10 @@ from click.exceptions import FileError from libtmux.common import has_gte_version, has_minimum_version, which -from libtmux.exc import LibTmuxException, TmuxCommandNotFound +from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server -from . import config, exc, log, util +from . import config, exc, log, shell, util from .__about__ import __version__ from ._compat import string_types from .workspacebuilder import WorkspaceBuilder, freeze @@ -682,64 +682,19 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): """ server = Server(socket_name=socket_name, socket_path=socket_path) - try: - server.sessions - except LibTmuxException as e: - if 'No such file or directory' in str(e): - raise LibTmuxException( - 'no tmux session found. Start a tmux session and try again. \n' - 'Original error: ' + str(e) - ) - else: - raise e + shell.raise_if_tmux_not_running(server=server) - current_pane = None - if os.getenv('TMUX_PANE') is not None: - try: - current_pane = [ - p - for p in server._list_panes() - if p.get('pane_id') == os.getenv('TMUX_PANE') - ][0] - except IndexError: - pass - - try: - if session_name: - session = server.find_where({'session_name': session_name}) - elif current_pane is not None: - session = server.find_where({'session_id': current_pane['session_id']}) - else: - session = server.list_sessions()[0] - - if not session: - raise exc.TmuxpException('Session not found: %s' % session_name) - except exc.TmuxpException as e: - print(e) - return + current_pane = shell.get_current_pane(server=server) - try: - if window_name: - window = session.find_where({'window_name': window_name}) - if not window: - raise exc.TmuxpException('Window not found: %s' % window_name) - elif current_pane is not None: - window = session.find_where({'window_id': current_pane['window_id']}) - else: - window = session.list_windows()[0] + session = shell.get_session( + server=server, session_name=session_name, current_pane=current_pane + ) - except exc.TmuxpException as e: - print(e) - return + window = shell.get_window( + session=session, window_name=window_name, current_pane=current_pane + ) - try: - if current_pane is not None: - pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 - else: - pane = window.attached_pane # NOQA: F841 - except exc.TmuxpException as e: - print(e) - return + pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841 if command is not None: exec(command) @@ -779,64 +734,19 @@ def command_shell_plus( """ server = Server(socket_name=socket_name, socket_path=socket_path) - try: - server.sessions - except LibTmuxException as e: - if 'No such file or directory' in str(e): - raise LibTmuxException( - 'no tmux session found. Start a tmux session and try again. \n' - 'Original error: ' + str(e) - ) - else: - raise e + shell.raise_if_tmux_not_running(server=server) - current_pane = None - if os.getenv('TMUX_PANE') is not None: - try: - current_pane = [ - p - for p in server._list_panes() - if p.get('pane_id') == os.getenv('TMUX_PANE') - ][0] - except IndexError: - pass - - try: - if session_name: - session = server.find_where({'session_name': session_name}) - elif current_pane is not None: - session = server.find_where({'session_id': current_pane['session_id']}) - else: - session = server.list_sessions()[0] - - if not session: - raise exc.TmuxpException('Session not found: %s' % session_name) - except exc.TmuxpException as e: - print(e) - return + current_pane = shell.get_current_pane(server=server) - try: - if window_name: - window = session.find_where({'window_name': window_name}) - if not window: - raise exc.TmuxpException('Window not found: %s' % window_name) - elif current_pane is not None: - window = session.find_where({'window_id': current_pane['window_id']}) - else: - window = session.list_windows()[0] + session = shell.get_session( + server=server, session_name=session_name, current_pane=current_pane + ) - except exc.TmuxpException as e: - print(e) - return + window = shell.get_window( + session=session, window_name=window_name, current_pane=current_pane + ) - try: - if current_pane is not None: - pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 - else: - pane = window.attached_pane # NOQA: F841 - except exc.TmuxpException as e: - print(e) - return + pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841 if command is not None: exec(command) diff --git a/tmuxp/shell.py b/tmuxp/shell.py new file mode 100644 index 0000000000..ba994821bf --- /dev/null +++ b/tmuxp/shell.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +"""Command line tool for managing tmux workspaces and tmuxp configurations. + +tmuxp.shell +~~~~~~~~~~~ + +""" +from __future__ import absolute_import + +import logging +import os + +from libtmux.exc import LibTmuxException + +from . import exc + +logger = logging.getLogger(__name__) + + +def raise_if_tmux_not_running(server): + """Raise exception if not running. More descriptive error if no server found.""" + try: + server.sessions + except LibTmuxException as e: + if 'No such file or directory' in str(e): + raise LibTmuxException( + 'no tmux session found. Start a tmux session and try again. \n' + 'Original error: ' + str(e) + ) + else: + raise e + + +def get_current_pane(server): + """Return Pane if one found in env""" + if os.getenv('TMUX_PANE') is not None: + try: + return [ + p + for p in server._list_panes() + if p.get('pane_id') == os.getenv('TMUX_PANE') + ][0] + except IndexError: + pass + + +def get_session(server, session_name=None, current_pane=None): + if session_name: + session = server.find_where({'session_name': session_name}) + elif current_pane is not None: + session = server.find_where({'session_id': current_pane['session_id']}) + else: + session = server.list_sessions()[0] + + if not session: + raise exc.TmuxpException('Session not found: %s' % session_name) + + return session + + +def get_window(session, window_name=None, current_pane=None): + if window_name: + window = session.find_where({'window_name': window_name}) + if not window: + raise exc.TmuxpException('Window not found: %s' % window_name) + elif current_pane is not None: + window = session.find_where({'window_id': current_pane['window_id']}) + else: + window = session.list_windows()[0] + + return window + + +def get_pane(window, current_pane=None): + try: + if current_pane is not None: + pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 + else: + pane = window.attached_pane # NOQA: F841 + except exc.TmuxpException as e: + print(e) + return + + return pane From 83659635ed5fe56adcb06133542c78ffab8624fe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 04:56:36 -0600 Subject: [PATCH 0645/2998] Keep helper methods in util --- tmuxp/cli.py | 22 ++++++------- tmuxp/shell.py | 84 -------------------------------------------------- tmuxp/util.py | 69 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 95 deletions(-) delete mode 100644 tmuxp/shell.py diff --git a/tmuxp/cli.py b/tmuxp/cli.py index f0f219f588..d9ee0ec2b8 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -19,7 +19,7 @@ from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server -from . import config, exc, log, shell, util +from . import config, exc, log, util from .__about__ import __version__ from ._compat import string_types from .workspacebuilder import WorkspaceBuilder, freeze @@ -682,19 +682,19 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): """ server = Server(socket_name=socket_name, socket_path=socket_path) - shell.raise_if_tmux_not_running(server=server) + util.raise_if_tmux_not_running(server=server) - current_pane = shell.get_current_pane(server=server) + current_pane = util.get_current_pane(server=server) - session = shell.get_session( + session = util.get_session( server=server, session_name=session_name, current_pane=current_pane ) - window = shell.get_window( + window = util.get_window( session=session, window_name=window_name, current_pane=current_pane ) - pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841 + pane = util.get_pane(window=window, current_pane=current_pane) # NOQA: F841 if command is not None: exec(command) @@ -734,19 +734,19 @@ def command_shell_plus( """ server = Server(socket_name=socket_name, socket_path=socket_path) - shell.raise_if_tmux_not_running(server=server) + util.raise_if_tmux_not_running(server=server) - current_pane = shell.get_current_pane(server=server) + current_pane = util.get_current_pane(server=server) - session = shell.get_session( + session = util.get_session( server=server, session_name=session_name, current_pane=current_pane ) - window = shell.get_window( + window = util.get_window( session=session, window_name=window_name, current_pane=current_pane ) - pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841 + pane = util.get_pane(window=window, current_pane=current_pane) # NOQA: F841 if command is not None: exec(command) diff --git a/tmuxp/shell.py b/tmuxp/shell.py deleted file mode 100644 index ba994821bf..0000000000 --- a/tmuxp/shell.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -"""Command line tool for managing tmux workspaces and tmuxp configurations. - -tmuxp.shell -~~~~~~~~~~~ - -""" -from __future__ import absolute_import - -import logging -import os - -from libtmux.exc import LibTmuxException - -from . import exc - -logger = logging.getLogger(__name__) - - -def raise_if_tmux_not_running(server): - """Raise exception if not running. More descriptive error if no server found.""" - try: - server.sessions - except LibTmuxException as e: - if 'No such file or directory' in str(e): - raise LibTmuxException( - 'no tmux session found. Start a tmux session and try again. \n' - 'Original error: ' + str(e) - ) - else: - raise e - - -def get_current_pane(server): - """Return Pane if one found in env""" - if os.getenv('TMUX_PANE') is not None: - try: - return [ - p - for p in server._list_panes() - if p.get('pane_id') == os.getenv('TMUX_PANE') - ][0] - except IndexError: - pass - - -def get_session(server, session_name=None, current_pane=None): - if session_name: - session = server.find_where({'session_name': session_name}) - elif current_pane is not None: - session = server.find_where({'session_id': current_pane['session_id']}) - else: - session = server.list_sessions()[0] - - if not session: - raise exc.TmuxpException('Session not found: %s' % session_name) - - return session - - -def get_window(session, window_name=None, current_pane=None): - if window_name: - window = session.find_where({'window_name': window_name}) - if not window: - raise exc.TmuxpException('Window not found: %s' % window_name) - elif current_pane is not None: - window = session.find_where({'window_id': current_pane['window_id']}) - else: - window = session.list_windows()[0] - - return window - - -def get_pane(window, current_pane=None): - try: - if current_pane is not None: - pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 - else: - pane = window.attached_pane # NOQA: F841 - except exc.TmuxpException as e: - print(e) - return - - return pane diff --git a/tmuxp/util.py b/tmuxp/util.py index 5b7f3c73e6..6cf66b68ce 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -13,6 +13,8 @@ import subprocess import sys +from libtmux.exc import LibTmuxException + from . import exc from ._compat import console_to_str @@ -74,3 +76,70 @@ def oh_my_zsh_auto_title(): 'Then create a new shell or type:\n\n' '\t$ source ~/.zshrc' ) + + +def raise_if_tmux_not_running(server): + """Raise exception if not running. More descriptive error if no server found.""" + try: + server.sessions + except LibTmuxException as e: + if 'No such file or directory' in str(e): + raise LibTmuxException( + 'no tmux session found. Start a tmux session and try again. \n' + 'Original error: ' + str(e) + ) + else: + raise e + + +def get_current_pane(server): + """Return Pane if one found in env""" + if os.getenv('TMUX_PANE') is not None: + try: + return [ + p + for p in server._list_panes() + if p.get('pane_id') == os.getenv('TMUX_PANE') + ][0] + except IndexError: + pass + + +def get_session(server, session_name=None, current_pane=None): + if session_name: + session = server.find_where({'session_name': session_name}) + elif current_pane is not None: + session = server.find_where({'session_id': current_pane['session_id']}) + else: + session = server.list_sessions()[0] + + if not session: + raise exc.TmuxpException('Session not found: %s' % session_name) + + return session + + +def get_window(session, window_name=None, current_pane=None): + if window_name: + window = session.find_where({'window_name': window_name}) + if not window: + raise exc.TmuxpException('Window not found: %s' % window_name) + elif current_pane is not None: + window = session.find_where({'window_id': current_pane['window_id']}) + else: + window = session.list_windows()[0] + + return window + + +def get_pane(window, current_pane=None): + try: + if current_pane is not None: + pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 + else: + pane = window.attached_pane # NOQA: F841 + except exc.TmuxpException as e: + print(e) + return + + return pane From 63bc260c89df5bcecebfdb31e5f71bfe727b62b4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 04:58:16 -0600 Subject: [PATCH 0646/2998] docs(API): Add new util methods --- docs/api.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index 031e3d9f1b..c3b523ddd3 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -15,6 +15,18 @@ Internals .. automethod:: tmuxp.util.run_before_script +.. automethod:: tmuxp.util.oh_my_zsh_auto_title + +.. automethod:: tmuxp.util.raise_if_tmux_not_running + +.. automethod:: tmuxp.util.get_current_pane + +.. automethod:: tmuxp.util.get_session + +.. automethod:: tmuxp.util.get_window + +.. automethod:: tmuxp.util.get_pane + CLI --- From 663fcaa959ba62e5df06ab8abb65a94187409b79 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 05:30:48 -0600 Subject: [PATCH 0647/2998] Split out shell, launch into shell by default unless BREAKPOINT entered --- tmuxp/cli.py | 22 ++++++++++++--- tmuxp/shell.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 tmuxp/shell.py diff --git a/tmuxp/cli.py b/tmuxp/cli.py index d9ee0ec2b8..d56f23ae2d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -21,7 +21,7 @@ from . import config, exc, log, util from .__about__ import __version__ -from ._compat import string_types +from ._compat import PY3, PYMINOR, string_types from .workspacebuilder import WorkspaceBuilder, freeze logger = logging.getLogger(__name__) @@ -671,7 +671,15 @@ def startup(config_dir): 'command', help='Instead of opening shell, execute python code in libtmux and exit', ) -def command_shell(session_name, window_name, socket_name, socket_path, command): +@click.option( + '--use-pdb/--no-pdb', + 'use_pdb', + help='Use pdb / breakpoint() instead of code.interact()', + default=False, +) +def command_shell( + session_name, window_name, socket_name, socket_path, command, use_pdb +): """Launch python shell for tmux server, session, window and pane. Priority given to loaded session/wndow/pane objects: @@ -699,9 +707,15 @@ def command_shell(session_name, window_name, socket_name, socket_path, command): if command is not None: exec(command) else: - from ._compat import breakpoint as tmuxp_breakpoint + if use_pdb or (os.getenv('PYTHONBREAKPOINT') and PY3 and PYMINOR >= 7): + from ._compat import breakpoint as tmuxp_breakpoint + + tmuxp_breakpoint() + return + else: + from .shell import launch - tmuxp_breakpoint() + launch(server=server, session=session, window=window, pane=pane) @cli.command(name='shell_plus') diff --git a/tmuxp/shell.py b/tmuxp/shell.py new file mode 100644 index 0000000000..67ab226d2f --- /dev/null +++ b/tmuxp/shell.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +"""Utility and helper methods for tmuxp. + +tmuxp.shell +~~~~~~~~~~~ + +""" +from __future__ import absolute_import, unicode_literals + +import logging +import os + +logger = logging.getLogger(__name__) + + +def launch(shell=None, best=True, use_pythonrc=False, **kwargs): + import code + + import libtmux + + imported_objects = { + 'libtmux': libtmux, + 'Server': libtmux.Server, + 'Session': libtmux.Session, + 'Window': libtmux.Window, + 'Pane': libtmux.Pane, + 'server': kwargs.get('server'), + 'session': kwargs.get('session'), + 'window': kwargs.get('window'), + 'pane': kwargs.get('pane'), + } + + try: + # Try activating rlcompleter, because it's handy. + import readline + except ImportError: + pass + else: + # We don't have to wrap the following import in a 'try', because + # we already know 'readline' was imported successfully. + import rlcompleter + + readline.set_completer(rlcompleter.Completer(imported_objects).complete) + # Enable tab completion on systems using libedit (e.g. macOS). + # These lines are copied from Lib/site.py on Python 3.4. + readline_doc = getattr(readline, '__doc__', '') + if readline_doc is not None and 'libedit' in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab:complete") + + # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system + # conventions and get $PYTHONSTARTUP first then .pythonrc.py. + if use_pythonrc: + for pythonrc in set( + [os.environ.get("PYTHONSTARTUP"), os.path.expanduser('~/.pythonrc.py')] + ): + if not pythonrc: + continue + if not os.path.isfile(pythonrc): + continue + with open(pythonrc) as handle: + pythonrc_code = handle.read() + # Match the behavior of the cpython shell where an error in + # PYTHONSTARTUP prints an exception and continues. + try: + exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) + except Exception: + import traceback + + traceback.print_exc() + + code.interact(local=imported_objects) From 477ec685c6b595495b1bfeddeda8819204fd5731 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 05:41:09 -0600 Subject: [PATCH 0648/2998] Remove shell_plus: Update tests --- tests/test_cli.py | 14 +++--- tmuxp/cli.py | 123 ++++++---------------------------------------- 2 files changed, 22 insertions(+), 115 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 651970cfa2..6352c07f6c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -407,7 +407,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output -@pytest.mark.parametrize("cli_cmd", ['shell', 'shell_plus']) +@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--use-pdb')]) @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", [ @@ -501,7 +501,8 @@ def test_shell( SERVER_SOCKET_NAME=server.socket_name, ) - cli_args = [cli_cmd] + [cli_arg.format(**template_ctx) for cli_arg in cli_args] + cli_cmd = list(cli_cmd) if isinstance(cli_cmd, (list, tuple)) else [cli_cmd] + cli_args = cli_cmd + [cli_arg.format(**template_ctx) for cli_arg in cli_args] for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) @@ -515,7 +516,7 @@ def test_shell( assert expected_output.format(**template_ctx) in result.output -@pytest.mark.parametrize("cli_cmd", ['shell', 'shell_plus']) +@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--use-pdb')]) @pytest.mark.parametrize( "cli_args,inputs,env,template_ctx,exception,message", [ @@ -583,7 +584,8 @@ def test_shell_target_missing( PANE_ID=template_ctx.get('pane_id'), SERVER_SOCKET_NAME=server.socket_name, ) - cli_args = [cli_cmd] + [cli_arg.format(**template_ctx) for cli_arg in cli_args] + cli_cmd = list(cli_cmd) if isinstance(cli_cmd, (list, tuple)) else [cli_cmd] + cli_args = cli_cmd + [cli_arg.format(**template_ctx) for cli_arg in cli_args] for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) @@ -608,7 +610,7 @@ def test_shell_target_missing( [ ( [ - 'shell_plus', + 'shell', '-L{SOCKET_NAME}', ], [], @@ -617,7 +619,7 @@ def test_shell_target_missing( ), ( [ - 'shell_plus', + 'shell', '-L{SOCKET_NAME}', ], [], diff --git a/tmuxp/cli.py b/tmuxp/cli.py index d56f23ae2d..29ddd411d4 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -677,8 +677,14 @@ def startup(config_dir): help='Use pdb / breakpoint() instead of code.interact()', default=False, ) +@click.option( + '--use-pythonrc/--no-startup', + 'use_pythonrc', + help='Load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.', + default=False, +) def command_shell( - session_name, window_name, socket_name, socket_path, command, use_pdb + session_name, window_name, socket_name, socket_path, command, use_pdb, use_pythonrc ): """Launch python shell for tmux server, session, window and pane. @@ -715,114 +721,13 @@ def command_shell( else: from .shell import launch - launch(server=server, session=session, window=window, pane=pane) - - -@cli.command(name='shell_plus') -@click.argument('session_name', nargs=1, required=False) -@click.argument('window_name', nargs=1, required=False) -@click.option('-S', 'socket_path', help='pass-through for tmux -S') -@click.option('-L', 'socket_name', help='pass-through for tmux -L') -@click.option( - '-c', - 'command', - help='Instead of opening shell, execute python code in libtmux and exit', -) -@click.option( - '--use-pythonrc/--no-startup', - 'use_pythonrc', - help='Load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.', - default=False, -) -def command_shell_plus( - session_name, - window_name, - socket_name, - socket_path, - command, - use_pythonrc, -): - """shell w/ tab completion. - - Credits: django-extensions shell_plus.py 51fef74 (MIT License) - """ - server = Server(socket_name=socket_name, socket_path=socket_path) - - util.raise_if_tmux_not_running(server=server) - - current_pane = util.get_current_pane(server=server) - - session = util.get_session( - server=server, session_name=session_name, current_pane=current_pane - ) - - window = util.get_window( - session=session, window_name=window_name, current_pane=current_pane - ) - - pane = util.get_pane(window=window, current_pane=current_pane) # NOQA: F841 - - if command is not None: - exec(command) - else: - # Using normal Python shell - import code - - import libtmux - - imported_objects = { - 'libtmux': libtmux, - 'Server': libtmux.Server, - 'Session': libtmux.Session, - 'Window': libtmux.Window, - 'Pane': libtmux.Pane, - 'server': server, - 'session': session, - 'window': window, - 'pane': pane, - } - - try: - # Try activating rlcompleter, because it's handy. - import readline - except ImportError: - pass - else: - # We don't have to wrap the following import in a 'try', because - # we already know 'readline' was imported successfully. - import rlcompleter - - readline.set_completer(rlcompleter.Completer(imported_objects).complete) - # Enable tab completion on systems using libedit (e.g. macOS). - # These lines are copied from Lib/site.py on Python 3.4. - readline_doc = getattr(readline, '__doc__', '') - if readline_doc is not None and 'libedit' in readline_doc: - readline.parse_and_bind("bind ^I rl_complete") - else: - readline.parse_and_bind("tab:complete") - - # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system - # conventions and get $PYTHONSTARTUP first then .pythonrc.py. - if use_pythonrc: - for pythonrc in set( - [os.environ.get("PYTHONSTARTUP"), os.path.expanduser('~/.pythonrc.py')] - ): - if not pythonrc: - continue - if not os.path.isfile(pythonrc): - continue - with open(pythonrc) as handle: - pythonrc_code = handle.read() - # Match the behavior of the cpython shell where an error in - # PYTHONSTARTUP prints an exception and continues. - try: - exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) - except Exception: - import traceback - - traceback.print_exc() - - code.interact(local=imported_objects) + launch( + server=server, + session=session, + window=window, + pane=pane, + use_pythonrc=use_pythonrc, + ) @cli.command(name='freeze') From 5e6c56fb79a5b7f2f9c376bce399af1ee9dbe201 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 05:54:02 -0600 Subject: [PATCH 0649/2998] Checks for having python shells --- tmuxp/shell.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tmuxp/shell.py b/tmuxp/shell.py index 67ab226d2f..c9c0c63f49 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -13,7 +13,45 @@ logger = logging.getLogger(__name__) -def launch(shell=None, best=True, use_pythonrc=False, **kwargs): +def has_ipython(): + try: + from IPython import start_ipython # NOQA F841 + except ImportError: + try: + from IPython.Shell import IPShell # NOQA F841 + except ImportError: + return False + + return True + + +def has_ptpython(): + try: + from ptpython.repl import embed, run_config # NOQA F841 + except ImportError: + try: + from prompt_toolkit.contrib.repl import embed, run_config # NOQA F841 + except ImportError: + return False + + return True + + +def has_ptipython(): + try: + from ptpython.ipython import embed # NOQA F841 + from ptpython.repl import run_config # NOQA F841 + except ImportError: + try: + from prompt_toolkit.contrib.ipython import embed # NOQA F841 + from prompt_toolkit.contrib.repl import run_config # NOQA F841 + except ImportError: + return False + + return True + + +def launch(shell='best', use_pythonrc=False, **kwargs): import code import libtmux From 36f37ea29aa8e59b46144d0ae4b5ca5930e7c625 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 07:24:44 -0600 Subject: [PATCH 0650/2998] Automatically detect the best shell --- tests/test_cli.py | 4 +- tmuxp/cli.py | 19 +++--- tmuxp/shell.py | 157 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 166 insertions(+), 14 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 6352c07f6c..5b93a743c2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -407,7 +407,7 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output -@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--use-pdb')]) +@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--pdb')]) @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", [ @@ -516,7 +516,7 @@ def test_shell( assert expected_output.format(**template_ctx) in result.output -@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--use-pdb')]) +@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--pdb')]) @pytest.mark.parametrize( "cli_args,inputs,env,template_ctx,exception,message", [ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 29ddd411d4..e5502b252d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -671,20 +671,22 @@ def startup(config_dir): 'command', help='Instead of opening shell, execute python code in libtmux and exit', ) -@click.option( - '--use-pdb/--no-pdb', - 'use_pdb', - help='Use pdb / breakpoint() instead of code.interact()', - default=False, -) @click.option( '--use-pythonrc/--no-startup', 'use_pythonrc', help='Load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.', default=False, ) +@click.option('--pdb', 'shell', flag_value='pdb', help='Use plain pdb') +@click.option( + '--code', 'shell', flag_value='code', help='Use stdlib\'s code.interact()' +) +@click.option('--ptipython', 'shell', flag_value='pdb', help='Use ptpython + ipython') +@click.option('--ptpython', 'shell', flag_value='pdb', help='Use ptpython') +@click.option('--ipython', 'shell', flag_value='pdb', help='Use ipython') +@click.option('--bpython', 'shell', flag_value='pdb', help='Use bpython') def command_shell( - session_name, window_name, socket_name, socket_path, command, use_pdb, use_pythonrc + session_name, window_name, socket_name, socket_path, command, shell, use_pythonrc ): """Launch python shell for tmux server, session, window and pane. @@ -713,7 +715,7 @@ def command_shell( if command is not None: exec(command) else: - if use_pdb or (os.getenv('PYTHONBREAKPOINT') and PY3 and PYMINOR >= 7): + if shell == 'pdb' or (os.getenv('PYTHONBREAKPOINT') and PY3 and PYMINOR >= 7): from ._compat import breakpoint as tmuxp_breakpoint tmuxp_breakpoint() @@ -727,6 +729,7 @@ def command_shell( window=window, pane=pane, use_pythonrc=use_pythonrc, + shell=shell, ) diff --git a/tmuxp/shell.py b/tmuxp/shell.py index c9c0c63f49..545bb2b949 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -9,6 +9,7 @@ import logging import os +import traceback logger = logging.getLogger(__name__) @@ -51,12 +52,132 @@ def has_ptipython(): return True -def launch(shell='best', use_pythonrc=False, **kwargs): - import code +def has_bpython(): + try: + from bpython import embed # NOQA F841 + except ImportError: + return False + return True + + +def detect_best_shell(): + if has_ptipython(): + return 'ptipython' + elif has_ptpython(): + return 'ptpython' + elif has_ipython(): + return 'ipython' + elif has_bpython(): + return 'bpython' + return 'code' + + +def get_bpython(options, extra_args): + try: + from bpython import embed # NOQA F841 + except ImportError: + return traceback.format_exc() + + def launch_bpython(): + imported_objects = get_launch_args(**options) + kwargs = {} + if extra_args: + kwargs['args'] = extra_args + embed(imported_objects, **kwargs) + + return launch_bpython + + +def get_ipython_arguments(): + ipython_args = 'IPYTHON_ARGUMENTS' + return os.environ.get(ipython_args, '').split() + + +def get_ipython(options, **extra_args): + try: + from IPython import start_ipython + + def launch_ipython(): + imported_objects = get_launch_args(**options) + ipython_arguments = extra_args or get_ipython_arguments() + start_ipython(argv=ipython_arguments, user_ns=imported_objects) + + return launch_ipython + except ImportError: + str_exc = traceback.format_exc() + # IPython < 0.11 + # Explicitly pass an empty list as arguments, because otherwise + # IPython would use sys.argv from this script. + # Notebook not supported for IPython < 0.11. + try: + from IPython.Shell import IPShell + except ImportError: + return str_exc + "\n" + traceback.format_exc() + + def launch_ipython(): + imported_objects = get_launch_args(**options) + shell = IPShell(argv=[], user_ns=imported_objects) + shell.mainloop() + + return launch_ipython + +def get_ptpython(self, options): + try: + from ptpython.repl import embed, run_config + except ImportError: + tb = traceback.format_exc() + try: # prompt_toolkit < v0.27 + from prompt_toolkit.contrib.repl import embed, run_config + except ImportError: + return tb + + def run_ptpython(): + imported_objects = get_launch_args(**options) + history_filename = os.path.expanduser('~/.ptpython_history') + embed( + globals=imported_objects, + history_filename=history_filename, + vi_mode=options['vi_mode'], + configure=run_config, + ) + + return run_ptpython + + +def get_ptipython(options): + """Based on django-extensions + + Run renamed to launch, get_imported_objects renamed to get_launch_args + """ + try: + from ptpython.ipython import embed + from ptpython.repl import run_config + except ImportError: + tb = traceback.format_exc() + try: # prompt_toolkit < v0.27 + from prompt_toolkit.contrib.ipython import embed + from prompt_toolkit.contrib.repl import run_config + except ImportError: + return tb + + def launch_ptipython(): + imported_objects = get_launch_args(**options) + history_filename = os.path.expanduser('~/.ptpython_history') + embed( + user_ns=imported_objects, + history_filename=history_filename, + vi_mode=options['vi_mode'], + configure=run_config, + ) + + return launch_ptipython + + +def get_launch_args(**kwargs): import libtmux - imported_objects = { + return { 'libtmux': libtmux, 'Server': libtmux.Server, 'Session': libtmux.Session, @@ -68,6 +189,10 @@ def launch(shell='best', use_pythonrc=False, **kwargs): 'pane': kwargs.get('pane'), } + +def get_code(use_pythonrc, imported_objects): + import code + try: # Try activating rlcompleter, because it's handy. import readline @@ -108,4 +233,28 @@ def launch(shell='best', use_pythonrc=False, **kwargs): traceback.print_exc() - code.interact(local=imported_objects) + def launch_code(): + code.interact(local=imported_objects) + + return launch_code + + +def launch(shell='best', use_pythonrc=False, **kwargs): + # Also allowing passing shell='code' to force using code.interact + imported_objects = get_launch_args(**kwargs) + + if shell == 'best': + shell = detect_best_shell() + + if shell == 'ptipython': + launch = get_ptipython(options=kwargs) + elif shell == 'ptpython': + launch = get_ptpython(options=kwargs) + elif shell == 'ipython': + launch = get_ipython(options=kwargs) + elif shell == 'bpython': + launch = get_bpython(options=kwargs) + else: + launch = get_code(use_pythonrc=use_pythonrc, imported_objects=imported_objects) + + launch() From eddf45118afd5a8ba7c52d843540a32ec7cea354 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 07:48:35 -0600 Subject: [PATCH 0651/2998] Automatically detect the best shell --- tests/test_cli.py | 27 ++++++++++++++++++---- tmuxp/cli.py | 44 +++++++++++++++++++++++++++--------- tmuxp/shell.py | 57 +++++++++++++++++------------------------------ 3 files changed, 77 insertions(+), 51 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 5b93a743c2..2741a30a2f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -516,7 +516,13 @@ def test_shell( assert expected_output.format(**template_ctx) in result.output -@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--pdb')]) +@pytest.mark.parametrize( + "cli_cmd", + [ + 'shell', + ('shell', '--pdb'), + ], +) @pytest.mark.parametrize( "cli_args,inputs,env,template_ctx,exception,message", [ @@ -605,12 +611,23 @@ def test_shell_target_missing( assert message.format(**template_ctx) in result.output +@pytest.mark.parametrize( + "cli_cmd", + [ + # 'shell', + # ('shell', '--pdb'), + ('shell', '--code'), + # ('shell', '--bpython'), + # ('shell', '--ptipython'), + # ('shell', '--ptpython'), + # ('shell', '--ipython'), + ], +) @pytest.mark.parametrize( "cli_args,inputs,env,message", [ ( [ - 'shell', '-L{SOCKET_NAME}', ], [], @@ -619,7 +636,6 @@ def test_shell_target_missing( ), ( [ - 'shell', '-L{SOCKET_NAME}', ], [], @@ -629,6 +645,7 @@ def test_shell_target_missing( ], ) def test_shell_plus( + cli_cmd, cli_args, inputs, env, @@ -652,7 +669,9 @@ def test_shell_plus( SERVER_SOCKET_NAME=server.socket_name, ) - cli_args[:] = [cli_arg.format(**template_ctx) for cli_arg in cli_args] + cli_cmd = list(cli_cmd) if isinstance(cli_cmd, (list, tuple)) else [cli_cmd] + cli_args = cli_cmd + [cli_arg.format(**template_ctx) for cli_arg in cli_args] + for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index e5502b252d..6b1ac0cf5d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -671,22 +671,44 @@ def startup(config_dir): 'command', help='Instead of opening shell, execute python code in libtmux and exit', ) +@click.option( + '--best', + 'shell', + flag_value='best', + help='Use best shell available in site packages', + default=True, +) +@click.option('--pdb', 'shell', flag_value='pdb', help='Use plain pdb') +@click.option( + '--code', 'shell', flag_value='code', help='Use stdlib\'s code.interact()' +) +@click.option( + '--ptipython', 'shell', flag_value='ptipython', help='Use ptpython + ipython' +) +@click.option('--ptpython', 'shell', flag_value='ptpython', help='Use ptpython') +@click.option('--ipython', 'shell', flag_value='ipython', help='Use ipython') +@click.option('--bpython', 'shell', flag_value='bpython', help='Use bpython') @click.option( '--use-pythonrc/--no-startup', 'use_pythonrc', - help='Load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.', + help='Load PYTHONSTARTUP env var and ~/.pythonrc.py script in --code', default=False, ) -@click.option('--pdb', 'shell', flag_value='pdb', help='Use plain pdb') @click.option( - '--code', 'shell', flag_value='code', help='Use stdlib\'s code.interact()' + '--use-vi-mode/--no-vi-mode', + 'use_vi_mode', + help='Use vi-mode in ptpython/ptipython', + default=False, ) -@click.option('--ptipython', 'shell', flag_value='pdb', help='Use ptpython + ipython') -@click.option('--ptpython', 'shell', flag_value='pdb', help='Use ptpython') -@click.option('--ipython', 'shell', flag_value='pdb', help='Use ipython') -@click.option('--bpython', 'shell', flag_value='pdb', help='Use bpython') def command_shell( - session_name, window_name, socket_name, socket_path, command, shell, use_pythonrc + session_name, + window_name, + socket_name, + socket_path, + command, + shell, + use_pythonrc, + use_vi_mode, ): """Launch python shell for tmux server, session, window and pane. @@ -724,12 +746,14 @@ def command_shell( from .shell import launch launch( + shell=shell, + use_pythonrc=use_pythonrc, # shell: code + use_vi_mode=use_vi_mode, # shell: ptpython, ptipython + # tmux environment / libtmux variables server=server, session=session, window=window, pane=pane, - use_pythonrc=use_pythonrc, - shell=shell, ) diff --git a/tmuxp/shell.py b/tmuxp/shell.py index 545bb2b949..2920b590fd 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -9,7 +9,6 @@ import logging import os -import traceback logger = logging.getLogger(__name__) @@ -72,11 +71,11 @@ def detect_best_shell(): return 'code' -def get_bpython(options, extra_args): - try: - from bpython import embed # NOQA F841 - except ImportError: - return traceback.format_exc() +def get_bpython(options, extra_args=None): + if extra_args is None: + extra_args = {} + + from bpython import embed # NOQA F841 def launch_bpython(): imported_objects = get_launch_args(**options) @@ -104,15 +103,11 @@ def launch_ipython(): return launch_ipython except ImportError: - str_exc = traceback.format_exc() # IPython < 0.11 # Explicitly pass an empty list as arguments, because otherwise # IPython would use sys.argv from this script. # Notebook not supported for IPython < 0.11. - try: - from IPython.Shell import IPShell - except ImportError: - return str_exc + "\n" + traceback.format_exc() + from IPython.Shell import IPShell def launch_ipython(): imported_objects = get_launch_args(**options) @@ -122,30 +117,26 @@ def launch_ipython(): return launch_ipython -def get_ptpython(self, options): +def get_ptpython(options, vi_mode=False): try: from ptpython.repl import embed, run_config except ImportError: - tb = traceback.format_exc() - try: # prompt_toolkit < v0.27 - from prompt_toolkit.contrib.repl import embed, run_config - except ImportError: - return tb + from prompt_toolkit.contrib.repl import embed, run_config - def run_ptpython(): + def launch_ptpython(): imported_objects = get_launch_args(**options) history_filename = os.path.expanduser('~/.ptpython_history') embed( globals=imported_objects, history_filename=history_filename, - vi_mode=options['vi_mode'], + vi_mode=vi_mode, configure=run_config, ) - return run_ptpython + return launch_ptpython -def get_ptipython(options): +def get_ptipython(options, vi_mode=False): """Based on django-extensions Run renamed to launch, get_imported_objects renamed to get_launch_args @@ -154,12 +145,9 @@ def get_ptipython(options): from ptpython.ipython import embed from ptpython.repl import run_config except ImportError: - tb = traceback.format_exc() - try: # prompt_toolkit < v0.27 - from prompt_toolkit.contrib.ipython import embed - from prompt_toolkit.contrib.repl import run_config - except ImportError: - return tb + # prompt_toolkit < v0.27 + from prompt_toolkit.contrib.ipython import embed + from prompt_toolkit.contrib.repl import run_config def launch_ptipython(): imported_objects = get_launch_args(**options) @@ -167,7 +155,7 @@ def launch_ptipython(): embed( user_ns=imported_objects, history_filename=history_filename, - vi_mode=options['vi_mode'], + vi_mode=vi_mode, configure=run_config, ) @@ -226,12 +214,7 @@ def get_code(use_pythonrc, imported_objects): pythonrc_code = handle.read() # Match the behavior of the cpython shell where an error in # PYTHONSTARTUP prints an exception and continues. - try: - exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) - except Exception: - import traceback - - traceback.print_exc() + exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) def launch_code(): code.interact(local=imported_objects) @@ -239,7 +222,7 @@ def launch_code(): return launch_code -def launch(shell='best', use_pythonrc=False, **kwargs): +def launch(shell='best', use_pythonrc=False, use_vi_mode=False, **kwargs): # Also allowing passing shell='code' to force using code.interact imported_objects = get_launch_args(**kwargs) @@ -247,9 +230,9 @@ def launch(shell='best', use_pythonrc=False, **kwargs): shell = detect_best_shell() if shell == 'ptipython': - launch = get_ptipython(options=kwargs) + launch = get_ptipython(options=kwargs, vi_mode=use_vi_mode) elif shell == 'ptpython': - launch = get_ptpython(options=kwargs) + launch = get_ptpython(options=kwargs, vi_mode=use_vi_mode) elif shell == 'ipython': launch = get_ipython(options=kwargs) elif shell == 'bpython': From 4f96c8f8fd403e29cc25505c5a2ff5c9004cf890 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 08:51:05 -0600 Subject: [PATCH 0652/2998] Test detect_best_shell, shell detection --- tests/test_shell.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/test_shell.py diff --git a/tests/test_shell.py b/tests/test_shell.py new file mode 100644 index 0000000000..9c700b5039 --- /dev/null +++ b/tests/test_shell.py @@ -0,0 +1,14 @@ +from tmuxp import shell +from tmuxp._compat import string_types + + +def test_detect_best_shell(): + result = shell.detect_best_shell() + assert isinstance(result, string_types) + + +def test_shell_detect(): + assert isinstance(shell.has_bpython(), bool) + assert isinstance(shell.has_ipython(), bool) + assert isinstance(shell.has_ptpython(), bool) + assert isinstance(shell.has_ptipython(), bool) From e4c07da33ee4cc9607cd3e03180b035364bff598 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 09:18:36 -0600 Subject: [PATCH 0653/2998] docs(CHANGES): Update for #641 --- CHANGES | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGES b/CHANGES index 6ffa7e38e1..fbf320e294 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,28 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* +- :issue:`641` Improvements to ``shell`` + + Thanks `django-extensions`_ (licensed MIT) for the shell detection abstraction. + + - Deprecate ``shell_plus`` + - ``tmuxp shell`` now detects the best shell available by default + - Python 3.7+ with ``PYTHONBREAKPOINT`` set in env will drop into ``pdb`` by + default + - Drop into ``code.interact`` by default instead of ``pdb`` if no third + party shells found + - New options, override: + + - ``--pdb``: Use plain old ``breakpoint()`` (python 3.7+) or + ``pdb.set_trace`` + - ``--code``: Drop into ``code.interact``, accepts ``--use-pythonrc`` + - ``--bpython``: Drop into bpython + - ``--ipython``: Drop into ipython + - ``--ptpython``: Drop into ptpython, accepts ``--use-vi-mode`` + - ``--ptipython``: Drop into ipython + ptpython, accepts + ``--use-vi-mode`` + +.. _django-extensions: https://github.com/django-extensions/django-extensions tmuxp 1.6.0 (2020-11-06) ------------------------ From 822675978af1e6a9c33d422ba3c325d4c47d3f15 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 09:18:47 -0600 Subject: [PATCH 0654/2998] docs(cli): Update for new changes to rich shells --- docs/cli.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/cli.rst b/docs/cli.rst index 7a0dd8a9e1..59cb2cee60 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -101,6 +101,20 @@ this via ``tmuxp -c``: .. _ipdb: https://pypi.org/project/ipdb/ .. _libtmux: https://libtmux.git-pull.com +Shell detection +~~~~~~~~~~~~~~~ + +``tmuxp shell`` detects the richest shell available in your *site packages*, you can also pick your shell via args: + +- ``--pdb``: Use plain old ``breakpoint()`` (python 3.7+) or + ``pdb.set_trace`` +- ``--code``: Drop into ``code.interact``, accepts ``--use-pythonrc`` +- ``--bpython``: Drop into bpython +- ``--ipython``: Drop into ipython +- ``--ptpython``: Drop into ptpython, accepts ``--use-vi-mode`` +- ``--ptipython``: Drop into ipython + ptpython, accepts + ``--use-vi-mode`` + .. _cli_freeze: Freeze sessions From 888b2b391a76890ef1cf51b796e5411cdc2192c5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 09:22:04 -0600 Subject: [PATCH 0655/2998] Tag v1.6.1 --- CHANGES | 3 +++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index fbf320e294..be938951cb 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* + +tmuxp 1.6.1 (2020-11-07) +------------------------ - :issue:`641` Improvements to ``shell`` Thanks `django-extensions`_ (licensed MIT) for the shell detection abstraction. diff --git a/pyproject.toml b/pyproject.toml index f024273be8..1338e43e52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.0" +version = "1.6.1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 859816bd08..7fe395812e 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.0' +__version__ = '1.6.1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 8f24fd2ca8c7044ea568cd254ea03695c87219c1 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 25 Oct 2020 13:52:39 -0700 Subject: [PATCH 0656/2998] Adding debug-info command --- tmuxp/cli.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 6b1ac0cf5d..cb7053d88e 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -15,11 +15,19 @@ import kaptan from click.exceptions import FileError -from libtmux.common import has_gte_version, has_minimum_version, which +from libtmux.common import ( + has_gte_version, + has_minimum_version, + which, + get_version, + tmux_cmd, + which +) from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server +from libtmux import __version__ as libtmux_version -from . import config, exc, log, util +from . import config, exc, log, util, __file__ as tmuxp_path from .__about__ import __version__ from ._compat import PY3, PYMINOR, string_types from .workspacebuilder import WorkspaceBuilder, freeze @@ -1054,3 +1062,56 @@ def command_ls(): if os.path.isdir(f) or ext not in VALID_CONFIG_DIR_FILE_EXTENSIONS: continue print(stem) + + +@cli.command(name='debug-info', short_help='Print out all diagnostic info') +def command_debug_info(): + """ + """ + + def prepend_tab(strings): + """ + """ + return list(map( + lambda x: '\t%s' % x, + strings + )) + + def format_tmux_resp(std_resp): + """ + """ + return '\n'.join([ + *prepend_tab(std_resp.stdout), + click.style( + '\n'.join(prepend_tab(std_resp.stderr)), + fg='red' + ) + ]) + + output = [ + 'python version: %s' % ' '.join(sys.version.split('\n')), + 'system PATH: %s' % os.environ['PATH'], + 'tmux version: %s' % get_version(), + 'libtmux version: %s' % libtmux_version, + 'tmuxp version: %s' % __version__, + 'tmux path: %s' % which('tmux'), + 'tmuxp path: %s' % tmuxp_path, + 'shell: %s' % os.environ['SHELL'], + 'tmux sessions:\n%s' % format_tmux_resp( + tmux_cmd('list-sessions') + ), + 'tmux windows:\n%s' % format_tmux_resp( + tmux_cmd('list-windows') + ), + 'tmux panes:\n%s' % format_tmux_resp( + tmux_cmd('list-panes') + ), + 'tmux global options:\n%s' % format_tmux_resp( + tmux_cmd('show-options', '-g') + ), + 'tmux window options:\n%s' % format_tmux_resp( + tmux_cmd('show-window-options', '-g') + ) + ] + + click.echo('\n'.join(output)) From 324b537fe32e231e9475ed50eb27b601951fed48 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 25 Oct 2020 14:23:17 -0700 Subject: [PATCH 0657/2998] adding system info to debug-info and updating issues_template --- .github/issue_template.md | 19 +++---------------- tmuxp/cli.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index 5368bd0a61..ef99c9b8c0 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -2,23 +2,10 @@ * For general technical questions, problems or feature requests related to the code **in this repository** file an issue. ### Step 2: Provide tmuxp details - * Python version - * system PATH - * tmux version - * tmuxp version - * tmux path - * tmuxp path, - * libtmux version - * shell - * output of `tmux list-sessions`, `tmux list-windows`, `tmux list-panes` - * output of `tmux show-options -g`, `tmux show-window-options -g` - * output of `tmuxp freeze ` + * Include output of `tmuxp debug-info` + * Include any other pertinant system info not captured -### Step 3: Describe your environment - * Architecture: _____ - * OS version: _____ - -### Step 4: Describe the problem: +### Step 3: Describe the problem: #### Steps to reproduce: 1. _____ 2. _____ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index cb7053d88e..ce2a7a3fa5 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1067,18 +1067,27 @@ def command_ls(): @cli.command(name='debug-info', short_help='Print out all diagnostic info') def command_debug_info(): """ + Print debug info to submit with Issues. """ def prepend_tab(strings): """ + Prepend tab to strings in list. """ return list(map( lambda x: '\t%s' % x, strings )) + def generate_output_break(): + """ + Generate output break. + """ + return '-' * 25 + def format_tmux_resp(std_resp): """ + Format tmux command response for tmuxp stdout. """ return '\n'.join([ *prepend_tab(std_resp.stdout), @@ -1089,6 +1098,14 @@ def format_tmux_resp(std_resp): ]) output = [ + generate_output_break(), + 'environment:\n%s' % '\n'.join(prepend_tab([ + 'system: %s' % os.uname().sysname, + 'arch: %s' % os.uname().machine, + 'os: {0} {1}'.format(os.uname().nodename, os.uname().version), + 'kernel: %s' % os.uname().release, + ])), + generate_output_break(), 'python version: %s' % ' '.join(sys.version.split('\n')), 'system PATH: %s' % os.environ['PATH'], 'tmux version: %s' % get_version(), @@ -1097,6 +1114,7 @@ def format_tmux_resp(std_resp): 'tmux path: %s' % which('tmux'), 'tmuxp path: %s' % tmuxp_path, 'shell: %s' % os.environ['SHELL'], + generate_output_break(), 'tmux sessions:\n%s' % format_tmux_resp( tmux_cmd('list-sessions') ), From 926899c8d3638c324d0b16ff3a449eca32863b5d Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 25 Oct 2020 14:34:35 -0700 Subject: [PATCH 0658/2998] adding test for debug-info command --- tests/test_cli.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index 2741a30a2f..ca30bda96c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -16,6 +16,7 @@ from tmuxp import cli, config, exc from tmuxp.cli import ( command_ls, + command_debug_info, get_config_dir, is_pure_name, load_workspace, @@ -953,3 +954,22 @@ def test_ls_cli(monkeypatch, tmpdir): runner = CliRunner() cli_output = runner.invoke(command_ls).output assert cli_output == '\n'.join(stems) + '\n' + + +def test_debug_info_cli(): + runner = CliRunner() + cli_output = runner.invoke(command_debug_info).output + assert 'environment' in cli_output + assert 'python version' in cli_output + assert 'system PATH' in cli_output + assert 'tmux version' in cli_output + assert 'libtmux version' in cli_output + assert 'tmuxp version' in cli_output + assert 'tmux path' in cli_output + assert 'tmuxp path' in cli_output + assert 'shell' in cli_output + assert 'tmux session' in cli_output + assert 'tmux windows' in cli_output + assert 'tmux panes' in cli_output + assert 'tmux global options' in cli_output + assert 'tmux window options' in cli_output \ No newline at end of file From 4e64e502c1c3f139da784d8c6b000e581d6f8b54 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 11:24:27 -0700 Subject: [PATCH 0659/2998] working on the logfile addition --- tmuxp/cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index ce2a7a3fa5..249b3581fa 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -874,6 +874,7 @@ def command_freeze(session_name, socket_name, socket_path, force): flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) +@click.option('--log-file', 'log_file', help='File to log output to') def command_load( ctx, config, From 29349bb4dde2dba127e5783e247a7987a6700b10 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 31 Oct 2020 15:25:55 -0700 Subject: [PATCH 0660/2998] working on logging (saving work while switching branch) --- tmuxp/cli.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 249b3581fa..5bbf5869f2 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -856,7 +856,9 @@ def command_freeze(session_name, socket_name, socket_path, force): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') -@click.option('-s', 'new_session_name', help='start new session with new session name') +@click.option( + '-s', 'new_session_name', help='start new session with new session name' +) @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( '-d', 'detached', help='Load the session without attaching it', is_flag=True @@ -874,7 +876,9 @@ def command_freeze(session_name, socket_name, socket_path, force): flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) -@click.option('--log-file', 'log_file', help='File to log output to') +@click.option( + '--log-file', 'log_file', default=None, help='File to log output to' +) def command_load( ctx, config, @@ -884,6 +888,7 @@ def command_load( answer_yes, detached, colors, + log_file ): """Load a tmux workspace from each CONFIG. From 0650d14dff42b12ea79572c3e92425828cf2d74d Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 07:16:39 -0800 Subject: [PATCH 0661/2998] moving load --log-file feature to new branch --- tmuxp/cli.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 5bbf5869f2..71044496bd 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -876,9 +876,6 @@ def command_freeze(session_name, socket_name, socket_path, force): flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) -@click.option( - '--log-file', 'log_file', default=None, help='File to log output to' -) def command_load( ctx, config, @@ -887,8 +884,7 @@ def command_load( new_session_name, answer_yes, detached, - colors, - log_file + colors ): """Load a tmux workspace from each CONFIG. From 705f7d890a0effb49a43a53e5c9ebdec4d39d2eb Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 07:50:15 -0800 Subject: [PATCH 0662/2998] Updating debug-info docs --- docs/cli.rst | 16 ++++++++++++++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- tmuxp/cli.py | 8 ++++---- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index 59cb2cee60..5d9b3fc4be 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -184,6 +184,22 @@ are created, the last session is named from the terminal. $ tmxup load -s ... +.. _cli_debug_info: + +Debug Info +---------- + +Use to collect all relevant information for submitting an issue to the project. + +.. code-block:: bash + + $ tmuxp debug-info + -------------------------- + environment: + system: Linux + arch: x86_64 + ... + .. _cli_import: Import diff --git a/pyproject.toml b/pyproject.toml index 1338e43e52..303d32cc86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.1" +version = "1.7.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 7fe395812e..035d1fd44a 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.1' +__version__ = '1.7.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 71044496bd..b87d6a7e71 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1081,7 +1081,7 @@ def prepend_tab(strings): strings )) - def generate_output_break(): + def output_break(): """ Generate output break. """ @@ -1100,14 +1100,14 @@ def format_tmux_resp(std_resp): ]) output = [ - generate_output_break(), + output_break(), 'environment:\n%s' % '\n'.join(prepend_tab([ 'system: %s' % os.uname().sysname, 'arch: %s' % os.uname().machine, 'os: {0} {1}'.format(os.uname().nodename, os.uname().version), 'kernel: %s' % os.uname().release, ])), - generate_output_break(), + output_break(), 'python version: %s' % ' '.join(sys.version.split('\n')), 'system PATH: %s' % os.environ['PATH'], 'tmux version: %s' % get_version(), @@ -1116,7 +1116,7 @@ def format_tmux_resp(std_resp): 'tmux path: %s' % which('tmux'), 'tmuxp path: %s' % tmuxp_path, 'shell: %s' % os.environ['SHELL'], - generate_output_break(), + output_break(), 'tmux sessions:\n%s' % format_tmux_resp( tmux_cmd('list-sessions') ), From 9bb5e921bb59286134867bf655943d27f5697336 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 08:01:44 -0800 Subject: [PATCH 0663/2998] removed redundant which import --- tmuxp/cli.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index b87d6a7e71..d2aba24bf0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -20,8 +20,7 @@ has_minimum_version, which, get_version, - tmux_cmd, - which + tmux_cmd ) from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server From 31f7a729ab4fce38bcf2d0bee8ecec61e9d675ba Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 08:03:43 -0800 Subject: [PATCH 0664/2998] Updating CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index be938951cb..5529eb9d67 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Here you can find the recent changes to tmuxp current ------- +- :issue:`352` New command ``tmuxp debug-info`` for creating github issues - *Insert changes/features/fixes for next release here* tmuxp 1.6.1 (2020-11-07) From 22bd6982c0eed704b96a613bde48188a15e37934 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 08:05:45 -0800 Subject: [PATCH 0665/2998] running black over changes --- tests/test_cli.py | 2 +- tmuxp/cli.py | 70 ++++++++++++++++++++--------------------------- 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index ca30bda96c..1e3e0cc000 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -972,4 +972,4 @@ def test_debug_info_cli(): assert 'tmux windows' in cli_output assert 'tmux panes' in cli_output assert 'tmux global options' in cli_output - assert 'tmux window options' in cli_output \ No newline at end of file + assert 'tmux window options' in cli_output diff --git a/tmuxp/cli.py b/tmuxp/cli.py index d2aba24bf0..bd2df2235d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -16,11 +16,11 @@ from click.exceptions import FileError from libtmux.common import ( - has_gte_version, - has_minimum_version, - which, + has_gte_version, + has_minimum_version, + which, get_version, - tmux_cmd + tmux_cmd, ) from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server @@ -855,9 +855,7 @@ def command_freeze(session_name, socket_name, socket_path, force): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') -@click.option( - '-s', 'new_session_name', help='start new session with new session name' -) +@click.option('-s', 'new_session_name', help='start new session with new session name') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( '-d', 'detached', help='Load the session without attaching it', is_flag=True @@ -883,7 +881,7 @@ def command_load( new_session_name, answer_yes, detached, - colors + colors, ): """Load a tmux workspace from each CONFIG. @@ -1075,10 +1073,7 @@ def prepend_tab(strings): """ Prepend tab to strings in list. """ - return list(map( - lambda x: '\t%s' % x, - strings - )) + return list(map(lambda x: '\t%s' % x, strings)) def output_break(): """ @@ -1090,22 +1085,26 @@ def format_tmux_resp(std_resp): """ Format tmux command response for tmuxp stdout. """ - return '\n'.join([ - *prepend_tab(std_resp.stdout), - click.style( - '\n'.join(prepend_tab(std_resp.stderr)), - fg='red' - ) - ]) + return '\n'.join( + [ + *prepend_tab(std_resp.stdout), + click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), + ] + ) output = [ output_break(), - 'environment:\n%s' % '\n'.join(prepend_tab([ - 'system: %s' % os.uname().sysname, - 'arch: %s' % os.uname().machine, - 'os: {0} {1}'.format(os.uname().nodename, os.uname().version), - 'kernel: %s' % os.uname().release, - ])), + 'environment:\n%s' + % '\n'.join( + prepend_tab( + [ + 'system: %s' % os.uname().sysname, + 'arch: %s' % os.uname().machine, + 'os: {0} {1}'.format(os.uname().nodename, os.uname().version), + 'kernel: %s' % os.uname().release, + ] + ) + ), output_break(), 'python version: %s' % ' '.join(sys.version.split('\n')), 'system PATH: %s' % os.environ['PATH'], @@ -1116,21 +1115,12 @@ def format_tmux_resp(std_resp): 'tmuxp path: %s' % tmuxp_path, 'shell: %s' % os.environ['SHELL'], output_break(), - 'tmux sessions:\n%s' % format_tmux_resp( - tmux_cmd('list-sessions') - ), - 'tmux windows:\n%s' % format_tmux_resp( - tmux_cmd('list-windows') - ), - 'tmux panes:\n%s' % format_tmux_resp( - tmux_cmd('list-panes') - ), - 'tmux global options:\n%s' % format_tmux_resp( - tmux_cmd('show-options', '-g') - ), - 'tmux window options:\n%s' % format_tmux_resp( - tmux_cmd('show-window-options', '-g') - ) + 'tmux sessions:\n%s' % format_tmux_resp(tmux_cmd('list-sessions')), + 'tmux windows:\n%s' % format_tmux_resp(tmux_cmd('list-windows')), + 'tmux panes:\n%s' % format_tmux_resp(tmux_cmd('list-panes')), + 'tmux global options:\n%s' % format_tmux_resp(tmux_cmd('show-options', '-g')), + 'tmux window options:\n%s' + % format_tmux_resp(tmux_cmd('show-window-options', '-g')), ] click.echo('\n'.join(output)) From 019f5433f2d34ba1eac2322c8dc305d0a80a0f8a Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 08:14:06 -0800 Subject: [PATCH 0666/2998] Updating README with debug-info command --- README.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.rst b/README.rst index dc9f150d30..5ed311bb74 100644 --- a/README.rst +++ b/README.rst @@ -177,6 +177,21 @@ You can auto confirm the prompt. In this case no preview will be shown. $ tmuxp convert --yes filename +Debug Info +--------- + +Collect system info to submit with a Github issue + +.. code-block:: sh + + $ tmuxp debug-info + -------------------------- + environment: + system: Linux + arch: x86_64 + ... + + Docs / Reading material ----------------------- From fec95e4d97f221e0ab72bb19f1d3efac4ae71673 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 10:41:14 -0800 Subject: [PATCH 0667/2998] fixing python2 incompatible code --- tmuxp/cli.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index bd2df2235d..7d0ab249bb 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1085,12 +1085,10 @@ def format_tmux_resp(std_resp): """ Format tmux command response for tmuxp stdout. """ - return '\n'.join( - [ - *prepend_tab(std_resp.stdout), - click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), - ] - ) + return [ + '\n'.join(prepend_tab(std_resp.stdout)), + click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), + ] output = [ output_break(), From 1acb58c774a2bf0adcd86668b1bec8b474c8930b Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 11:13:36 -0800 Subject: [PATCH 0668/2998] updating the logic of debug-info output format --- tmuxp/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7d0ab249bb..a04fe5c633 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1085,10 +1085,10 @@ def format_tmux_resp(std_resp): """ Format tmux command response for tmuxp stdout. """ - return [ + return '\n'.join([ '\n'.join(prepend_tab(std_resp.stdout)), click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), - ] + ]) output = [ output_break(), From ce8d9cb6e5180dc33901d1b448339a5dfefaa8ed Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 30 Aug 2020 16:02:52 -0700 Subject: [PATCH 0669/2998] Adding the Plugin System. Initial commit containing logic for 4/5 of the desired plugin api methods --- tmuxp/cli.py | 44 +++++++++++++++++++++++++++++++++++---- tmuxp/config.py | 4 ++++ tmuxp/workspacebuilder.py | 13 +++++++++++- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 6b1ac0cf5d..4c49338fbc 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -7,6 +7,7 @@ """ from __future__ import absolute_import +import importlib import logging import os import sys @@ -192,6 +193,35 @@ def set_layout_hook(session, hook_name): session.cmd(*cmd) +def load_plugins(sconfig): + plugins = [] + if 'plugins' in sconfig: + for plugin in sconfig['plugins']: + try: + """ + click.echo( + click.style('[Loading] ', fg='green') + + click.style(f'Plugin: {plugin}', fg='blue', bold=True) + ) + """ + module_name = plugin.split('.') + module_name = '.'.join(module_name[:-1]) + plugin_name = plugin.split('.')[-1] + plugin = getattr(importlib.import_module(module_name), plugin_name) + plugins.append(plugin()) + except Exception as error: + click.echo( + click.wrap_text( + f'Error in loading {plugin}. Please make ' + f'sure {plugin} is installed.\n\n' + f'{error}' + ) + ) + + return plugins + + + def is_pure_name(path): """ Return True if path is a name and not a file path. @@ -276,7 +306,7 @@ def scan_config(config, config_dir=None): If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If one or more found, it will warn and pick the first. - +[Loading] If config is ".", "./" or None, it will scan current directory. If config is has no path and only a filename, e.g. "myconfig.yaml" it will @@ -372,7 +402,7 @@ def scan_config(config, config_dir=None): return config -def _reattach(session): +def _reattach(session, plugins): """ Reattach session (depending on env being inside tmux already or not) @@ -388,6 +418,10 @@ def _reattach(session): If not, ``tmux attach-session`` loads the client to the target session. """ + + for plugin in plugins: + plugin.reattach(session) + if 'TMUX' in os.environ: session.switch_client() @@ -513,8 +547,10 @@ def load_workspace( which('tmux') # raise exception if tmux not found + plugins = load_plugins(sconfig) + try: # load WorkspaceBuilder object for tmuxp config / tmux server - builder = WorkspaceBuilder(sconf=sconfig, server=t) + builder = WorkspaceBuilder(sconf=sconfig, server=t, plugins=plugins) except exc.EmptyConfigException: click.echo('%s is empty or parsed no config data' % config_file, err=True) return @@ -532,7 +568,7 @@ def load_workspace( default=True, ) ): - _reattach(builder.session) + _reattach(builder.session, plugins) return try: diff --git a/tmuxp/config.py b/tmuxp/config.py index bea1df0081..eee39ce45c 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -42,6 +42,10 @@ def validate_schema(sconf): if 'window_name' not in window: raise exc.ConfigError('config window is missing "window_name"') + if 'plugins' in sconf: + if not isinstance(sconf['plugins'], list): + raise exc.ConfigError('"plugins" only supports list type') + return True diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index d24164f5f9..79a00d2ef5 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -68,7 +68,7 @@ class WorkspaceBuilder(object): a session inside tmux (when `$TMUX` is in the env variables). """ - def __init__(self, sconf, server=None): + def __init__(self, sconf, server=None, plugins=None): """ Initialize workspace loading. @@ -98,6 +98,8 @@ def __init__(self, sconf, server=None): self.sconf = sconf + self.plugins = plugins if plugins is not None else [] + def session_exists(self, session_name=None): exists = self.server.has_session(session_name) if not exists: @@ -158,6 +160,9 @@ def build(self, session=None): assert session.id assert isinstance(session, Session) + + for plugin in self.plugins: + plugin.before_workspace_builder(session) focus = None @@ -183,6 +188,10 @@ def build(self, session=None): for option, value in self.sconf['environment'].items(): self.session.set_environment(option, value) + # Runs after before_script + for plugin in self.plugins: + plugin.before_script(session) + for w, wconf in self.iter_create_windows(session): assert isinstance(w, Window) @@ -200,6 +209,8 @@ def build(self, session=None): if 'focus' in wconf and wconf['focus']: focus = w + for plugin in self.plugins: + plugin.on_window_create(w) self.config_after_window(w, wconf) if focus_pane: From 5ddde64b43da2eb1e1ceb6b377597bfed576006e Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 30 Aug 2020 16:06:02 -0700 Subject: [PATCH 0670/2998] removing a rogue line --- tmuxp/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 4c49338fbc..37c3608a87 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -306,7 +306,6 @@ def scan_config(config, config_dir=None): If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If one or more found, it will warn and pick the first. -[Loading] If config is ".", "./" or None, it will scan current directory. If config is has no path and only a filename, e.g. "myconfig.yaml" it will From b8b77cf9c96819bb1532ae2e09eb757c2ef6b778 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 30 Aug 2020 16:15:24 -0700 Subject: [PATCH 0671/2998] ran black over the changes --- tmuxp/cli.py | 4 ++-- tmuxp/workspacebuilder.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 37c3608a87..e6cccb2f46 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -217,9 +217,8 @@ def load_plugins(sconfig): f'{error}' ) ) - - return plugins + return plugins def is_pure_name(path): @@ -306,6 +305,7 @@ def scan_config(config, config_dir=None): If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If one or more found, it will warn and pick the first. + If config is ".", "./" or None, it will scan current directory. If config is has no path and only a filename, e.g. "myconfig.yaml" it will diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 79a00d2ef5..3d02c7c33e 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -160,7 +160,7 @@ def build(self, session=None): assert session.id assert isinstance(session, Session) - + for plugin in self.plugins: plugin.before_workspace_builder(session) From a912b1ac90c4b6b6f41071ad9b12e07addf9735d Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 30 Aug 2020 16:36:25 -0700 Subject: [PATCH 0672/2998] added the logic for the method after re-reading Tony's issue statement with stubbed solution --- tmuxp/workspacebuilder.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 3d02c7c33e..6e4676188e 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -195,6 +195,9 @@ def build(self, session=None): for w, wconf in self.iter_create_windows(session): assert isinstance(w, Window) + for plugin in self.plugins: + plugin.on_window_create(w) + focus_pane = None for p, pconf in self.iter_create_panes(w, wconf): assert isinstance(p, Pane) @@ -209,10 +212,11 @@ def build(self, session=None): if 'focus' in wconf and wconf['focus']: focus = w - for plugin in self.plugins: - plugin.on_window_create(w) self.config_after_window(w, wconf) + for plugin in self.plugins: + plugin.after_window_finished(w) + if focus_pane: focus_pane.select_pane() From 03bf7e22c102bb87e8a58730fa7a852c4a8316cd Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Wed, 9 Sep 2020 20:49:14 -0700 Subject: [PATCH 0673/2998] Adding in test plugins. Got these plugins to programmitcally install with python for testing purposes. Started rudimentary config testing. Started working on the cli.load_plugins test. --- requirements/test.txt | 1 + .../fixtures/pluginsystem/install_plugins.py | 21 +++++++ .../plugins/tmuxp_plugin_one/setup.py | 10 ++++ .../tmuxp_plugin_one/__init__.py | 0 .../tmuxp_plugin_one/plugin.py | 19 +++++++ .../plugins/tmuxp_plugin_two/setup.py | 10 ++++ .../tmuxp_plugin_two/__init__.py | 0 .../tmuxp_plugin_two/plugin.py | 19 +++++++ .../workspacebuilder/plugins_one.yaml | 15 +++++ .../workspacebuilder/plugins_two.yaml | 16 ++++++ tests/test_cli.py | 17 +++++- tests/test_config.py | 20 +++++++ tmuxp/cli.py | 56 +++++++++---------- 13 files changed, 175 insertions(+), 29 deletions(-) create mode 100644 tests/fixtures/pluginsystem/install_plugins.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py create mode 100644 tests/fixtures/workspacebuilder/plugins_one.yaml create mode 100644 tests/fixtures/workspacebuilder/plugins_two.yaml diff --git a/requirements/test.txt b/requirements/test.txt index 87f12558c3..fa11258412 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -3,3 +3,4 @@ pytest-rerunfailures<9 pytest-cov coverage codecov +wheel diff --git a/tests/fixtures/pluginsystem/install_plugins.py b/tests/fixtures/pluginsystem/install_plugins.py new file mode 100644 index 0000000000..865ca43a3b --- /dev/null +++ b/tests/fixtures/pluginsystem/install_plugins.py @@ -0,0 +1,21 @@ +import subprocess +import sys + + +plugin_paths = [ + "plugins/tmuxp_plugin_one", + "plugins/tmuxp_plugin_two" +] + + +def install(package): + subprocess.check_call([sys.executable, "-m", "pip", "install", package]) + + +def install_plugins(): + for plugin in plugin_paths: + install(plugin) + + +if __name__ == "__main__": + install_plugins() diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py new file mode 100644 index 0000000000..b9c71baa0b --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py @@ -0,0 +1,10 @@ +from setuptools import setup + +setup( + name='tmuxp-plugin-one', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description='A tmuxp plugin to test the plugin system', +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py new file mode 100644 index 0000000000..7fd150419a --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py @@ -0,0 +1,19 @@ +class TestPluginOne: + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def before_workspace_builder(self, session): + pass + + def before_script(self, session): + pass + + def reattach(self, session): + pass + + def on_window_create(self, window): + if window.name == 'editor': + pass + + def after_window_finished(self, window): + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py new file mode 100644 index 0000000000..b0a5ec7e04 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py @@ -0,0 +1,10 @@ +from setuptools import setup + +setup( + name='tmuxp-plugin-two', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description='A tmuxp plugin to test the plugin system', +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py new file mode 100644 index 0000000000..1c049bcbd8 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py @@ -0,0 +1,19 @@ +class TestPluginTwo: + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def before_workspace_builder(self, session): + pass + + def before_script(self, session): + pass + + def reattach(self, session): + pass + + def on_window_create(self, window): + if window.name == 'editor': + pass + + def after_window_finished(self, window): + pass diff --git a/tests/fixtures/workspacebuilder/plugins_one.yaml b/tests/fixtures/workspacebuilder/plugins_one.yaml new file mode 100644 index 0000000000..3833e1ec46 --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugins_one.yaml @@ -0,0 +1,15 @@ +session_name: plugin-test +plugins: +- 'tmuxp_plugin_one.plugin.TestPluginOne' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log + - echo hello + - echo hello + - echo hello diff --git a/tests/fixtures/workspacebuilder/plugins_two.yaml b/tests/fixtures/workspacebuilder/plugins_two.yaml new file mode 100644 index 0000000000..4f341dfbba --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugins_two.yaml @@ -0,0 +1,16 @@ +session_name: plugin-test +plugins: +- 'tmuxp_plugin_one.plugin.TestPluginOne' +- 'tmuxp_plugin_two.plugin.TestPluginTwo' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log + - echo hello + - echo hello + - echo hello diff --git a/tests/test_cli.py b/tests/test_cli.py index 2741a30a2f..d1972f72e2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -20,10 +20,12 @@ is_pure_name, load_workspace, scan_config, + load_plugins, ) from .fixtures._util import curjoin, loadfixture - +from tmuxp_plugin_one.plugin import TestPluginOne +from tmuxp_plugin_two.plugin import TestPluginTwo def test_creates_config_dir_not_exists(tmpdir): """cli.startup() creates config dir if not exists.""" @@ -267,6 +269,19 @@ def check_cmd(config_arg): assert 'config not found in config dir' in check_cmd('moo') +def test_load_plugins(): + session_config = curjoin("workspacebuildter/plugins_two.yaml") + plugins = load_plugins(session_config) + assert len(plugins) == 2 + + test_plugin_class_types = [ + TestPluginOne().__class__, + TestPluginTwo().__class__ + ] + for plugin in plugins: + assert plugin.__class__ in test_plugin_class_types + + def test_load_workspace(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable diff --git a/tests/test_config.py b/tests/test_config.py index f8f027e25c..934c1907ec 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -383,3 +383,23 @@ def test_replaces_env_variables(monkeypatch): assert "%s/moo" % env_val == sconfig['global_options']['default-shell'] assert "%s/lol" % env_val == sconfig['options']['default-command'] assert "logging @ %s" % env_val == sconfig['windows'][1]['window_name'] + + +def test_plugins(): + yaml_config = """ + session_name: test session + plugins: tmuxp-plugin-one.plugin.TestPluginOne + windows: + - window_name: editor + panes: + shell_command: + - tail -F /var/log/syslog + start_directory: /var/log + """ + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + with pytest.raises(exc.ConfigError) as excinfo: + config.validate_schema(sconfig) + assert excinfo.matches('only supports list type') \ No newline at end of file diff --git a/tmuxp/cli.py b/tmuxp/cli.py index e6cccb2f46..4ea083343a 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -193,34 +193,6 @@ def set_layout_hook(session, hook_name): session.cmd(*cmd) -def load_plugins(sconfig): - plugins = [] - if 'plugins' in sconfig: - for plugin in sconfig['plugins']: - try: - """ - click.echo( - click.style('[Loading] ', fg='green') - + click.style(f'Plugin: {plugin}', fg='blue', bold=True) - ) - """ - module_name = plugin.split('.') - module_name = '.'.join(module_name[:-1]) - plugin_name = plugin.split('.')[-1] - plugin = getattr(importlib.import_module(module_name), plugin_name) - plugins.append(plugin()) - except Exception as error: - click.echo( - click.wrap_text( - f'Error in loading {plugin}. Please make ' - f'sure {plugin} is installed.\n\n' - f'{error}' - ) - ) - - return plugins - - def is_pure_name(path): """ Return True if path is a name and not a file path. @@ -401,6 +373,34 @@ def scan_config(config, config_dir=None): return config +def load_plugins(config): + plugins = [] + if 'plugins' in config: + for plugin in config['plugins']: + try: + """ + click.echo( + click.style('[Loading] ', fg='green') + + click.style(f'Plugin: {plugin}', fg='blue', bold=True) + ) + """ + module_name = plugin.split('.') + module_name = '.'.join(module_name[:-1]) + plugin_name = plugin.split('.')[-1] + plugin = getattr(importlib.import_module(module_name), plugin_name) + plugins.append(plugin()) + except Exception as error: + click.echo( + click.wrap_text( + f'Error in loading {plugin}. Please make ' \ + f'sure {plugin} is installed.\n\n' \ + f'{error}' \ + ) + ) + + return plugins + + def _reattach(session, plugins): """ Reattach session (depending on env being inside tmux already or not) From 53f672be28a1e8dc2f97e4e911067092c3bde2f6 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 12 Sep 2020 14:43:31 -0700 Subject: [PATCH 0674/2998] Redoing the plugin fixtures for testing --- .../fixtures/pluginsystem/install_plugins.py | 10 +++++++--- .../setup.py | 4 ++-- .../tmuxp_plugin_interface}/__init__.py | 0 .../tmuxp_plugin_interface}/plugin.py | 9 ++++----- .../tmuxp_plugin_one/plugin.py | 19 ------------------- .../plugins/tmuxp_test_plugin_awf/setup.py | 13 +++++++++++++ .../tmuxp_test_plugin_awf}/__init__.py | 0 .../tmuxp_test_plugin_awf/plugin.py | 8 ++++++++ .../plugins/tmuxp_test_plugin_bs/setup.py | 12 ++++++++++++ .../tmuxp_test_plugin_bs/__init__.py | 0 .../tmuxp_test_plugin_bs/plugin.py | 8 ++++++++ .../plugins/tmuxp_test_plugin_bwb/setup.py | 13 +++++++++++++ .../tmuxp_test_plugin_bwb/__init__.py | 0 .../tmuxp_test_plugin_bwb/plugin.py | 9 +++++++++ .../plugins/tmuxp_test_plugin_owc/setup.py | 12 ++++++++++++ .../tmuxp_test_plugin_owc/__init__.py | 0 .../tmuxp_test_plugin_owc/plugin.py | 9 +++++++++ .../setup.py | 6 ++++-- .../tmuxp_test_plugin_r/__init__.py | 0 .../tmuxp_test_plugin_r/plugin.py | 8 ++++++++ .../{plugins_two.yaml => plugin_awf.yaml} | 5 ++--- .../fixtures/workspacebuilder/plugin_bs.yaml | 15 +++++++++++++++ .../fixtures/workspacebuilder/plugin_bwb.yaml | 15 +++++++++++++++ .../fixtures/workspacebuilder/plugin_owc.yaml | 15 +++++++++++++++ .../{plugins_one.yaml => plugin_r.yaml} | 4 ++-- tests/test_cli.py | 10 ++++------ tests/test_workspacebuilder.py | 17 +++++++++++++++++ 27 files changed, 179 insertions(+), 42 deletions(-) rename tests/fixtures/pluginsystem/plugins/{tmuxp_plugin_one => tmuxp_plugin_interface}/setup.py (66%) rename tests/fixtures/pluginsystem/plugins/{tmuxp_plugin_one/tmuxp_plugin_one => tmuxp_plugin_interface/tmuxp_plugin_interface}/__init__.py (100%) rename tests/fixtures/pluginsystem/plugins/{tmuxp_plugin_two/tmuxp_plugin_two => tmuxp_plugin_interface/tmuxp_plugin_interface}/plugin.py (68%) delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py rename tests/fixtures/pluginsystem/plugins/{tmuxp_plugin_two/tmuxp_plugin_two => tmuxp_test_plugin_awf/tmuxp_test_plugin_awf}/__init__.py (100%) create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py rename tests/fixtures/pluginsystem/plugins/{tmuxp_plugin_two => tmuxp_test_plugin_r}/setup.py (57%) create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py rename tests/fixtures/workspacebuilder/{plugins_two.yaml => plugin_awf.yaml} (67%) create mode 100644 tests/fixtures/workspacebuilder/plugin_bs.yaml create mode 100644 tests/fixtures/workspacebuilder/plugin_bwb.yaml create mode 100644 tests/fixtures/workspacebuilder/plugin_owc.yaml rename tests/fixtures/workspacebuilder/{plugins_one.yaml => plugin_r.yaml} (74%) diff --git a/tests/fixtures/pluginsystem/install_plugins.py b/tests/fixtures/pluginsystem/install_plugins.py index 865ca43a3b..0b437b703b 100644 --- a/tests/fixtures/pluginsystem/install_plugins.py +++ b/tests/fixtures/pluginsystem/install_plugins.py @@ -3,14 +3,18 @@ plugin_paths = [ - "plugins/tmuxp_plugin_one", - "plugins/tmuxp_plugin_two" + "plugins/tmuxp_plugin_interface", + "plugins/tmuxp_test_plugin_bwb", + "plugins/tmuxp_test_plugin_bs", + "plugins/tmuxp_test_plugin_r", + "plugins/tmuxp_test_plugin_owc", + "plugins/tmuxp_test_plugin_awf", ] def install(package): subprocess.check_call([sys.executable, "-m", "pip", "install", package]) - + def install_plugins(): for plugin in plugin_paths: diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py similarity index 66% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py rename to tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py index b9c71baa0b..3291ffb6eb 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py @@ -1,10 +1,10 @@ from setuptools import setup setup( - name='tmuxp-plugin-one', + name='tmuxp_plugin_interface', version='0.0.1', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), - description='A tmuxp plugin to test the plugin system', + description='A tmuxp plugin class interface', ) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/__init__.py similarity index 100% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/__init__.py rename to tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/__init__.py diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/plugin.py similarity index 68% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py rename to tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/plugin.py index 1c049bcbd8..dc3176d49d 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/plugin.py @@ -1,6 +1,6 @@ -class TestPluginTwo: +class TmuxpPluginInterface: def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + pass def before_workspace_builder(self, session): pass @@ -12,8 +12,7 @@ def reattach(self, session): pass def on_window_create(self, window): - if window.name == 'editor': - pass + pass def after_window_finished(self, window): - pass + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py deleted file mode 100644 index 7fd150419a..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_one/tmuxp_plugin_one/plugin.py +++ /dev/null @@ -1,19 +0,0 @@ -class TestPluginOne: - def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' - - def before_workspace_builder(self, session): - pass - - def before_script(self, session): - pass - - def reattach(self, session): - pass - - def on_window_create(self, window): - if window.name == 'editor': - pass - - def after_window_finished(self, window): - pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py new file mode 100644 index 0000000000..1fa1f0cb03 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py @@ -0,0 +1,13 @@ +from setuptools import setup + +setup( + name='tmuxp_test_plugin_awf', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description=( + 'A tmuxp plugin to test the after_window_finished part of the ' + 'plugin system' + ), +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/__init__.py similarity index 100% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/tmuxp_plugin_two/__init__.py rename to tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/__init__.py diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py new file mode 100644 index 0000000000..b6351f5a79 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -0,0 +1,8 @@ +from tmuxp_plugin_interface.plugin import TmuxpPluginInterface + +class PluginAfterWindowFinished(TmuxpPluginInterface): + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def after_window_finished(self, window): + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py new file mode 100644 index 0000000000..2770f72715 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py @@ -0,0 +1,12 @@ +from setuptools import setup + +setup( + name='tmuxp_test_plugin_bs', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description=( + 'A tmuxp plugin to test the before_script part of the plugin system' + ), +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py new file mode 100644 index 0000000000..26749eb073 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -0,0 +1,8 @@ +from tmuxp_plugin_interface.plugin import TmuxpPluginInterface + +class PluginBeforeScript(TmuxpPluginInterface): + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def before_script(self, session): + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py new file mode 100644 index 0000000000..7886ce9f9c --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py @@ -0,0 +1,13 @@ +from setuptools import setup + +setup( + name='tmuxp_test_plugin_bwb', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description=( + 'A tmuxp plugin to test the before_workspace_builder part of the ' + 'plugin system' + ), +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py new file mode 100644 index 0000000000..0ee490ad76 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py @@ -0,0 +1,9 @@ +from tmuxp_plugin_interface.plugin import TmuxpPluginInterface + +class PluginBeforeWorkspaceBuilder(TmuxpPluginInterface): + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def before_workspace_builder(self, session): + session.rename_session('plugin_test_bwb') + diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py new file mode 100644 index 0000000000..bbaf32962b --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py @@ -0,0 +1,12 @@ +from setuptools import setup + +setup( + name='tmuxp_test_plugin_owc', + version='0.0.1', + author='Joseph Flinn', + author_email='joseph.s.flinn@gmail.com', + packages=setuptools.find_packages(), + description=( + 'A tmuxp plugin to test the on_window_create part of the plugin system' + ), +) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py new file mode 100644 index 0000000000..34c78b615e --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -0,0 +1,9 @@ +from tmuxp_plugin_interface.plugin import TmuxpPluginInterface + +class PluginOnWindowCreate(TmuxpPluginInterface): + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def on_window_create(self, window): + if window.name == 'editor': + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py similarity index 57% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py rename to tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py index b0a5ec7e04..95d1a9c175 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_two/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py @@ -1,10 +1,12 @@ from setuptools import setup setup( - name='tmuxp-plugin-two', + name='tmuxp_test_plugin_r', version='0.0.1', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), - description='A tmuxp plugin to test the plugin system', + description=( + 'A tmuxp plugin to test the reattach part of the plugin system' + ), ) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py new file mode 100644 index 0000000000..36064065cd --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -0,0 +1,8 @@ +from tmuxp_plugin_interface.plugin import TmuxpPluginInterface + +class PluginReattach(TmuxpPluginInterface): + def __init__(self): + self.message = f'[+] This is the Tmuxp Test Plugin' + + def reattach(self, session): + pass diff --git a/tests/fixtures/workspacebuilder/plugins_two.yaml b/tests/fixtures/workspacebuilder/plugin_awf.yaml similarity index 67% rename from tests/fixtures/workspacebuilder/plugins_two.yaml rename to tests/fixtures/workspacebuilder/plugin_awf.yaml index 4f341dfbba..c8da105387 100644 --- a/tests/fixtures/workspacebuilder/plugins_two.yaml +++ b/tests/fixtures/workspacebuilder/plugin_awf.yaml @@ -1,7 +1,6 @@ -session_name: plugin-test +session_name: plugin-test-awf plugins: -- 'tmuxp_plugin_one.plugin.TestPluginOne' -- 'tmuxp_plugin_two.plugin.TestPluginTwo' +- 'tmuxp_test_plugin_awf.plugin.TestPluginAfterWindowFinished' windows: - window_name: editor layout: tiled diff --git a/tests/fixtures/workspacebuilder/plugin_bs.yaml b/tests/fixtures/workspacebuilder/plugin_bs.yaml new file mode 100644 index 0000000000..abea993dac --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_bs.yaml @@ -0,0 +1,15 @@ +session_name: plugin-test-bs +plugins: +- 'tmuxp_test_plugin_bs.plugin.TestPluginBeforeScript' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log + - echo hello + - echo hello + - echo hello diff --git a/tests/fixtures/workspacebuilder/plugin_bwb.yaml b/tests/fixtures/workspacebuilder/plugin_bwb.yaml new file mode 100644 index 0000000000..c2804a0dd6 --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_bwb.yaml @@ -0,0 +1,15 @@ +session_name: plugin-test-bwb +plugins: +- 'tmuxp_test_plugin_bwb.plugin.TestPluginBeforeWorkspaceBuild' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log + - echo hello + - echo hello + - echo hello diff --git a/tests/fixtures/workspacebuilder/plugin_owc.yaml b/tests/fixtures/workspacebuilder/plugin_owc.yaml new file mode 100644 index 0000000000..820657d493 --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_owc.yaml @@ -0,0 +1,15 @@ +session_name: plugin-test-owc +plugins: +- 'tmuxp_test_plugin_owc.plugin.TestPluginOnWindowCreate' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log + - echo hello + - echo hello + - echo hello diff --git a/tests/fixtures/workspacebuilder/plugins_one.yaml b/tests/fixtures/workspacebuilder/plugin_r.yaml similarity index 74% rename from tests/fixtures/workspacebuilder/plugins_one.yaml rename to tests/fixtures/workspacebuilder/plugin_r.yaml index 3833e1ec46..34dcaa7253 100644 --- a/tests/fixtures/workspacebuilder/plugins_one.yaml +++ b/tests/fixtures/workspacebuilder/plugin_r.yaml @@ -1,6 +1,6 @@ -session_name: plugin-test +session_name: plugin-test-r plugins: -- 'tmuxp_plugin_one.plugin.TestPluginOne' +- 'tmuxp_test_plugin_r.plugin.TestPluginReattach' windows: - window_name: editor layout: tiled diff --git a/tests/test_cli.py b/tests/test_cli.py index d1972f72e2..9ffe55168a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -24,8 +24,7 @@ ) from .fixtures._util import curjoin, loadfixture -from tmuxp_plugin_one.plugin import TestPluginOne -from tmuxp_plugin_two.plugin import TestPluginTwo +from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder def test_creates_config_dir_not_exists(tmpdir): """cli.startup() creates config dir if not exists.""" @@ -270,13 +269,12 @@ def check_cmd(config_arg): def test_load_plugins(): - session_config = curjoin("workspacebuildter/plugins_two.yaml") + session_config = curjoin("workspacebuildter/plugin_bwb.yaml") plugins = load_plugins(session_config) - assert len(plugins) == 2 + assert len(plugins) == 1 test_plugin_class_types = [ - TestPluginOne().__class__, - TestPluginTwo().__class__ + PluginBeforeWorkspaceBuilder().__class__, ] for plugin in plugins: assert plugin.__class__ in test_plugin_class_types diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 4aab73dafe..e71e0597b5 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -673,3 +673,20 @@ def test_before_load_true_if_test_passes_with_args(server): with temp_session(server) as session: builder.build(session=session) + + +def test_plugin_system_before_workspace_builder(session): + config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session) + assert session.cmd('display-message', '-p', "'#S'") == 'plugin_test_bwb' + + + From 0ef8e16e3ebedc014cfdf50de2b78b161601c960 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 12 Sep 2020 19:15:27 -0700 Subject: [PATCH 0675/2998] finished invididual plugin method testing. Moved the plugin loading into the workspacebuilder and changed the reattach to take in a builder object instead of a session so that it can access those plugins. --- .../tmuxp_test_plugin_awf/plugin.py | 3 +- .../tmuxp_test_plugin_bs/plugin.py | 3 +- .../tmuxp_test_plugin_owc/plugin.py | 2 +- .../tmuxp_test_plugin_r/plugin.py | 2 +- .../fixtures/workspacebuilder/plugin_awf.yaml | 2 +- .../fixtures/workspacebuilder/plugin_bs.yaml | 2 +- .../fixtures/workspacebuilder/plugin_bwb.yaml | 2 +- .../fixtures/workspacebuilder/plugin_owc.yaml | 2 +- tests/fixtures/workspacebuilder/plugin_r.yaml | 2 +- tests/test_cli.py | 41 ++++++---- tests/test_workspacebuilder.py | 74 ++++++++++++++++++- tmuxp/cli.py | 57 ++++---------- tmuxp/workspacebuilder.py | 31 +++++++- 13 files changed, 150 insertions(+), 73 deletions(-) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index b6351f5a79..e318fc566e 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -5,4 +5,5 @@ def __init__(self): self.message = f'[+] This is the Tmuxp Test Plugin' def after_window_finished(self, window): - pass \ No newline at end of file + if window.name == 'editor': + window.rename_window('plugin_test_awf') \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index 26749eb073..a22b1ac0b0 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -5,4 +5,5 @@ def __init__(self): self.message = f'[+] This is the Tmuxp Test Plugin' def before_script(self, session): - pass \ No newline at end of file + print('Changing session_name to plugin_test_bs') + session.rename_session('plugin_test_bs') \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index 34c78b615e..b7c8d52815 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -6,4 +6,4 @@ def __init__(self): def on_window_create(self, window): if window.name == 'editor': - pass \ No newline at end of file + window.rename_window('plugin_test_owc') \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py index 36064065cd..52192b5cdd 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -5,4 +5,4 @@ def __init__(self): self.message = f'[+] This is the Tmuxp Test Plugin' def reattach(self, session): - pass + session.rename_session('plugin_test_r') diff --git a/tests/fixtures/workspacebuilder/plugin_awf.yaml b/tests/fixtures/workspacebuilder/plugin_awf.yaml index c8da105387..5111833e14 100644 --- a/tests/fixtures/workspacebuilder/plugin_awf.yaml +++ b/tests/fixtures/workspacebuilder/plugin_awf.yaml @@ -1,6 +1,6 @@ session_name: plugin-test-awf plugins: -- 'tmuxp_test_plugin_awf.plugin.TestPluginAfterWindowFinished' +- 'tmuxp_test_plugin_awf.plugin.PluginAfterWindowFinished' windows: - window_name: editor layout: tiled diff --git a/tests/fixtures/workspacebuilder/plugin_bs.yaml b/tests/fixtures/workspacebuilder/plugin_bs.yaml index abea993dac..a04d6eb3f3 100644 --- a/tests/fixtures/workspacebuilder/plugin_bs.yaml +++ b/tests/fixtures/workspacebuilder/plugin_bs.yaml @@ -1,6 +1,6 @@ session_name: plugin-test-bs plugins: -- 'tmuxp_test_plugin_bs.plugin.TestPluginBeforeScript' +- 'tmuxp_test_plugin_bs.plugin.PluginBeforeScript' windows: - window_name: editor layout: tiled diff --git a/tests/fixtures/workspacebuilder/plugin_bwb.yaml b/tests/fixtures/workspacebuilder/plugin_bwb.yaml index c2804a0dd6..8241f27946 100644 --- a/tests/fixtures/workspacebuilder/plugin_bwb.yaml +++ b/tests/fixtures/workspacebuilder/plugin_bwb.yaml @@ -1,6 +1,6 @@ session_name: plugin-test-bwb plugins: -- 'tmuxp_test_plugin_bwb.plugin.TestPluginBeforeWorkspaceBuild' +- 'tmuxp_test_plugin_bwb.plugin.PluginBeforeWorkspaceBuilder' windows: - window_name: editor layout: tiled diff --git a/tests/fixtures/workspacebuilder/plugin_owc.yaml b/tests/fixtures/workspacebuilder/plugin_owc.yaml index 820657d493..abc81d9192 100644 --- a/tests/fixtures/workspacebuilder/plugin_owc.yaml +++ b/tests/fixtures/workspacebuilder/plugin_owc.yaml @@ -1,6 +1,6 @@ session_name: plugin-test-owc plugins: -- 'tmuxp_test_plugin_owc.plugin.TestPluginOnWindowCreate' +- 'tmuxp_test_plugin_owc.plugin.PluginOnWindowCreate' windows: - window_name: editor layout: tiled diff --git a/tests/fixtures/workspacebuilder/plugin_r.yaml b/tests/fixtures/workspacebuilder/plugin_r.yaml index 34dcaa7253..b220aab6b8 100644 --- a/tests/fixtures/workspacebuilder/plugin_r.yaml +++ b/tests/fixtures/workspacebuilder/plugin_r.yaml @@ -1,6 +1,6 @@ session_name: plugin-test-r plugins: -- 'tmuxp_test_plugin_r.plugin.TestPluginReattach' +- 'tmuxp_test_plugin_r.plugin.PluginReattach' windows: - window_name: editor layout: tiled diff --git a/tests/test_cli.py b/tests/test_cli.py index 9ffe55168a..559680cf53 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,6 +7,8 @@ import pytest +import kaptan + import click from click.testing import CliRunner @@ -20,11 +22,12 @@ is_pure_name, load_workspace, scan_config, - load_plugins, + _reattach ) +from tmuxp.workspacebuilder import WorkspaceBuilder from .fixtures._util import curjoin, loadfixture -from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder + def test_creates_config_dir_not_exists(tmpdir): """cli.startup() creates config dir if not exists.""" @@ -268,18 +271,6 @@ def check_cmd(config_arg): assert 'config not found in config dir' in check_cmd('moo') -def test_load_plugins(): - session_config = curjoin("workspacebuildter/plugin_bwb.yaml") - plugins = load_plugins(session_config) - assert len(plugins) == 1 - - test_plugin_class_types = [ - PluginBeforeWorkspaceBuilder().__class__, - ] - for plugin in plugins: - assert plugin.__class__ in test_plugin_class_types - - def test_load_workspace(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable @@ -966,3 +957,25 @@ def test_ls_cli(monkeypatch, tmpdir): runner = CliRunner() cli_output = runner.invoke(command_ls).output assert cli_output == '\n'.join(stems) + '\n' + + +def test_reattach_plugins(server): + config_plugins = loadfixture("workspacebuilder/plugin_r.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + # open it detached + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + try: + _reattach(builder) + except libtmux.exc.LibTmuxException as error: + pass + + + proc = builder.session.cmd('display-message', '-p', "'#S'") + + assert proc.stdout[0] == "'plugin_test_r'" \ No newline at end of file diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e71e0597b5..bbf2c2cbd1 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -18,6 +18,7 @@ from . import example_dir, fixtures_dir from .fixtures._util import loadfixture +from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder def test_split_windows(session): @@ -675,6 +676,24 @@ def test_before_load_true_if_test_passes_with_args(server): builder.build(session=session) +def test_load_plugins(): + plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(plugins_config).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + + assert len(builder.plugins) == 1 + + test_plugin_class_types = [ + PluginBeforeWorkspaceBuilder().__class__, + ] + for plugin in builder.plugins: + assert plugin.__class__ in test_plugin_class_types + + def test_plugin_system_before_workspace_builder(session): config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") @@ -685,8 +704,59 @@ def test_plugin_system_before_workspace_builder(session): builder = WorkspaceBuilder(sconf=sconfig) assert len(builder.plugins) > 0 - builder.build(session) - assert session.cmd('display-message', '-p', "'#S'") == 'plugin_test_bwb' + builder.build(session=session) + + proc = session.cmd('display-message', '-p', "'#S'") + + assert proc.stdout[0] == "'plugin_test_bwb'" + + +def test_plugin_system_before_script(session): + config_plugins = loadfixture("workspacebuilder/plugin_bs.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + proc = session.cmd('display-message', '-p', "'#S'") + + assert proc.stdout[0] == "'plugin_test_bs'" +def test_plugin_system_on_window_create(session): + config_plugins = loadfixture("workspacebuilder/plugin_owc.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + + proc = session.cmd('display-message', '-p', "'#W'") + + assert proc.stdout[0] == "'plugin_test_owc'" + + +def test_plugin_system_after_window_finished(session): + config_plugins = loadfixture("workspacebuilder/plugin_awf.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + + proc = session.cmd('display-message', '-p', "'#W'") + + assert proc.stdout[0] == "'plugin_test_awf'" \ No newline at end of file diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 4ea083343a..3bbf402443 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -7,7 +7,6 @@ """ from __future__ import absolute_import -import importlib import logging import os import sys @@ -373,41 +372,13 @@ def scan_config(config, config_dir=None): return config -def load_plugins(config): - plugins = [] - if 'plugins' in config: - for plugin in config['plugins']: - try: - """ - click.echo( - click.style('[Loading] ', fg='green') - + click.style(f'Plugin: {plugin}', fg='blue', bold=True) - ) - """ - module_name = plugin.split('.') - module_name = '.'.join(module_name[:-1]) - plugin_name = plugin.split('.')[-1] - plugin = getattr(importlib.import_module(module_name), plugin_name) - plugins.append(plugin()) - except Exception as error: - click.echo( - click.wrap_text( - f'Error in loading {plugin}. Please make ' \ - f'sure {plugin} is installed.\n\n' \ - f'{error}' \ - ) - ) - - return plugins - - -def _reattach(session, plugins): +def _reattach(builder): """ Reattach session (depending on env being inside tmux already or not) Parameters ---------- - session : :class:`libtmux.Session` + builder: :class:`workspacebuilder.WorkspaceBuilder` Notes ----- @@ -418,14 +389,17 @@ def _reattach(session, plugins): If not, ``tmux attach-session`` loads the client to the target session. """ - for plugin in plugins: - plugin.reattach(session) + for plugin in builder.plugins: + plugin.reattach(builder.session) + proc = builder.session.cmd('display-message', '-p', "'#S'") + for line in proc.stdout: + print(line) if 'TMUX' in os.environ: - session.switch_client() + builder.session.switch_client() else: - session.attach_session() + builder.session.attach_session() def load_workspace( @@ -546,10 +520,8 @@ def load_workspace( which('tmux') # raise exception if tmux not found - plugins = load_plugins(sconfig) - try: # load WorkspaceBuilder object for tmuxp config / tmux server - builder = WorkspaceBuilder(sconf=sconfig, server=t, plugins=plugins) + builder = WorkspaceBuilder(sconf=sconfig, server=t) except exc.EmptyConfigException: click.echo('%s is empty or parsed no config data' % config_file, err=True) return @@ -564,10 +536,10 @@ def load_workspace( or click.confirm( '%s is already running. Attach?' % click.style(session_name, fg='green'), - default=True, + eefault=True, ) ): - _reattach(builder.session, plugins) + _reattach(builder) return try: @@ -625,10 +597,7 @@ def load_workspace( builder.session.kill_session() click.echo('Session killed.') elif choice == 'a': - if 'TMUX' in os.environ: - builder.session.switch_client() - else: - builder.session.attach_session() + _reattach(builder) else: sys.exit() diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 6e4676188e..8278e6ac56 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -9,6 +9,7 @@ from __future__ import absolute_import, unicode_literals import logging +import importlib from libtmux.exc import TmuxSessionExists from libtmux.pane import Pane @@ -68,7 +69,7 @@ class WorkspaceBuilder(object): a session inside tmux (when `$TMUX` is in the env variables). """ - def __init__(self, sconf, server=None, plugins=None): + def __init__(self, sconf, server=None): """ Initialize workspace loading. @@ -98,7 +99,7 @@ def __init__(self, sconf, server=None, plugins=None): self.sconf = sconf - self.plugins = plugins if plugins is not None else [] + self.plugins = self.load_plugins() def session_exists(self, session_name=None): exists = self.server.has_session(session_name) @@ -108,6 +109,27 @@ def session_exists(self, session_name=None): self.session = self.server.find_where({'session_name': session_name}) return True + def load_plugins(self): + plugins = [] + if 'plugins' in self.sconf: + for plugin in self.sconf['plugins']: + try: + module_name = plugin.split('.') + module_name = '.'.join(module_name[:-1]) + plugin_name = plugin.split('.')[-1] + plugin = getattr( + importlib.import_module(module_name), + plugin_name + ) + plugins.append(plugin()) + except Exception as error: + raise exc.TmuxpException( + 'Error in loading {0}. Please make sure {0} is ' + + 'installed.\n\n{1}'.format(plugin, error) + ) + + return plugins + def build(self, session=None): """ Build tmux workspace in session. @@ -162,7 +184,7 @@ def build(self, session=None): assert isinstance(session, Session) for plugin in self.plugins: - plugin.before_workspace_builder(session) + plugin.before_workspace_builder(self.session) focus = None @@ -190,7 +212,8 @@ def build(self, session=None): # Runs after before_script for plugin in self.plugins: - plugin.before_script(session) + print('workspacebuilder - plugin.before_script') + plugin.before_script(self.session) for w, wconf in self.iter_create_windows(session): assert isinstance(w, Window) From 28f792770dc13421232bea15a717d7b3035c69ae Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 13 Sep 2020 09:13:52 -0700 Subject: [PATCH 0676/2998] finished the tests --- .../tmuxp_test_plugin_awf/plugin.py | 10 ++- .../tmuxp_test_plugin_bs/plugin.py | 1 - .../tmuxp_test_plugin_owc/plugin.py | 12 +++- .../plugin_awf_multiple_windows.yaml | 18 ++++++ .../plugin_multiple_plugins.yaml | 15 +++++ .../plugin_owc_multiple_windows.yaml | 17 ++++++ tests/test_cli.py | 1 - tests/test_workspacebuilder.py | 61 +++++++++++++++++-- tmuxp/workspacebuilder.py | 1 - 9 files changed, 127 insertions(+), 9 deletions(-) create mode 100644 tests/fixtures/workspacebuilder/plugin_awf_multiple_windows.yaml create mode 100644 tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml create mode 100644 tests/fixtures/workspacebuilder/plugin_owc_multiple_windows.yaml diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index e318fc566e..25dea9cc14 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -6,4 +6,12 @@ def __init__(self): def after_window_finished(self, window): if window.name == 'editor': - window.rename_window('plugin_test_awf') \ No newline at end of file + window.rename_window('plugin_test_awf') + elif window.name == 'awf_mw_test': + window.rename_window('plugin_test_awf_mw') + elif window.name == 'awf_mw_test_2': + window.rename_window('plugin_test_awf_mw_2') + elif window.name == 'mp_test_owc': + window.rename_window('mp_test_awf') + else: + pass \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index a22b1ac0b0..ca22c3d951 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -5,5 +5,4 @@ def __init__(self): self.message = f'[+] This is the Tmuxp Test Plugin' def before_script(self, session): - print('Changing session_name to plugin_test_bs') session.rename_session('plugin_test_bs') \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index b7c8d52815..92420c69ac 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -6,4 +6,14 @@ def __init__(self): def on_window_create(self, window): if window.name == 'editor': - window.rename_window('plugin_test_owc') \ No newline at end of file + window.rename_window('plugin_test_owc') + elif window.name == 'owc_mw_test': + window.rename_window('plugin_test_owc_mw') + elif window.name == 'owc_mw_test_2': + window.rename_window('plugin_test_owc_mw_2') + elif window.name == 'mp_test': + window.rename_window('mp_test_owc') + else: + pass + + \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_awf_multiple_windows.yaml b/tests/fixtures/workspacebuilder/plugin_awf_multiple_windows.yaml new file mode 100644 index 0000000000..994c2a7c4d --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_awf_multiple_windows.yaml @@ -0,0 +1,18 @@ +session_name: plugin-test-awf-mw +plugins: +- 'tmuxp_test_plugin_awf.plugin.PluginAfterWindowFinished' +windows: +- window_name: awf_mw_test + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log +- window_name: awf_mw_test_2 + layout: tiled + shell_command_before: + - cd ~/ + panes: + - echo hello \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml b/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml new file mode 100644 index 0000000000..edb702ac76 --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml @@ -0,0 +1,15 @@ +session_name: plugin-test-multiple-plugins +plugins: +- 'tmuxp_test_plugin_bwb.plugin.PluginBeforeWorkspaceBuilder' +- 'tmuxp_test_plugin_bs.plugin.PluginBeforeScript' +- 'tmuxp_test_plugin_owc.plugin.PluginOnWindowCreate' +- 'tmuxp_test_plugin_awf.plugin.PluginAfterWindowFinished' +windows: +- window_name: mp_test + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_owc_multiple_windows.yaml b/tests/fixtures/workspacebuilder/plugin_owc_multiple_windows.yaml new file mode 100644 index 0000000000..c7d437e584 --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_owc_multiple_windows.yaml @@ -0,0 +1,17 @@ +session_name: plugin-test-owc-mw +plugins: +- 'tmuxp_test_plugin_owc.plugin.PluginOnWindowCreate' +windows: +- window_name: owc_mw_test + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep \.log +- window_name: owc_mw_test_2 + layout: tiled + shell_command_before: + - cd ~/ + panes: + - echo hello \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index 559680cf53..b0fe90a834 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -975,7 +975,6 @@ def test_reattach_plugins(server): except libtmux.exc.LibTmuxException as error: pass - proc = builder.session.cmd('display-message', '-p', "'#S'") assert proc.stdout[0] == "'plugin_test_r'" \ No newline at end of file diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index bbf2c2cbd1..d50baeef8d 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -707,7 +707,6 @@ def test_plugin_system_before_workspace_builder(session): builder.build(session=session) proc = session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_bwb'" @@ -724,7 +723,6 @@ def test_plugin_system_before_script(session): builder.build(session=session) proc = session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_bs'" @@ -741,7 +739,6 @@ def test_plugin_system_on_window_create(session): builder.build(session=session) proc = session.cmd('display-message', '-p', "'#W'") - assert proc.stdout[0] == "'plugin_test_owc'" @@ -758,5 +755,61 @@ def test_plugin_system_after_window_finished(session): builder.build(session=session) proc = session.cmd('display-message', '-p', "'#W'") + assert proc.stdout[0] == "'plugin_test_awf'" + + +def test_plugin_system_on_window_create_multiple_windows(session): + config_plugins = loadfixture("workspacebuilder/plugin_owc_multiple_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + + proc = session.cmd('list-windows', '-F', "'#W'") + assert "'plugin_test_owc_mw'" in proc.stdout + assert "'plugin_test_owc_mw_2'" in proc.stdout - assert proc.stdout[0] == "'plugin_test_awf'" \ No newline at end of file + +def test_plugin_system_after_window_finished_multiple_windows(session): + config_plugins = loadfixture("workspacebuilder/plugin_awf_multiple_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + + proc = session.cmd('list-windows', '-F', "'#W'") + assert "'plugin_test_awf_mw'" in proc.stdout + assert "'plugin_test_awf_mw_2'" in proc.stdout + + +def test_plugin_system_multiple_plugins(session): + config_plugins = loadfixture("workspacebuilder/plugin_multiple_plugins.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(config_plugins).get() + sconfig = config.expand(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + assert len(builder.plugins) > 0 + + builder.build(session=session) + + # Drop through to the before_script plugin hook + proc = session.cmd('display-message', '-p', "'#S'") + assert proc.stdout[0] == "'plugin_test_bs'" + + # Drop through to the after_window_finished. This won't succeed + # unless on_window_create succeeds because of how the test plugin + # override methods are currently written + proc = session.cmd('display-message', '-p', "'#W'") + assert proc.stdout[0] == "'mp_test_awf'" \ No newline at end of file diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 8278e6ac56..c64e756098 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -212,7 +212,6 @@ def build(self, session=None): # Runs after before_script for plugin in self.plugins: - print('workspacebuilder - plugin.before_script') plugin.before_script(self.session) for w, wconf in self.iter_create_windows(session): From c990e9bb05310115d93948f4ba7a2881288f170f Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 13 Sep 2020 09:49:47 -0700 Subject: [PATCH 0677/2998] moved the plugin interface into the tmuxp package instead of its own separate package --- requirements/test.txt | 1 - tests/fixtures/pluginsystem/install_plugins.py | 1 - .../plugins/tmuxp_plugin_interface/setup.py | 10 ---------- .../tmuxp_plugin_interface/__init__.py | 0 .../plugins/tmuxp_test_plugin_awf/setup.py | 2 +- .../tmuxp_test_plugin_awf/plugin.py | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py | 2 +- .../tmuxp_test_plugin_bs/plugin.py | 2 +- .../plugins/tmuxp_test_plugin_bwb/setup.py | 2 +- .../tmuxp_test_plugin_bwb/plugin.py | 2 +- .../plugins/tmuxp_test_plugin_owc/setup.py | 2 +- .../tmuxp_test_plugin_owc/plugin.py | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_r/setup.py | 2 +- .../tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py | 2 +- .../tmuxp_plugin_interface => tmuxp}/plugin.py | 0 15 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/__init__.py rename {tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface => tmuxp}/plugin.py (100%) diff --git a/requirements/test.txt b/requirements/test.txt index fa11258412..87f12558c3 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -3,4 +3,3 @@ pytest-rerunfailures<9 pytest-cov coverage codecov -wheel diff --git a/tests/fixtures/pluginsystem/install_plugins.py b/tests/fixtures/pluginsystem/install_plugins.py index 0b437b703b..2c805b74d0 100644 --- a/tests/fixtures/pluginsystem/install_plugins.py +++ b/tests/fixtures/pluginsystem/install_plugins.py @@ -3,7 +3,6 @@ plugin_paths = [ - "plugins/tmuxp_plugin_interface", "plugins/tmuxp_test_plugin_bwb", "plugins/tmuxp_test_plugin_bs", "plugins/tmuxp_test_plugin_r", diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py deleted file mode 100644 index 3291ffb6eb..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_plugin_interface', - version='0.0.1', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description='A tmuxp plugin class interface', -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py index 1fa1f0cb03..984c2ea814 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py @@ -2,7 +2,7 @@ setup( name='tmuxp_test_plugin_awf', - version='0.0.1', + version='0.0.2', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index 25dea9cc14..3fa159a7c5 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -1,4 +1,4 @@ -from tmuxp_plugin_interface.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPluginInterface class PluginAfterWindowFinished(TmuxpPluginInterface): def __init__(self): diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py index 2770f72715..28861bd55a 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py @@ -2,7 +2,7 @@ setup( name='tmuxp_test_plugin_bs', - version='0.0.1', + version='0.0.2', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index ca22c3d951..7d694b7e62 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -1,4 +1,4 @@ -from tmuxp_plugin_interface.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPluginInterface class PluginBeforeScript(TmuxpPluginInterface): def __init__(self): diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py index 7886ce9f9c..65aebd8147 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py @@ -2,7 +2,7 @@ setup( name='tmuxp_test_plugin_bwb', - version='0.0.1', + version='0.0.2', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py index 0ee490ad76..fe77a1bc83 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py @@ -1,4 +1,4 @@ -from tmuxp_plugin_interface.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPluginInterface class PluginBeforeWorkspaceBuilder(TmuxpPluginInterface): def __init__(self): diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py index bbaf32962b..673ad1e757 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py @@ -2,7 +2,7 @@ setup( name='tmuxp_test_plugin_owc', - version='0.0.1', + version='0.0.2', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index 92420c69ac..15c68219fe 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -1,4 +1,4 @@ -from tmuxp_plugin_interface.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPluginInterface class PluginOnWindowCreate(TmuxpPluginInterface): def __init__(self): diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py index 95d1a9c175..7fcbbfe89f 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py @@ -2,7 +2,7 @@ setup( name='tmuxp_test_plugin_r', - version='0.0.1', + version='0.0.2', author='Joseph Flinn', author_email='joseph.s.flinn@gmail.com', packages=setuptools.find_packages(), diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py index 52192b5cdd..37c33c90d4 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -1,4 +1,4 @@ -from tmuxp_plugin_interface.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPluginInterface class PluginReattach(TmuxpPluginInterface): def __init__(self): diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/plugin.py b/tmuxp/plugin.py similarity index 100% rename from tests/fixtures/pluginsystem/plugins/tmuxp_plugin_interface/tmuxp_plugin_interface/plugin.py rename to tmuxp/plugin.py From 072d3abb191003aa9a9f47df9d07fad8c52ba368 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 13 Sep 2020 14:50:28 -0700 Subject: [PATCH 0678/2998] Updating the versioning in relation to the plugin system --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index be938951cb..b78bb2c28f 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,14 @@ Changelog Here you can find the recent changes to tmuxp +tmxup 1.5.8 (2020-09-*) +----------------------- +- :issue:`530` Add plugin system for user customization of tmuxp +- :issue:`530` Add tests for the plugin system +- :issue:`530` Update existing tests for the plugin system +- :issue:`530` Add the plugin interface to the tmuxp package +- :issue:`530` Add in depth documentation for the plugin system + current ------- - *Insert changes/features/fixes for next release here* From 96f8c2e2430fba447ab5b46ac99293e45aa3792a Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 20 Sep 2020 14:00:54 -0700 Subject: [PATCH 0679/2998] Switching the test plugins over to using poetry instead of wheel --- pyproject.toml | 5 +++++ .../plugins/tmuxp_test_plugin_awf/pyproject.toml | 15 +++++++++++++++ .../plugins/tmuxp_test_plugin_bs/pyproject.toml | 15 +++++++++++++++ .../plugins/tmuxp_test_plugin_bwb/pyproject.toml | 15 +++++++++++++++ .../plugins/tmuxp_test_plugin_owc/pyproject.toml | 15 +++++++++++++++ .../plugins/tmuxp_test_plugin_r/pyproject.toml | 15 +++++++++++++++ 6 files changed, 80 insertions(+) create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml diff --git a/pyproject.toml b/pyproject.toml index 1338e43e52..a71b317197 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,6 +69,11 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] +tmuxp-test-plugin-bwb = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/"} +tmuxp-test-plugin-bs = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/"} +tmuxp-test-plugin-r = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/"} +tmuxp-test-plugin-owc = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/"} +tmuxp-test-plugin-awf = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/"} ### Coverage ### codecov = "*" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml new file mode 100644 index 0000000000..9b9fbd5def --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_awf" +version = "0.0.2" +description = "A tmuxp plugin to test after_window_finished part of the tmuxp plugin system" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "1.5.8" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml new file mode 100644 index 0000000000..016fdc8d78 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_bs" +version = "0.0.2" +description = "A tmuxp plugin to test before_script part of the tmuxp plugin system" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "1.5.8" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml new file mode 100644 index 0000000000..98ccf2b31c --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_bwb" +version = "0.0.2" +description = "A tmuxp plugin to test before_workspace_build part of the tmuxp plugin system" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "1.5.8" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml new file mode 100644 index 0000000000..c0b16b1659 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_owc" +version = "0.0.2" +description = "A tmuxp plugin to test on_window_create part of the tmuxp plugin system" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "1.5.8" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml new file mode 100644 index 0000000000..9e7c25a619 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_r" +version = "0.0.2" +description = "A tmuxp plugin to test reattach part of the tmuxp plugin system" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "1.5.8" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" From bdfbec150d792133b1dbc9291dcf868930d1e4a4 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 27 Sep 2020 10:51:41 -0700 Subject: [PATCH 0680/2998] fixing based on flake8 and black --- .../fixtures/pluginsystem/install_plugins.py | 24 --------------- .../plugins/tmuxp_test_plugin_awf/setup.py | 13 -------- .../tmuxp_test_plugin_awf/plugin.py | 9 +++--- .../plugins/tmuxp_test_plugin_bs/setup.py | 12 -------- .../tmuxp_test_plugin_bs/plugin.py | 5 ++-- .../plugins/tmuxp_test_plugin_bwb/setup.py | 13 -------- .../tmuxp_test_plugin_bwb/plugin.py | 4 +-- .../plugins/tmuxp_test_plugin_owc/setup.py | 12 -------- .../tmuxp_test_plugin_owc/plugin.py | 7 ++--- .../plugins/tmuxp_test_plugin_r/setup.py | 12 -------- .../tmuxp_test_plugin_r/plugin.py | 3 +- tests/test_cli.py | 10 +++---- tests/test_config.py | 2 +- tests/test_workspacebuilder.py | 30 +++++++++---------- tmuxp/cli.py | 2 +- tmuxp/plugin.py | 4 +-- tmuxp/workspacebuilder.py | 9 ++---- 17 files changed, 42 insertions(+), 129 deletions(-) delete mode 100644 tests/fixtures/pluginsystem/install_plugins.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py delete mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py diff --git a/tests/fixtures/pluginsystem/install_plugins.py b/tests/fixtures/pluginsystem/install_plugins.py deleted file mode 100644 index 2c805b74d0..0000000000 --- a/tests/fixtures/pluginsystem/install_plugins.py +++ /dev/null @@ -1,24 +0,0 @@ -import subprocess -import sys - - -plugin_paths = [ - "plugins/tmuxp_test_plugin_bwb", - "plugins/tmuxp_test_plugin_bs", - "plugins/tmuxp_test_plugin_r", - "plugins/tmuxp_test_plugin_owc", - "plugins/tmuxp_test_plugin_awf", -] - - -def install(package): - subprocess.check_call([sys.executable, "-m", "pip", "install", package]) - - -def install_plugins(): - for plugin in plugin_paths: - install(plugin) - - -if __name__ == "__main__": - install_plugins() diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py deleted file mode 100644 index 984c2ea814..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_test_plugin_awf', - version='0.0.2', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description=( - 'A tmuxp plugin to test the after_window_finished part of the ' - 'plugin system' - ), -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index 3fa159a7c5..2932cd4482 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -1,11 +1,12 @@ from tmuxp.plugin import TmuxpPluginInterface + class PluginAfterWindowFinished(TmuxpPluginInterface): def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + self.message = '[+] This is the Tmuxp Test Plugin' - def after_window_finished(self, window): - if window.name == 'editor': + def after_window_finished(self, window): + if window.name == 'editor': window.rename_window('plugin_test_awf') elif window.name == 'awf_mw_test': window.rename_window('plugin_test_awf_mw') @@ -14,4 +15,4 @@ def after_window_finished(self, window): elif window.name == 'mp_test_owc': window.rename_window('mp_test_awf') else: - pass \ No newline at end of file + pass diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py deleted file mode 100644 index 28861bd55a..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/setup.py +++ /dev/null @@ -1,12 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_test_plugin_bs', - version='0.0.2', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description=( - 'A tmuxp plugin to test the before_script part of the plugin system' - ), -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index 7d694b7e62..0f0a645640 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -1,8 +1,9 @@ from tmuxp.plugin import TmuxpPluginInterface + class PluginBeforeScript(TmuxpPluginInterface): def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + self.message = '[+] This is the Tmuxp Test Plugin' def before_script(self, session): - session.rename_session('plugin_test_bs') \ No newline at end of file + session.rename_session('plugin_test_bs') diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py deleted file mode 100644 index 65aebd8147..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_test_plugin_bwb', - version='0.0.2', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description=( - 'A tmuxp plugin to test the before_workspace_builder part of the ' - 'plugin system' - ), -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py index fe77a1bc83..2ab37a2ac1 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py @@ -1,9 +1,9 @@ from tmuxp.plugin import TmuxpPluginInterface + class PluginBeforeWorkspaceBuilder(TmuxpPluginInterface): def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + self.message = '[+] This is the Tmuxp Test Plugin' def before_workspace_builder(self, session): session.rename_session('plugin_test_bwb') - diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py deleted file mode 100644 index 673ad1e757..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/setup.py +++ /dev/null @@ -1,12 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_test_plugin_owc', - version='0.0.2', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description=( - 'A tmuxp plugin to test the on_window_create part of the plugin system' - ), -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index 15c68219fe..6fae97dd1c 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -1,11 +1,12 @@ from tmuxp.plugin import TmuxpPluginInterface + class PluginOnWindowCreate(TmuxpPluginInterface): def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + self.message = '[+] This is the Tmuxp Test Plugin' def on_window_create(self, window): - if window.name == 'editor': + if window.name == 'editor': window.rename_window('plugin_test_owc') elif window.name == 'owc_mw_test': window.rename_window('plugin_test_owc_mw') @@ -15,5 +16,3 @@ def on_window_create(self, window): window.rename_window('mp_test_owc') else: pass - - \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py deleted file mode 100644 index 7fcbbfe89f..0000000000 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/setup.py +++ /dev/null @@ -1,12 +0,0 @@ -from setuptools import setup - -setup( - name='tmuxp_test_plugin_r', - version='0.0.2', - author='Joseph Flinn', - author_email='joseph.s.flinn@gmail.com', - packages=setuptools.find_packages(), - description=( - 'A tmuxp plugin to test the reattach part of the plugin system' - ), -) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py index 37c33c90d4..d54b7ef84c 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -1,8 +1,9 @@ from tmuxp.plugin import TmuxpPluginInterface + class PluginReattach(TmuxpPluginInterface): def __init__(self): - self.message = f'[+] This is the Tmuxp Test Plugin' + self.message = '[+] This is the Tmuxp Test Plugin' def reattach(self, session): session.rename_session('plugin_test_r') diff --git a/tests/test_cli.py b/tests/test_cli.py index b0fe90a834..27c497c4f4 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -22,7 +22,7 @@ is_pure_name, load_workspace, scan_config, - _reattach + _reattach, ) from tmuxp.workspacebuilder import WorkspaceBuilder @@ -972,9 +972,9 @@ def test_reattach_plugins(server): try: _reattach(builder) - except libtmux.exc.LibTmuxException as error: + except libtmux.exc.LibTmuxException: pass - proc = builder.session.cmd('display-message', '-p', "'#S'") - - assert proc.stdout[0] == "'plugin_test_r'" \ No newline at end of file + proc = builder.session.cmd('display-message', '-p', "'#S'") + + assert proc.stdout[0] == "'plugin_test_r'" diff --git a/tests/test_config.py b/tests/test_config.py index 934c1907ec..e1085cf47b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -402,4 +402,4 @@ def test_plugins(): with pytest.raises(exc.ConfigError) as excinfo: config.validate_schema(sconfig) - assert excinfo.matches('only supports list type') \ No newline at end of file + assert excinfo.matches('only supports list type') diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index d50baeef8d..4a30973deb 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -682,15 +682,15 @@ def test_load_plugins(): sconfig = kaptan.Kaptan(handler='yaml') sconfig = sconfig.import_config(plugins_config).get() sconfig = config.expand(sconfig) - + builder = WorkspaceBuilder(sconf=sconfig) assert len(builder.plugins) == 1 test_plugin_class_types = [ - PluginBeforeWorkspaceBuilder().__class__, + PluginBeforeWorkspaceBuilder().__class__, ] - for plugin in builder.plugins: + for plugin in builder.plugins: assert plugin.__class__ in test_plugin_class_types @@ -706,7 +706,7 @@ def test_plugin_system_before_workspace_builder(session): builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#S'") + proc = session.cmd('display-message', '-p', "'#S'") assert proc.stdout[0] == "'plugin_test_bwb'" @@ -722,7 +722,7 @@ def test_plugin_system_before_script(session): builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#S'") + proc = session.cmd('display-message', '-p', "'#S'") assert proc.stdout[0] == "'plugin_test_bs'" @@ -738,7 +738,7 @@ def test_plugin_system_on_window_create(session): builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#W'") + proc = session.cmd('display-message', '-p', "'#W'") assert proc.stdout[0] == "'plugin_test_owc'" @@ -754,7 +754,7 @@ def test_plugin_system_after_window_finished(session): builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#W'") + proc = session.cmd('display-message', '-p', "'#W'") assert proc.stdout[0] == "'plugin_test_awf'" @@ -771,9 +771,9 @@ def test_plugin_system_on_window_create_multiple_windows(session): builder.build(session=session) proc = session.cmd('list-windows', '-F', "'#W'") - assert "'plugin_test_owc_mw'" in proc.stdout - assert "'plugin_test_owc_mw_2'" in proc.stdout - + assert "'plugin_test_owc_mw'" in proc.stdout + assert "'plugin_test_owc_mw_2'" in proc.stdout + def test_plugin_system_after_window_finished_multiple_windows(session): config_plugins = loadfixture("workspacebuilder/plugin_awf_multiple_windows.yaml") @@ -788,8 +788,8 @@ def test_plugin_system_after_window_finished_multiple_windows(session): builder.build(session=session) proc = session.cmd('list-windows', '-F', "'#W'") - assert "'plugin_test_awf_mw'" in proc.stdout - assert "'plugin_test_awf_mw_2'" in proc.stdout + assert "'plugin_test_awf_mw'" in proc.stdout + assert "'plugin_test_awf_mw_2'" in proc.stdout def test_plugin_system_multiple_plugins(session): @@ -805,11 +805,11 @@ def test_plugin_system_multiple_plugins(session): builder.build(session=session) # Drop through to the before_script plugin hook - proc = session.cmd('display-message', '-p', "'#S'") + proc = session.cmd('display-message', '-p', "'#S'") assert proc.stdout[0] == "'plugin_test_bs'" # Drop through to the after_window_finished. This won't succeed # unless on_window_create succeeds because of how the test plugin # override methods are currently written - proc = session.cmd('display-message', '-p', "'#W'") - assert proc.stdout[0] == "'mp_test_awf'" \ No newline at end of file + proc = session.cmd('display-message', '-p', "'#W'") + assert proc.stdout[0] == "'mp_test_awf'" diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3bbf402443..6dbf15ded9 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -391,7 +391,7 @@ def _reattach(builder): for plugin in builder.plugins: plugin.reattach(builder.session) - proc = builder.session.cmd('display-message', '-p', "'#S'") + proc = builder.session.cmd('display-message', '-p', "'#S'") for line in proc.stdout: print(line) diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index dc3176d49d..72867da7da 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -14,5 +14,5 @@ def reattach(self, session): def on_window_create(self, window): pass - def after_window_finished(self, window): - pass \ No newline at end of file + def after_window_finished(self, window): + pass diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index c64e756098..45623bfff8 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -117,15 +117,12 @@ def load_plugins(self): module_name = plugin.split('.') module_name = '.'.join(module_name[:-1]) plugin_name = plugin.split('.')[-1] - plugin = getattr( - importlib.import_module(module_name), - plugin_name - ) + plugin = getattr(importlib.import_module(module_name), plugin_name) plugins.append(plugin()) except Exception as error: raise exc.TmuxpException( - 'Error in loading {0}. Please make sure {0} is ' + - 'installed.\n\n{1}'.format(plugin, error) + 'Error in loading {0}. Please make sure {0} is ' + 'installed.\n\n{1}'.format(plugin, error) ) return plugins From 798790590f87f40eae987368b3bb4302709f6e44 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 27 Sep 2020 12:35:44 -0700 Subject: [PATCH 0681/2998] fixing mistype --- tmuxp/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 6dbf15ded9..24b7490205 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -536,7 +536,7 @@ def load_workspace( or click.confirm( '%s is already running. Attach?' % click.style(session_name, fg='green'), - eefault=True, + default=True, ) ): _reattach(builder) From 3a4bef30aa34f1096a6fc0bd8d9825ad698bace4 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 4 Oct 2020 13:49:32 -0700 Subject: [PATCH 0682/2998] fixed typo --- CHANGES | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index b78bb2c28f..b2511879b3 100644 --- a/CHANGES +++ b/CHANGES @@ -4,16 +4,13 @@ Changelog Here you can find the recent changes to tmuxp -tmxup 1.5.8 (2020-09-*) ------------------------ +current +------- - :issue:`530` Add plugin system for user customization of tmuxp - :issue:`530` Add tests for the plugin system - :issue:`530` Update existing tests for the plugin system - :issue:`530` Add the plugin interface to the tmuxp package - :issue:`530` Add in depth documentation for the plugin system - -current -------- - *Insert changes/features/fixes for next release here* tmuxp 1.6.1 (2020-11-07) From 122842244ebc07cfabe37c02328227b34772665b Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 4 Oct 2020 13:51:40 -0700 Subject: [PATCH 0683/2998] Updating the location of the before_script plugin method execution. Updating corresponding tests. Starting on the documentation --- docs/index.rst | 1 + docs/plugin_system.rst | 95 +++++++++++++++++++ examples/plugin-system.json | 24 +++++ examples/plugin-system.yaml | 13 +++ .../plugin_multiple_plugins.yaml | 1 - tests/test_cli.py | 18 +++- tests/test_workspacebuilder.py | 18 +--- tmuxp/cli.py | 4 + tmuxp/plugin.py | 73 +++++++++++++- tmuxp/workspacebuilder.py | 4 - 10 files changed, 224 insertions(+), 27 deletions(-) create mode 100644 docs/plugin_system.rst create mode 100644 examples/plugin-system.json create mode 100644 examples/plugin-system.yaml diff --git a/docs/index.rst b/docs/index.rst index fc6d677954..6f1a1919c3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -28,6 +28,7 @@ Table of Contents quickstart examples cli + plugin_system developing api history diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst new file mode 100644 index 0000000000..ed276d9667 --- /dev/null +++ b/docs/plugin_system.rst @@ -0,0 +1,95 @@ +.. _plugin_system: + +============= +Plugin System +============= + +The plugin system allows users to customize and extend different aspects of +tmuxp without the need to change tmuxp itself. + + +Using a Plugin +-------------- + +To use a plugin, install it in your local python environment and add it to +your tmuxp configuration file. + +Example Configurations +^^^^^^^^^^^^^^^^^^^^^^ +YAML +~~~~ + +.. literalinclude:: ../examples/plugin-system.yaml + :language: yaml + +JSON +~~~~ + +.. literalinclude:: ../examples/plugin-system.json + :language: json + +.. _poetry: https://python-poetry.org/ + + +Developing a Plugin +------------------- + +.. module:: tmuxp + +Plugin API +^^^^^^^^^^ + +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_workspace_builder +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.on_window_create +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.after_window_finished +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_script +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.reattach + + +Example Plugin +-------------- + +Tmuxp expects all plugins to be class within a python submodule named +``plugin`` that is within a python module that is installed in the local +python environment. A plugin interface is provided by tmuxp to inherit. + +`poetry`_ is the chosen python package manager for tmuxp. It is highly +suggested to use it when developing tmuxp plugins; however, ``pip`` will work +just as well. + +.. code-block:: bash + + python_module + ├── my_plugin_module + │   ├── __init__.py + │   └── plugin.py + ├── pyproject.toml # Poetry's module configuration file + └── setup.py # pip's module configuration file + +The `plugin.py` file could contain something like the following: + +.. code-block:: python + + from tmuxp.plugin import TmuxpPluginInterface + import datetime + + class MyTmuxpPlugin(TmuxpPluginInterface): + def __init__(self): + super.__init__(self) + + def before_workspace_builder(self, session): + session.rename_session('my-new-session-name') + + def reattach(self, session): + now = datetime.datetime.now().strftime('%Y-%m-%d') + session.rename_session('session_{}'.format(now)) + +Once this plugin is installed in the local python environment, it can be used +in a configuration file like the following: + +.. code-block: yaml + + session_name: plugin example + plugins: + - my_plugin_module.plugin.MyTmuxpPlugin + # ... the rest of your config diff --git a/examples/plugin-system.json b/examples/plugin-system.json new file mode 100644 index 0000000000..4309676b30 --- /dev/null +++ b/examples/plugin-system.json @@ -0,0 +1,24 @@ +{ + "session_name": "plugin-system", + "plugins": [ + "tmuxp_plugin_extended_build.plugin.PluginExtendedBuild" + ], + "windows": [ + { + "window_name": "editor", + "layout": "tiled", + "shell_command_before": [ + "cd ~/" + ], + "panes": [ + { + "shell_command": [ + "cd /var/log", + "ls -al | grep *.log" + ] + }, + "echo \"hello world\"" + ] + } + ] +} \ No newline at end of file diff --git a/examples/plugin-system.yaml b/examples/plugin-system.yaml new file mode 100644 index 0000000000..13fa6278ce --- /dev/null +++ b/examples/plugin-system.yaml @@ -0,0 +1,13 @@ +session_name: plugin-system +plugins: +- 'tmuxp_plugin_extended_build.plugin.PluginExtendedBuild' +windows: +- window_name: editor + layout: tiled + shell_command_before: + - cd ~/ + panes: + - shell_command: + - cd /var/log + - ls -al | grep *.log + - echo "hello world" \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml b/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml index edb702ac76..113347db6e 100644 --- a/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml +++ b/tests/fixtures/workspacebuilder/plugin_multiple_plugins.yaml @@ -1,7 +1,6 @@ session_name: plugin-test-multiple-plugins plugins: - 'tmuxp_test_plugin_bwb.plugin.PluginBeforeWorkspaceBuilder' -- 'tmuxp_test_plugin_bs.plugin.PluginBeforeScript' - 'tmuxp_test_plugin_owc.plugin.PluginOnWindowCreate' - 'tmuxp_test_plugin_awf.plugin.PluginAfterWindowFinished' windows: diff --git a/tests/test_cli.py b/tests/test_cli.py index 27c497c4f4..317b4569fd 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -959,6 +959,22 @@ def test_ls_cli(monkeypatch, tmpdir): assert cli_output == '\n'.join(stems) + '\n' +def test_plugin_system_before_script(server, monkeypatch): + # this is an implementation test. Since this testsuite may be ran within + # a tmux session by the developer himself, delete the TMUX variable + # temporarily. + monkeypatch.delenv('TMUX', raising=False) + session_file = curjoin("workspacebuilder/plugin_bs.yaml") + + # open it detached + session = load_workspace( + session_file, socket_name=server.socket_name, detached=True + ) + + assert isinstance(session, libtmux.Session) + assert session.name == 'plugin_test_bs' + + def test_reattach_plugins(server): config_plugins = loadfixture("workspacebuilder/plugin_r.yaml") @@ -977,4 +993,4 @@ def test_reattach_plugins(server): proc = builder.session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_r'" + assert proc.stdout[0] == "'plugin_test_r'" \ No newline at end of file diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 4a30973deb..7055cc3527 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -710,22 +710,6 @@ def test_plugin_system_before_workspace_builder(session): assert proc.stdout[0] == "'plugin_test_bwb'" -def test_plugin_system_before_script(session): - config_plugins = loadfixture("workspacebuilder/plugin_bs.yaml") - - sconfig = kaptan.Kaptan(handler='yaml') - sconfig = sconfig.import_config(config_plugins).get() - sconfig = config.expand(sconfig) - - builder = WorkspaceBuilder(sconf=sconfig) - assert len(builder.plugins) > 0 - - builder.build(session=session) - - proc = session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_bs'" - - def test_plugin_system_on_window_create(session): config_plugins = loadfixture("workspacebuilder/plugin_owc.yaml") @@ -806,7 +790,7 @@ def test_plugin_system_multiple_plugins(session): # Drop through to the before_script plugin hook proc = session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_bs'" + assert proc.stdout[0] == "'plugin_test_bwb'" # Drop through to the after_window_finished. This won't succeed # unless on_window_create succeeds because of how the test plugin diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 24b7490205..809e781659 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -601,6 +601,10 @@ def load_workspace( else: sys.exit() + # Runs after before_script + for plugin in builder.plugins: + plugin.before_script(builder.session) + return builder.session diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index 72867da7da..234ac35298 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -1,18 +1,83 @@ class TmuxpPluginInterface: def __init__(self): + """ + Initialize plugin interface. + """ pass def before_workspace_builder(self, session): - pass + """ + Provide a session hook previous to creating the workspace. - def before_script(self, session): - pass + Parameters + ---------- + session : :class:`libtmux.Session` + session to hook into - def reattach(self, session): + Notes + ----- + This runs after the session has been created but before any of + the windows/panes/commands are entered. + """ pass def on_window_create(self, window): + """ + Provide a window hook previous to creating the window. + + Parameters + ---------- + window: :class:`libtmux.Window` + window to hook into + + Notes + ----- + This runs runs before anything is created in the windows, like panes. + """ pass def after_window_finished(self, window): + """ + Provide a window hook after creating the window. + + Parameters + ---------- + window: :class:`libtmux.Window` + window to hook into + + Notes + ----- + This runs after everything has been created in the window, including + the paes and all of the commands for the panes. It also runs after the + ``options_after`` have been applied to the window. + """ pass + + def before_script(self, session): + """ + Provide a session hook after the workspace has been built. + + Parameters + ---------- + session : :class:`libtmux.Session` + session to hook into + + Notes + ----- + This runs after the workspace has been loaded with ``tmuxp load``. It + augments instead of replaces the ``before_script`` section of the + configuration. If changes to the session need to be made prior to + anything being built, please use ``before_workspace_builder`` instead. + """ + pass + + def reattach(self, session): + """ + Provide a session hook before reattaching to the session. + + Parameters + ---------- + session : :class:`libtmux.Session` + session to hook into + """ + pass \ No newline at end of file diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 45623bfff8..4547cce946 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -207,10 +207,6 @@ def build(self, session=None): for option, value in self.sconf['environment'].items(): self.session.set_environment(option, value) - # Runs after before_script - for plugin in self.plugins: - plugin.before_script(self.session) - for w, wconf in self.iter_create_windows(session): assert isinstance(w, Window) From c56c695fbf6d7331b10481b1b00493ad00bd3084 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 11 Oct 2020 12:03:27 -0700 Subject: [PATCH 0684/2998] updating the plugin system docs --- docs/plugin_system.rst | 40 ++++++++++++++++++--------------- tmuxp/plugin.py | 51 +++++++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index ed276d9667..5da7cf1a7c 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -34,28 +34,14 @@ JSON Developing a Plugin ------------------- -.. module:: tmuxp - -Plugin API -^^^^^^^^^^ - -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_workspace_builder -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.on_window_create -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.after_window_finished -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_script -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.reattach - - -Example Plugin --------------- - -Tmuxp expects all plugins to be class within a python submodule named +tmuxp expects all plugins to be class within a python submodule named ``plugin`` that is within a python module that is installed in the local python environment. A plugin interface is provided by tmuxp to inherit. `poetry`_ is the chosen python package manager for tmuxp. It is highly suggested to use it when developing tmuxp plugins; however, ``pip`` will work -just as well. +just as well. Only one of the configuration files is needed for the packaging tool that the +package developer desides to use. .. code-block:: bash @@ -66,6 +52,7 @@ just as well. ├── pyproject.toml # Poetry's module configuration file └── setup.py # pip's module configuration file + The `plugin.py` file could contain something like the following: .. code-block:: python @@ -75,6 +62,13 @@ The `plugin.py` file could contain something like the following: class MyTmuxpPlugin(TmuxpPluginInterface): def __init__(self): + """ + Currently optional. + + In the current version of the plugin interface, the __init__ + isn't being utilized. However, it does provide a space for + later additions to the interface. + """ super.__init__(self) def before_workspace_builder(self, session): @@ -87,9 +81,19 @@ The `plugin.py` file could contain something like the following: Once this plugin is installed in the local python environment, it can be used in a configuration file like the following: -.. code-block: yaml +.. code-block:: yaml session_name: plugin example plugins: - my_plugin_module.plugin.MyTmuxpPlugin # ... the rest of your config + + +Plugin API +---------- + +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_workspace_builder +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.on_window_create +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.after_window_finished +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_script +.. automethod:: tmuxp.plugin.TmuxpPluginInterface.reattach \ No newline at end of file diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index 234ac35298..dcf58c6e7f 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -9,30 +9,26 @@ def before_workspace_builder(self, session): """ Provide a session hook previous to creating the workspace. + This runs after the session has been created but before any of + the windows/panes/commands are entered. + Parameters ---------- session : :class:`libtmux.Session` session to hook into - - Notes - ----- - This runs after the session has been created but before any of - the windows/panes/commands are entered. """ pass def on_window_create(self, window): """ - Provide a window hook previous to creating the window. + Provide a window hook previous to doing anything with a window. + + This runs runs before anything is created in the windows, like panes. Parameters ---------- window: :class:`libtmux.Window` window to hook into - - Notes - ----- - This runs runs before anything is created in the windows, like panes. """ pass @@ -40,16 +36,14 @@ def after_window_finished(self, window): """ Provide a window hook after creating the window. + This runs after everything has been created in the window, including + the panes and all of the commands for the panes. It also runs after the + ``options_after`` has been applied to the window. + Parameters ---------- window: :class:`libtmux.Window` window to hook into - - Notes - ----- - This runs after everything has been created in the window, including - the paes and all of the commands for the panes. It also runs after the - ``options_after`` have been applied to the window. """ pass @@ -57,17 +51,28 @@ def before_script(self, session): """ Provide a session hook after the workspace has been built. + This runs after the workspace has been loaded with ``tmuxp load``. It + augments instead of replaces the ``before_script`` section of the + configuration. + + This hook provides access to the LibTmux.session object for any + behavior that would be used in the ``before_script`` section of the + configuration file that needs access directly to the session object. + This runs after the workspace has been loaded with ``tmuxp load``. + + The hook augments, rather than replaces, the ``before_script`` section + of the configuration. While it is possible to do all of the + ``before_script`` configuration in this function, if a shell script + is currently being used for the configuration, it would be cleaner to + continue using the script in the ``before_section``. + + If changes to the session need to be made prior to + anything being built, please use ``before_workspace_builder`` instead. + Parameters ---------- session : :class:`libtmux.Session` session to hook into - - Notes - ----- - This runs after the workspace has been loaded with ``tmuxp load``. It - augments instead of replaces the ``before_script`` section of the - configuration. If changes to the session need to be made prior to - anything being built, please use ``before_workspace_builder`` instead. """ pass From bab350e249515ef857abbd555cae51d3d5a74172 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 11 Oct 2020 12:12:46 -0700 Subject: [PATCH 0685/2998] Updated the readme with the plugin docs link --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index dc9f150d30..8609bee451 100644 --- a/README.rst +++ b/README.rst @@ -155,7 +155,6 @@ Snapshot your tmux layout, pane paths, and window/session names. See more about `freezing tmux`_ sessions. - Convert a session file ---------------------- @@ -176,6 +175,11 @@ You can auto confirm the prompt. In this case no preview will be shown. $ tmuxp convert -y filename $ tmuxp convert --yes filename +Plugin System +------------- + +tmuxp has a plugin system to allow for custom behavior. See more about the +`Plugin System`_. Docs / Reading material ----------------------- From aa1ae9884f1bb76751ca591d4f41d7e46aa27d13 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 11 Oct 2020 12:18:14 -0700 Subject: [PATCH 0686/2998] fixed plugin system link in the readme --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 8609bee451..99a2bf25a4 100644 --- a/README.rst +++ b/README.rst @@ -204,6 +204,7 @@ Want to learn more about tmux itself? `Read The Tao of Tmux online`_. .. _teamocil: https://github.com/remiprev/teamocil .. _Examples: http://tmuxp.git-pull.com/examples.html .. _freezing tmux: http://tmuxp.git-pull.com/cli.html#freeze-sessions +.. _Plugin System: http://tmuxp.git-pull.com/plugin_system.html .. _bootstrap_env.py: https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py .. _testing: http://tmuxp.git-pull.com/developing.html#test-runner .. _python objects: http://tmuxp.git-pull.com/api.html#api From cae94b9211b1c3116bb8f1b05818c2cd171a1187 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Tue, 13 Oct 2020 08:04:55 -0700 Subject: [PATCH 0687/2998] updating test plugin required versions --- .../pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml index 9b9fbd5def..47c2d7606a 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "1.5.8" +tmuxp = "^1.5.6" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index 016fdc8d78..ea6ef52439 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "1.5.8" +tmuxp = "^1.5.6" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml index 98ccf2b31c..cfe6c93b2c 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "1.5.8" +tmuxp = "^1.5.6" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml index c0b16b1659..dbad45b80e 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "1.5.8" +tmuxp = "^1.5.6" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml index 9e7c25a619..f57b2376aa 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "1.5.8" +tmuxp = "^1.5.6" [tool.poetry.dev-dependencies] From f61c0fd0afe49f153b8021c549b6f106f11c9a32 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 18 Oct 2020 17:08:47 -0700 Subject: [PATCH 0688/2998] Working on version contraints for the plugin system. Moved the load_plugin function and corresponding tests. Add a way to skip loading a plugin if it failed to load --- CHANGES | 5 +- docs/plugin_system.rst | 50 ++++++++-- pyproject.toml | 2 +- tests/fixtures/pluginsystem/__init__.py | 0 .../pluginsystem/partials/__init__.py | 0 .../pluginsystem/partials/all_pass.py | 17 ++++ .../partials/test_plugin_helpers.py | 16 +++ .../partials/tmux_version_fail.py | 32 ++++++ .../partials/tmuxp_version_fail.py | 31 ++++++ .../tmuxp_test_plugin_awf/pyproject.toml | 2 +- .../tmuxp_test_plugin_bs/pyproject.toml | 2 +- .../tmuxp_test_plugin_bwb/pyproject.toml | 2 +- .../tmuxp_test_plugin_owc/pyproject.toml | 2 +- .../tmuxp_test_plugin_r/pyproject.toml | 2 +- tests/test_cli.py | 26 ++++- tests/test_plugin.py | 81 ++++++++++++++++ tests/test_workspacebuilder.py | 32 ++---- tmuxp/__about__.py | 2 +- tmuxp/cli.py | 44 ++++++++- tmuxp/exc.py | 9 ++ tmuxp/plugin.py | 97 ++++++++++++++++++- tmuxp/workspacebuilder.py | 26 +---- 22 files changed, 412 insertions(+), 68 deletions(-) create mode 100644 tests/fixtures/pluginsystem/__init__.py create mode 100644 tests/fixtures/pluginsystem/partials/__init__.py create mode 100644 tests/fixtures/pluginsystem/partials/all_pass.py create mode 100644 tests/fixtures/pluginsystem/partials/test_plugin_helpers.py create mode 100644 tests/fixtures/pluginsystem/partials/tmux_version_fail.py create mode 100644 tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py create mode 100644 tests/test_plugin.py diff --git a/CHANGES b/CHANGES index b2511879b3..08fd505258 100644 --- a/CHANGES +++ b/CHANGES @@ -6,12 +6,15 @@ Here you can find the recent changes to tmuxp current ------- +- *Insert changes/features/fixes for next release here* + +tmuxp 1.7.0a1 (2020-11-07) +-------------------------- - :issue:`530` Add plugin system for user customization of tmuxp - :issue:`530` Add tests for the plugin system - :issue:`530` Update existing tests for the plugin system - :issue:`530` Add the plugin interface to the tmuxp package - :issue:`530` Add in depth documentation for the plugin system -- *Insert changes/features/fixes for next release here* tmuxp 1.6.1 (2020-11-07) ------------------------ diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 5da7cf1a7c..987d3fefc0 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -39,20 +39,44 @@ tmuxp expects all plugins to be class within a python submodule named python environment. A plugin interface is provided by tmuxp to inherit. `poetry`_ is the chosen python package manager for tmuxp. It is highly -suggested to use it when developing tmuxp plugins; however, ``pip`` will work -just as well. Only one of the configuration files is needed for the packaging tool that the -package developer desides to use. +suggested to use it when developing plugins; however, ``pip`` will work +just as well. Only one of the configuration files is needed for the packaging +tool that the package developer desides to use. .. code-block:: bash python_module - ├── my_plugin_module + ├── tmuxp_plugin_my_plugin_module │   ├── __init__.py │   └── plugin.py ├── pyproject.toml # Poetry's module configuration file └── setup.py # pip's module configuration file +When publishing plugins to pypi, tmuxp advocates for standardized naming: +``tmuxp-plugin-{your-plugin-name}`` to allow for easier searching. To create a +module configuration file with poetry, run ``poetry init`` in the module +directory. The resulting file looks something like this: + +.. code-block:: toml + + [tool.poetry] + name = "tmuxp-plugin-my-tmuxp-plugin" + version = "0.0.2" + description = "An example tmuxp plugin." + authors = ["Author Name .com>"] + + [tool.poetry.dependencies] + python = "~2.7 || ^3.5" + tmuxp = "^1.6.0" + + [tool.poetry.dev-dependencies] + + [build-system] + requires = ["poetry>=0.12"] + build-backend = "poetry.masonry.api" + + The `plugin.py` file could contain something like the following: .. code-block:: python @@ -63,13 +87,18 @@ The `plugin.py` file could contain something like the following: class MyTmuxpPlugin(TmuxpPluginInterface): def __init__(self): """ - Currently optional. - - In the current version of the plugin interface, the __init__ - isn't being utilized. However, it does provide a space for - later additions to the interface. + Initialize my custom plugin. """ - super.__init__(self) + super().__init__() + + # Optional version dependency configurations: + self.plugin_name = 'tmuxp-plugin-my-tmuxp-plugin' + self.tmux_min_version = '1.8' + self.tmux_max_version = '2.4' + self.tmux_version_incompatible = ['2.3'] + self.tmuxp_min_version = '1.6.0' + self.tmuxp_max_version = '1.6.2' + self.tmuxp_version_incompatible = ['1.6.1'] def before_workspace_builder(self, session): session.rename_session('my-new-session-name') @@ -78,6 +107,7 @@ The `plugin.py` file could contain something like the following: now = datetime.datetime.now().strftime('%Y-%m-%d') session.rename_session('session_{}'.format(now)) + Once this plugin is installed in the local python environment, it can be used in a configuration file like the following: diff --git a/pyproject.toml b/pyproject.toml index a71b317197..86fcd64eb3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.1" +version = "1.7.0a1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tests/fixtures/pluginsystem/__init__.py b/tests/fixtures/pluginsystem/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/partials/__init__.py b/tests/fixtures/pluginsystem/partials/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py new file mode 100644 index 0000000000..9f9dc013e4 --- /dev/null +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -0,0 +1,17 @@ +from .test_plugin_helpers import TestTmuxpPluginInterface + + +class AllVersionPassPlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmuxp-plugin-my-tmuxp-plugin', + 'tmux_min_version': '1.8', + 'tmux_max_version': '100.0', + 'tmux_version_incompatible': ['2.3'], + 'tmuxp_min_version': '1.6.0', + 'tmuxp_max_version': '100.0.0', + 'tmuxp_version_incompatible': ['1.5.6'], + 'tmux_version': '3.0', + 'tmuxp_version': '1.6.0', + } + TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py new file mode 100644 index 0000000000..1b8b7ca716 --- /dev/null +++ b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py @@ -0,0 +1,16 @@ +from tmuxp.plugin import TmuxpPluginInterface + +class TestTmuxpPluginInterface(TmuxpPluginInterface): + def __init__(self, config): + tmux_version = config.pop('tmux_version', None) + tmuxp_version = config.pop('tmuxp_version', None) + + TmuxpPluginInterface.__init__(self, **config) + + # WARNING! This should not be done in anything but a test + if tmux_version: + self.version_constraints['tmux']['version'] = tmux_version + if tmuxp_version: + self.version_constraints['tmuxp']['version'] = tmuxp_version + + self._version_check() \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py new file mode 100644 index 0000000000..243e53302d --- /dev/null +++ b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py @@ -0,0 +1,32 @@ +from .test_plugin_helpers import TestTmuxpPluginInterface + + +class TmuxVersionFailMinPlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmux-min-version-fail', + 'tmux_min_version': '1.8', + 'tmux_version': '1.7' + } + TestTmuxpPluginInterface.__init__(self, config) + + +class TmuxVersionFailMaxPlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmux-max-version-fail', + 'tmux_min_version': '3.0', + 'tmux_version': '3.5' + } + TestTmuxpPluginInterface.__init__(self, config) + + +class TmuxVersionFailIncompatiblePlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmux-incompatible-version-fail', + 'tmux_version_incompatible': ['2.3'], + 'tmux_version': '2.3' + } + + TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py new file mode 100644 index 0000000000..edf88e84f5 --- /dev/null +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -0,0 +1,31 @@ +from .test_plugin_helpers import TestTmuxpPluginInterface + + +class TmuxpVersionFailMinPlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmuxp-min-verion-fail', + 'tmuxp_min_version': '1.6.0', + 'tmuxp_version': '1.5.6' + } + TestTmuxpPluginInterface.__init__(self, config) + + +class TmuxpVersionFailMaxPlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmuxp-max-verion-fail', + 'tmuxp_min_version': '2.0.0', + 'tmuxp_version': '2.5' + } + TestTmuxpPluginInterface.__init__(self, config) + + +class TmuxpVersionFailIncompatiblePlugin(TestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmuxp-incompatible-verion-fail', + 'tmuxp_version_incompatible': ['1.5.0'], + 'tmuxp_version': '1.5.0' + } + TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml index 47c2d7606a..198d239d63 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.5.6" +tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index ea6ef52439..15cd0f2ff6 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.5.6" +tmuxp = "^1.6.0." [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml index cfe6c93b2c..e34023ad10 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.5.6" +tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml index dbad45b80e..c6a94e5db1 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.5.6" +tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml index f57b2376aa..ae0b438dba 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.5.6" +tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/tests/test_cli.py b/tests/test_cli.py index 317b4569fd..dcd0c6a8c9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -23,8 +23,10 @@ load_workspace, scan_config, _reattach, + load_plugins, ) from tmuxp.workspacebuilder import WorkspaceBuilder +from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder from .fixtures._util import curjoin, loadfixture @@ -959,6 +961,24 @@ def test_ls_cli(monkeypatch, tmpdir): assert cli_output == '\n'.join(stems) + '\n' +def test_load_plugins(): + plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(plugins_config).get() + sconfig = config.expand(sconfig) + + plugins = load_plugins(sconfig) + + assert len(plugins) == 1 + + test_plugin_class_types = [ + PluginBeforeWorkspaceBuilder().__class__, + ] + for plugin in plugins: + assert plugin.__class__ in test_plugin_class_types + + def test_plugin_system_before_script(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable @@ -983,7 +1003,11 @@ def test_reattach_plugins(server): sconfig = config.expand(sconfig) # open it detached - builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder = WorkspaceBuilder( + sconf=sconfig, + plugins=load_plugins(sconfig), + server=server + ) builder.build() try: diff --git a/tests/test_plugin.py b/tests/test_plugin.py new file mode 100644 index 0000000000..fdc8b33b18 --- /dev/null +++ b/tests/test_plugin.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +"""Test for tmuxp plugin api.""" +from __future__ import absolute_import + +import json +import os + +import pytest + +import libtmux +from libtmux.common import has_lt_version +from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.exc import TmuxpPluginException + +from .fixtures.pluginsystem.partials.all_pass import AllVersionPassPlugin +from .fixtures.pluginsystem.partials.tmux_version_fail import ( + TmuxVersionFailMinPlugin, + TmuxVersionFailMaxPlugin, + TmuxVersionFailIncompatiblePlugin +) +from .fixtures.pluginsystem.partials.tmuxp_version_fail import ( + TmuxpVersionFailMinPlugin, + TmuxpVersionFailMaxPlugin, + TmuxpVersionFailIncompatiblePlugin +) + + +def test_all_pass(): + try: + plugin = AllVersionPassPlugin() + assert(True) + except TmuxpPluginException as error: + assert(False) + + +def test_tmux_version_fail_min(): + try: + plugin = TmuxVersionFailMinPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_tmux_version_fail_max(): + try: + plugin = TmuxVersionFailMaxPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_tmux_version_fail_incompatible(): + try: + plugin = TmuxVersionFailIncompatiblePlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_tmuxp_version_fail_min(): + try: + plugin = TmuxpVersionFailMinPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_tmux_version_fail_max(): + try: + plugin = TmuxpVersionFailMaxPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_tmux_version_fail_incompatible(): + try: + plugin = TmuxpVersionFailIncompatiblePlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) \ No newline at end of file diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 7055cc3527..3783d0d8e4 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -15,10 +15,10 @@ from tmuxp import config, exc from tmuxp._compat import text_type from tmuxp.workspacebuilder import WorkspaceBuilder +from tmuxp.cli import load_plugins from . import example_dir, fixtures_dir from .fixtures._util import loadfixture -from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder def test_split_windows(session): @@ -676,24 +676,6 @@ def test_before_load_true_if_test_passes_with_args(server): builder.build(session=session) -def test_load_plugins(): - plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") - - sconfig = kaptan.Kaptan(handler='yaml') - sconfig = sconfig.import_config(plugins_config).get() - sconfig = config.expand(sconfig) - - builder = WorkspaceBuilder(sconf=sconfig) - - assert len(builder.plugins) == 1 - - test_plugin_class_types = [ - PluginBeforeWorkspaceBuilder().__class__, - ] - for plugin in builder.plugins: - assert plugin.__class__ in test_plugin_class_types - - def test_plugin_system_before_workspace_builder(session): config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") @@ -701,7 +683,7 @@ def test_plugin_system_before_workspace_builder(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) @@ -717,7 +699,7 @@ def test_plugin_system_on_window_create(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) @@ -733,7 +715,7 @@ def test_plugin_system_after_window_finished(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) @@ -749,7 +731,7 @@ def test_plugin_system_on_window_create_multiple_windows(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) @@ -766,7 +748,7 @@ def test_plugin_system_after_window_finished_multiple_windows(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) @@ -783,7 +765,7 @@ def test_plugin_system_multiple_plugins(session): sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) - builder = WorkspaceBuilder(sconf=sconfig) + builder = WorkspaceBuilder(sconf=sconfig, plugins=load_plugins(sconfig)) assert len(builder.plugins) > 0 builder.build(session=session) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 7fe395812e..7242004d0b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.1' +__version__ = '1.7.0a1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 809e781659..3045dab079 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -8,6 +8,7 @@ from __future__ import absolute_import import logging +import importlib import os import sys @@ -372,6 +373,43 @@ def scan_config(config, config_dir=None): return config +def load_plugins(sconf): + """ + Load and return plugins in config + """ + plugins = [] + if 'plugins' in sconf: + for plugin in sconf['plugins']: + try: + module_name = plugin.split('.') + module_name = '.'.join(module_name[:-1]) + plugin_name = plugin.split('.')[-1] + plugin = getattr(importlib.import_module(module_name), plugin_name) + plugins.append(plugin()) + except exc.TmuxpPluginException as error: + if (click.confirm( + '%s Skip?' % click.style(error, fg='orange'), default=True + )): + pass + except Exception as error: + raise exc.TmuxpException( + 'Error in loading {0}. Please make sure {0} is ' + 'installed.\n\n{1}'.format(plugin, error) + ) + + if not detached and ( + answer_yes + or click.confirm( + '%s is already running. Attach?' + % click.style(session_name, fg='green'), + default=True, + ) + ): + pass + + return plugins + + def _reattach(builder): """ Reattach session (depending on env being inside tmux already or not) @@ -521,7 +559,11 @@ def load_workspace( which('tmux') # raise exception if tmux not found try: # load WorkspaceBuilder object for tmuxp config / tmux server - builder = WorkspaceBuilder(sconf=sconfig, server=t) + builder = WorkspaceBuilder( + sconf=sconfig, + plugins=load_plugins(sconfig), + server=t + ) except exc.EmptyConfigException: click.echo('%s is empty or parsed no config data' % config_file, err=True) return diff --git a/tmuxp/exc.py b/tmuxp/exc.py index fcf567796f..fb847f82c1 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -15,6 +15,8 @@ class TmuxpException(Exception): """Base Exception for Tmuxp Errors.""" + pass + class ConfigError(TmuxpException): @@ -30,6 +32,13 @@ class EmptyConfigException(ConfigError): pass +class TmuxpPluginException(TmuxpException): + + """Base Exception for Tmuxp Errors.""" + + pass + + class BeforeLoadScriptNotExists(OSError): def __init__(self, *args, **kwargs): super(BeforeLoadScriptNotExists, self).__init__(*args, **kwargs) diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index dcf58c6e7f..ad87290a5b 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -1,9 +1,102 @@ +from distutils.version import LooseVersion +from libtmux.common import get_version + +from .__about__ import __version__ +from .exc import TmuxpPluginException + +#: Minimum version of tmux required to run libtmux +TMUX_MIN_VERSION = '1.8' + +#: Most recent version of tmux supported +TMUX_MAX_VERSION = None + +#: Minimum version of tmuxp required to use plugins +TMUXP_MIN_VERSION = '1.6.0' + +#: Most recent version of tmuxp +TMUXP_MAX_VERSION = None + + class TmuxpPluginInterface: - def __init__(self): + def __init__(self, + plugin_name='tmuxp-plugin-interface', + tmux_min_version=TMUX_MIN_VERSION, + tmux_max_version=TMUX_MAX_VERSION, + tmux_version_incompatible=None, + tmuxp_min_version=TMUXP_MIN_VERSION, + tmuxp_max_version=TMUXP_MAX_VERSION, + tmuxp_version_incompatible=None + ): """ Initialize plugin interface. """ - pass + self.plugin_name = plugin_name + + self.tmux_min_version = tmux_min_version + self.tmux_max_version = tmux_max_version + self.tmuxp_min_version = tmuxp_min_version + self.tmuxp_max_version = tmuxp_max_version + + self.tmux_version_incompatible = [] + if tmux_version_incompatible: + self.tmux_version_incompatible = tmux_version_incompatible + + self.tmuxp_version_incompatible = [] + if tmuxp_version_incompatible: + self.tmuxp_version_incompatible = tmuxp_version_incompatible + + self.tmux_version = get_version() + self.tmuxp_version = LooseVersion(__version__) + + self.version_constraints = { + 'tmux': { + 'version': self.tmux_version, + 'vmin': self.tmux_min_version, + 'vmax': self.tmux_max_version, + 'incompatible': self.tmux_version_incompatible + }, + 'tmuxp': { + 'version': self.tmuxp_version, + 'vmin': self.tmuxp_min_version, + 'vmax': self.tmuxp_max_version, + 'incompatible': self.tmuxp_version_incompatible + }, + } + + self._version_check() + + + def _version_check(self): + """ + Check all dependency versions for compatibility. + """ + for dep, constraints in self.version_constraints.items(): + try: + assert self._pass_version_check(**constraints) + except AssertionError: + raise TmuxpPluginException( + 'Incompatible {dep} version: {version}. {plugin_name} ' \ + 'requires versions >={vmin} && <={vmax}.'.format( + dep=dep, + plugin_name=self.plugin_name, + **constraints + ) + ) + + print('Versions for {0} are good to go'.format(self.plugin_name)) + + def _pass_version_check(self, version, vmin, vmax, incompatible): + """ + Provide affirmative if version compatibility is correct. + """ + if vmin and version < LooseVersion(vmin): + return False + if vmax and version > LooseVersion(vmax): + return False + if version in incompatible: + return False + + return True def before_workspace_builder(self, session): """ diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 4547cce946..d313438d83 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -9,7 +9,6 @@ from __future__ import absolute_import, unicode_literals import logging -import importlib from libtmux.exc import TmuxSessionExists from libtmux.pane import Pane @@ -69,7 +68,7 @@ class WorkspaceBuilder(object): a session inside tmux (when `$TMUX` is in the env variables). """ - def __init__(self, sconf, server=None): + def __init__(self, sconf, plugins=[], server=None): """ Initialize workspace loading. @@ -78,6 +77,9 @@ def __init__(self, sconf, server=None): sconf : dict session config, includes a :py:obj:`list` of ``windows``. + plugins : list + plugins to be used for this session + server : :class:`libtmux.Server` tmux server to build session in @@ -99,7 +101,7 @@ def __init__(self, sconf, server=None): self.sconf = sconf - self.plugins = self.load_plugins() + self.plugins = plugins def session_exists(self, session_name=None): exists = self.server.has_session(session_name) @@ -109,24 +111,6 @@ def session_exists(self, session_name=None): self.session = self.server.find_where({'session_name': session_name}) return True - def load_plugins(self): - plugins = [] - if 'plugins' in self.sconf: - for plugin in self.sconf['plugins']: - try: - module_name = plugin.split('.') - module_name = '.'.join(module_name[:-1]) - plugin_name = plugin.split('.')[-1] - plugin = getattr(importlib.import_module(module_name), plugin_name) - plugins.append(plugin()) - except Exception as error: - raise exc.TmuxpException( - 'Error in loading {0}. Please make sure {0} is ' - 'installed.\n\n{1}'.format(plugin, error) - ) - - return plugins - def build(self, session=None): """ Build tmux workspace in session. From 2742381775683162fae6112f3d055b0f00ac17b2 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 24 Oct 2020 13:26:42 -0700 Subject: [PATCH 0689/2998] Finishing up the version contraints of the plugin system as well as skipping plugin load if the fail --- docs/plugin_system.rst | 21 ++--- pyproject.toml | 1 + .../pluginsystem/partials/all_pass.py | 9 +- .../partials/libtmux_version_fail.py | 31 +++++++ .../partials/test_plugin_helpers.py | 5 +- .../partials/tmux_version_fail.py | 16 ++-- .../partials/tmuxp_version_fail.py | 16 ++-- .../tmuxp_test_plugin_fail/pyproject.toml | 15 ++++ .../tmuxp_test_plugin_fail/__init__.py | 0 .../tmuxp_test_plugin_fail/plugin.py | 10 +++ .../workspacebuilder/plugin_missing_fail.yaml | 6 ++ .../plugin_versions_fail.yaml | 6 ++ tests/test_cli.py | 39 +++++++++ tests/test_plugin.py | 32 ++++++- tmuxp/cli.py | 30 +++---- tmuxp/plugin.py | 85 ++++++++++++++----- 16 files changed, 252 insertions(+), 70 deletions(-) create mode 100644 tests/fixtures/pluginsystem/partials/libtmux_version_fail.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/__init__.py create mode 100644 tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py create mode 100644 tests/fixtures/workspacebuilder/plugin_missing_fail.yaml create mode 100644 tests/fixtures/workspacebuilder/plugin_versions_fail.yaml diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 987d3fefc0..5c53b6fe88 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -89,16 +89,17 @@ The `plugin.py` file could contain something like the following: """ Initialize my custom plugin. """ - super().__init__() - - # Optional version dependency configurations: - self.plugin_name = 'tmuxp-plugin-my-tmuxp-plugin' - self.tmux_min_version = '1.8' - self.tmux_max_version = '2.4' - self.tmux_version_incompatible = ['2.3'] - self.tmuxp_min_version = '1.6.0' - self.tmuxp_max_version = '1.6.2' - self.tmuxp_version_incompatible = ['1.6.1'] + # Optional version dependency configuration. See Plugin API docs + # for all supported config parameters + config = { + 'tmuxp_min_version' = '1.6.2' + } + + TmuxpPluginInterface.__init__( + self, + plugin_name='tmuxp-plugin-my-tmuxp-plugin', + **config + ) def before_workspace_builder(self, session): session.rename_session('my-new-session-name') diff --git a/pyproject.toml b/pyproject.toml index 86fcd64eb3..4c5a1345a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,6 +74,7 @@ tmuxp-test-plugin-bs = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_ tmuxp-test-plugin-r = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/"} tmuxp-test-plugin-owc = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/"} tmuxp-test-plugin-awf = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/"} +tmuxp-test-plugin-fail = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/"} ### Coverage ### codecov = "*" diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py index 9f9dc013e4..43ea639575 100644 --- a/tests/fixtures/pluginsystem/partials/all_pass.py +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -1,17 +1,20 @@ -from .test_plugin_helpers import TestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPluginInterface -class AllVersionPassPlugin(TestTmuxpPluginInterface): +class AllVersionPassPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmuxp-plugin-my-tmuxp-plugin', 'tmux_min_version': '1.8', 'tmux_max_version': '100.0', 'tmux_version_incompatible': ['2.3'], + 'libtmux_min_version': '0.8.3', + 'libtmux_max_version': '100.0', + 'libtmux_version_incompatible': ['0.7.1'], 'tmuxp_min_version': '1.6.0', 'tmuxp_max_version': '100.0.0', 'tmuxp_version_incompatible': ['1.5.6'], 'tmux_version': '3.0', 'tmuxp_version': '1.6.0', } - TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py new file mode 100644 index 0000000000..f1564b5c26 --- /dev/null +++ b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py @@ -0,0 +1,31 @@ +from .test_plugin_helpers import MyTestTmuxpPluginInterface + + +class LibtmuxVersionFailMinPlugin(MyTestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'libtmux-min-version-fail', + 'libtmux_min_version': '0.8.3', + 'libtmux_version': '0.7.0' + } + MyTestTmuxpPluginInterface.__init__(self, config) + + +class LibtmuxVersionFailMaxPlugin(MyTestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'libtmux-max-version-fail', + 'libtmux_max_version': '3.0', + 'libtmux_version': '3.5' + } + MyTestTmuxpPluginInterface.__init__(self, config) + + +class LibtmuxVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'libtmux-incompatible-version-fail', + 'libtmux_version_incompatible': ['0.7.1'], + 'libtmux_version': '0.7.1' + } + MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py index 1b8b7ca716..f876c369ac 100644 --- a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py +++ b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py @@ -1,8 +1,9 @@ from tmuxp.plugin import TmuxpPluginInterface -class TestTmuxpPluginInterface(TmuxpPluginInterface): +class MyTestTmuxpPluginInterface(TmuxpPluginInterface): def __init__(self, config): tmux_version = config.pop('tmux_version', None) + libtmux_version = config.pop('libtmux_version', None) tmuxp_version = config.pop('tmuxp_version', None) TmuxpPluginInterface.__init__(self, **config) @@ -10,6 +11,8 @@ def __init__(self, config): # WARNING! This should not be done in anything but a test if tmux_version: self.version_constraints['tmux']['version'] = tmux_version + if libtmux_version: + self.version_constraints['libtmux']['version'] = libtmux_version if tmuxp_version: self.version_constraints['tmuxp']['version'] = tmuxp_version diff --git a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py index 243e53302d..40790cfe8e 100644 --- a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py @@ -1,27 +1,27 @@ -from .test_plugin_helpers import TestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPluginInterface -class TmuxVersionFailMinPlugin(TestTmuxpPluginInterface): +class TmuxVersionFailMinPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmux-min-version-fail', 'tmux_min_version': '1.8', 'tmux_version': '1.7' } - TestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPluginInterface.__init__(self, config) -class TmuxVersionFailMaxPlugin(TestTmuxpPluginInterface): +class TmuxVersionFailMaxPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmux-max-version-fail', - 'tmux_min_version': '3.0', + 'tmux_max_version': '3.0', 'tmux_version': '3.5' } - TestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPluginInterface.__init__(self, config) -class TmuxVersionFailIncompatiblePlugin(TestTmuxpPluginInterface): +class TmuxVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmux-incompatible-version-fail', @@ -29,4 +29,4 @@ def __init__(self): 'tmux_version': '2.3' } - TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index edf88e84f5..18415eba1e 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -1,31 +1,31 @@ -from .test_plugin_helpers import TestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPluginInterface -class TmuxpVersionFailMinPlugin(TestTmuxpPluginInterface): +class TmuxpVersionFailMinPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmuxp-min-verion-fail', 'tmuxp_min_version': '1.6.0', 'tmuxp_version': '1.5.6' } - TestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPluginInterface.__init__(self, config) -class TmuxpVersionFailMaxPlugin(TestTmuxpPluginInterface): +class TmuxpVersionFailMaxPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmuxp-max-verion-fail', - 'tmuxp_min_version': '2.0.0', + 'tmuxp_max_version': '2.0.0', 'tmuxp_version': '2.5' } - TestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPluginInterface.__init__(self, config) -class TmuxpVersionFailIncompatiblePlugin(TestTmuxpPluginInterface): +class TmuxpVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { 'plugin_name': 'tmuxp-incompatible-verion-fail', 'tmuxp_version_incompatible': ['1.5.0'], 'tmuxp_version': '1.5.0' } - TestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml new file mode 100644 index 0000000000..977cabeb3e --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "tmuxp_test_plugin_fail" +version = "0.1.0" +description = "A test plugin designed to fail to test the cli" +authors = ["Joseph Flinn "] + +[tool.poetry.dependencies] +python = "~2.7 || ^3.5" +tmuxp = "^1.6.0" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/__init__.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py new file mode 100644 index 0000000000..f5f27c61f6 --- /dev/null +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py @@ -0,0 +1,10 @@ +from tmuxp.plugin import TmuxpPluginInterface + + +class PluginFailVersion(TmuxpPluginInterface): + def __init__(self): + config = { + 'plugin_name': 'tmuxp-plugin-fail-version', + 'tmuxp_max_version': '0.0.0', + } + TmuxpPluginInterface.__init__(self, **config) \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_missing_fail.yaml b/tests/fixtures/workspacebuilder/plugin_missing_fail.yaml new file mode 100644 index 0000000000..4e1097debd --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_missing_fail.yaml @@ -0,0 +1,6 @@ +session_name: plugin-test-missing-fail +plugins: +- 'tmuxp_test_plugin_fail.plugin.PluginFailMissing' +windows: +- panes: + - echo "hey" \ No newline at end of file diff --git a/tests/fixtures/workspacebuilder/plugin_versions_fail.yaml b/tests/fixtures/workspacebuilder/plugin_versions_fail.yaml new file mode 100644 index 0000000000..e4e7a4910b --- /dev/null +++ b/tests/fixtures/workspacebuilder/plugin_versions_fail.yaml @@ -0,0 +1,6 @@ +session_name: plugin-test-version-fail +plugins: +- 'tmuxp_test_plugin_fail.plugin.PluginFailVersion' +windows: +- panes: + - echo "hey" \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index dcd0c6a8c9..9702f46878 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -979,6 +979,45 @@ def test_load_plugins(): assert plugin.__class__ in test_plugin_class_types +@pytest.mark.skip('Not sure how to clean up the tmux session this makes') +@pytest.mark.parametrize( + "cli_args,inputs", + [( + ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], + ['y\n'], + )], +) +def test_load_plugins_version_fail_skip(cli_args, inputs): + runner = CliRunner() + + results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + assert '[Loading]' in results.output + + +@pytest.mark.parametrize( + "cli_args,inputs", + [( + ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], + ['n\n'], + )], +) +def test_load_plugins_version_fail_no_skip(cli_args, inputs): + runner = CliRunner() + + results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + assert '[Not Skipping]' in results.output + + +@pytest.mark.parametrize("cli_args", [ + (['load', 'tests/fixtures/workspacebuilder/plugin_missing_fail.yaml']) +]) +def test_load_plugins_plugin_missing(cli_args): + runner = CliRunner() + + results = runner.invoke(cli.cli, cli_args) + assert '[Plugin Error]' in results.output + + def test_plugin_system_before_script(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable diff --git a/tests/test_plugin.py b/tests/test_plugin.py index fdc8b33b18..1390d95306 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -18,6 +18,11 @@ TmuxVersionFailMaxPlugin, TmuxVersionFailIncompatiblePlugin ) +from .fixtures.pluginsystem.partials.libtmux_version_fail import ( + LibtmuxVersionFailMinPlugin, + LibtmuxVersionFailMaxPlugin, + LibtmuxVersionFailIncompatiblePlugin +) from .fixtures.pluginsystem.partials.tmuxp_version_fail import ( TmuxpVersionFailMinPlugin, TmuxpVersionFailMaxPlugin, @@ -65,7 +70,7 @@ def test_tmuxp_version_fail_min(): assert('Incompatible' in error.__str__()) -def test_tmux_version_fail_max(): +def test_tmuxp_version_fail_max(): try: plugin = TmuxpVersionFailMaxPlugin() assert(False) @@ -73,9 +78,32 @@ def test_tmux_version_fail_max(): assert('Incompatible' in error.__str__()) -def test_tmux_version_fail_incompatible(): +def test_tmuxp_version_fail_incompatible(): try: plugin = TmuxpVersionFailIncompatiblePlugin() assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + +def test_libtmux_version_fail_min(): + try: + plugin = LibtmuxVersionFailMinPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_libtmux_version_fail_max(): + try: + plugin = LibtmuxVersionFailMaxPlugin() + assert(False) + except TmuxpPluginException as error: + assert('Incompatible' in error.__str__()) + + +def test_libtmux_version_fail_incompatible(): + try: + plugin = LibtmuxVersionFailIncompatiblePlugin() + assert(False) except TmuxpPluginException as error: assert('Incompatible' in error.__str__()) \ No newline at end of file diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 3045dab079..0507812927 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -387,25 +387,23 @@ def load_plugins(sconf): plugin = getattr(importlib.import_module(module_name), plugin_name) plugins.append(plugin()) except exc.TmuxpPluginException as error: - if (click.confirm( - '%s Skip?' % click.style(error, fg='orange'), default=True + if (not click.confirm( + '%sSkip loading %s?' + % (click.style(str(error), fg='yellow'), plugin_name), + default=True )): - pass + click.echo( + click.style('[Not Skipping] ', fg='yellow') + + 'Plugin verions constraint not met. Exiting...' + ) + sys.exit(1) except Exception as error: - raise exc.TmuxpException( - 'Error in loading {0}. Please make sure {0} is ' - 'installed.\n\n{1}'.format(plugin, error) + click.echo( + click.style('[Plugin Error] ', fg='red') + + "Couldn\'t load {0}\n".format(plugin) + + click.style('{0}'.format(error), fg='yellow') ) - - if not detached and ( - answer_yes - or click.confirm( - '%s is already running. Attach?' - % click.style(session_name, fg='green'), - default=True, - ) - ): - pass + sys.exit(1) return plugins diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index ad87290a5b..bc53225b28 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -1,3 +1,4 @@ +import libtmux from distutils.version import LooseVersion from libtmux.common import get_version @@ -10,6 +11,12 @@ #: Most recent version of tmux supported TMUX_MAX_VERSION = None +#: Minimum version of libtmux required to run libtmux +LIBTMUX_MIN_VERSION = '0.8.3' + +#: Most recent version of libtmux supported +LIBTMUX_MAX_VERSION = None + #: Minimum version of tmuxp required to use plugins TMUXP_MIN_VERSION = '1.6.0' @@ -23,43 +30,78 @@ def __init__(self, tmux_min_version=TMUX_MIN_VERSION, tmux_max_version=TMUX_MAX_VERSION, tmux_version_incompatible=None, + libtmux_min_version=LIBTMUX_MIN_VERSION, + libtmux_max_version=LIBTMUX_MAX_VERSION, + libtmux_version_incompatible=None, tmuxp_min_version=TMUXP_MIN_VERSION, tmuxp_max_version=TMUXP_MAX_VERSION, tmuxp_version_incompatible=None ): """ Initialize plugin interface. - """ - self.plugin_name = plugin_name - self.tmux_min_version = tmux_min_version - self.tmux_max_version = tmux_max_version - self.tmuxp_min_version = tmuxp_min_version - self.tmuxp_max_version = tmuxp_max_version + The default version values are set to the versions that the plugin + system requires. + + Parameters + ---------- + plugin_name : str + Name of the child plugin. Used in error message plugin fails to + load + + tmux_min_version : str + Min version of tmux that the plugin supports + + tmux_max_version : str + Min version of tmux that the plugin supports + + tmux_version_incompatible : list + Versions of tmux that are incompatible with the plugin - self.tmux_version_incompatible = [] - if tmux_version_incompatible: - self.tmux_version_incompatible = tmux_version_incompatible + libtmux_min_version : str + Min version of libtmux that the plugin supports + + libtmux_max_version : str + Max version of libtmux that the plugin supports + + libtmux_version_incompatible : list + Versions of libtmux that are incompatible with the plugin + + tmuxp_min_version : str + Min version of tmuxp that the plugin supports - self.tmuxp_version_incompatible = [] - if tmuxp_version_incompatible: - self.tmuxp_version_incompatible = tmuxp_version_incompatible + tmuxp_max_version : str + Max version of tmuxp that the plugin supports + tmuxp_version_incompatible : list + Versions of tmuxp that are incompatible with the plugin + + """ + self.plugin_name = plugin_name + + # Dependency versions self.tmux_version = get_version() + self.libtmux_version = libtmux.__version__ self.tmuxp_version = LooseVersion(__version__) self.version_constraints = { 'tmux': { 'version': self.tmux_version, - 'vmin': self.tmux_min_version, - 'vmax': self.tmux_max_version, - 'incompatible': self.tmux_version_incompatible + 'vmin': tmux_min_version, + 'vmax': tmux_max_version, + 'incompatible': tmux_version_incompatible if tmux_version_incompatible else [] + }, + 'libtmux': { + 'version': self.libtmux_version, + 'vmin': libtmux_min_version, + 'vmax': libtmux_max_version, + 'incompatible': libtmux_version_incompatible if libtmux_version_incompatible else [] }, 'tmuxp': { 'version': self.tmuxp_version, - 'vmin': self.tmuxp_min_version, - 'vmax': self.tmuxp_max_version, - 'incompatible': self.tmuxp_version_incompatible + 'vmin': tmuxp_min_version, + 'vmax': tmuxp_max_version, + 'incompatible': tmuxp_version_incompatible if tmuxp_version_incompatible else [] }, } @@ -75,16 +117,15 @@ def _version_check(self): assert self._pass_version_check(**constraints) except AssertionError: raise TmuxpPluginException( - 'Incompatible {dep} version: {version}. {plugin_name} ' \ - 'requires versions >={vmin} && <={vmax}.'.format( + 'Incompatible {dep} version: {version}\n{plugin_name} ' \ + 'requirements:\nmin: {vmin} | max: {vmax} | ' \ + 'incompatible: {incompatible}\n'.format( dep=dep, plugin_name=self.plugin_name, **constraints ) ) - print('Versions for {0} are good to go'.format(self.plugin_name)) - def _pass_version_check(self, version, vmin, vmax, incompatible): """ Provide affirmative if version compatibility is correct. From f63340aaa581be1618701672e3e6e14c4e979f6f Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 24 Oct 2020 13:32:35 -0700 Subject: [PATCH 0690/2998] running black over changes --- .../pluginsystem/partials/all_pass.py | 2 +- .../partials/libtmux_version_fail.py | 8 +- .../partials/test_plugin_helpers.py | 3 +- .../partials/tmux_version_fail.py | 8 +- .../partials/tmuxp_version_fail.py | 8 +- .../tmuxp_test_plugin_fail/plugin.py | 2 +- tests/test_cli.py | 38 ++++----- tests/test_plugin.py | 77 +++++++++---------- tmuxp/cli.py | 16 ++-- tmuxp/plugin.py | 72 +++++++++-------- 10 files changed, 116 insertions(+), 118 deletions(-) diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py index 43ea639575..9cd49c6f5f 100644 --- a/tests/fixtures/pluginsystem/partials/all_pass.py +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -17,4 +17,4 @@ def __init__(self): 'tmux_version': '3.0', 'tmuxp_version': '1.6.0', } - MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py index f1564b5c26..d1717fd9ca 100644 --- a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py @@ -6,7 +6,7 @@ def __init__(self): config = { 'plugin_name': 'libtmux-min-version-fail', 'libtmux_min_version': '0.8.3', - 'libtmux_version': '0.7.0' + 'libtmux_version': '0.7.0', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -16,7 +16,7 @@ def __init__(self): config = { 'plugin_name': 'libtmux-max-version-fail', 'libtmux_max_version': '3.0', - 'libtmux_version': '3.5' + 'libtmux_version': '3.5', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -26,6 +26,6 @@ def __init__(self): config = { 'plugin_name': 'libtmux-incompatible-version-fail', 'libtmux_version_incompatible': ['0.7.1'], - 'libtmux_version': '0.7.1' + 'libtmux_version': '0.7.1', } - MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py index f876c369ac..31cc55a028 100644 --- a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py +++ b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py @@ -1,5 +1,6 @@ from tmuxp.plugin import TmuxpPluginInterface + class MyTestTmuxpPluginInterface(TmuxpPluginInterface): def __init__(self, config): tmux_version = config.pop('tmux_version', None) @@ -16,4 +17,4 @@ def __init__(self, config): if tmuxp_version: self.version_constraints['tmuxp']['version'] = tmuxp_version - self._version_check() \ No newline at end of file + self._version_check() diff --git a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py index 40790cfe8e..5374e003ed 100644 --- a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py @@ -6,7 +6,7 @@ def __init__(self): config = { 'plugin_name': 'tmux-min-version-fail', 'tmux_min_version': '1.8', - 'tmux_version': '1.7' + 'tmux_version': '1.7', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -16,7 +16,7 @@ def __init__(self): config = { 'plugin_name': 'tmux-max-version-fail', 'tmux_max_version': '3.0', - 'tmux_version': '3.5' + 'tmux_version': '3.5', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -26,7 +26,7 @@ def __init__(self): config = { 'plugin_name': 'tmux-incompatible-version-fail', 'tmux_version_incompatible': ['2.3'], - 'tmux_version': '2.3' + 'tmux_version': '2.3', } - MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index 18415eba1e..20fffdcc4e 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -6,7 +6,7 @@ def __init__(self): config = { 'plugin_name': 'tmuxp-min-verion-fail', 'tmuxp_min_version': '1.6.0', - 'tmuxp_version': '1.5.6' + 'tmuxp_version': '1.5.6', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -16,7 +16,7 @@ def __init__(self): config = { 'plugin_name': 'tmuxp-max-verion-fail', 'tmuxp_max_version': '2.0.0', - 'tmuxp_version': '2.5' + 'tmuxp_version': '2.5', } MyTestTmuxpPluginInterface.__init__(self, config) @@ -26,6 +26,6 @@ def __init__(self): config = { 'plugin_name': 'tmuxp-incompatible-verion-fail', 'tmuxp_version_incompatible': ['1.5.0'], - 'tmuxp_version': '1.5.0' + 'tmuxp_version': '1.5.0', } - MyTestTmuxpPluginInterface.__init__(self, config) \ No newline at end of file + MyTestTmuxpPluginInterface.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py index f5f27c61f6..a3852f1cd7 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py @@ -7,4 +7,4 @@ def __init__(self): 'plugin_name': 'tmuxp-plugin-fail-version', 'tmuxp_max_version': '0.0.0', } - TmuxpPluginInterface.__init__(self, **config) \ No newline at end of file + TmuxpPluginInterface.__init__(self, **config) diff --git a/tests/test_cli.py b/tests/test_cli.py index 9702f46878..627ab21e48 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -982,39 +982,43 @@ def test_load_plugins(): @pytest.mark.skip('Not sure how to clean up the tmux session this makes') @pytest.mark.parametrize( "cli_args,inputs", - [( - ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], - ['y\n'], - )], + [ + ( + ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], + ['y\n'], + ) + ], ) def test_load_plugins_version_fail_skip(cli_args, inputs): runner = CliRunner() - results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) assert '[Loading]' in results.output @pytest.mark.parametrize( "cli_args,inputs", - [( - ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], - ['n\n'], - )], + [ + ( + ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], + ['n\n'], + ) + ], ) def test_load_plugins_version_fail_no_skip(cli_args, inputs): runner = CliRunner() - results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) assert '[Not Skipping]' in results.output -@pytest.mark.parametrize("cli_args", [ - (['load', 'tests/fixtures/workspacebuilder/plugin_missing_fail.yaml']) -]) +@pytest.mark.parametrize( + "cli_args", [(['load', 'tests/fixtures/workspacebuilder/plugin_missing_fail.yaml'])] +) def test_load_plugins_plugin_missing(cli_args): runner = CliRunner() - results = runner.invoke(cli.cli, cli_args) + results = runner.invoke(cli.cli, cli_args) assert '[Plugin Error]' in results.output @@ -1043,9 +1047,7 @@ def test_reattach_plugins(server): # open it detached builder = WorkspaceBuilder( - sconf=sconfig, - plugins=load_plugins(sconfig), - server=server + sconf=sconfig, plugins=load_plugins(sconfig), server=server ) builder.build() @@ -1056,4 +1058,4 @@ def test_reattach_plugins(server): proc = builder.session.cmd('display-message', '-p', "'#S'") - assert proc.stdout[0] == "'plugin_test_r'" \ No newline at end of file + assert proc.stdout[0] == "'plugin_test_r'" diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 1390d95306..a84be68be1 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2,108 +2,101 @@ """Test for tmuxp plugin api.""" from __future__ import absolute_import -import json -import os - -import pytest - -import libtmux -from libtmux.common import has_lt_version -from tmuxp.plugin import TmuxpPluginInterface from tmuxp.exc import TmuxpPluginException from .fixtures.pluginsystem.partials.all_pass import AllVersionPassPlugin from .fixtures.pluginsystem.partials.tmux_version_fail import ( TmuxVersionFailMinPlugin, TmuxVersionFailMaxPlugin, - TmuxVersionFailIncompatiblePlugin + TmuxVersionFailIncompatiblePlugin, ) from .fixtures.pluginsystem.partials.libtmux_version_fail import ( LibtmuxVersionFailMinPlugin, LibtmuxVersionFailMaxPlugin, - LibtmuxVersionFailIncompatiblePlugin + LibtmuxVersionFailIncompatiblePlugin, ) from .fixtures.pluginsystem.partials.tmuxp_version_fail import ( TmuxpVersionFailMinPlugin, TmuxpVersionFailMaxPlugin, - TmuxpVersionFailIncompatiblePlugin + TmuxpVersionFailIncompatiblePlugin, ) def test_all_pass(): try: - plugin = AllVersionPassPlugin() - assert(True) - except TmuxpPluginException as error: - assert(False) + AllVersionPassPlugin() + assert True + except TmuxpPluginException: + assert False def test_tmux_version_fail_min(): try: - plugin = TmuxVersionFailMinPlugin() - assert(False) + TmuxVersionFailMinPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_tmux_version_fail_max(): try: - plugin = TmuxVersionFailMaxPlugin() - assert(False) + TmuxVersionFailMaxPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_tmux_version_fail_incompatible(): try: - plugin = TmuxVersionFailIncompatiblePlugin() - assert(False) + TmuxVersionFailIncompatiblePlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_tmuxp_version_fail_min(): try: - plugin = TmuxpVersionFailMinPlugin() - assert(False) + TmuxpVersionFailMinPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_tmuxp_version_fail_max(): try: - plugin = TmuxpVersionFailMaxPlugin() - assert(False) + TmuxpVersionFailMaxPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_tmuxp_version_fail_incompatible(): try: - plugin = TmuxpVersionFailIncompatiblePlugin() - assert(False) + TmuxpVersionFailIncompatiblePlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() + def test_libtmux_version_fail_min(): try: - plugin = LibtmuxVersionFailMinPlugin() - assert(False) + LibtmuxVersionFailMinPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_libtmux_version_fail_max(): try: - plugin = LibtmuxVersionFailMaxPlugin() - assert(False) + LibtmuxVersionFailMaxPlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) + assert 'Incompatible' in error.__str__() def test_libtmux_version_fail_incompatible(): try: - plugin = LibtmuxVersionFailIncompatiblePlugin() - assert(False) + LibtmuxVersionFailIncompatiblePlugin() + assert False except TmuxpPluginException as error: - assert('Incompatible' in error.__str__()) \ No newline at end of file + assert 'Incompatible' in error.__str__() diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 0507812927..e390c07859 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -387,13 +387,13 @@ def load_plugins(sconf): plugin = getattr(importlib.import_module(module_name), plugin_name) plugins.append(plugin()) except exc.TmuxpPluginException as error: - if (not click.confirm( - '%sSkip loading %s?' - % (click.style(str(error), fg='yellow'), plugin_name), - default=True - )): + if not click.confirm( + '%sSkip loading %s?' + % (click.style(str(error), fg='yellow'), plugin_name), + default=True, + ): click.echo( - click.style('[Not Skipping] ', fg='yellow') + click.style('[Not Skipping] ', fg='yellow') + 'Plugin verions constraint not met. Exiting...' ) sys.exit(1) @@ -558,9 +558,7 @@ def load_workspace( try: # load WorkspaceBuilder object for tmuxp config / tmux server builder = WorkspaceBuilder( - sconf=sconfig, - plugins=load_plugins(sconfig), - server=t + sconf=sconfig, plugins=load_plugins(sconfig), server=t ) except exc.EmptyConfigException: click.echo('%s is empty or parsed no config data' % config_file, err=True) diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index bc53225b28..d165d9f68c 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -25,7 +25,8 @@ class TmuxpPluginInterface: - def __init__(self, + def __init__( + self, plugin_name='tmuxp-plugin-interface', tmux_min_version=TMUX_MIN_VERSION, tmux_max_version=TMUX_MAX_VERSION, @@ -35,18 +36,18 @@ def __init__(self, libtmux_version_incompatible=None, tmuxp_min_version=TMUXP_MIN_VERSION, tmuxp_max_version=TMUXP_MAX_VERSION, - tmuxp_version_incompatible=None + tmuxp_version_incompatible=None, ): """ Initialize plugin interface. - The default version values are set to the versions that the plugin - system requires. + The default version values are set to the versions that the plugin + system requires. Parameters ---------- plugin_name : str - Name of the child plugin. Used in error message plugin fails to + Name of the child plugin. Used in error message plugin fails to load tmux_min_version : str @@ -54,13 +55,13 @@ def __init__(self, tmux_max_version : str Min version of tmux that the plugin supports - + tmux_version_incompatible : list Versions of tmux that are incompatible with the plugin libtmux_min_version : str Min version of libtmux that the plugin supports - + libtmux_max_version : str Max version of libtmux that the plugin supports @@ -83,31 +84,36 @@ def __init__(self, self.tmux_version = get_version() self.libtmux_version = libtmux.__version__ self.tmuxp_version = LooseVersion(__version__) - + self.version_constraints = { 'tmux': { 'version': self.tmux_version, - 'vmin': tmux_min_version, + 'vmin': tmux_min_version, 'vmax': tmux_max_version, - 'incompatible': tmux_version_incompatible if tmux_version_incompatible else [] + 'incompatible': tmux_version_incompatible + if tmux_version_incompatible + else [], }, 'libtmux': { 'version': self.libtmux_version, - 'vmin': libtmux_min_version, + 'vmin': libtmux_min_version, 'vmax': libtmux_max_version, - 'incompatible': libtmux_version_incompatible if libtmux_version_incompatible else [] + 'incompatible': libtmux_version_incompatible + if libtmux_version_incompatible + else [], }, 'tmuxp': { 'version': self.tmuxp_version, - 'vmin': tmuxp_min_version, + 'vmin': tmuxp_min_version, 'vmax': tmuxp_max_version, - 'incompatible': tmuxp_version_incompatible if tmuxp_version_incompatible else [] + 'incompatible': tmuxp_version_incompatible + if tmuxp_version_incompatible + else [], }, } self._version_check() - def _version_check(self): """ Check all dependency versions for compatibility. @@ -117,12 +123,10 @@ def _version_check(self): assert self._pass_version_check(**constraints) except AssertionError: raise TmuxpPluginException( - 'Incompatible {dep} version: {version}\n{plugin_name} ' \ - 'requirements:\nmin: {vmin} | max: {vmax} | ' \ + 'Incompatible {dep} version: {version}\n{plugin_name} ' + 'requirements:\nmin: {vmin} | max: {vmax} | ' 'incompatible: {incompatible}\n'.format( - dep=dep, - plugin_name=self.plugin_name, - **constraints + dep=dep, plugin_name=self.plugin_name, **constraints ) ) @@ -136,14 +140,14 @@ def _pass_version_check(self, version, vmin, vmax, incompatible): return False if version in incompatible: return False - + return True def before_workspace_builder(self, session): """ Provide a session hook previous to creating the workspace. - This runs after the session has been created but before any of + This runs after the session has been created but before any of the windows/panes/commands are entered. Parameters @@ -187,20 +191,20 @@ def before_script(self, session): This runs after the workspace has been loaded with ``tmuxp load``. It augments instead of replaces the ``before_script`` section of the - configuration. + configuration. - This hook provides access to the LibTmux.session object for any - behavior that would be used in the ``before_script`` section of the + This hook provides access to the LibTmux.session object for any + behavior that would be used in the ``before_script`` section of the configuration file that needs access directly to the session object. - This runs after the workspace has been loaded with ``tmuxp load``. - - The hook augments, rather than replaces, the ``before_script`` section - of the configuration. While it is possible to do all of the - ``before_script`` configuration in this function, if a shell script - is currently being used for the configuration, it would be cleaner to + This runs after the workspace has been loaded with ``tmuxp load``. + + The hook augments, rather than replaces, the ``before_script`` section + of the configuration. While it is possible to do all of the + ``before_script`` configuration in this function, if a shell script + is currently being used for the configuration, it would be cleaner to continue using the script in the ``before_section``. - - If changes to the session need to be made prior to + + If changes to the session need to be made prior to anything being built, please use ``before_workspace_builder`` instead. Parameters @@ -219,4 +223,4 @@ def reattach(self, session): session : :class:`libtmux.Session` session to hook into """ - pass \ No newline at end of file + pass From f779439e6c2f85641ea1db553fac9931f498df6f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 08:28:20 -0500 Subject: [PATCH 0691/2998] Typo fix --- tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py | 6 +++--- tmuxp/cli.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index 20fffdcc4e..53c0600b6e 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -4,7 +4,7 @@ class TmuxpVersionFailMinPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { - 'plugin_name': 'tmuxp-min-verion-fail', + 'plugin_name': 'tmuxp-min-version-fail', 'tmuxp_min_version': '1.6.0', 'tmuxp_version': '1.5.6', } @@ -14,7 +14,7 @@ def __init__(self): class TmuxpVersionFailMaxPlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { - 'plugin_name': 'tmuxp-max-verion-fail', + 'plugin_name': 'tmuxp-max-version-fail', 'tmuxp_max_version': '2.0.0', 'tmuxp_version': '2.5', } @@ -24,7 +24,7 @@ def __init__(self): class TmuxpVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): def __init__(self): config = { - 'plugin_name': 'tmuxp-incompatible-verion-fail', + 'plugin_name': 'tmuxp-incompatible-version-fail', 'tmuxp_version_incompatible': ['1.5.0'], 'tmuxp_version': '1.5.0', } diff --git a/tmuxp/cli.py b/tmuxp/cli.py index e390c07859..dc0b93571f 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -7,8 +7,8 @@ """ from __future__ import absolute_import -import logging import importlib +import logging import os import sys @@ -394,7 +394,7 @@ def load_plugins(sconf): ): click.echo( click.style('[Not Skipping] ', fg='yellow') - + 'Plugin verions constraint not met. Exiting...' + + 'Plugin versions constraint not met. Exiting...' ) sys.exit(1) except Exception as error: From 823245ed3cf849091c3bf4fb31174cb6a45493a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 08:43:58 -0500 Subject: [PATCH 0692/2998] Plugin tests: Use pytest.raises and assert message contents See also: https://docs.pytest.org/en/6.1.2/reference.html#pytest-raises --- tests/test_plugin.py | 80 +++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index a84be68be1..488465e0bd 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2,101 +2,81 @@ """Test for tmuxp plugin api.""" from __future__ import absolute_import +import pytest + from tmuxp.exc import TmuxpPluginException from .fixtures.pluginsystem.partials.all_pass import AllVersionPassPlugin -from .fixtures.pluginsystem.partials.tmux_version_fail import ( - TmuxVersionFailMinPlugin, - TmuxVersionFailMaxPlugin, - TmuxVersionFailIncompatiblePlugin, -) from .fixtures.pluginsystem.partials.libtmux_version_fail import ( - LibtmuxVersionFailMinPlugin, - LibtmuxVersionFailMaxPlugin, LibtmuxVersionFailIncompatiblePlugin, + LibtmuxVersionFailMaxPlugin, + LibtmuxVersionFailMinPlugin, +) +from .fixtures.pluginsystem.partials.tmux_version_fail import ( + TmuxVersionFailIncompatiblePlugin, + TmuxVersionFailMaxPlugin, + TmuxVersionFailMinPlugin, ) from .fixtures.pluginsystem.partials.tmuxp_version_fail import ( - TmuxpVersionFailMinPlugin, - TmuxpVersionFailMaxPlugin, TmuxpVersionFailIncompatiblePlugin, + TmuxpVersionFailMaxPlugin, + TmuxpVersionFailMinPlugin, ) def test_all_pass(): - try: - AllVersionPassPlugin() - assert True - except TmuxpPluginException: - assert False + AllVersionPassPlugin() def test_tmux_version_fail_min(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxVersionFailMinPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmux-min-version-fail' in str(exc_info.value) def test_tmux_version_fail_max(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxVersionFailMaxPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmux-max-version-fail' in str(exc_info.value) def test_tmux_version_fail_incompatible(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxVersionFailIncompatiblePlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmux-incompatible-version-fail' in str(exc_info.value) def test_tmuxp_version_fail_min(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxpVersionFailMinPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmuxp-min-version-fail' in str(exc_info.value) def test_tmuxp_version_fail_max(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxpVersionFailMaxPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmuxp-max-version-fail' in str(exc_info.value) def test_tmuxp_version_fail_incompatible(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: TmuxpVersionFailIncompatiblePlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'tmuxp-incompatible-version-fail' in str(exc_info.value) def test_libtmux_version_fail_min(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: LibtmuxVersionFailMinPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'libtmux-min-version-fail' in str(exc_info.value) def test_libtmux_version_fail_max(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: LibtmuxVersionFailMaxPlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'libtmux-max-version-fail' in str(exc_info.value) def test_libtmux_version_fail_incompatible(): - try: + with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: LibtmuxVersionFailIncompatiblePlugin() - assert False - except TmuxpPluginException as error: - assert 'Incompatible' in error.__str__() + assert 'libtmux-incompatible-version-fail' in str(exc_info.value) From ceb7b6b16acdece0cefd4722ed486c7f8a2b974e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 31 Oct 2020 08:53:04 -0500 Subject: [PATCH 0693/2998] Rename PluginInterface -> Plugin --- docs/plugin_system.rst | 16 ++++++++-------- tests/fixtures/pluginsystem/partials/all_pass.py | 6 +++--- .../partials/libtmux_version_fail.py | 14 +++++++------- .../pluginsystem/partials/test_plugin_helpers.py | 6 +++--- .../pluginsystem/partials/tmux_version_fail.py | 14 +++++++------- .../pluginsystem/partials/tmuxp_version_fail.py | 14 +++++++------- .../tmuxp_test_plugin_awf/plugin.py | 4 ++-- .../tmuxp_test_plugin_bs/plugin.py | 4 ++-- .../tmuxp_test_plugin_bwb/plugin.py | 4 ++-- .../tmuxp_test_plugin_fail/plugin.py | 6 +++--- .../tmuxp_test_plugin_owc/plugin.py | 4 ++-- .../tmuxp_test_plugin_r/plugin.py | 4 ++-- tmuxp/plugin.py | 9 +++++---- 13 files changed, 53 insertions(+), 52 deletions(-) diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 5c53b6fe88..8cf50b44ed 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -81,10 +81,10 @@ The `plugin.py` file could contain something like the following: .. code-block:: python - from tmuxp.plugin import TmuxpPluginInterface + from tmuxp.plugin import TmuxpPlugin import datetime - class MyTmuxpPlugin(TmuxpPluginInterface): + class MyTmuxpPlugin(TmuxpPlugin): def __init__(self): """ Initialize my custom plugin. @@ -95,7 +95,7 @@ The `plugin.py` file could contain something like the following: 'tmuxp_min_version' = '1.6.2' } - TmuxpPluginInterface.__init__( + TmuxpPlugin.__init__( self, plugin_name='tmuxp-plugin-my-tmuxp-plugin', **config @@ -123,8 +123,8 @@ in a configuration file like the following: Plugin API ---------- -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_workspace_builder -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.on_window_create -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.after_window_finished -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.before_script -.. automethod:: tmuxp.plugin.TmuxpPluginInterface.reattach \ No newline at end of file +.. automethod:: tmuxp.plugin.TmuxpPlugin.before_workspace_builder +.. automethod:: tmuxp.plugin.TmuxpPlugin.on_window_create +.. automethod:: tmuxp.plugin.TmuxpPlugin.after_window_finished +.. automethod:: tmuxp.plugin.TmuxpPlugin.before_script +.. automethod:: tmuxp.plugin.TmuxpPlugin.reattach \ No newline at end of file diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py index 9cd49c6f5f..a19ade914a 100644 --- a/tests/fixtures/pluginsystem/partials/all_pass.py +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -1,7 +1,7 @@ -from .test_plugin_helpers import MyTestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPlugin -class AllVersionPassPlugin(MyTestTmuxpPluginInterface): +class AllVersionPassPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-plugin-my-tmuxp-plugin', @@ -17,4 +17,4 @@ def __init__(self): 'tmux_version': '3.0', 'tmuxp_version': '1.6.0', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py index d1717fd9ca..8e7535cab1 100644 --- a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py @@ -1,31 +1,31 @@ -from .test_plugin_helpers import MyTestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPlugin -class LibtmuxVersionFailMinPlugin(MyTestTmuxpPluginInterface): +class LibtmuxVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'libtmux-min-version-fail', 'libtmux_min_version': '0.8.3', 'libtmux_version': '0.7.0', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class LibtmuxVersionFailMaxPlugin(MyTestTmuxpPluginInterface): +class LibtmuxVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'libtmux-max-version-fail', 'libtmux_max_version': '3.0', 'libtmux_version': '3.5', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class LibtmuxVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): +class LibtmuxVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'libtmux-incompatible-version-fail', 'libtmux_version_incompatible': ['0.7.1'], 'libtmux_version': '0.7.1', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py index 31cc55a028..d58eca8dd8 100644 --- a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py +++ b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py @@ -1,13 +1,13 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class MyTestTmuxpPluginInterface(TmuxpPluginInterface): +class MyTestTmuxpPlugin(TmuxpPlugin): def __init__(self, config): tmux_version = config.pop('tmux_version', None) libtmux_version = config.pop('libtmux_version', None) tmuxp_version = config.pop('tmuxp_version', None) - TmuxpPluginInterface.__init__(self, **config) + TmuxpPlugin.__init__(self, **config) # WARNING! This should not be done in anything but a test if tmux_version: diff --git a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py index 5374e003ed..19ffbb1e08 100644 --- a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py @@ -1,27 +1,27 @@ -from .test_plugin_helpers import MyTestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPlugin -class TmuxVersionFailMinPlugin(MyTestTmuxpPluginInterface): +class TmuxVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmux-min-version-fail', 'tmux_min_version': '1.8', 'tmux_version': '1.7', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class TmuxVersionFailMaxPlugin(MyTestTmuxpPluginInterface): +class TmuxVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmux-max-version-fail', 'tmux_max_version': '3.0', 'tmux_version': '3.5', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class TmuxVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): +class TmuxVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmux-incompatible-version-fail', @@ -29,4 +29,4 @@ def __init__(self): 'tmux_version': '2.3', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index 53c0600b6e..05cbd4ce05 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -1,31 +1,31 @@ -from .test_plugin_helpers import MyTestTmuxpPluginInterface +from .test_plugin_helpers import MyTestTmuxpPlugin -class TmuxpVersionFailMinPlugin(MyTestTmuxpPluginInterface): +class TmuxpVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-min-version-fail', 'tmuxp_min_version': '1.6.0', 'tmuxp_version': '1.5.6', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class TmuxpVersionFailMaxPlugin(MyTestTmuxpPluginInterface): +class TmuxpVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-max-version-fail', 'tmuxp_max_version': '2.0.0', 'tmuxp_version': '2.5', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) -class TmuxpVersionFailIncompatiblePlugin(MyTestTmuxpPluginInterface): +class TmuxpVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-incompatible-version-fail', 'tmuxp_version_incompatible': ['1.5.0'], 'tmuxp_version': '1.5.0', } - MyTestTmuxpPluginInterface.__init__(self, config) + MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index 2932cd4482..442f86e267 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -1,7 +1,7 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginAfterWindowFinished(TmuxpPluginInterface): +class PluginAfterWindowFinished(TmuxpPlugin): def __init__(self): self.message = '[+] This is the Tmuxp Test Plugin' diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index 0f0a645640..98692ac9f3 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -1,7 +1,7 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginBeforeScript(TmuxpPluginInterface): +class PluginBeforeScript(TmuxpPlugin): def __init__(self): self.message = '[+] This is the Tmuxp Test Plugin' diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py index 2ab37a2ac1..78fd68f28b 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py @@ -1,7 +1,7 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginBeforeWorkspaceBuilder(TmuxpPluginInterface): +class PluginBeforeWorkspaceBuilder(TmuxpPlugin): def __init__(self): self.message = '[+] This is the Tmuxp Test Plugin' diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py index a3852f1cd7..abe56e46c7 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py @@ -1,10 +1,10 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginFailVersion(TmuxpPluginInterface): +class PluginFailVersion(TmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-plugin-fail-version', 'tmuxp_max_version': '0.0.0', } - TmuxpPluginInterface.__init__(self, **config) + TmuxpPlugin.__init__(self, **config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index 6fae97dd1c..2ba059cd4d 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -1,7 +1,7 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginOnWindowCreate(TmuxpPluginInterface): +class PluginOnWindowCreate(TmuxpPlugin): def __init__(self): self.message = '[+] This is the Tmuxp Test Plugin' diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py index d54b7ef84c..ccf251142a 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -1,7 +1,7 @@ -from tmuxp.plugin import TmuxpPluginInterface +from tmuxp.plugin import TmuxpPlugin -class PluginReattach(TmuxpPluginInterface): +class PluginReattach(TmuxpPlugin): def __init__(self): self.message = '[+] This is the Tmuxp Test Plugin' diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index d165d9f68c..759e0bb471 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -1,5 +1,6 @@ -import libtmux from distutils.version import LooseVersion + +import libtmux from libtmux.common import get_version from .__about__ import __version__ @@ -24,10 +25,10 @@ TMUXP_MAX_VERSION = None -class TmuxpPluginInterface: +class TmuxpPlugin: def __init__( self, - plugin_name='tmuxp-plugin-interface', + plugin_name='tmuxp-plugin', tmux_min_version=TMUX_MIN_VERSION, tmux_max_version=TMUX_MAX_VERSION, tmux_version_incompatible=None, @@ -39,7 +40,7 @@ def __init__( tmuxp_version_incompatible=None, ): """ - Initialize plugin interface. + Initialize plugin. The default version values are set to the versions that the plugin system requires. From b1c4454d19904c1ed7ca73da2c49aca756b40f5b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 15:55:04 -0600 Subject: [PATCH 0694/2998] Update CHANGES --- CHANGES | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 08fd505258..04245cb552 100644 --- a/CHANGES +++ b/CHANGES @@ -10,11 +10,15 @@ current tmuxp 1.7.0a1 (2020-11-07) -------------------------- -- :issue:`530` Add plugin system for user customization of tmuxp -- :issue:`530` Add tests for the plugin system -- :issue:`530` Update existing tests for the plugin system -- :issue:`530` Add the plugin interface to the tmuxp package -- :issue:`530` Add in depth documentation for the plugin system +- :issue:`530` Plugin system + + - Add plugin system for user customization of tmuxp + - Add tests for the plugin system + - Update existing tests for the plugin system + - Add the plugin interface to the tmuxp package + - Add in depth documentation for the plugin system + + Thank you @joseph-flinn! tmuxp 1.6.1 (2020-11-07) ------------------------ From 19acf41b843ebe558d44c0766f858e726e04d8a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 17:04:44 -0600 Subject: [PATCH 0695/2998] docs(CHANGES): Add note about 1.6.1 --- CHANGES | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 04245cb552..801c57abee 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,8 @@ tmuxp 1.7.0a1 (2020-11-07) Thank you @joseph-flinn! +.. _v1.6.1: + tmuxp 1.6.1 (2020-11-07) ------------------------ - :issue:`641` Improvements to ``shell`` @@ -37,17 +39,17 @@ tmuxp 1.6.1 (2020-11-07) - ``--pdb``: Use plain old ``breakpoint()`` (python 3.7+) or ``pdb.set_trace`` - ``--code``: Drop into ``code.interact``, accepts ``--use-pythonrc`` - - ``--bpython``: Drop into bpython - - ``--ipython``: Drop into ipython - - ``--ptpython``: Drop into ptpython, accepts ``--use-vi-mode`` - - ``--ptipython``: Drop into ipython + ptpython, accepts + - ``--bpython``: Drop into `bpython`_ + - ``--ipython``: Drop into `ipython`_ + - ``--ptpython``: Drop into `ptpython`_, accepts ``--use-vi-mode`` + - ``--ptipython``: Drop into `ipython`_ + `ptpython`_, accepts ``--use-vi-mode`` .. _django-extensions: https://github.com/django-extensions/django-extensions tmuxp 1.6.0 (2020-11-06) ------------------------ -- :issue:`636` New command: ``tmuxp shell`` and :issue:`638` ``tmuxp shell_plus`` +- :issue:`636` + :issue:`638` New command: ``tmuxp shell`` Automatically preloads session, window, and pane via `libtmux`_ api objects and makes them available in a python console. @@ -55,6 +57,11 @@ tmuxp 1.6.0 (2020-11-06) .. image:: _static/tmuxp-shell.gif :width: 100% + As of :ref:`1.6.1 (above) `, ``tmuxp shell`` will find the most + feature-rich shell available. If you have `ipython`_, `ptpython`_, or + `bpython`_ available, it will be selected automatically. Pass ``--pdb`` + to use standard library pdb, or ``--code`` to use ``code.interact``. + In python 3.7+, supports ``PYTHONBREAKPOINT``: .. code-block:: sh @@ -81,7 +88,9 @@ tmuxp 1.6.0 (2020-11-06) $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW - ``tmuxp shell_plus`` has autocompletion +.. _bpython: https://bpython-interpreter.org/ +.. _ipython: https://ipython.org/ +.. _ptpython: https://github.com/prompt-toolkit/ptpython tmuxp 1.5.8 (2020-10-31) ------------------------ From bcbb80dc3c507dc46ac870b2103a54f869104675 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 7 Nov 2020 17:12:39 -0600 Subject: [PATCH 0696/2998] docs(CHANGES): Link to libtmux API --- CHANGES | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 801c57abee..adb3fefda4 100644 --- a/CHANGES +++ b/CHANGES @@ -52,7 +52,8 @@ tmuxp 1.6.0 (2020-11-06) - :issue:`636` + :issue:`638` New command: ``tmuxp shell`` Automatically preloads session, window, and pane via `libtmux`_ - api objects and makes them available in a python console. + :ref:`API objects ` and makes them available in a python + console. .. image:: _static/tmuxp-shell.gif :width: 100% From 6d54799503c551baadb2c13de7921fa41470a9a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 08:04:19 -0600 Subject: [PATCH 0697/2998] Update poetry lockfile --- poetry.lock | 136 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 122 insertions(+), 14 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3aa1020cd8..f9e5285a7d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -479,20 +479,20 @@ description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "21.4.0" +version = "21.5.0" [package.dependencies] -SecretStorage = ">=3" +SecretStorage = ">=3.2" jeepney = ">=0.4.2" pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" [package.dependencies.importlib-metadata] python = "<3.8" -version = "*" +version = ">=1" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] category = "main" @@ -608,7 +608,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.8.0" +version = "0.8.1" [[package]] category = "dev" @@ -1005,10 +1005,10 @@ marker = "sys_platform == \"linux\"" name = "secretstorage" optional = false python-versions = ">=3.5" -version = "3.1.2" +version = "3.2.0" [package.dependencies] -cryptography = "*" +cryptography = ">=2.0" jeepney = ">=0.4.2" [[package]] @@ -1196,6 +1196,108 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-awf" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.0.2" + +[package.dependencies] +tmuxp = "^1.6.0" + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf" + +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-bs" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.0.2" + +[package.dependencies] +tmuxp = "^1.6.0." + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs" + +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-bwb" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.0.2" + +[package.dependencies] +tmuxp = "^1.6.0" + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb" + +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-fail" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.1.0" + +[package.dependencies] +tmuxp = "^1.6.0" + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail" + +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-owc" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.0.2" + +[package.dependencies] +tmuxp = "^1.6.0" + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc" + +[[package]] +category = "dev" +description = "" +develop = true +name = "tmuxp-test-plugin-r" +optional = false +python-versions = "~2.7 || ^3.5" +version = "0.0.2" + +[package.dependencies] +tmuxp = "^1.6.0" + +[package.source] +reference = "" +type = "directory" +url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r" + [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1361,7 +1463,7 @@ lint = [] test = [] [metadata] -content-hash = "77432007847ff3d4dfb7b62412e8db50dfd30076ba6bb1e019851c7b0502e7ed" +content-hash = "b2634966ff0baa0d081c246b681bf7794a19c518e81ea6c5f5f43ec9543c1cf0" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1602,8 +1704,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-21.4.0-py3-none-any.whl", hash = "sha256:4e34ea2fdec90c1c43d6610b5a5fafa1b9097db1802948e90caf5763974b8f8d"}, - {file = "keyring-21.4.0.tar.gz", hash = "sha256:9aeadd006a852b78f4b4ef7c7556c2774d2432bbef8ee538a3e9089ac8b11466"}, + {file = "keyring-21.5.0-py3-none-any.whl", hash = "sha256:12de23258a95f3b13e5b167f7a641a878e91eab8ef16fafc077720a95e6115bb"}, + {file = "keyring-21.5.0.tar.gz", hash = "sha256:207bd66f2a9881c835dad653da04e196c678bf104f8252141d2d3c4f31051579"}, ] libtmux = [ {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, @@ -1672,8 +1774,8 @@ pathlib2 = [ {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] pathspec = [ - {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, - {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ {file = "Pillow-6.2.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:834dd023b7f987d6b700ad93dc818098d7eb046bd445e9992b3093c6f9d7a95f"}, @@ -1905,8 +2007,8 @@ scandir = [ {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, ] secretstorage = [ - {file = "SecretStorage-3.1.2-py3-none-any.whl", hash = "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b"}, - {file = "SecretStorage-3.1.2.tar.gz", hash = "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6"}, + {file = "SecretStorage-3.2.0-py3-none-any.whl", hash = "sha256:ed5279d788af258e4676fa26b6efb6d335a31f1f9f529b6f1e200f388fac33e1"}, + {file = "SecretStorage-3.2.0.tar.gz", hash = "sha256:46305c3847ee3f7252b284e0eee5590fa6341c891104a2fd2313f8798c615a82"}, ] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, @@ -1954,6 +2056,12 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] +tmuxp-test-plugin-awf = [] +tmuxp-test-plugin-bs = [] +tmuxp-test-plugin-bwb = [] +tmuxp-test-plugin-fail = [] +tmuxp-test-plugin-owc = [] +tmuxp-test-plugin-r = [] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, From f3a5b2143a60a1e71791f1bf05d753cb8a7770e7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 08:13:21 -0600 Subject: [PATCH 0698/2998] Update tests --- tests/test_cli.py | 11 +++++------ tmuxp/util.py | 5 ++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 627ab21e48..f4c1c139eb 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,26 +7,25 @@ import pytest -import kaptan - import click +import kaptan from click.testing import CliRunner +from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder import libtmux from libtmux.common import has_lt_version from libtmux.exc import LibTmuxException from tmuxp import cli, config, exc from tmuxp.cli import ( + _reattach, command_ls, get_config_dir, is_pure_name, + load_plugins, load_workspace, scan_config, - _reattach, - load_plugins, ) from tmuxp.workspacebuilder import WorkspaceBuilder -from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder from .fixtures._util import curjoin, loadfixture @@ -538,7 +537,7 @@ def test_shell( {}, {}, LibTmuxException, - r'.*DoesNotExist\s\(No such file or directory\).*', + r'.*DoesNotExist.*', ), ( [ diff --git a/tmuxp/util.py b/tmuxp/util.py index 6cf66b68ce..249b23f473 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -83,7 +83,10 @@ def raise_if_tmux_not_running(server): try: server.sessions except LibTmuxException as e: - if 'No such file or directory' in str(e): + if any( + needle in str(e) + for needle in ['No such file or directory', 'no server running on'] + ): raise LibTmuxException( 'no tmux session found. Start a tmux session and try again. \n' 'Original error: ' + str(e) From 3c25058e61801b17aa93973cf2f2cebf6ace3c19 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 11:15:28 -0800 Subject: [PATCH 0699/2998] running black over changes trying monkey patch in debug-info test testing parts of the debug-info command test to narrow down problem removing os specifics from debug-info to see if the python ones come through python internals only testing adding SHELL back in adding SHELL to debug_info_test via monkeypatch adding python version back in Adding os variables back in --- tests/test_cli.py | 4 +++- tmuxp/cli.py | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 1e3e0cc000..c60d3b528c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -956,7 +956,9 @@ def test_ls_cli(monkeypatch, tmpdir): assert cli_output == '\n'.join(stems) + '\n' -def test_debug_info_cli(): +def test_debug_info_cli(monkeypatch, tmpdir): + monkeypatch.setenv('SHELL', '/bin/bash') + runner = CliRunner() cli_output = runner.invoke(command_debug_info).output assert 'environment' in cli_output diff --git a/tmuxp/cli.py b/tmuxp/cli.py index a04fe5c633..9b3dcb2a81 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -24,6 +24,7 @@ ) from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server + from libtmux import __version__ as libtmux_version from . import config, exc, log, util, __file__ as tmuxp_path @@ -1085,10 +1086,12 @@ def format_tmux_resp(std_resp): """ Format tmux command response for tmuxp stdout. """ - return '\n'.join([ - '\n'.join(prepend_tab(std_resp.stdout)), - click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), - ]) + return '\n'.join( + [ + '\n'.join(prepend_tab(std_resp.stdout)), + click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), + ] + ) output = [ output_break(), From 5efacb05d20d85f42f949d5de7fe2bac8ea1f58e Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 7 Nov 2020 13:20:33 -0800 Subject: [PATCH 0700/2998] changing from os to platform for better system data coverage removing version from uname output since it is on the next line --- tmuxp/cli.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 9b3dcb2a81..72e79ce624 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -9,6 +9,7 @@ import logging import os +import platform import sys import click @@ -1099,10 +1100,10 @@ def format_tmux_resp(std_resp): % '\n'.join( prepend_tab( [ - 'system: %s' % os.uname().sysname, - 'arch: %s' % os.uname().machine, - 'os: {0} {1}'.format(os.uname().nodename, os.uname().version), - 'kernel: %s' % os.uname().release, + 'dist: %s' % platform.platform(), + 'arch: %s' % platform.machine(), + 'uname: %s' % '; '.join(platform.uname()[:3]), + 'version: %s' % platform.version(), ] ) ), From 6444bb9c6e1170a10a456c02aa407e4d5a547c3a Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 8 Nov 2020 09:08:36 -0800 Subject: [PATCH 0701/2998] updating the version --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 303d32cc86..56bd8985bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.7.0" +version = "1.6.2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 035d1fd44a..eaa33c135f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0' +__version__ = '1.6.2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 3ea71ffb10d99b03d8c137cb02f5813bb27d0e8a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 08:13:21 -0600 Subject: [PATCH 0702/2998] Update tests --- tests/test_cli.py | 4 ++-- tmuxp/util.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index c60d3b528c..303370a016 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -15,8 +15,8 @@ from libtmux.exc import LibTmuxException from tmuxp import cli, config, exc from tmuxp.cli import ( - command_ls, command_debug_info, + command_ls, get_config_dir, is_pure_name, load_workspace, @@ -533,7 +533,7 @@ def test_shell( {}, {}, LibTmuxException, - r'.*DoesNotExist\s\(No such file or directory\).*', + r'.*DoesNotExist.*', ), ( [ diff --git a/tmuxp/util.py b/tmuxp/util.py index 6cf66b68ce..249b23f473 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -83,7 +83,10 @@ def raise_if_tmux_not_running(server): try: server.sessions except LibTmuxException as e: - if 'No such file or directory' in str(e): + if any( + needle in str(e) + for needle in ['No such file or directory', 'no server running on'] + ): raise LibTmuxException( 'no tmux session found. Start a tmux session and try again. \n' 'Original error: ' + str(e) From acfc05076ec3d1b18dd484b8cd98618990c57827 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 14:30:40 -0600 Subject: [PATCH 0703/2998] Update changes for 1.6.2 --- CHANGES | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 5529eb9d67..fcc69453b0 100644 --- a/CHANGES +++ b/CHANGES @@ -6,9 +6,13 @@ Here you can find the recent changes to tmuxp current ------- -- :issue:`352` New command ``tmuxp debug-info`` for creating github issues - *Insert changes/features/fixes for next release here* +tmuxp 1.6.2 (2020-11-08) +------------------------ +- :issue:`643` New command ``tmuxp debug-info`` for creating github + issues, fixes :issue:`352`. Thank you @joseph-flinn! + tmuxp 1.6.1 (2020-11-07) ------------------------ - :issue:`641` Improvements to ``shell`` From 88581798ed0d3541a7b4a3574614120d65f7ddeb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 14:33:24 -0600 Subject: [PATCH 0704/2998] docs(README): RST Fixes --- README.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 5ed311bb74..91a5179e04 100644 --- a/README.rst +++ b/README.rst @@ -178,19 +178,19 @@ You can auto confirm the prompt. In this case no preview will be shown. Debug Info ---------- +---------- -Collect system info to submit with a Github issue +Collect system info to submit with a Github issue: .. code-block:: sh - $ tmuxp debug-info - -------------------------- - environment: - system: Linux - arch: x86_64 - ... + $ tmuxp debug-info + ------------------ + environment: + system: Linux + arch: x86_64 + # ... so on Docs / Reading material ----------------------- From 0b492c586910725a771ca8b58861e6ceca8dd600 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 8 Nov 2020 14:37:59 -0600 Subject: [PATCH 0705/2998] Tag v1.7.0a2 --- CHANGES | 4 ++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 8d67db37a6..d18cd72564 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,10 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.7.0a2 (2020-11-08) +-------------------------- +- Port ``tmuxp debug-info`` from :issue:`643` from via v1.6.2 + tmuxp 1.7.0a1 (2020-11-07) -------------------------- - :issue:`530` Plugin system diff --git a/pyproject.toml b/pyproject.toml index 4c5a1345a8..3c216516a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.7.0a1" +version = "1.7.0a2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 7242004d0b..56293145fb 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0a1' +__version__ = '1.7.0a2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From c0d27c5312890c3a52ef6cc613f9b2f46d347932 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Mon, 9 Nov 2020 22:06:45 -0800 Subject: [PATCH 0706/2998] adding in TmuxpPlugin.__init__ documentation to the online docs --- docs/plugin_system.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 8cf50b44ed..31aad33628 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -123,8 +123,9 @@ in a configuration file like the following: Plugin API ---------- +.. automethod:: tmuxp.plugin.TmuxpPlugin.__init__ .. automethod:: tmuxp.plugin.TmuxpPlugin.before_workspace_builder .. automethod:: tmuxp.plugin.TmuxpPlugin.on_window_create .. automethod:: tmuxp.plugin.TmuxpPlugin.after_window_finished .. automethod:: tmuxp.plugin.TmuxpPlugin.before_script -.. automethod:: tmuxp.plugin.TmuxpPlugin.reattach \ No newline at end of file +.. automethod:: tmuxp.plugin.TmuxpPlugin.reattach From 9150529ec543159b3bf33b4fffacb5064c2117ae Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Nov 2020 07:52:17 -0600 Subject: [PATCH 0707/2998] Update lockfile --- poetry.lock | 127 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 52 deletions(-) diff --git a/poetry.lock b/poetry.lock index f9e5285a7d..29b68cbfe6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -65,7 +65,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" +version = "2.9.0" [package.dependencies] pytz = ">=2015.7" @@ -129,7 +129,7 @@ description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false python-versions = "*" -version = "2020.6.20" +version = "2020.11.8" [[package]] category = "dev" @@ -255,7 +255,7 @@ marker = "python_version >= \"3.6\" and python_version < \"3.7\"" name = "dataclasses" optional = false python-versions = ">=3.6, <3.7" -version = "0.7" +version = "0.8" [[package]] category = "dev" @@ -441,11 +441,11 @@ description = "Low-level, pure Python DBus protocol wrapper." marker = "sys_platform == \"linux\"" name = "jeepney" optional = false -python-versions = ">=3.5" -version = "0.4.3" +python-versions = ">=3.6" +version = "0.5.0" [package.extras] -dev = ["testpath"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] category = "dev" @@ -947,7 +947,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.10.28" +version = "2020.11.13" [[package]] category = "dev" @@ -955,13 +955,13 @@ description = "Python HTTP for Humans." name = "requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" +version = "2.25.0" [package.dependencies] certifi = ">=2017.4.17" chardet = ">=3.0.2,<4" idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" +urllib3 = ">=1.21.1,<1.27" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] @@ -1065,7 +1065,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.3.0" +version = "3.3.1" [package.dependencies] Jinja2 = ">=2.3" @@ -1394,7 +1394,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.11" +version = "1.26.2" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1493,8 +1493,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] babel = [ - {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, - {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, + {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"}, + {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"}, ] "backports.functools-lru-cache" = [ {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, @@ -1508,8 +1508,8 @@ bleach = [ {file = "bleach-3.2.1.tar.gz", hash = "sha256:52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080"}, ] certifi = [ - {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, - {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, + {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, + {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, ] cffi = [ {file = "cffi-1.14.3-2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc"}, @@ -1639,8 +1639,8 @@ cryptography = [ {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, ] dataclasses = [ - {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, - {file = "dataclasses-0.7.tar.gz", hash = "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6"}, + {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, + {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, @@ -1693,8 +1693,8 @@ isort = [ {file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"}, ] jeepney = [ - {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, - {file = "jeepney-0.4.3.tar.gz", hash = "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e"}, + {file = "jeepney-0.5.0-py3-none-any.whl", hash = "sha256:e0e057fe2069a54257de32eb26cf14aac5fa90f5836f49926009a5022fb1e31a"}, + {file = "jeepney-0.5.0.tar.gz", hash = "sha256:2531d17ccfb3485d4eaee03c1a19a75f28b3ac0fbb5a1b683b77b820e5b0f509"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -1953,37 +1953,51 @@ recommonmark = [ {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ - {file = "regex-2020.10.28-cp27-cp27m-win32.whl", hash = "sha256:4b5a9bcb56cc146c3932c648603b24514447eafa6ce9295234767bf92f69b504"}, - {file = "regex-2020.10.28-cp27-cp27m-win_amd64.whl", hash = "sha256:c13d311a4c4a8d671f5860317eb5f09591fbe8259676b86a85769423b544451e"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c8a2b7ccff330ae4c460aff36626f911f918555660cc28163417cb84ffb25789"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4afa350f162551cf402bfa3cd8302165c8e03e689c897d185f16a167328cc6dd"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b88fa3b8a3469f22b4f13d045d9bd3eda797aa4e406fde0a2644bc92bbdd4bdd"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f43109822df2d3faac7aad79613f5f02e4eab0fc8ad7932d2e70e2a83bd49c26"}, - {file = "regex-2020.10.28-cp36-cp36m-win32.whl", hash = "sha256:8092a5a06ad9a7a247f2a76ace121183dc4e1a84c259cf9c2ce3bbb69fac3582"}, - {file = "regex-2020.10.28-cp36-cp36m-win_amd64.whl", hash = "sha256:49461446b783945597c4076aea3f49aee4b4ce922bd241e4fcf62a3e7c61794c"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8ca9dca965bd86ea3631b975d63b0693566d3cc347e55786d5514988b6f5b84c"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ea37320877d56a7f0a1e6a625d892cf963aa7f570013499f5b8d5ab8402b5625"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:3a5f08039eee9ea195a89e180c5762bfb55258bfb9abb61a20d3abee3b37fd12"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:cb905f3d2e290a8b8f1579d3984f2cfa7c3a29cc7cba608540ceeed18513f520"}, - {file = "regex-2020.10.28-cp37-cp37m-win32.whl", hash = "sha256:a62162be05edf64f819925ea88d09d18b09bebf20971b363ce0c24e8b4aa14c0"}, - {file = "regex-2020.10.28-cp37-cp37m-win_amd64.whl", hash = "sha256:03855ee22980c3e4863dc84c42d6d2901133362db5daf4c36b710dd895d78f0a"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux1_i686.whl", hash = "sha256:625116aca6c4b57c56ea3d70369cacc4d62fead4930f8329d242e4fe7a58ce4b"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dc522e25e57e88b4980d2bdd334825dbf6fa55f28a922fc3bfa60cc09e5ef53"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:119e0355dbdd4cf593b17f2fc5dbd4aec2b8899d0057e4957ba92f941f704bf5"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:cfcf28ed4ce9ced47b9b9670a4f0d3d3c0e4d4779ad4dadb1ad468b097f808aa"}, - {file = "regex-2020.10.28-cp38-cp38-win32.whl", hash = "sha256:06b52815d4ad38d6524666e0d50fe9173533c9cc145a5779b89733284e6f688f"}, - {file = "regex-2020.10.28-cp38-cp38-win_amd64.whl", hash = "sha256:c3466a84fce42c2016113101018a9981804097bacbab029c2d5b4fcb224b89de"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c2c6c56ee97485a127555c9595c069201b5161de9d05495fbe2132b5ac104786"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1ec66700a10e3c75f1f92cbde36cca0d3aaee4c73dfa26699495a3a30b09093c"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:11116d424734fe356d8777f89d625f0df783251ada95d6261b4c36ad27a394bb"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f1fce1e4929157b2afeb4bb7069204d4370bab9f4fc03ca1fbec8bd601f8c87d"}, - {file = "regex-2020.10.28-cp39-cp39-win32.whl", hash = "sha256:832339223b9ce56b7b15168e691ae654d345ac1635eeb367ade9ecfe0e66bee0"}, - {file = "regex-2020.10.28-cp39-cp39-win_amd64.whl", hash = "sha256:654c1635f2313d0843028487db2191530bca45af61ca85d0b16555c399625b0e"}, - {file = "regex-2020.10.28.tar.gz", hash = "sha256:dd3e6547ecf842a29cf25123fbf8d2461c53c8d37aa20d87ecee130c89b7079b"}, + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, ] requests = [ - {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, - {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, + {file = "requests-2.25.0-py2.py3-none-any.whl", hash = "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998"}, + {file = "requests-2.25.0.tar.gz", hash = "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -2021,8 +2035,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.3.0-py3-none-any.whl", hash = "sha256:3abdb2c57a65afaaa4f8573cbabd5465078eb6fd282c1e4f87f006875a7ec0c7"}, - {file = "Sphinx-3.3.0.tar.gz", hash = "sha256:1c21e7c5481a31b531e6cbf59c3292852ccde175b504b00ce2ff0b8f4adc3649"}, + {file = "Sphinx-3.3.1-py3-none-any.whl", hash = "sha256:d4e59ad4ea55efbb3c05cde3bfc83bfc14f0c95aa95c3d75346fcce186a47960"}, + {file = "Sphinx-3.3.1.tar.gz", hash = "sha256:1e8d592225447104d1172be415bc2972bd1357e3e12fdc76edf2261105db4300"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -2084,19 +2098,28 @@ typed-ast = [ {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fcf135e17cc74dbfbc05894ebca928ffeb23d9790b3167a674921db19082401f"}, {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f208eb7aff048f6bea9586e61af041ddf7f9ade7caed625742af423f6bae3298"}, {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7e4c9d7658aaa1fc80018593abdf8598bf91325af6af5cce4ce7c73bc45ea53d"}, {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"}, + {file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"}, + {file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"}, {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing = [ @@ -2109,8 +2132,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, - {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, + {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, + {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, From e0749e63ae8c06019297e8bda5443ac4c463359b Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 15 Nov 2020 11:13:44 -0800 Subject: [PATCH 0708/2998] adding option for `--log-file` on the `load` command --- CHANGES | 1 + pyproject.toml | 2 +- tests/test_cli.py | 27 +++++++++++ tmuxp/__about__.py | 2 +- tmuxp/cli.py | 112 +++++++++++++++++++++++++++++++++------------ tmuxp/log.py | 12 ++++- 6 files changed, 125 insertions(+), 31 deletions(-) diff --git a/CHANGES b/CHANGES index fcc69453b0..a428aa4b3a 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Here you can find the recent changes to tmuxp current ------- +- Adding option to dump `load` output to log file - *Insert changes/features/fixes for next release here* tmuxp 1.6.2 (2020-11-08) diff --git a/pyproject.toml b/pyproject.toml index 56bd8985bd..8a8efa679b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.2" +version = "1.6.3" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tests/test_cli.py b/tests/test_cli.py index 303370a016..1e14e51f91 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -408,6 +408,33 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): assert 'Please set' not in result.output +@pytest.mark.parametrize( + "cli_args", + [ + (['load', '.', '--log-file', 'log.txt']), + ], +) +def test_load_log_file(cli_args, tmpdir, monkeypatch): + # create dummy tmuxp yaml that breaks to prevent actually loading tmux + tmpdir.join('.tmuxp.yaml').write( + """ +session_name: hello + """ + ) + tmpdir.join('.oh-my-zsh').ensure(dir=True) + monkeypatch.setenv('HOME', str(tmpdir)) + + with tmpdir.as_cwd(): + print('tmpdir: {0}'.format(tmpdir)) + runner = CliRunner() + + # If autoconfirm (-y) no need to prompt y + input_args = 'y\ny\n' if '-y' not in cli_args else '' + + runner.invoke(cli.cli, cli_args, input=input_args) + assert 'Loading' in tmpdir.join('log.txt').open().read() + + @pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--pdb')]) @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index eaa33c135f..f94e45557b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.2' +__version__ = '1.6.3' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 72e79ce624..c4d1645e48 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -42,6 +42,14 @@ def get_cwd(): return os.getcwd() +def tmuxp_echo(message=None, log_level='INFO', **click_kwargs): + """ + Combines logging.log and click.echo + """ + logger.log(log.LOG_LEVELS[log_level], click.unstyle(message)) + click.echo(message, **click_kwargs) + + def get_config_dir(): """ Return tmuxp configuration directory. @@ -246,8 +254,8 @@ def scan_config_argument(ctx, param, value, config_dir=None): config_dir = config_dir() if not config: - click.echo("Enter at least one CONFIG") - click.echo(ctx.get_help(), color=ctx.color) + tmuxp_echo("Enter at least one CONFIG") + tmuxp_echo(ctx.get_help(), color=ctx.color) ctx.exit() if isinstance(value, string_types): @@ -357,11 +365,14 @@ def scan_config(config, config_dir=None): ] if len(candidates) > 1: - click.secho( - 'Multiple .tmuxp.{yml,yaml,json} configs in %s' % dirname(config), - fg="red", + tmuxp_echo( + click.style( + 'Multiple .tmuxp.{yml,yaml,json} configs in %s' + % dirname(config), + fg="red", + ) ) - click.echo( + tmuxp_echo( click.wrap_text( 'This is undefined behavior, use only one. ' 'Use file names e.g. myproject.json, coolproject.yaml. ' @@ -381,7 +392,46 @@ def scan_config(config, config_dir=None): return config +<<<<<<< Updated upstream def _reattach(session): +======= +def load_plugins(sconf): + """ + Load and return plugins in config + """ + plugins = [] + if 'plugins' in sconf: + for plugin in sconf['plugins']: + try: + module_name = plugin.split('.') + module_name = '.'.join(module_name[:-1]) + plugin_name = plugin.split('.')[-1] + plugin = getattr(importlib.import_module(module_name), plugin_name) + plugins.append(plugin()) + except exc.TmuxpPluginException as error: + if not click.confirm( + '%sSkip loading %s?' + % (click.style(str(error), fg='yellow'), plugin_name), + default=True, + ): + tmuxp_echo( + click.style('[Not Skipping] ', fg='yellow') + + 'Plugin versions constraint not met. Exiting...' + ) + sys.exit(1) + except Exception as error: + tmuxp_echo( + click.style('[Plugin Error] ', fg='red') + + "Couldn\'t load {0}\n".format(plugin) + + click.style('{0}'.format(error), fg='yellow') + ) + sys.exit(1) + + return plugins + + +def _reattach(builder): +>>>>>>> Stashed changes """ Reattach session (depending on env being inside tmux already or not) @@ -505,6 +555,11 @@ def load_workspace( # get the canonical path, eliminating any symlinks config_file = os.path.realpath(config_file) + tmuxp_echo( + click.style('[Loading] ', fg='green') + + click.style(config_file, fg='blue', bold=True) + ) + # kaptan allows us to open a yaml or json file as a dict sconfig = kaptan.Kaptan() sconfig = sconfig.import_config(config_file).get() @@ -525,7 +580,7 @@ def load_workspace( try: # load WorkspaceBuilder object for tmuxp config / tmux server builder = WorkspaceBuilder(sconf=sconfig, server=t) except exc.EmptyConfigException: - click.echo('%s is empty or parsed no config data' % config_file, err=True) + tmuxp_echo('%s is empty or parsed no config data' % config_file, err=True) return session_name = sconfig['session_name'] @@ -545,11 +600,6 @@ def load_workspace( return try: - click.echo( - click.style('[Loading] ', fg='green') - + click.style(config_file, fg='blue', bold=True) - ) - builder.build() # load tmux session via workspace builder if 'TMUX' in os.environ: # tmuxp ran from inside tmux @@ -586,8 +636,8 @@ def load_workspace( except exc.TmuxpException as e: import traceback - click.echo(traceback.format_exc(), err=True) - click.echo(e, err=True) + tmuxp_echo(traceback.format_exc(), err=True) + tmuxp_echo(e, err=True) choice = click.prompt( 'Error loading workspace. (k)ill, (a)ttach, (d)etach?', @@ -597,7 +647,7 @@ def load_workspace( if choice == 'k': builder.session.kill_session() - click.echo('Session killed.') + tmuxp_echo('Session killed.') elif choice == 'a': if 'TMUX' in os.environ: builder.session.switch_client() @@ -625,12 +675,12 @@ def cli(log_level): try: has_minimum_version() except TmuxCommandNotFound: - click.echo('tmux not found. tmuxp requires you install tmux first.') + tmuxp_echo('tmux not found. tmuxp requires you install tmux first.') sys.exit() except exc.TmuxpException as e: - click.echo(e, err=True) + tmuxp_echo(e, err=True) sys.exit() - setup_logger(level=log_level.upper()) + setup_logger(logger=logger, level=log_level.upper()) def setup_logger(logger=None, level='INFO'): @@ -649,12 +699,12 @@ def setup_logger(logger=None, level='INFO'): logger = logging.getLogger() if not logger.handlers: # setup logger handlers - channel = logging.StreamHandler() - channel.setFormatter(log.DebugLogFormatter()) - + # channel = logging.StreamHandler() + # channel.setFormatter(log.DebugLogFormatter()) # channel.setFormatter(log.LogFormatter()) + logger.setLevel(level) - logger.addHandler(channel) + # logger.addHandler(channel) def startup(config_dir): @@ -875,6 +925,7 @@ def command_freeze(session_name, socket_name, socket_path, force): flag_value=88, help='Like -2, but indicates that the terminal supports 88 colours.', ) +@click.option('--log-file', help='File to log errors/output to') def command_load( ctx, config, @@ -884,6 +935,7 @@ def command_load( answer_yes, detached, colors, + log_file, ): """Load a tmux workspace from each CONFIG. @@ -908,6 +960,10 @@ def command_load( detached mode. """ util.oh_my_zsh_auto_title() + if log_file: + logfile_handler = logging.FileHandler(log_file) + logfile_handler.setFormatter(log.LogFormatter()) + logger.addHandler(logfile_handler) tmux_options = { 'socket_name': socket_name, @@ -919,8 +975,8 @@ def command_load( } if not config: - click.echo("Enter at least one CONFIG") - click.echo(ctx.get_help(), color=ctx.color) + tmuxp_echo("Enter at least one CONFIG") + tmuxp_echo(ctx.get_help(), color=ctx.color) ctx.exit() if isinstance(config, string_types): @@ -962,7 +1018,7 @@ def import_config(configfile, importfunc): else: sys.exit('Unknown config format.') - click.echo( + tmuxp_echo( newconfig + '---------------------------------------------------------------' '\n' 'Configuration import does its best to convert files.\n' @@ -984,9 +1040,9 @@ def import_config(configfile, importfunc): buf.write(newconfig) buf.close() - click.echo('Saved to %s.' % dest) + tmuxp_echo('Saved to %s.' % dest) else: - click.echo( + tmuxp_echo( 'tmuxp has examples in JSON and YAML format at ' '\n' 'View tmuxp docs at ' @@ -1125,4 +1181,4 @@ def format_tmux_resp(std_resp): % format_tmux_resp(tmux_cmd('show-window-options', '-g')), ] - click.echo('\n'.join(output)) + tmuxp_echo('\n'.join(output)) diff --git a/tmuxp/log.py b/tmuxp/log.py index 561877835b..7cafe264d5 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -21,6 +21,15 @@ 'CRITICAL': Fore.RED, } +LOG_LEVELS = { + 'CRITICAL': 50, + 'ERROR': 40, + 'WARNING': 30, + 'INFO': 20, + 'DEBUG': 10, + 'NOTSET': 0, +} + def default_log_template(self, record): """ @@ -89,8 +98,9 @@ def format(self, record): prefix = self.template(record) % record.__dict__ + parts = prefix.split(record.message) formatted = prefix + " " + record.message - return formatted.replace("\n", "\n ") + return formatted.replace("\n", "\n" + parts[0] + " ") def debug_log_template(self, record): From d6c138307d7c0f61fa606ca62bef7b09304d2d77 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 15 Nov 2020 11:17:09 -0800 Subject: [PATCH 0709/2998] fixing stash merge issue --- tmuxp/cli.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index c4d1645e48..94b5bbaaa3 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -392,46 +392,7 @@ def scan_config(config, config_dir=None): return config -<<<<<<< Updated upstream def _reattach(session): -======= -def load_plugins(sconf): - """ - Load and return plugins in config - """ - plugins = [] - if 'plugins' in sconf: - for plugin in sconf['plugins']: - try: - module_name = plugin.split('.') - module_name = '.'.join(module_name[:-1]) - plugin_name = plugin.split('.')[-1] - plugin = getattr(importlib.import_module(module_name), plugin_name) - plugins.append(plugin()) - except exc.TmuxpPluginException as error: - if not click.confirm( - '%sSkip loading %s?' - % (click.style(str(error), fg='yellow'), plugin_name), - default=True, - ): - tmuxp_echo( - click.style('[Not Skipping] ', fg='yellow') - + 'Plugin versions constraint not met. Exiting...' - ) - sys.exit(1) - except Exception as error: - tmuxp_echo( - click.style('[Plugin Error] ', fg='red') - + "Couldn\'t load {0}\n".format(plugin) - + click.style('{0}'.format(error), fg='yellow') - ) - sys.exit(1) - - return plugins - - -def _reattach(builder): ->>>>>>> Stashed changes """ Reattach session (depending on env being inside tmux already or not) From 97af76cfa1382921e1bf0ecc536b8cb46bd113f2 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sun, 15 Nov 2020 14:41:25 -0800 Subject: [PATCH 0710/2998] Updated docs. Fixed a non-standard-conforming global option --- README.rst | 10 +++++++++- docs/cli.rst | 13 ++++++++++++- tmuxp/cli.py | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 91a5179e04..56074ba102 100644 --- a/README.rst +++ b/README.rst @@ -177,9 +177,16 @@ You can auto confirm the prompt. In this case no preview will be shown. $ tmuxp convert --yes filename -Debug Info +Debugging Helpers ---------- +The `load` command provides a way to log output to a log file for debugging +purposes. + +.. code-block:: sh + + $ tmuxp load --log-file . + Collect system info to submit with a Github issue: .. code-block:: sh @@ -192,6 +199,7 @@ Collect system info to submit with a Github issue: # ... so on + Docs / Reading material ----------------------- diff --git a/docs/cli.rst b/docs/cli.rst index 5d9b3fc4be..87a67a089b 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -184,12 +184,23 @@ are created, the last session is named from the terminal. $ tmxup load -s ... +The output of the ``load`` command can be logged to a file for +debugging purposes. the log level can be controlled with the global +``--log-level`` option (defaults to INFO). + +.. code-block:: bash + + $ tmuxp load --log-file + $ tmuxp --log-level load --log-file + + .. _cli_debug_info: Debug Info ---------- -Use to collect all relevant information for submitting an issue to the project. +Use to collect all relevant information for submitting an issue to +the project. .. code-block:: bash diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 94b5bbaaa3..a9afd67287 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -623,7 +623,7 @@ def load_workspace( @click.group(context_settings={'obj': {}}) @click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') @click.option( - '--log_level', + '--log-level', default='INFO', help='Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)', ) From 8542708d661f74af9b372247b7c45deb7ecdb3e5 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 21 Nov 2020 06:23:58 -0800 Subject: [PATCH 0711/2998] adding in style selection to the logging formatter --- tmuxp/log.py | 60 +++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/tmuxp/log.py b/tmuxp/log.py index 7cafe264d5..bb9b3d0a45 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -31,7 +31,16 @@ } -def default_log_template(self, record): +def set_style( + message, stylized, style_before=None, style_after=None, prefix='', suffix='' +): + if stylized: + return prefix + style_before + message + style_after + suffix + + return prefix + message + suffix + + +def default_log_template(self, record, stylized=False): """ Return the prefix for the log message. Template for Formatter. @@ -48,37 +57,34 @@ def default_log_template(self, record): """ reset = Style.RESET_ALL - levelname = ( - LEVEL_COLORS.get(record.levelname) - + Style.BRIGHT - + '(%(levelname)s)' - + Style.RESET_ALL - + ' ' + levelname = set_style( + '(%(levelname)s)', + stylized, + style_before=(LEVEL_COLORS.get(record.levelname) + Style.BRIGHT), + style_after=Style.RESET_ALL, + suffix=' ', ) - asctime = ( - '[' - + Fore.BLACK - + Style.DIM - + Style.BRIGHT - + '%(asctime)s' - + Fore.RESET - + Style.RESET_ALL - + ']' + asctime = set_style( + '%(asctime)s', + stylized, + style_before=(Fore.BLACK + Style.DIM + Style.BRIGHT), + style_after=(Fore.RESET + Style.RESET_ALL), + prefix='[', + suffix=']', ) - name = ( - ' ' - + Fore.WHITE - + Style.DIM - + Style.BRIGHT - + '%(name)s' - + Fore.RESET - + Style.RESET_ALL - + ' ' + name = set_style( + '%(name)s', + stylized, + style_before=(Fore.WHITE + Style.DIM + Style.BRIGHT), + style_after=(Fore.RESET + Style.RESET_ALL), + prefix=' ', + suffix=' ', ) - tpl = reset + levelname + asctime + name + reset + if stylized: + return reset + levelname + asctime + name + reset - return tpl + return levelname + asctime + name class LogFormatter(logging.Formatter): From 008507b779066b3194e14cb7d451b88066c4c197 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 21 Nov 2020 06:29:04 -0800 Subject: [PATCH 0712/2998] adding a style switch to the log --- tmuxp/cli.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index a9afd67287..53271f3f4d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -42,11 +42,15 @@ def get_cwd(): return os.getcwd() -def tmuxp_echo(message=None, log_level='INFO', **click_kwargs): +def tmuxp_echo(message=None, log_level='INFO', style_log=False, **click_kwargs): """ Combines logging.log and click.echo """ - logger.log(log.LOG_LEVELS[log_level], click.unstyle(message)) + if style_log: + logger.log(log.LOG_LEVELS[log_level], message) + else: + logger.log(log.LOG_LEVELS[log_level], click.unstyle(message)) + click.echo(message, **click_kwargs) From 0ca92907212db6da6ad857ac28aad979a2794925 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 21 Nov 2020 06:43:41 -0800 Subject: [PATCH 0713/2998] updating the set-env to use the new format --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b63e5ab096..97486bc4c8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -29,13 +29,13 @@ jobs: run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py python get-poetry.py -y --version 1.0.10 - echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + echo "PATH={$HOME}/.poetry/bin:{$PATH}" >> $GITHUB_ENV rm get-poetry.py - name: Get poetry cache paths from config run: | - echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') - echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + echo "poetry_cache_dir=$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV + echo "poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV - name: Configure poetry shell: bash From 287fcc1df4f69edf7d6d83c2e99f7fc8c33564d9 Mon Sep 17 00:00:00 2001 From: Joseph Flinn Date: Sat, 21 Nov 2020 06:49:07 -0800 Subject: [PATCH 0714/2998] fixing test action by using actual bash instead of a templating thing --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 97486bc4c8..984af9c993 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -29,13 +29,13 @@ jobs: run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py python get-poetry.py -y --version 1.0.10 - echo "PATH={$HOME}/.poetry/bin:{$PATH}" >> $GITHUB_ENV + echo "PATH=${HOME}/.poetry/bin:${PATH}" >> $GITHUB_ENV rm get-poetry.py - name: Get poetry cache paths from config run: | echo "poetry_cache_dir=$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV - echo "poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV + echo "poetry_virtualenvs_path=$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV - name: Configure poetry shell: bash From 9edead2b1ee32dffa32f1c06fac72c7ed2788036 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Nov 2020 14:26:00 -0600 Subject: [PATCH 0715/2998] Tag v1.6.3 --- CHANGES | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index a428aa4b3a..bba1c17e7f 100644 --- a/CHANGES +++ b/CHANGES @@ -6,9 +6,19 @@ Here you can find the recent changes to tmuxp current ------- -- Adding option to dump `load` output to log file - *Insert changes/features/fixes for next release here* +tmuxp 1.6.3 (2020-11-22) +------------------------ +- :issue:`647` Adding option to dump `load` output to log file, thank you + @joseph-flinn! + + ``tmuxp load file.yaml --log-file yourfile.txt`` + + Adjust log levels: + + ``tmuxp --log-level DEBUG load file.yaml --log-file yourfile.txt`` + tmuxp 1.6.2 (2020-11-08) ------------------------ - :issue:`643` New command ``tmuxp debug-info`` for creating github From 09f2569bc3e85296a192446c0c9d21b4485a8131 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Nov 2020 14:27:46 -0600 Subject: [PATCH 0716/2998] Fix README --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 56074ba102..e1ae6e5ffa 100644 --- a/README.rst +++ b/README.rst @@ -178,9 +178,9 @@ You can auto confirm the prompt. In this case no preview will be shown. Debugging Helpers ----------- +----------------- -The `load` command provides a way to log output to a log file for debugging +The ``load`` command provides a way to log output to a log file for debugging purposes. .. code-block:: sh From 1202e74aa92ae2c7b35a4abc4a38734a75aa351c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Nov 2020 14:31:01 -0600 Subject: [PATCH 0717/2998] Tag v1.7.0a3 --- CHANGES | 7 ++++++- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 753113a9d8..086fa1c616 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,11 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.7.0a3 (2020-11-22) +-------------------------- +- Port ``tmuxp load --log-level outputfile.log`` from + 1.6.3 + tmuxp 1.7.0a2 (2020-11-08) -------------------------- - Port ``tmuxp debug-info`` from :issue:`643` from via v1.6.2 @@ -24,7 +29,7 @@ tmuxp 1.7.0a1 (2020-11-07) Thank you @joseph-flinn! - tmuxp 1.6.3 (2020-11-22) +tmuxp 1.6.3 (2020-11-22) ------------------------ - :issue:`647` Adding option to dump `load` output to log file, thank you @joseph-flinn! diff --git a/pyproject.toml b/pyproject.toml index 3c216516a0..c5122e4447 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.7.0a2" +version = "1.7.0a3" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 56293145fb..e1bb1c575b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0a2' +__version__ = '1.7.0a3' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From c50700bfd3a496570a8b6942d0202aff8d5faf3d Mon Sep 17 00:00:00 2001 From: Joseph Flinn <58369717+joseph-flinn@users.noreply.github.com> Date: Mon, 23 Nov 2020 01:46:20 -0800 Subject: [PATCH 0718/2998] fixing the publish doc action env vars (#648) --- .github/workflows/publish-docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index a700246d70..ece6167d9c 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -31,13 +31,13 @@ jobs: run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py python get-poetry.py -y --version 1.0.10 - echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + echo "PATH=$HOME/.poetry/bin:$PATH" >> $GITHUB_ENV rm get-poetry.py - name: Get poetry cache paths from config run: | - echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') - echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + echo "poetry_cache_dir=$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV + echo "poetry_virtualenvs_path=$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV - name: Configure poetry shell: bash From e9214838dd8f5ef5e0f5eb58bff79fa8e626d1ad Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Tue, 5 Jan 2021 19:26:59 +0000 Subject: [PATCH 0719/2998] add the ability to append windows to a session Modifies the behaviour when starting a session from within an existing tmux session: the user is given the choice to switch to new session, do nothing, or append to current session. --- docs/cli.rst | 17 ++ docs/quickstart.rst | 3 +- .../workspacebuilder/three_windows.yaml | 14 ++ .../workspacebuilder/two_windows.yaml | 10 ++ tests/test_workspacebuilder.py | 57 +++++++ tmuxp/cli.py | 160 ++++++++++++++---- tmuxp/workspacebuilder.py | 48 ++++-- 7 files changed, 259 insertions(+), 50 deletions(-) create mode 100644 tests/fixtures/workspacebuilder/three_windows.yaml create mode 100644 tests/fixtures/workspacebuilder/two_windows.yaml diff --git a/docs/cli.rst b/docs/cli.rst index 87a67a089b..703ad8cdcb 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -169,6 +169,23 @@ directory may be loaded with: $ tmuxp load . +If you try to load a config file from within a tmux session, it will ask you +if you want to load and attach to the new session, or just load detached. +You can also load a config file and append the windows to the current active session. + +:: + + Already inside TMUX, switch to session? yes/no + Or (a)ppend windows in the current active session? + [y/n/a]: + +All of these options can be preselected to skip the prompt: + +.. code-block:: bash + $ tmuxp load -y config # load attached + $ tmuxp load -d config # load detached + $ tmuxp load -a config # append windows + Multiple sessions can be loaded at once. The first ones will be created without being attached. The last one will be attached if there is no ``-d`` flag on the command line. diff --git a/docs/quickstart.rst b/docs/quickstart.rst index aebac4812f..a575582a8b 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -55,7 +55,8 @@ Load multiple tmux sessions at once: $ tmuxp load example.yaml anothersession.yaml tmuxp will offer to ``switch-client`` for you if you're already in a -session. +session. You can also load a configuration, and append the windows to +the current active session. You can also have a custom tmuxp config directory by setting the ``TMUX_CONFIGDIR`` in your environment variables. diff --git a/tests/fixtures/workspacebuilder/three_windows.yaml b/tests/fixtures/workspacebuilder/three_windows.yaml new file mode 100644 index 0000000000..e0c8286f85 --- /dev/null +++ b/tests/fixtures/workspacebuilder/three_windows.yaml @@ -0,0 +1,14 @@ +session_name: sample_three_windows +windows: +- window_name: first + panes: + - shell_command: + - echo 'first window' +- window_name: second + panes: + - shell_command: + - echo 'second window' +- window_name: third + panes: + - shell_command: + - echo 'third window' diff --git a/tests/fixtures/workspacebuilder/two_windows.yaml b/tests/fixtures/workspacebuilder/two_windows.yaml new file mode 100644 index 0000000000..0f1d40f34a --- /dev/null +++ b/tests/fixtures/workspacebuilder/two_windows.yaml @@ -0,0 +1,10 @@ +session_name: sample_two_windows +windows: +- window_name: first + panes: + - shell_command: + - echo 'first window' +- window_name: second + panes: + - shell_command: + - echo 'second window' diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 3783d0d8e4..1b635ef6ac 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -779,3 +779,60 @@ def test_plugin_system_multiple_plugins(session): # override methods are currently written proc = session.cmd('display-message', '-p', "'#W'") assert proc.stdout[0] == "'mp_test_awf'" + + +def test_load_configs_same_session(server): + yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + assert len(server.sessions) == 1 + assert len(server.sessions[0]._windows) == 3 + + yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + assert len(server.sessions) == 2 + assert len(server.sessions[1]._windows) == 2 + + yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build(server.sessions[1], True) + + assert len(server.sessions) == 2 + assert len(server.sessions[1]._windows) == 4 + + +def test_load_configs_separate_sessions(server): + yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + assert len(server.sessions) == 1 + assert len(server.sessions[0]._windows) == 3 + + yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + assert len(server.sessions) == 2 + assert len(server.sessions[0]._windows) == 3 + assert len(server.sessions[1]._windows) == 2 diff --git a/tmuxp/cli.py b/tmuxp/cli.py index b95297211e..4d19f271b8 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -448,7 +448,6 @@ def _reattach(builder): If not, ``tmux attach-session`` loads the client to the target session. """ - for plugin in builder.plugins: plugin.reattach(builder.session) proc = builder.session.cmd('display-message', '-p', "'#S'") @@ -462,6 +461,85 @@ def _reattach(builder): builder.session.attach_session() +def _load_attached(builder, detached): + """ + Load config in new session and attach + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + detached : bool + """ + builder.build() + + if 'TMUX' in os.environ: # tmuxp ran from inside tmux + # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' + tmux_env = os.environ.pop('TMUX') + + if has_gte_version('2.6'): + set_layout_hook(builder.session, 'client-session-changed') + + builder.session.switch_client() # switch client to new session + + os.environ['TMUX'] = tmux_env # set TMUX back again + else: + if has_gte_version('2.6'): + # if attaching for first time + set_layout_hook(builder.session, 'client-attached') + + # for cases where user switches client for first time + set_layout_hook(builder.session, 'client-session-changed') + + if not detached: + builder.session.attach_session() + + +def _load_detached(builder): + """ + Load config in new session but don't attach + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + builder.build() + + if has_gte_version('2.6'): # prepare for both cases + set_layout_hook(builder.session, 'client-attached') + set_layout_hook(builder.session, 'client-session-changed') + + print('Session created in detached state.') + + +def _load_append_windows_to_current_session(builder): + """ + Load config as new windows in current session + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + current_attached_session = builder.find_current_attached_session() + builder.build(current_attached_session, append=True) + if has_gte_version('2.6'): # prepare for both cases + set_layout_hook(builder.session, 'client-attached') + set_layout_hook(builder.session, 'client-session-changed') + + +def _setup_plugins(builder): + """ + Runs after before_script + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + for plugin in builder.plugins: + plugin.before_script(builder.session) + + return builder.session + + def load_workspace( config_file, socket_name=None, @@ -470,6 +548,7 @@ def load_workspace( colors=None, detached=False, answer_yes=False, + append=False, ): """ Load a tmux "workspace" session via tmuxp file. @@ -490,7 +569,11 @@ def load_workspace( detached : bool Force detached state. default False. answer_yes : bool - Assume yes when given prompt. default False. + Assume yes when given prompt to attach in new session. + Default False. + append : bool + Assume current when given prompt to append windows in same session. + Default False. Notes ----- @@ -595,9 +678,8 @@ def load_workspace( session_name = sconfig['session_name'] - # if the session already exists, prompt the user to attach. tmuxp doesn't - # support incremental session building or appending (yet, PR's welcome!) - if builder.session_exists(session_name): + # if the session already exists, prompt the user to attach + if builder.session_exists(session_name) and not append: if not detached and ( answer_yes or click.confirm( @@ -610,38 +692,37 @@ def load_workspace( return try: - builder.build() # load tmux session via workspace builder - - if 'TMUX' in os.environ: # tmuxp ran from inside tmux - if not detached and ( - answer_yes or click.confirm('Already inside TMUX, switch to session?') - ): - # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' - tmux_env = os.environ.pop('TMUX') - - if has_gte_version('2.6'): - set_layout_hook(builder.session, 'client-session-changed') - - builder.session.switch_client() # switch client to new session + if detached: + _load_detached(builder) + return _setup_plugins(builder) - os.environ['TMUX'] = tmux_env # set TMUX back again - return builder.session - else: # session created in the background, from within tmux - if has_gte_version('2.6'): # prepare for both cases - set_layout_hook(builder.session, 'client-attached') - set_layout_hook(builder.session, 'client-session-changed') + if append: + if 'TMUX' in os.environ: # tmuxp ran from inside tmux + _load_append_windows_to_current_session(builder) + else: + _load_attached(builder, detached) - sys.exit('Session created in detached state.') - else: # tmuxp ran from inside tmux - if has_gte_version('2.6'): - # if attaching for first time - set_layout_hook(builder.session, 'client-attached') + return _setup_plugins(builder) - # for cases where user switches client for first time - set_layout_hook(builder.session, 'client-session-changed') + # append and answer_yes have no meaning if specified together + elif answer_yes: + _load_attached(builder, detached) + return _setup_plugins(builder) - if not detached: - builder.session.attach_session() + if 'TMUX' in os.environ: # tmuxp ran from inside tmux + msg = "Already inside TMUX, switch to session? yes/no\n"\ + "Or (a)ppend windows in the current active session?\n[y/n/a]" + options = ['y', 'n', 'a'] + choice = click.prompt(msg, value_proc=_validate_choices(options)) + + if choice == 'y': + _load_attached(builder, detached) + elif choice == 'a': + _load_append_windows_to_current_session(builder) + else: + _load_detached(builder) + else: + _load_attached(builder, detached) except exc.TmuxpException as e: import traceback @@ -663,11 +744,8 @@ def load_workspace( else: sys.exit() - # Runs after before_script - for plugin in builder.plugins: - plugin.before_script(builder.session) + return _setup_plugins(builder) - return builder.session @click.group(context_settings={'obj': {}}) @@ -923,6 +1001,12 @@ def command_freeze(session_name, socket_name, socket_path, force): @click.option( '-d', 'detached', help='Load the session without attaching it', is_flag=True ) +@click.option( + '-a', + 'append', + help='Load configuration, appending windows to the current session', + is_flag=True +) @click.option( 'colors', '-2', @@ -945,6 +1029,7 @@ def command_load( new_session_name, answer_yes, detached, + append, colors, log_file, ): @@ -983,6 +1068,7 @@ def command_load( 'answer_yes': answer_yes, 'colors': colors, 'detached': detached, + 'append': append, } if not config: diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index d313438d83..45992cb21f 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -17,7 +17,7 @@ from libtmux.window import Window from . import exc -from .util import run_before_script +from .util import run_before_script, get_current_pane logger = logging.getLogger(__name__) @@ -111,7 +111,7 @@ def session_exists(self, session_name=None): self.session = self.server.find_where({'session_name': session_name}) return True - def build(self, session=None): + def build(self, session=None, append=False): """ Build tmux workspace in session. @@ -125,6 +125,8 @@ def build(self, session=None): ---------- session : :class:`libtmux.Session` session to build workspace in + append : bool + append windows in current active session """ if not session: @@ -191,7 +193,7 @@ def build(self, session=None): for option, value in self.sconf['environment'].items(): self.session.set_environment(option, value) - for w, wconf in self.iter_create_windows(session): + for w, wconf in self.iter_create_windows(session, append): assert isinstance(w, Window) for plugin in self.plugins: @@ -222,7 +224,7 @@ def build(self, session=None): if focus: focus.select_window() - def iter_create_windows(self, s): + def iter_create_windows(self, session, append=False): """ Return :class:`libtmux.Window` iterating through session config dict. @@ -235,6 +237,8 @@ def iter_create_windows(self, s): ---------- session : :class:`libtmux.Session` session to create windows in + append : bool + append windows in current active session Returns ------- @@ -248,11 +252,12 @@ def iter_create_windows(self, s): else: window_name = wconf['window_name'] + is_first_window_pass = self.first_window_pass(i, session, append) + w1 = None - if i == int(1): # if first window, use window 1 - w1 = s.attached_window + if is_first_window_pass: # if first window, use window 1 + w1 = session.attached_window w1.move_window(99) - pass if 'start_directory' in wconf: sd = wconf['start_directory'] @@ -264,7 +269,7 @@ def iter_create_windows(self, s): else: ws = None - w = s.new_window( + w = session.new_window( window_name=window_name, start_directory=sd, attach=False, # do not move to the new window @@ -272,10 +277,11 @@ def iter_create_windows(self, s): window_shell=ws, ) - if i == int(1) and w1: # if first window, use window 1 - w1.kill_window() + if is_first_window_pass: # if first window, use window 1 + session.attached_window.kill_window() + assert isinstance(w, Window) - s.server._update_windows() + session.server._update_windows() if 'options' in wconf and isinstance(wconf['options'], dict): for key, val in wconf['options'].items(): w.set_window_option(key, val) @@ -283,7 +289,7 @@ def iter_create_windows(self, s): if 'focus' in wconf and wconf['focus']: w.select_window() - s.server._update_windows() + session.server._update_windows() yield w, wconf @@ -369,6 +375,24 @@ def config_after_window(self, w, wconf): for key, val in wconf['options_after'].items(): w.set_window_option(key, val) + def find_current_attached_session(self): + current_active_pane = get_current_pane(self.server) + + if not current_active_pane: + raise exc.TmuxpException("No session active.") + + return next( + ( + s + for s in self.server.list_sessions() + if s["session_id"] == current_active_pane["session_id"] + ), + None, + ) + + def first_window_pass(self, i, session, append): + return len(session.windows) == 1 and i == 1 and not append + def freeze(session): """ From 99aaf537197b8f652780cbbb16fb2090e448ecc5 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Tue, 5 Jan 2021 20:19:38 +0000 Subject: [PATCH 0720/2998] increment minor version to 1.8.0 --- tmuxp/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index e1bb1c575b..f90ce28676 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0a3' +__version__ = '1.8.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 45b7fa635c71ef06cb13cd61c51c371047baa2e0 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Wed, 6 Jan 2021 12:47:11 +0000 Subject: [PATCH 0721/2998] add tests for helper methods within cli --- tests/test_cli.py | 104 ++++++++++++++++++++++++++++++++++++++++++++++ tmuxp/cli.py | 2 +- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 2bf16dd368..5a5de020ac 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,6 +4,7 @@ import json import os +from unittest.mock import MagicMock import pytest @@ -18,6 +19,8 @@ from tmuxp import cli, config, exc from tmuxp.cli import ( _reattach, + _load_attached, + _load_append_windows_to_current_session, command_debug_info, command_ls, get_config_dir, @@ -1088,6 +1091,107 @@ def test_reattach_plugins(server): assert proc.stdout[0] == "'plugin_test_r'" +def test_load_attached(server, monkeypatch): + # Load a session and attach from outside tmux + monkeypatch.delenv('TMUX', raising=False) + + attach_session_mock = MagicMock() + attach_session_mock.return_value.stderr = None + + monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) + + yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + _load_attached(builder, False) + + assert builder.session.attach_session.call_count == 1 + + +def test_load_attached_detached(server, monkeypatch): + # Load a session but don't attach + monkeypatch.delenv('TMUX', raising=False) + + attach_session_mock = MagicMock() + attach_session_mock.return_value.stderr = None + + monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) + + yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + _load_attached(builder, True) + + assert builder.session.attach_session.call_count == 0 + + +def test_load_attached_within_tmux(server, monkeypatch): + # Load a session and attach from within tmux + monkeypatch.setenv('TMUX', "/tmp/tmux-1234/default,123,0") + + switch_client_mock = MagicMock() + switch_client_mock.return_value.stderr = None + + monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) + + yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + _load_attached(builder, False) + + assert builder.session.switch_client.call_count == 1 + + +def test_load_attached_within_tmux_detached(server, monkeypatch): + # Load a session and attach from within tmux + monkeypatch.setenv('TMUX', "/tmp/tmux-1234/default,123,0") + + switch_client_mock = MagicMock() + switch_client_mock.return_value.stderr = None + + monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) + + yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + _load_attached(builder, True) + + assert builder.session.switch_client.call_count == 1 + +def test_load_append_windows_to_current_session(server, monkeypatch): + yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + assert len(server.list_sessions()) == 1 + assert len(server._list_windows()) == 3 + + # Assign an active pane to the session + monkeypatch.setenv("TMUX_PANE", server._list_panes()[0]["pane_id"]) + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + _load_append_windows_to_current_session(builder) + + assert len(server.list_sessions()) == 1 + assert len(server._list_windows()) == 6 + + + def test_debug_info_cli(monkeypatch, tmpdir): monkeypatch.setenv('SHELL', '/bin/bash') diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 4d19f271b8..f220245749 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -463,7 +463,7 @@ def _reattach(builder): def _load_attached(builder, detached): """ - Load config in new session and attach + Load config in new session Parameters ---------- From 186e68232af0256d76fda025c404e11ffb9825b2 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Wed, 6 Jan 2021 12:56:59 +0000 Subject: [PATCH 0722/2998] add test for find_current_active_pane on workspace builder --- tests/test_workspacebuilder.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 1b635ef6ac..ce3584dc43 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -836,3 +836,33 @@ def test_load_configs_separate_sessions(server): assert len(server.sessions) == 2 assert len(server.sessions[0]._windows) == 3 assert len(server.sessions[1]._windows) == 2 + + +def test_find_current_active_pane(server, monkeypatch): + yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + + sconfig = kaptan.Kaptan(handler='yaml') + sconfig = sconfig.import_config(yaml_config).get() + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + assert len(server.list_sessions()) == 2 + + # Assign an active pane to the session + second_session = server.list_sessions()[1] + first_pane_on_second_session_id = ( + second_session.list_windows()[0].list_panes()[0]["pane_id"] + ) + monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) + + builder = WorkspaceBuilder(sconf=sconfig, server=server) + + assert builder.find_current_attached_session() == second_session From 07b8e431c44eb105f91cce43a90cb98c98a79c78 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Wed, 6 Jan 2021 12:59:48 +0000 Subject: [PATCH 0723/2998] import mock package correctly under 2.7 --- tests/test_cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 5a5de020ac..e5a7f93ed8 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,7 +4,11 @@ import json import os -from unittest.mock import MagicMock + +try: + from unittest.mock import MagicMock +except ImportError: + from mock import MagicMock import pytest From a4ea2e6e6bc184b2a097f566cb360423ac649d97 Mon Sep 17 00:00:00 2001 From: dougharris Date: Wed, 6 Jan 2021 19:33:42 -0500 Subject: [PATCH 0724/2998] Adding commas to requirements/base.txt (#651) It was installing click 8.0.0.1a Addresses #649 --- requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index c0509baac4..fb2ab61bc7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux>=0.8<0.9 -click>=7<8 +libtmux>=0.8,<0.9 +click>=7,<8 colorama>=0.3.9 From 8596556cd336fe9ec1b20840ab639577bd613436 Mon Sep 17 00:00:00 2001 From: dougharris Date: Wed, 6 Jan 2021 19:33:42 -0500 Subject: [PATCH 0725/2998] Adding commas to requirements/base.txt (#651) It was installing click 8.0.0.1a Addresses #649 --- requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index c0509baac4..fb2ab61bc7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux>=0.8<0.9 -click>=7<8 +libtmux>=0.8,<0.9 +click>=7,<8 colorama>=0.3.9 From cc888a3a5d11a282a0f2aad66e3dae2e29a8239c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Jan 2021 18:36:23 -0600 Subject: [PATCH 0726/2998] Tag v1.6.4 --- CHANGES | 5 +++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index bba1c17e7f..00d630a7f0 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,11 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.6.4 (2021-01-22) +------------------------ +- :issue:`651` Fix packaging issue with click, thanks @dougharris! Fixes + :issue:`649` + tmuxp 1.6.3 (2020-11-22) ------------------------ - :issue:`647` Adding option to dump `load` output to log file, thank you diff --git a/pyproject.toml b/pyproject.toml index 8a8efa679b..34ae775a64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.3" +version = "1.6.4" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index f94e45557b..4c9d353f6c 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.3' +__version__ = '1.6.4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 77c0cb689e885e14e7a8a18b3f18a741e336fb65 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 6 Jan 2021 18:40:59 -0600 Subject: [PATCH 0727/2998] Tag v1.7.0a4 --- CHANGES | 4 ++++ tmuxp/__about__.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f7e1942cc8..4df0b2eefe 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,10 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.7.0a4 (2021-01-06) +-------------------------- +- Port click package fix from 1.6.4 + tmuxp 1.7.0a3 (2020-11-22) -------------------------- - Port ``tmuxp load --log-level outputfile.log`` from diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index e1bb1c575b..873f5b13d1 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0a3' +__version__ = '1.7.0a4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 0ba9a1e557ff87eeecfc3ed5c48e0f03bab3e47c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 7 Jan 2021 07:09:56 -0600 Subject: [PATCH 0728/2998] Update poetry.lock file --- poetry.lock | 595 +++++++++++++++++++++++++++++----------------------- 1 file changed, 336 insertions(+), 259 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3aa1020cd8..4e8074980a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -65,7 +65,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" +version = "2.9.0" [package.dependencies] pytz = ">=2015.7" @@ -129,7 +129,7 @@ description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false python-versions = "*" -version = "2020.6.20" +version = "2020.12.5" [[package]] category = "dev" @@ -138,7 +138,7 @@ marker = "sys_platform == \"linux\"" name = "cffi" optional = false python-versions = "*" -version = "1.14.3" +version = "1.14.4" [package.dependencies] pycparser = "*" @@ -148,8 +148,8 @@ category = "dev" description = "Universal encoding detector for Python 2 and 3" name = "chardet" optional = false -python-versions = "*" -version = "3.0.4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "4.0.0" [[package]] category = "main" @@ -165,7 +165,7 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.10" +version = "2.1.11" [package.dependencies] coverage = "*" @@ -223,7 +223,7 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.3" +version = "5.3.1" [package.extras] toml = ["toml"] @@ -234,11 +234,11 @@ description = "cryptography is a package which provides cryptographic recipes an marker = "sys_platform == \"linux\"" name = "cryptography" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "3.2.1" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +version = "3.3.1" [package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" +cffi = ">=1.12" six = ">=1.4.1" [package.extras] @@ -255,7 +255,7 @@ marker = "python_version >= \"3.6\" and python_version < \"3.7\"" name = "dataclasses" optional = false python-versions = ">=3.6, <3.7" -version = "0.7" +version = "0.8" [[package]] category = "dev" @@ -367,7 +367,7 @@ marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "2.0.0" +version = "2.1.1" [package.dependencies] zipp = ">=0.5" @@ -386,7 +386,27 @@ version = "*" [package.extras] docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] + +[[package]] +category = "dev" +description = "Read metadata from Python packages" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" +name = "importlib-metadata" +optional = false +python-versions = ">=3.6" +version = "3.3.0" + +[package.dependencies] +zipp = ">=0.5" + +[package.dependencies.typing-extensions] +python = "<3.8" +version = ">=3.6.4" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] category = "dev" @@ -428,7 +448,7 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.6.4" +version = "5.7.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -441,11 +461,11 @@ description = "Low-level, pure Python DBus protocol wrapper." marker = "sys_platform == \"linux\"" name = "jeepney" optional = false -python-versions = ">=3.5" -version = "0.4.3" +python-versions = ">=3.6" +version = "0.6.0" [package.extras] -dev = ["testpath"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] category = "dev" @@ -479,20 +499,20 @@ description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "21.4.0" +version = "21.8.0" [package.dependencies] -SecretStorage = ">=3" +SecretStorage = ">=3.2" jeepney = ">=0.4.2" pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" [package.dependencies.importlib-metadata] python = "<3.8" -version = "*" +version = ">=1" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] category = "main" @@ -567,11 +587,10 @@ description = "Core utilities for Python packages" name = "packaging" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.4" +version = "20.8" [package.dependencies] pyparsing = ">=2.0.2" -six = "*" [[package]] category = "dev" @@ -608,7 +627,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.8.0" +version = "0.8.1" [[package]] category = "dev" @@ -635,7 +654,7 @@ marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.6" -version = "8.0.1" +version = "8.1.0" [[package]] category = "dev" @@ -672,7 +691,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.9.0" +version = "1.10.0" [[package]] category = "dev" @@ -713,7 +732,7 @@ description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false python-versions = ">=3.5" -version = "2.7.2" +version = "2.7.3" [[package]] category = "dev" @@ -794,6 +813,31 @@ version = ">=2.2.0" checkqa_mypy = ["mypy (0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +[[package]] +category = "dev" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = ">=3.6" +version = "6.2.1" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=19.2.0" +colorama = "*" +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<1.0.0a1" +py = ">=1.8.2" +toml = "*" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + [[package]] category = "dev" description = "Pytest plugin for measuring coverage." @@ -852,7 +896,7 @@ marker = "python_version >= \"3\"" name = "pytest-mock" optional = false python-versions = ">=3.5" -version = "3.3.1" +version = "3.5.0" [package.dependencies] pytest = ">=5.0" @@ -891,7 +935,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" -version = "2020.4" +version = "2020.5" [[package]] category = "dev" @@ -947,7 +991,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.10.28" +version = "2020.11.13" [[package]] category = "dev" @@ -955,13 +999,13 @@ description = "Python HTTP for Humans." name = "requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" +version = "2.25.1" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" +chardet = ">=3.0.2,<5" idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" +urllib3 = ">=1.21.1,<1.27" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] @@ -1004,12 +1048,12 @@ description = "Python bindings to FreeDesktop.org Secret Service API" marker = "sys_platform == \"linux\"" name = "secretstorage" optional = false -python-versions = ">=3.5" -version = "3.1.2" +python-versions = ">=3.6" +version = "3.3.0" [package.dependencies] -cryptography = "*" -jeepney = ">=0.4.2" +cryptography = ">=2.0" +jeepney = ">=0.6" [[package]] category = "dev" @@ -1065,7 +1109,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.3.0" +version = "3.4.2" [package.dependencies] Jinja2 = ">=2.3" @@ -1088,8 +1132,8 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.790)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.790)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] category = "dev" @@ -1210,11 +1254,12 @@ category = "dev" description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.51.0" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +version = "4.55.1" [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +telegram = ["requests"] [[package]] category = "dev" @@ -1242,7 +1287,7 @@ description = "Collection of utilities for publishing packages on PyPI" name = "twine" optional = false python-versions = ">=3.6" -version = "3.2.0" +version = "3.3.0" [package.dependencies] colorama = ">=0.4.3" @@ -1266,7 +1311,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "typed-ast" optional = false python-versions = "*" -version = "1.4.1" +version = "1.4.2" [[package]] category = "dev" @@ -1280,7 +1325,7 @@ version = "3.7.4.3" [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" name = "typing-extensions" optional = false python-versions = "*" @@ -1292,7 +1337,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.11" +version = "1.26.2" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1391,8 +1436,8 @@ attrs = [ {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] babel = [ - {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, - {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, + {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"}, + {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"}, ] "backports.functools-lru-cache" = [ {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, @@ -1406,59 +1451,57 @@ bleach = [ {file = "bleach-3.2.1.tar.gz", hash = "sha256:52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080"}, ] certifi = [ - {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, - {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] cffi = [ - {file = "cffi-1.14.3-2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc"}, - {file = "cffi-1.14.3-2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768"}, - {file = "cffi-1.14.3-2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d"}, - {file = "cffi-1.14.3-2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1"}, - {file = "cffi-1.14.3-2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca"}, - {file = "cffi-1.14.3-2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730"}, - {file = "cffi-1.14.3-cp27-cp27m-win32.whl", hash = "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d"}, - {file = "cffi-1.14.3-cp27-cp27m-win_amd64.whl", hash = "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4"}, - {file = "cffi-1.14.3-cp35-cp35m-win32.whl", hash = "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d"}, - {file = "cffi-1.14.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537"}, - {file = "cffi-1.14.3-cp36-cp36m-win32.whl", hash = "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0"}, - {file = "cffi-1.14.3-cp36-cp36m-win_amd64.whl", hash = "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394"}, - {file = "cffi-1.14.3-cp37-cp37m-win32.whl", hash = "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc"}, - {file = "cffi-1.14.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9"}, - {file = "cffi-1.14.3-cp38-cp38-win32.whl", hash = "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522"}, - {file = "cffi-1.14.3-cp38-cp38-win_amd64.whl", hash = "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c"}, - {file = "cffi-1.14.3-cp39-cp39-win32.whl", hash = "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b"}, - {file = "cffi-1.14.3-cp39-cp39-win_amd64.whl", hash = "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3"}, - {file = "cffi-1.14.3.tar.gz", hash = "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591"}, + {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, + {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, + {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, + {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, + {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, + {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, + {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, + {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, + {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, + {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, + {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, + {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, + {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, + {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, + {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, + {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, + {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, + {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, + {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, + {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, + {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, + {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, + {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, + {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, + {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, + {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, + {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, + {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, + {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, + {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, + {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, + {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, ] chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] codecov = [ - {file = "codecov-2.1.10-py2.py3-none-any.whl", hash = "sha256:61bc71b5f58be8000bf9235aa9d0112f8fd3acca00aa02191bb81426d22a8584"}, - {file = "codecov-2.1.10-py3.8.egg", hash = "sha256:a333626e6ff882db760ce71a1d84baf80ddff2cd459a3cc49b41fdac47d77ca5"}, - {file = "codecov-2.1.10.tar.gz", hash = "sha256:d30ad6084501224b1ba699cbf018a340bb9553eb2701301c14133995fdd84f33"}, + {file = "codecov-2.1.11-py2.py3-none-any.whl", hash = "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8"}, + {file = "codecov-2.1.11-py3.8.egg", hash = "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef"}, + {file = "codecov-2.1.11.tar.gz", hash = "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1477,68 +1520,75 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, - {file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"}, - {file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"}, - {file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"}, - {file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"}, - {file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"}, - {file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"}, - {file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"}, - {file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"}, - {file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"}, - {file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"}, - {file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"}, - {file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"}, - {file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"}, - {file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"}, - {file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"}, - {file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"}, - {file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"}, - {file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"}, - {file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"}, - {file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"}, - {file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"}, - {file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"}, - {file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"}, - {file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"}, - {file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"}, - {file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"}, - {file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"}, - {file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"}, - {file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"}, - {file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"}, - {file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"}, - {file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"}, - {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, + {file = "coverage-5.3.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fabeeb121735d47d8eab8671b6b031ce08514c86b7ad8f7d5490a7b6dcd6267d"}, + {file = "coverage-5.3.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:7e4d159021c2029b958b2363abec4a11db0ce8cd43abb0d9ce44284cb97217e7"}, + {file = "coverage-5.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:378ac77af41350a8c6b8801a66021b52da8a05fd77e578b7380e876c0ce4f528"}, + {file = "coverage-5.3.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e448f56cfeae7b1b3b5bcd99bb377cde7c4eb1970a525c770720a352bc4c8044"}, + {file = "coverage-5.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:cc44e3545d908ecf3e5773266c487ad1877be718d9dc65fc7eb6e7d14960985b"}, + {file = "coverage-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:08b3ba72bd981531fd557f67beee376d6700fba183b167857038997ba30dd297"}, + {file = "coverage-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:8dacc4073c359f40fcf73aede8428c35f84639baad7e1b46fce5ab7a8a7be4bb"}, + {file = "coverage-5.3.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ee2f1d1c223c3d2c24e3afbb2dd38be3f03b1a8d6a83ee3d9eb8c36a52bee899"}, + {file = "coverage-5.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9a9d4ff06804920388aab69c5ea8a77525cf165356db70131616acd269e19b36"}, + {file = "coverage-5.3.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:782a5c7df9f91979a7a21792e09b34a658058896628217ae6362088b123c8500"}, + {file = "coverage-5.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:fda29412a66099af6d6de0baa6bd7c52674de177ec2ad2630ca264142d69c6c7"}, + {file = "coverage-5.3.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:f2c6888eada180814b8583c3e793f3f343a692fc802546eed45f40a001b1169f"}, + {file = "coverage-5.3.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8f33d1156241c43755137288dea619105477961cfa7e47f48dbf96bc2c30720b"}, + {file = "coverage-5.3.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b239711e774c8eb910e9b1ac719f02f5ae4bf35fa0420f438cdc3a7e4e7dd6ec"}, + {file = "coverage-5.3.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:f54de00baf200b4539a5a092a759f000b5f45fd226d6d25a76b0dff71177a714"}, + {file = "coverage-5.3.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:be0416074d7f253865bb67630cf7210cbc14eb05f4099cc0f82430135aaa7a3b"}, + {file = "coverage-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:c46643970dff9f5c976c6512fd35768c4a3819f01f61169d8cdac3f9290903b7"}, + {file = "coverage-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9a4f66259bdd6964d8cf26142733c81fb562252db74ea367d9beb4f815478e72"}, + {file = "coverage-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6e5174f8ca585755988bc278c8bb5d02d9dc2e971591ef4a1baabdf2d99589b"}, + {file = "coverage-5.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3911c2ef96e5ddc748a3c8b4702c61986628bb719b8378bf1e4a6184bbd48fe4"}, + {file = "coverage-5.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c5ec71fd4a43b6d84ddb88c1df94572479d9a26ef3f150cef3dacefecf888105"}, + {file = "coverage-5.3.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f51dbba78d68a44e99d484ca8c8f604f17e957c1ca09c3ebc2c7e3bbd9ba0448"}, + {file = "coverage-5.3.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a2070c5affdb3a5e751f24208c5c4f3d5f008fa04d28731416e023c93b275277"}, + {file = "coverage-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:535dc1e6e68fad5355f9984d5637c33badbdc987b0c0d303ee95a6c979c9516f"}, + {file = "coverage-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:a4857f7e2bc6921dbd487c5c88b84f5633de3e7d416c4dc0bb70256775551a6c"}, + {file = "coverage-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fac3c432851038b3e6afe086f777732bcf7f6ebbfd90951fa04ee53db6d0bcdd"}, + {file = "coverage-5.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cd556c79ad665faeae28020a0ab3bda6cd47d94bec48e36970719b0b86e4dcf4"}, + {file = "coverage-5.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a66ca3bdf21c653e47f726ca57f46ba7fc1f260ad99ba783acc3e58e3ebdb9ff"}, + {file = "coverage-5.3.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ab110c48bc3d97b4d19af41865e14531f300b482da21783fdaacd159251890e8"}, + {file = "coverage-5.3.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e52d3d95df81c8f6b2a1685aabffadf2d2d9ad97203a40f8d61e51b70f191e4e"}, + {file = "coverage-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:fa10fee7e32213f5c7b0d6428ea92e3a3fdd6d725590238a3f92c0de1c78b9d2"}, + {file = "coverage-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ce6f3a147b4b1a8b09aae48517ae91139b1b010c5f36423fa2b866a8b23df879"}, + {file = "coverage-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:93a280c9eb736a0dcca19296f3c30c720cb41a71b1f9e617f341f0a8e791a69b"}, + {file = "coverage-5.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3102bb2c206700a7d28181dbe04d66b30780cde1d1c02c5f3c165cf3d2489497"}, + {file = "coverage-5.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8ffd4b204d7de77b5dd558cdff986a8274796a1e57813ed005b33fd97e29f059"}, + {file = "coverage-5.3.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a607ae05b6c96057ba86c811d9c43423f35e03874ffb03fbdcd45e0637e8b631"}, + {file = "coverage-5.3.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:3a3c3f8863255f3c31db3889f8055989527173ef6192a283eb6f4db3c579d830"}, + {file = "coverage-5.3.1-cp38-cp38-win32.whl", hash = "sha256:ff1330e8bc996570221b450e2d539134baa9465f5cb98aff0e0f73f34172e0ae"}, + {file = "coverage-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:3498b27d8236057def41de3585f317abae235dd3a11d33e01736ffedb2ef8606"}, + {file = "coverage-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ceb499d2b3d1d7b7ba23abe8bf26df5f06ba8c71127f188333dddcf356b4b63f"}, + {file = "coverage-5.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3b14b1da110ea50c8bcbadc3b82c3933974dbeea1832e814aab93ca1163cd4c1"}, + {file = "coverage-5.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:76b2775dda7e78680d688daabcb485dc87cf5e3184a0b3e012e1d40e38527cc8"}, + {file = "coverage-5.3.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:cef06fb382557f66d81d804230c11ab292d94b840b3cb7bf4450778377b592f4"}, + {file = "coverage-5.3.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f61319e33222591f885c598e3e24f6a4be3533c1d70c19e0dc59e83a71ce27d"}, + {file = "coverage-5.3.1-cp39-cp39-win32.whl", hash = "sha256:cc6f8246e74dd210d7e2b56c76ceaba1cc52b025cd75dbe96eb48791e0250e98"}, + {file = "coverage-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:2757fa64e11ec12220968f65d086b7a29b6583d16e9a544c889b22ba98555ef1"}, + {file = "coverage-5.3.1-pp36-none-any.whl", hash = "sha256:723d22d324e7997a651478e9c5a3120a0ecbc9a7e94071f7e1954562a8806cf3"}, + {file = "coverage-5.3.1-pp37-none-any.whl", hash = "sha256:c89b558f8a9a5a6f2cfc923c304d49f0ce629c3bd85cb442ca258ec20366394c"}, + {file = "coverage-5.3.1.tar.gz", hash = "sha256:38f16b1317b8dd82df67ed5daa5f5e7c959e46579840d77a67a4ceb9cef0a50b"}, ] cryptography = [ - {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, - {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, - {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, - {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, - {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, - {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, - {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, - {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, - {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, - {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, - {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, - {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, - {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, - {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, - {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, + {file = "cryptography-3.3.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030"}, + {file = "cryptography-3.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0"}, + {file = "cryptography-3.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812"}, + {file = "cryptography-3.3.1-cp27-cp27m-win32.whl", hash = "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e"}, + {file = "cryptography-3.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901"}, + {file = "cryptography-3.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d"}, + {file = "cryptography-3.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5"}, + {file = "cryptography-3.3.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c"}, + {file = "cryptography-3.3.1-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c"}, + {file = "cryptography-3.3.1-cp36-abi3-win32.whl", hash = "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a"}, + {file = "cryptography-3.3.1-cp36-abi3-win_amd64.whl", hash = "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7"}, + {file = "cryptography-3.3.1.tar.gz", hash = "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6"}, ] dataclasses = [ - {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, - {file = "dataclasses-0.7.tar.gz", hash = "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6"}, + {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, + {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, @@ -1577,8 +1627,10 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"}, - {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, + {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, + {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, + {file = "importlib_metadata-3.3.0-py3-none-any.whl", hash = "sha256:bf792d480abbd5eda85794e4afb09dd538393f7d6e6ffef6e9f03d2014cf9450"}, + {file = "importlib_metadata-3.3.0.tar.gz", hash = "sha256:5c5a2720817414a6c41f0a49993908068243ae02c1635a228126519b509c8aed"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1587,12 +1639,12 @@ iniconfig = [ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"}, - {file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"}, + {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, + {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, ] jeepney = [ - {file = "jeepney-0.4.3-py3-none-any.whl", hash = "sha256:d6c6b49683446d2407d2fe3acb7a368a77ff063f9182fe427da15d622adc24cf"}, - {file = "jeepney-0.4.3.tar.gz", hash = "sha256:3479b861cc2b6407de5188695fa1a8d57e5072d7059322469b62628869b8e36e"}, + {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, + {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -1602,8 +1654,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-21.4.0-py3-none-any.whl", hash = "sha256:4e34ea2fdec90c1c43d6610b5a5fafa1b9097db1802948e90caf5763974b8f8d"}, - {file = "keyring-21.4.0.tar.gz", hash = "sha256:9aeadd006a852b78f4b4ef7c7556c2774d2432bbef8ee538a3e9089ac8b11466"}, + {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, + {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, ] libtmux = [ {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, @@ -1662,8 +1714,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, + {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, + {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, ] pathlib2 = [ {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, @@ -1672,8 +1724,8 @@ pathlib2 = [ {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] pathspec = [ - {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, - {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ {file = "Pillow-6.2.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:834dd023b7f987d6b700ad93dc818098d7eb046bd445e9992b3093c6f9d7a95f"}, @@ -1734,34 +1786,34 @@ pillow = [ {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, - {file = "Pillow-8.0.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:b63d4ff734263ae4ce6593798bcfee6dbfb00523c82753a3a03cbc05555a9cc3"}, - {file = "Pillow-8.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f9403af9c790cc18411ea398a6950ee2def2a830ad0cfe6dc9122e6d528b302"}, - {file = "Pillow-8.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6b4a8fd632b4ebee28282a9fef4c341835a1aa8671e2770b6f89adc8e8c2703c"}, - {file = "Pillow-8.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:cc3ea6b23954da84dbee8025c616040d9aa5eaf34ea6895a0a762ee9d3e12e11"}, - {file = "Pillow-8.0.1-cp36-cp36m-win32.whl", hash = "sha256:d8a96747df78cda35980905bf26e72960cba6d355ace4780d4bdde3b217cdf1e"}, - {file = "Pillow-8.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7ba0ba61252ab23052e642abdb17fd08fdcfdbbf3b74c969a30c58ac1ade7cd3"}, - {file = "Pillow-8.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:795e91a60f291e75de2e20e6bdd67770f793c8605b553cb6e4387ce0cb302e09"}, - {file = "Pillow-8.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0a2e8d03787ec7ad71dc18aec9367c946ef8ef50e1e78c71f743bc3a770f9fae"}, - {file = "Pillow-8.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:006de60d7580d81f4a1a7e9f0173dc90a932e3905cc4d47ea909bc946302311a"}, - {file = "Pillow-8.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bd7bf289e05470b1bc74889d1466d9ad4a56d201f24397557b6f65c24a6844b8"}, - {file = "Pillow-8.0.1-cp37-cp37m-win32.whl", hash = "sha256:95edb1ed513e68bddc2aee3de66ceaf743590bf16c023fb9977adc4be15bd3f0"}, - {file = "Pillow-8.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e38d58d9138ef972fceb7aeec4be02e3f01d383723965bfcef14d174c8ccd039"}, - {file = "Pillow-8.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d3d07c86d4efa1facdf32aa878bd508c0dc4f87c48125cc16b937baa4e5b5e11"}, - {file = "Pillow-8.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:fbd922f702582cb0d71ef94442bfca57624352622d75e3be7a1e7e9360b07e72"}, - {file = "Pillow-8.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:92c882b70a40c79de9f5294dc99390671e07fc0b0113d472cbea3fde15db1792"}, - {file = "Pillow-8.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7c9401e68730d6c4245b8e361d3d13e1035cbc94db86b49dc7da8bec235d0015"}, - {file = "Pillow-8.0.1-cp38-cp38-win32.whl", hash = "sha256:6c1aca8231625115104a06e4389fcd9ec88f0c9befbabd80dc206c35561be271"}, - {file = "Pillow-8.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:cc9ec588c6ef3a1325fa032ec14d97b7309db493782ea8c304666fb10c3bd9a7"}, - {file = "Pillow-8.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:eb472586374dc66b31e36e14720747595c2b265ae962987261f044e5cce644b5"}, - {file = "Pillow-8.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:0eeeae397e5a79dc088d8297a4c2c6f901f8fb30db47795113a4a605d0f1e5ce"}, - {file = "Pillow-8.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81f812d8f5e8a09b246515fac141e9d10113229bc33ea073fec11403b016bcf3"}, - {file = "Pillow-8.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:895d54c0ddc78a478c80f9c438579ac15f3e27bf442c2a9aa74d41d0e4d12544"}, - {file = "Pillow-8.0.1-cp39-cp39-win32.whl", hash = "sha256:2fb113757a369a6cdb189f8df3226e995acfed0a8919a72416626af1a0a71140"}, - {file = "Pillow-8.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:59e903ca800c8cfd1ebe482349ec7c35687b95e98cefae213e271c8c7fffa021"}, - {file = "Pillow-8.0.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:5abd653a23c35d980b332bc0431d39663b1709d64142e3652890df4c9b6970f6"}, - {file = "Pillow-8.0.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:4b0ef2470c4979e345e4e0cc1bbac65fda11d0d7b789dbac035e4c6ce3f98adb"}, - {file = "Pillow-8.0.1-pp37-pypy37_pp73-win32.whl", hash = "sha256:8de332053707c80963b589b22f8e0229f1be1f3ca862a932c1bcd48dafb18dd8"}, - {file = "Pillow-8.0.1.tar.gz", hash = "sha256:11c5c6e9b02c9dac08af04f093eb5a2f84857df70a7d4a6a6ad461aca803fb9e"}, + {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, + {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, + {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, + {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, + {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, + {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, + {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, + {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, + {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, + {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, + {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, + {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, + {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, + {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, + {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, + {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, + {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, + {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, + {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, ] pkginfo = [ {file = "pkginfo-1.6.1-py2.py3-none-any.whl", hash = "sha256:ce14d7296c673dc4c61c759a0b6c14bae34e34eb819c0017bb6ca5b7292c56e9"}, @@ -1772,8 +1824,8 @@ pluggy = [ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] py = [ - {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, - {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, @@ -1790,8 +1842,8 @@ pyflakes = [ pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, - {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, - {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, + {file = "Pygments-2.7.3-py3-none-any.whl", hash = "sha256:f275b6c0909e5dafd2d6269a656aa90fa58ebf4a74f8fcf9053195d226b24a08"}, + {file = "Pygments-2.7.3.tar.gz", hash = "sha256:ccf3acacf3782cbed4a989426012f1c535c9a90d3a7fc3f16d231b9372d2b716"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1802,6 +1854,8 @@ pytest = [ {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, + {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, + {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, @@ -1812,8 +1866,8 @@ pytest-cov = [ pytest-mock = [ {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, - {file = "pytest-mock-3.3.1.tar.gz", hash = "sha256:a4d6d37329e4a893e77d9ffa89e838dd2b45d5dc099984cf03c703ac8411bb82"}, - {file = "pytest_mock-3.3.1-py3-none-any.whl", hash = "sha256:024e405ad382646318c4281948aadf6fe1135632bea9cc67366ea0c4098ef5f2"}, + {file = "pytest-mock-3.5.0.tar.gz", hash = "sha256:4992db789175540d40a193bc60e987b1e69f1a989adad525a44e581c82149b14"}, + {file = "pytest_mock-3.5.0-py3-none-any.whl", hash = "sha256:f9d77233b3af6c71cec6a8b8b5e9e9a2effd1bb6ff56e9ace72541ff6843ac81"}, ] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, @@ -1822,8 +1876,8 @@ pytest-rerunfailures = [ {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, ] pytz = [ - {file = "pytz-2020.4-py2.py3-none-any.whl", hash = "sha256:5c55e189b682d420be27c6995ba6edce0c0a77dd67bfbe2ae6607134d5851ffd"}, - {file = "pytz-2020.4.tar.gz", hash = "sha256:3e6b7dd2d1e0a59084bcee14a17af60c5c562cdc16d828e8eba2e683d3a7e268"}, + {file = "pytz-2020.5-py2.py3-none-any.whl", hash = "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4"}, + {file = "pytz-2020.5.tar.gz", hash = "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1851,37 +1905,51 @@ recommonmark = [ {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ - {file = "regex-2020.10.28-cp27-cp27m-win32.whl", hash = "sha256:4b5a9bcb56cc146c3932c648603b24514447eafa6ce9295234767bf92f69b504"}, - {file = "regex-2020.10.28-cp27-cp27m-win_amd64.whl", hash = "sha256:c13d311a4c4a8d671f5860317eb5f09591fbe8259676b86a85769423b544451e"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c8a2b7ccff330ae4c460aff36626f911f918555660cc28163417cb84ffb25789"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4afa350f162551cf402bfa3cd8302165c8e03e689c897d185f16a167328cc6dd"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b88fa3b8a3469f22b4f13d045d9bd3eda797aa4e406fde0a2644bc92bbdd4bdd"}, - {file = "regex-2020.10.28-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f43109822df2d3faac7aad79613f5f02e4eab0fc8ad7932d2e70e2a83bd49c26"}, - {file = "regex-2020.10.28-cp36-cp36m-win32.whl", hash = "sha256:8092a5a06ad9a7a247f2a76ace121183dc4e1a84c259cf9c2ce3bbb69fac3582"}, - {file = "regex-2020.10.28-cp36-cp36m-win_amd64.whl", hash = "sha256:49461446b783945597c4076aea3f49aee4b4ce922bd241e4fcf62a3e7c61794c"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8ca9dca965bd86ea3631b975d63b0693566d3cc347e55786d5514988b6f5b84c"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ea37320877d56a7f0a1e6a625d892cf963aa7f570013499f5b8d5ab8402b5625"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:3a5f08039eee9ea195a89e180c5762bfb55258bfb9abb61a20d3abee3b37fd12"}, - {file = "regex-2020.10.28-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:cb905f3d2e290a8b8f1579d3984f2cfa7c3a29cc7cba608540ceeed18513f520"}, - {file = "regex-2020.10.28-cp37-cp37m-win32.whl", hash = "sha256:a62162be05edf64f819925ea88d09d18b09bebf20971b363ce0c24e8b4aa14c0"}, - {file = "regex-2020.10.28-cp37-cp37m-win_amd64.whl", hash = "sha256:03855ee22980c3e4863dc84c42d6d2901133362db5daf4c36b710dd895d78f0a"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux1_i686.whl", hash = "sha256:625116aca6c4b57c56ea3d70369cacc4d62fead4930f8329d242e4fe7a58ce4b"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dc522e25e57e88b4980d2bdd334825dbf6fa55f28a922fc3bfa60cc09e5ef53"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:119e0355dbdd4cf593b17f2fc5dbd4aec2b8899d0057e4957ba92f941f704bf5"}, - {file = "regex-2020.10.28-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:cfcf28ed4ce9ced47b9b9670a4f0d3d3c0e4d4779ad4dadb1ad468b097f808aa"}, - {file = "regex-2020.10.28-cp38-cp38-win32.whl", hash = "sha256:06b52815d4ad38d6524666e0d50fe9173533c9cc145a5779b89733284e6f688f"}, - {file = "regex-2020.10.28-cp38-cp38-win_amd64.whl", hash = "sha256:c3466a84fce42c2016113101018a9981804097bacbab029c2d5b4fcb224b89de"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c2c6c56ee97485a127555c9595c069201b5161de9d05495fbe2132b5ac104786"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1ec66700a10e3c75f1f92cbde36cca0d3aaee4c73dfa26699495a3a30b09093c"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:11116d424734fe356d8777f89d625f0df783251ada95d6261b4c36ad27a394bb"}, - {file = "regex-2020.10.28-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f1fce1e4929157b2afeb4bb7069204d4370bab9f4fc03ca1fbec8bd601f8c87d"}, - {file = "regex-2020.10.28-cp39-cp39-win32.whl", hash = "sha256:832339223b9ce56b7b15168e691ae654d345ac1635eeb367ade9ecfe0e66bee0"}, - {file = "regex-2020.10.28-cp39-cp39-win_amd64.whl", hash = "sha256:654c1635f2313d0843028487db2191530bca45af61ca85d0b16555c399625b0e"}, - {file = "regex-2020.10.28.tar.gz", hash = "sha256:dd3e6547ecf842a29cf25123fbf8d2461c53c8d37aa20d87ecee130c89b7079b"}, + {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, + {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, + {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, + {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, + {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, + {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, + {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, + {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, + {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, + {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, + {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, + {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, + {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, + {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, + {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, + {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, + {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, ] requests = [ - {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, - {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -1905,8 +1973,8 @@ scandir = [ {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, ] secretstorage = [ - {file = "SecretStorage-3.1.2-py3-none-any.whl", hash = "sha256:b5ec909dde94d4ae2fa26af7c089036997030f0cf0a5cb372b4cccabd81c143b"}, - {file = "SecretStorage-3.1.2.tar.gz", hash = "sha256:15da8a989b65498e29be338b3b279965f1b8f09b9668bd8010da183024c8bff6"}, + {file = "SecretStorage-3.3.0-py3-none-any.whl", hash = "sha256:5c36f6537a523ec5f969ef9fad61c98eb9e017bc601d811e53aa25bece64892f"}, + {file = "SecretStorage-3.3.0.tar.gz", hash = "sha256:30cfdef28829dad64d6ea1ed08f8eff6aa115a77068926bcc9f5225d5a3246aa"}, ] six = [ {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, @@ -1919,8 +1987,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.3.0-py3-none-any.whl", hash = "sha256:3abdb2c57a65afaaa4f8573cbabd5465078eb6fd282c1e4f87f006875a7ec0c7"}, - {file = "Sphinx-3.3.0.tar.gz", hash = "sha256:1c21e7c5481a31b531e6cbf59c3292852ccde175b504b00ce2ff0b8f4adc3649"}, + {file = "Sphinx-3.4.2-py3-none-any.whl", hash = "sha256:b8aa4eb5502c53d3b5ca13a07abeedacd887f7770c198952fd5b9530d973e767"}, + {file = "Sphinx-3.4.2.tar.gz", hash = "sha256:77dec5ac77ca46eee54f59cf477780f4fb23327b3339ef39c8471abb829c1285"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -1959,37 +2027,46 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.51.0-py2.py3-none-any.whl", hash = "sha256:9ad44aaf0fc3697c06f6e05c7cf025dd66bc7bcb7613c66d85f4464c47ac8fad"}, - {file = "tqdm-4.51.0.tar.gz", hash = "sha256:ef54779f1c09f346b2b5a8e5c61f96fbcb639929e640e59f8cf810794f406432"}, + {file = "tqdm-4.55.1-py2.py3-none-any.whl", hash = "sha256:b8b46036fd00176d0870307123ef06bb851096964fa7fc578d789f90ce82c3e4"}, + {file = "tqdm-4.55.1.tar.gz", hash = "sha256:556c55b081bd9aa746d34125d024b73f0e2a0e62d5927ff0e400e20ee0a03b9a"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, - {file = "twine-3.2.0-py3-none-any.whl", hash = "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472"}, - {file = "twine-3.2.0.tar.gz", hash = "sha256:34352fd52ec3b9d29837e6072d5a2a7c6fe4290e97bba46bb8d478b5c598f7ab"}, + {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, + {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, ] typed-ast = [ - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, - {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, - {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, - {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, - {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, - {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, - {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, ] typing = [ {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, @@ -2001,8 +2078,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, - {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, + {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, + {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, From 868fe19a7c7fefa31f0fcd27154021334778431f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 Jan 2021 08:53:31 -0600 Subject: [PATCH 0729/2998] Release v1.7.0 --- CHANGES | 30 ++++++++++++++++++++++++++++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 4df0b2eefe..c3b0bb8d96 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,36 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.7.0 (2021-01-09) +------------------------ + +This will be the last Python 2.7 release of tmuxp. Bug fixes for python +2.7 will live in the `1.7.x branch`_. + +- :issue:`530` New feature: Plugin system + + - Add plugin system for user customization of tmuxp + - Add tests for the plugin system + - Update existing tests for the plugin system + - Add the plugin interface to the tmuxp package + - Add in depth documentation for the plugin system + + Thank you @joseph-flinn! +- :issue:`656` New feature: Ability to append windows to a session + + ``tmuxp load -a configfile`` will append a configuration to your current + tmux session. + + Thank you @will-ockmore! +- :issue:`647` Improvement: Logging to file: + + ``tmuxp load --log-level outputfile.log`` +- :issue:`643` New command: Debug information + + Port ``tmuxp debug-info`` from via v1.6.2 + +.. _1.7.x branch: https://github.com/tmux-python/tmuxp/tree/v1.7.x + tmuxp 1.7.0a4 (2021-01-06) -------------------------- - Port click package fix from 1.6.4 diff --git a/pyproject.toml b/pyproject.toml index c5122e4447..f162a3c2a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.7.0a3" +version = "1.7.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 873f5b13d1..035d1fd44a 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0a4' +__version__ = '1.7.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 6833d1735877e434c85d4737824593c0cb96ef63 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Jan 2021 12:42:16 -0600 Subject: [PATCH 0730/2998] tmuxp plugins: Update pyproject to show 1.7.0 version --- tests/fixtures/pluginsystem/partials/all_pass.py | 4 ++-- tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py | 4 ++-- .../pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml | 2 +- .../plugins/tmuxp_test_plugin_fail/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py index a19ade914a..19da4b6e63 100644 --- a/tests/fixtures/pluginsystem/partials/all_pass.py +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -11,10 +11,10 @@ def __init__(self): 'libtmux_min_version': '0.8.3', 'libtmux_max_version': '100.0', 'libtmux_version_incompatible': ['0.7.1'], - 'tmuxp_min_version': '1.6.0', + 'tmuxp_min_version': '1.7.0', 'tmuxp_max_version': '100.0.0', 'tmuxp_version_incompatible': ['1.5.6'], 'tmux_version': '3.0', - 'tmuxp_version': '1.6.0', + 'tmuxp_version': '1.7.0', } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index 05cbd4ce05..47c4a8e82c 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -5,8 +5,8 @@ class TmuxpVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { 'plugin_name': 'tmuxp-min-version-fail', - 'tmuxp_min_version': '1.6.0', - 'tmuxp_version': '1.5.6', + 'tmuxp_min_version': '1.7.0', + 'tmuxp_version': '1.6.3', } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml index 198d239d63..97d3597e59 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index 15cd0f2ff6..01a1fe2858 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0." +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml index e34023ad10..1693dc04ba 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml index 977cabeb3e..fbce74c992 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml index c6a94e5db1..1484f2b3eb 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml index ae0b438dba..9e18628f92 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "~2.7 || ^3.5" -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] From 37568de219b9cff08e0f4cff8e3e4e24af653133 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Jan 2021 12:42:53 -0600 Subject: [PATCH 0731/2998] Update poetry lockfile --- poetry.lock | 233 +++++++++++++++++++++++++++++----------------------- 1 file changed, 131 insertions(+), 102 deletions(-) diff --git a/poetry.lock b/poetry.lock index aed317bb1d..59b4af636a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -116,7 +116,7 @@ description = "An easy safelist-based HTML-sanitizing tool." name = "bleach" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.2.1" +version = "3.2.3" [package.dependencies] packaging = "*" @@ -223,7 +223,7 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.3.1" +version = "5.4" [package.extras] toml = ["toml"] @@ -395,7 +395,7 @@ marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version name = "importlib-metadata" optional = false python-versions = ">=3.6" -version = "3.3.0" +version = "3.4.0" [package.dependencies] zipp = ">=0.5" @@ -405,8 +405,8 @@ python = "<3.8" version = ">=3.6.4" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] category = "dev" @@ -499,7 +499,7 @@ description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "21.8.0" +version = "22.0.1" [package.dependencies] SecretStorage = ">=3.2" @@ -512,7 +512,7 @@ version = ">=1" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] category = "main" @@ -587,7 +587,7 @@ description = "Core utilities for Python packages" name = "packaging" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.8" +version = "20.9" [package.dependencies] pyparsing = ">=2.0.2" @@ -662,7 +662,7 @@ description = "Query metadatdata from sdists / bdists / installed packages." name = "pkginfo" optional = false python-versions = "*" -version = "1.6.1" +version = "1.7.0" [package.extras] testing = ["nose", "coverage"] @@ -732,7 +732,7 @@ description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false python-versions = ">=3.5" -version = "2.7.3" +version = "2.7.4" [[package]] category = "dev" @@ -819,7 +819,7 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.6" -version = "6.2.1" +version = "6.2.2" [package.dependencies] atomicwrites = ">=1.0" @@ -861,10 +861,10 @@ marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.10.1" +version = "2.11.1" [package.dependencies] -coverage = ">=4.4" +coverage = ">=5.2.1" pytest = ">=4.6" [package.extras] @@ -896,7 +896,7 @@ marker = "python_version >= \"3\"" name = "pytest-mock" optional = false python-versions = ">=3.5" -version = "3.5.0" +version = "3.5.1" [package.dependencies] pytest = ">=5.0" @@ -954,6 +954,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "5.3.1" +[[package]] +category = "main" +description = "YAML parser and emitter for Python" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +version = "5.4.1" + [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -1065,12 +1073,12 @@ version = "1.15.0" [[package]] category = "dev" -description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" -version = "2.0.0" +version = "2.1.0" [[package]] category = "dev" @@ -1109,7 +1117,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.4.2" +version = "3.4.3" [package.dependencies] Jinja2 = ">=2.3" @@ -1250,7 +1258,7 @@ python-versions = "~2.7 || ^3.5" version = "0.0.2" [package.dependencies] -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1267,7 +1275,7 @@ python-versions = "~2.7 || ^3.5" version = "0.0.2" [package.dependencies] -tmuxp = "^1.6.0." +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1284,7 +1292,7 @@ python-versions = "~2.7 || ^3.5" version = "0.0.2" [package.dependencies] -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1301,7 +1309,7 @@ python-versions = "~2.7 || ^3.5" version = "0.1.0" [package.dependencies] -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1318,7 +1326,7 @@ python-versions = "~2.7 || ^3.5" version = "0.0.2" [package.dependencies] -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1335,7 +1343,7 @@ python-versions = "~2.7 || ^3.5" version = "0.0.2" [package.dependencies] -tmuxp = "^1.6.0" +tmuxp = "^1.7.0" [package.source] reference = "" @@ -1357,7 +1365,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.55.1" +version = "4.56.0" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] @@ -1427,7 +1435,7 @@ version = "3.7.4.3" [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" name = "typing-extensions" optional = false python-versions = "*" @@ -1439,7 +1447,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.26.2" +version = "1.26.3" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1489,7 +1497,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1549,8 +1557,8 @@ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] bleach = [ - {file = "bleach-3.2.1-py2.py3-none-any.whl", hash = "sha256:9f8ccbeb6183c6e6cddea37592dfb0167485c1e3b13b3363bc325aa8bda3adbd"}, - {file = "bleach-3.2.1.tar.gz", hash = "sha256:52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080"}, + {file = "bleach-3.2.3-py2.py3-none-any.whl", hash = "sha256:2d3b3f7e7d69148bb683b26a3f21eabcf62fa8fb7bc75d0e7a13bcecd9568d4d"}, + {file = "bleach-3.2.3.tar.gz", hash = "sha256:c6ad42174219b64848e2e2cd434e44f56cd24a93a9b4f8bc52cfed55a1cd5aad"}, ] certifi = [ {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, @@ -1622,55 +1630,55 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.3.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fabeeb121735d47d8eab8671b6b031ce08514c86b7ad8f7d5490a7b6dcd6267d"}, - {file = "coverage-5.3.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:7e4d159021c2029b958b2363abec4a11db0ce8cd43abb0d9ce44284cb97217e7"}, - {file = "coverage-5.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:378ac77af41350a8c6b8801a66021b52da8a05fd77e578b7380e876c0ce4f528"}, - {file = "coverage-5.3.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e448f56cfeae7b1b3b5bcd99bb377cde7c4eb1970a525c770720a352bc4c8044"}, - {file = "coverage-5.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:cc44e3545d908ecf3e5773266c487ad1877be718d9dc65fc7eb6e7d14960985b"}, - {file = "coverage-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:08b3ba72bd981531fd557f67beee376d6700fba183b167857038997ba30dd297"}, - {file = "coverage-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:8dacc4073c359f40fcf73aede8428c35f84639baad7e1b46fce5ab7a8a7be4bb"}, - {file = "coverage-5.3.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ee2f1d1c223c3d2c24e3afbb2dd38be3f03b1a8d6a83ee3d9eb8c36a52bee899"}, - {file = "coverage-5.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9a9d4ff06804920388aab69c5ea8a77525cf165356db70131616acd269e19b36"}, - {file = "coverage-5.3.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:782a5c7df9f91979a7a21792e09b34a658058896628217ae6362088b123c8500"}, - {file = "coverage-5.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:fda29412a66099af6d6de0baa6bd7c52674de177ec2ad2630ca264142d69c6c7"}, - {file = "coverage-5.3.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:f2c6888eada180814b8583c3e793f3f343a692fc802546eed45f40a001b1169f"}, - {file = "coverage-5.3.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8f33d1156241c43755137288dea619105477961cfa7e47f48dbf96bc2c30720b"}, - {file = "coverage-5.3.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b239711e774c8eb910e9b1ac719f02f5ae4bf35fa0420f438cdc3a7e4e7dd6ec"}, - {file = "coverage-5.3.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:f54de00baf200b4539a5a092a759f000b5f45fd226d6d25a76b0dff71177a714"}, - {file = "coverage-5.3.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:be0416074d7f253865bb67630cf7210cbc14eb05f4099cc0f82430135aaa7a3b"}, - {file = "coverage-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:c46643970dff9f5c976c6512fd35768c4a3819f01f61169d8cdac3f9290903b7"}, - {file = "coverage-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9a4f66259bdd6964d8cf26142733c81fb562252db74ea367d9beb4f815478e72"}, - {file = "coverage-5.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6e5174f8ca585755988bc278c8bb5d02d9dc2e971591ef4a1baabdf2d99589b"}, - {file = "coverage-5.3.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3911c2ef96e5ddc748a3c8b4702c61986628bb719b8378bf1e4a6184bbd48fe4"}, - {file = "coverage-5.3.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c5ec71fd4a43b6d84ddb88c1df94572479d9a26ef3f150cef3dacefecf888105"}, - {file = "coverage-5.3.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f51dbba78d68a44e99d484ca8c8f604f17e957c1ca09c3ebc2c7e3bbd9ba0448"}, - {file = "coverage-5.3.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:a2070c5affdb3a5e751f24208c5c4f3d5f008fa04d28731416e023c93b275277"}, - {file = "coverage-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:535dc1e6e68fad5355f9984d5637c33badbdc987b0c0d303ee95a6c979c9516f"}, - {file = "coverage-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:a4857f7e2bc6921dbd487c5c88b84f5633de3e7d416c4dc0bb70256775551a6c"}, - {file = "coverage-5.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fac3c432851038b3e6afe086f777732bcf7f6ebbfd90951fa04ee53db6d0bcdd"}, - {file = "coverage-5.3.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cd556c79ad665faeae28020a0ab3bda6cd47d94bec48e36970719b0b86e4dcf4"}, - {file = "coverage-5.3.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a66ca3bdf21c653e47f726ca57f46ba7fc1f260ad99ba783acc3e58e3ebdb9ff"}, - {file = "coverage-5.3.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ab110c48bc3d97b4d19af41865e14531f300b482da21783fdaacd159251890e8"}, - {file = "coverage-5.3.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:e52d3d95df81c8f6b2a1685aabffadf2d2d9ad97203a40f8d61e51b70f191e4e"}, - {file = "coverage-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:fa10fee7e32213f5c7b0d6428ea92e3a3fdd6d725590238a3f92c0de1c78b9d2"}, - {file = "coverage-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ce6f3a147b4b1a8b09aae48517ae91139b1b010c5f36423fa2b866a8b23df879"}, - {file = "coverage-5.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:93a280c9eb736a0dcca19296f3c30c720cb41a71b1f9e617f341f0a8e791a69b"}, - {file = "coverage-5.3.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3102bb2c206700a7d28181dbe04d66b30780cde1d1c02c5f3c165cf3d2489497"}, - {file = "coverage-5.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8ffd4b204d7de77b5dd558cdff986a8274796a1e57813ed005b33fd97e29f059"}, - {file = "coverage-5.3.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a607ae05b6c96057ba86c811d9c43423f35e03874ffb03fbdcd45e0637e8b631"}, - {file = "coverage-5.3.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:3a3c3f8863255f3c31db3889f8055989527173ef6192a283eb6f4db3c579d830"}, - {file = "coverage-5.3.1-cp38-cp38-win32.whl", hash = "sha256:ff1330e8bc996570221b450e2d539134baa9465f5cb98aff0e0f73f34172e0ae"}, - {file = "coverage-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:3498b27d8236057def41de3585f317abae235dd3a11d33e01736ffedb2ef8606"}, - {file = "coverage-5.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ceb499d2b3d1d7b7ba23abe8bf26df5f06ba8c71127f188333dddcf356b4b63f"}, - {file = "coverage-5.3.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:3b14b1da110ea50c8bcbadc3b82c3933974dbeea1832e814aab93ca1163cd4c1"}, - {file = "coverage-5.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:76b2775dda7e78680d688daabcb485dc87cf5e3184a0b3e012e1d40e38527cc8"}, - {file = "coverage-5.3.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:cef06fb382557f66d81d804230c11ab292d94b840b3cb7bf4450778377b592f4"}, - {file = "coverage-5.3.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f61319e33222591f885c598e3e24f6a4be3533c1d70c19e0dc59e83a71ce27d"}, - {file = "coverage-5.3.1-cp39-cp39-win32.whl", hash = "sha256:cc6f8246e74dd210d7e2b56c76ceaba1cc52b025cd75dbe96eb48791e0250e98"}, - {file = "coverage-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:2757fa64e11ec12220968f65d086b7a29b6583d16e9a544c889b22ba98555ef1"}, - {file = "coverage-5.3.1-pp36-none-any.whl", hash = "sha256:723d22d324e7997a651478e9c5a3120a0ecbc9a7e94071f7e1954562a8806cf3"}, - {file = "coverage-5.3.1-pp37-none-any.whl", hash = "sha256:c89b558f8a9a5a6f2cfc923c304d49f0ce629c3bd85cb442ca258ec20366394c"}, - {file = "coverage-5.3.1.tar.gz", hash = "sha256:38f16b1317b8dd82df67ed5daa5f5e7c959e46579840d77a67a4ceb9cef0a50b"}, + {file = "coverage-5.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6d9c88b787638a451f41f97446a1c9fd416e669b4d9717ae4615bd29de1ac135"}, + {file = "coverage-5.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:66a5aae8233d766a877c5ef293ec5ab9520929c2578fd2069308a98b7374ea8c"}, + {file = "coverage-5.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9754a5c265f991317de2bac0c70a746efc2b695cf4d49f5d2cddeac36544fb44"}, + {file = "coverage-5.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:fbb17c0d0822684b7d6c09915677a32319f16ff1115df5ec05bdcaaee40b35f3"}, + {file = "coverage-5.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b7f7421841f8db443855d2854e25914a79a1ff48ae92f70d0a5c2f8907ab98c9"}, + {file = "coverage-5.4-cp27-cp27m-win32.whl", hash = "sha256:4a780807e80479f281d47ee4af2eb2df3e4ccf4723484f77da0bb49d027e40a1"}, + {file = "coverage-5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:87c4b38288f71acd2106f5d94f575bc2136ea2887fdb5dfe18003c881fa6b370"}, + {file = "coverage-5.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6809ebcbf6c1049002b9ac09c127ae43929042ec1f1dbd8bb1615f7cd9f70a0"}, + {file = "coverage-5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ba7ca81b6d60a9f7a0b4b4e175dcc38e8fef4992673d9d6e6879fd6de00dd9b8"}, + {file = "coverage-5.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:89fc12c6371bf963809abc46cced4a01ca4f99cba17be5e7d416ed7ef1245d19"}, + {file = "coverage-5.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a8eb7785bd23565b542b01fb39115a975fefb4a82f23d407503eee2c0106247"}, + {file = "coverage-5.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:7e40d3f8eb472c1509b12ac2a7e24158ec352fc8567b77ab02c0db053927e339"}, + {file = "coverage-5.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1ccae21a076d3d5f471700f6d30eb486da1626c380b23c70ae32ab823e453337"}, + {file = "coverage-5.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:755c56beeacac6a24c8e1074f89f34f4373abce8b662470d3aa719ae304931f3"}, + {file = "coverage-5.4-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:322549b880b2d746a7672bf6ff9ed3f895e9c9f108b714e7360292aa5c5d7cf4"}, + {file = "coverage-5.4-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:60a3307a84ec60578accd35d7f0c71a3a971430ed7eca6567399d2b50ef37b8c"}, + {file = "coverage-5.4-cp35-cp35m-win32.whl", hash = "sha256:1375bb8b88cb050a2d4e0da901001347a44302aeadb8ceb4b6e5aa373b8ea68f"}, + {file = "coverage-5.4-cp35-cp35m-win_amd64.whl", hash = "sha256:16baa799ec09cc0dcb43a10680573269d407c159325972dd7114ee7649e56c66"}, + {file = "coverage-5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2f2cf7a42d4b7654c9a67b9d091ec24374f7c58794858bff632a2039cb15984d"}, + {file = "coverage-5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b62046592b44263fa7570f1117d372ae3f310222af1fc1407416f037fb3af21b"}, + {file = "coverage-5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:812eaf4939ef2284d29653bcfee9665f11f013724f07258928f849a2306ea9f9"}, + {file = "coverage-5.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:859f0add98707b182b4867359e12bde806b82483fb12a9ae868a77880fc3b7af"}, + {file = "coverage-5.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:04b14e45d6a8e159c9767ae57ecb34563ad93440fc1b26516a89ceb5b33c1ad5"}, + {file = "coverage-5.4-cp36-cp36m-win32.whl", hash = "sha256:ebfa374067af240d079ef97b8064478f3bf71038b78b017eb6ec93ede1b6bcec"}, + {file = "coverage-5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:84df004223fd0550d0ea7a37882e5c889f3c6d45535c639ce9802293b39cd5c9"}, + {file = "coverage-5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1b811662ecf72eb2d08872731636aee6559cae21862c36f74703be727b45df90"}, + {file = "coverage-5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6b588b5cf51dc0fd1c9e19f622457cc74b7d26fe295432e434525f1c0fae02bc"}, + {file = "coverage-5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3fe50f1cac369b02d34ad904dfe0771acc483f82a1b54c5e93632916ba847b37"}, + {file = "coverage-5.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:32ab83016c24c5cf3db2943286b85b0a172dae08c58d0f53875235219b676409"}, + {file = "coverage-5.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:68fb816a5dd901c6aff352ce49e2a0ffadacdf9b6fae282a69e7a16a02dad5fb"}, + {file = "coverage-5.4-cp37-cp37m-win32.whl", hash = "sha256:a636160680c6e526b84f85d304e2f0bb4e94f8284dd765a1911de9a40450b10a"}, + {file = "coverage-5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:bb32ca14b4d04e172c541c69eec5f385f9a075b38fb22d765d8b0ce3af3a0c22"}, + {file = "coverage-5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4d7165a4e8f41eca6b990c12ee7f44fef3932fac48ca32cecb3a1b2223c21f"}, + {file = "coverage-5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a565f48c4aae72d1d3d3f8e8fb7218f5609c964e9c6f68604608e5958b9c60c3"}, + {file = "coverage-5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fff1f3a586246110f34dc762098b5afd2de88de507559e63553d7da643053786"}, + {file = "coverage-5.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a839e25f07e428a87d17d857d9935dd743130e77ff46524abb992b962eb2076c"}, + {file = "coverage-5.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:6625e52b6f346a283c3d563d1fd8bae8956daafc64bb5bbd2b8f8a07608e3994"}, + {file = "coverage-5.4-cp38-cp38-win32.whl", hash = "sha256:5bee3970617b3d74759b2d2df2f6a327d372f9732f9ccbf03fa591b5f7581e39"}, + {file = "coverage-5.4-cp38-cp38-win_amd64.whl", hash = "sha256:03ed2a641e412e42cc35c244508cf186015c217f0e4d496bf6d7078ebe837ae7"}, + {file = "coverage-5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14a9f1887591684fb59fdba8feef7123a0da2424b0652e1b58dd5b9a7bb1188c"}, + {file = "coverage-5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9564ac7eb1652c3701ac691ca72934dd3009997c81266807aef924012df2f4b3"}, + {file = "coverage-5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0f48fc7dc82ee14aeaedb986e175a429d24129b7eada1b7e94a864e4f0644dde"}, + {file = "coverage-5.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:107d327071061fd4f4a2587d14c389a27e4e5c93c7cba5f1f59987181903902f"}, + {file = "coverage-5.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:0cdde51bfcf6b6bd862ee9be324521ec619b20590787d1655d005c3fb175005f"}, + {file = "coverage-5.4-cp39-cp39-win32.whl", hash = "sha256:c67734cff78383a1f23ceba3b3239c7deefc62ac2b05fa6a47bcd565771e5880"}, + {file = "coverage-5.4-cp39-cp39-win_amd64.whl", hash = "sha256:c669b440ce46ae3abe9b2d44a913b5fd86bb19eb14a8701e88e3918902ecd345"}, + {file = "coverage-5.4-pp36-none-any.whl", hash = "sha256:c0ff1c1b4d13e2240821ef23c1efb1f009207cb3f56e16986f713c2b0e7cd37f"}, + {file = "coverage-5.4-pp37-none-any.whl", hash = "sha256:cd601187476c6bed26a0398353212684c427e10a903aeafa6da40c63309d438b"}, + {file = "coverage-5.4.tar.gz", hash = "sha256:6d2e262e5e8da6fa56e774fb8e2643417351427604c2b177f8e8c5f75fc928ca"}, ] cryptography = [ {file = "cryptography-3.3.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030"}, @@ -1731,8 +1739,8 @@ imagesize = [ importlib-metadata = [ {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, - {file = "importlib_metadata-3.3.0-py3-none-any.whl", hash = "sha256:bf792d480abbd5eda85794e4afb09dd538393f7d6e6ffef6e9f03d2014cf9450"}, - {file = "importlib_metadata-3.3.0.tar.gz", hash = "sha256:5c5a2720817414a6c41f0a49993908068243ae02c1635a228126519b509c8aed"}, + {file = "importlib_metadata-3.4.0-py3-none-any.whl", hash = "sha256:ace61d5fc652dc280e7b6b4ff732a9c2d40db2c0f92bc6cb74e07b73d53a1771"}, + {file = "importlib_metadata-3.4.0.tar.gz", hash = "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1756,8 +1764,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, - {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, + {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, + {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, ] libtmux = [ {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, @@ -1816,8 +1824,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] packaging = [ - {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, - {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pathlib2 = [ {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, @@ -1918,8 +1926,8 @@ pillow = [ {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, ] pkginfo = [ - {file = "pkginfo-1.6.1-py2.py3-none-any.whl", hash = "sha256:ce14d7296c673dc4c61c759a0b6c14bae34e34eb819c0017bb6ca5b7292c56e9"}, - {file = "pkginfo-1.6.1.tar.gz", hash = "sha256:a6a4ac943b496745cec21f14f021bbd869d5e9b4f6ec06918cffea5a2f4b9193"}, + {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, + {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -1944,8 +1952,8 @@ pyflakes = [ pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, - {file = "Pygments-2.7.3-py3-none-any.whl", hash = "sha256:f275b6c0909e5dafd2d6269a656aa90fa58ebf4a74f8fcf9053195d226b24a08"}, - {file = "Pygments-2.7.3.tar.gz", hash = "sha256:ccf3acacf3782cbed4a989426012f1c535c9a90d3a7fc3f16d231b9372d2b716"}, + {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, + {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1956,20 +1964,20 @@ pytest = [ {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, - {file = "pytest-6.2.1-py3-none-any.whl", hash = "sha256:1969f797a1a0dbd8ccf0fecc80262312729afea9c17f1d70ebf85c5e76c6f7c8"}, - {file = "pytest-6.2.1.tar.gz", hash = "sha256:66e419b1899bc27346cb2c993e12c5e5e8daba9073c1fbce33b9807abc95c306"}, + {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, + {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"}, - {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, - {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, + {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, + {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, ] pytest-mock = [ {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, - {file = "pytest-mock-3.5.0.tar.gz", hash = "sha256:4992db789175540d40a193bc60e987b1e69f1a989adad525a44e581c82149b14"}, - {file = "pytest_mock-3.5.0-py3-none-any.whl", hash = "sha256:f9d77233b3af6c71cec6a8b8b5e9e9a2effd1bb6ff56e9ace72541ff6843ac81"}, + {file = "pytest-mock-3.5.1.tar.gz", hash = "sha256:a1e2aba6af9560d313c642dae7e00a2a12b022b80301d9d7fc8ec6858e1dd9fc"}, + {file = "pytest_mock-3.5.1-py3-none-any.whl", hash = "sha256:379b391cfad22422ea2e252bdfc008edd08509029bcde3c25b2c0bd741e0424e"}, ] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, @@ -1997,6 +2005,27 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] readme-renderer = [ {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, @@ -2083,14 +2112,14 @@ six = [ {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] snowballstemmer = [ - {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, - {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"}, + {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, + {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.4.2-py3-none-any.whl", hash = "sha256:b8aa4eb5502c53d3b5ca13a07abeedacd887f7770c198952fd5b9530d973e767"}, - {file = "Sphinx-3.4.2.tar.gz", hash = "sha256:77dec5ac77ca46eee54f59cf477780f4fb23327b3339ef39c8471abb829c1285"}, + {file = "Sphinx-3.4.3-py3-none-any.whl", hash = "sha256:c314c857e7cd47c856d2c5adff514ac2e6495f8b8e0f886a8a37e9305dfea0d8"}, + {file = "Sphinx-3.4.3.tar.gz", hash = "sha256:41cad293f954f7d37f803d97eb184158cfd90f51195131e94875bc07cd08b93c"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -2135,8 +2164,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.55.1-py2.py3-none-any.whl", hash = "sha256:b8b46036fd00176d0870307123ef06bb851096964fa7fc578d789f90ce82c3e4"}, - {file = "tqdm-4.55.1.tar.gz", hash = "sha256:556c55b081bd9aa746d34125d024b73f0e2a0e62d5927ff0e400e20ee0a03b9a"}, + {file = "tqdm-4.56.0-py2.py3-none-any.whl", hash = "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a"}, + {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, @@ -2186,8 +2215,8 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, - {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, + {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, + {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, From b5b165a1a1a1fb158fea12297f50c3d3b54bb233 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Jan 2021 13:56:15 -0600 Subject: [PATCH 0732/2998] ci(publish-docs): Only publish if docs changed (#662) --- .github/workflows/publish-docs.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index ece6167d9c..736325455b 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -17,6 +17,22 @@ jobs: run: | git config --global user.name 'travis-ci' git config --global user.email 'travis@nowhere.edu' + - name: Filter changed file paths to outputs + uses: dorny/paths-filter@v2.7.0 + id: changes + with: + filters: | + root_docs: + - CHANGES + - README.* + docs: + - 'docs/**/*.rst' + - 'docs/**/*.md' + python_files: + - 'tmuxp/**' + - name: Should publish + if: steps.changes.outputs.docs == 'true' || steps.changes.outputs.root_docs == 'true' || steps.changes.outputs.python_files == 'true' + run: echo "PUBLISH=$(echo true)" >> $GITHUB_ENV - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: @@ -24,10 +40,12 @@ jobs: - name: Get full Python version id: full-python-version + if: env.PUBLISH == 'true' shell: bash run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - name: Install poetry + if: env.PUBLISH == 'true' run: | curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py python get-poetry.py -y --version 1.0.10 @@ -35,11 +53,13 @@ jobs: rm get-poetry.py - name: Get poetry cache paths from config + if: env.PUBLISH == 'true' run: | echo "poetry_cache_dir=$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV echo "poetry_virtualenvs_path=$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^\"//' -e 's/\"$//')" >> $GITHUB_ENV - name: Configure poetry + if: env.PUBLISH == 'true' shell: bash run: poetry config virtualenvs.in-project true @@ -54,22 +74,26 @@ jobs: key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} - name: Ensure cache is healthy - if: steps.cache.outputs.cache-hit == 'true' + if: steps.cache.outputs.cache-hit == 'true' && env.PUBLISH == 'true' shell: bash run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv - name: Upgrade pip shell: bash + if: env.PUBLISH == 'true' run: poetry run python -m pip install pip -U - name: Install dependencies [w/ docs] + if: env.PUBLISH == 'true' run: poetry install --extras "docs lint" - name: Build documentation + if: env.PUBLISH == 'true' run: | pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd - name: Push documentation to S3 + if: env.PUBLISH == 'true' uses: jakejarvis/s3-sync-action@master with: args: --acl public-read --follow-symlinks --delete @@ -81,6 +105,7 @@ jobs: SOURCE_DIR: 'docs/_build/html' # optional: defaults to entire repository - name: Generate list of changed files for CloudFront to invalidate + if: env.PUBLISH == 'true' run: | pushd docs/_build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd for file in $FILES; do @@ -91,6 +116,7 @@ jobs: - name: Invalidate on CloudFront uses: chetan/invalidate-cloudfront-action@master + if: env.PUBLISH == 'true' env: DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION }} AWS_REGION: 'us-east-1' From 7bb97ecfc27b5a9c2257110e72c5172395a48dc0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Jan 2021 13:59:47 -0600 Subject: [PATCH 0733/2998] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index c3b0bb8d96..3eb2c9924e 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Here you can find the recent changes to tmuxp current ------- +- :issue:`662` CI: Only update docs when changed - *Insert changes/features/fixes for next release here* tmuxp 1.7.0 (2021-01-09) From ee8c6e224a2ee90e275907ff1a269c7c930d5070 Mon Sep 17 00:00:00 2001 From: Justin Findlay Date: Wed, 3 Feb 2021 04:43:48 -0800 Subject: [PATCH 0734/2998] Support `tmux -f` option (#665) Fixes #654. `libtmux.server.Server` already supports a `config` option, so extend the option to the `tmuxp load` command line. --- tmuxp/cli.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index f220245749..74f5142c06 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -544,6 +544,7 @@ def load_workspace( config_file, socket_name=None, socket_path=None, + tmux_config_file=None, new_session_name=None, colors=None, detached=False, @@ -663,7 +664,8 @@ def load_workspace( sconfig = config.trickle(sconfig) t = Server( # create tmux server object - socket_name=socket_name, socket_path=socket_path, colors=colors + socket_name=socket_name, socket_path=socket_path, + config_file=tmux_config_file, colors=colors, ) which('tmux') # raise exception if tmux not found @@ -996,6 +998,7 @@ def command_freeze(session_name, socket_name, socket_path, force): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') +@click.option('-f', 'tmux_config_file', help='pass-through for tmux -f') @click.option('-s', 'new_session_name', help='start new session with new session name') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( @@ -1026,6 +1029,7 @@ def command_load( config, socket_name, socket_path, + tmux_config_file, new_session_name, answer_yes, detached, @@ -1064,6 +1068,7 @@ def command_load( tmux_options = { 'socket_name': socket_name, 'socket_path': socket_path, + 'tmux_config_file': tmux_config_file, 'new_session_name': new_session_name, 'answer_yes': answer_yes, 'colors': colors, From d3fef7f27391848816fc2c67a5077a5f883e07a0 Mon Sep 17 00:00:00 2001 From: Justin Findlay Date: Wed, 3 Feb 2021 04:43:48 -0800 Subject: [PATCH 0735/2998] Support `tmux -f` option (#665) Fixes #654. `libtmux.server.Server` already supports a `config` option, so extend the option to the `tmuxp load` command line. --- tmuxp/cli.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 53271f3f4d..eadf3dc406 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -423,6 +423,7 @@ def load_workspace( config_file, socket_name=None, socket_path=None, + tmux_config_file=None, new_session_name=None, colors=None, detached=False, @@ -537,7 +538,8 @@ def load_workspace( sconfig = config.trickle(sconfig) t = Server( # create tmux server object - socket_name=socket_name, socket_path=socket_path, colors=colors + socket_name=socket_name, socket_path=socket_path, + config_file=tmux_config_file, colors=colors, ) which('tmux') # raise exception if tmux not found @@ -872,6 +874,7 @@ def command_freeze(session_name, socket_name, socket_path, force): @click.argument('config', type=ConfigPath(exists=True), nargs=-1) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') +@click.option('-f', 'tmux_config_file', help='pass-through for tmux -f') @click.option('-s', 'new_session_name', help='start new session with new session name') @click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) @click.option( @@ -896,6 +899,7 @@ def command_load( config, socket_name, socket_path, + tmux_config_file, new_session_name, answer_yes, detached, @@ -933,6 +937,7 @@ def command_load( tmux_options = { 'socket_name': socket_name, 'socket_path': socket_path, + 'tmux_config_file': tmux_config_file, 'new_session_name': new_session_name, 'answer_yes': answer_yes, 'colors': colors, From 8f30ca2cf121467cb9ec3332f6cded380ddac602 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 06:52:15 -0600 Subject: [PATCH 0736/2998] Tag v1.6.5 --- CHANGES | 5 +++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 00d630a7f0..3854f2e705 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,11 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.6.5 (2021-02-03) +------------------------ +- :issue:`655` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes + :issue:`654` + tmuxp 1.6.4 (2021-01-22) ------------------------ - :issue:`651` Fix packaging issue with click, thanks @dougharris! Fixes diff --git a/pyproject.toml b/pyproject.toml index 34ae775a64..9e98b7b7d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.6.4" +version = "1.6.5" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 4c9d353f6c..fbc06e6e0f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.6.4' +__version__ = '1.6.5' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From d419b02d71a5db5a24652bdcb5caf9f06a35121d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 06:58:01 -0600 Subject: [PATCH 0737/2998] Merge v1.7.x --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index d1b337d0b6..22870ab227 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,11 @@ current - :issue:`662` CI: Only update docs when changed - *Insert changes/features/fixes for next release here* +tmuxp 1.7.1 (2021-02-03) +------------------------ +- :issue:`655` Support for passing tmux config file (``-f``), thanks + @jfindlay! Fixes :issue:`654` + tmuxp 1.6.5 (2021-02-03) ------------------------ - :issue:`655` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes From 845c6db01b329f74249b8e147a3fcaa21c408356 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 07:02:10 -0600 Subject: [PATCH 0738/2998] CHANGES: Fix issues being pointed to --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 22870ab227..e571b3e048 100644 --- a/CHANGES +++ b/CHANGES @@ -11,12 +11,12 @@ current tmuxp 1.7.1 (2021-02-03) ------------------------ -- :issue:`655` Support for passing tmux config file (``-f``), thanks +- :issue:`665` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes :issue:`654` tmuxp 1.6.5 (2021-02-03) ------------------------ -- :issue:`655` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes +- :issue:`665` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes :issue:`654` tmuxp 1.7.0 (2021-01-09) From bcad6cbc4c18548bfd26d0652cd5f32484cc0c0a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 07:15:58 -0600 Subject: [PATCH 0739/2998] pytest: Append test fixture packages via monkeypatch --- pyproject.toml | 6 ------ tests/conftest.py | 16 +++++++++++++++- tests/test_cli.py | 9 +++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f162a3c2a2..303d32cc86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,12 +69,6 @@ pytest-mock = [ {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -tmuxp-test-plugin-bwb = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/"} -tmuxp-test-plugin-bs = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/"} -tmuxp-test-plugin-r = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/"} -tmuxp-test-plugin-owc = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/"} -tmuxp-test-plugin-awf = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/"} -tmuxp-test-plugin-fail = { path = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/"} ### Coverage ### codecov = "*" diff --git a/tests/conftest.py b/tests/conftest.py index 7ed9c2d2f9..77465d8b0e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- - import logging +import os import pytest @@ -11,6 +11,20 @@ logger = logging.getLogger(__name__) +@pytest.fixture(autouse=True, scope='function') +def site_packages_test_fixtures(monkeypatch): + paths = [ + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/", + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/", + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/", + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/", + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/", + "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/", + ] + for path in paths: + monkeypatch.syspath_prepend(os.path.abspath(os.path.relpath(path))) + + @pytest.fixture(scope='function') def socket_name(request): return 'tmuxp_test%s' % next(namer) diff --git a/tests/test_cli.py b/tests/test_cli.py index e5a7f93ed8..f340be3e8f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -15,16 +15,15 @@ import click import kaptan from click.testing import CliRunner -from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder import libtmux from libtmux.common import has_lt_version from libtmux.exc import LibTmuxException from tmuxp import cli, config, exc from tmuxp.cli import ( - _reattach, - _load_attached, _load_append_windows_to_current_session, + _load_attached, + _reattach, command_debug_info, command_ls, get_config_dir, @@ -996,6 +995,8 @@ def test_ls_cli(monkeypatch, tmpdir): def test_load_plugins(): + from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder + plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -1174,6 +1175,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): assert builder.session.switch_client.call_count == 1 + def test_load_append_windows_to_current_session(server, monkeypatch): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -1195,7 +1197,6 @@ def test_load_append_windows_to_current_session(server, monkeypatch): assert len(server._list_windows()) == 6 - def test_debug_info_cli(monkeypatch, tmpdir): monkeypatch.setenv('SHELL', '/bin/bash') From f10676ae2968d3e295014ad197059485871b096e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 07:22:25 -0600 Subject: [PATCH 0740/2998] monkeypatch_plugin_test_packages: Opt-in --- tests/conftest.py | 4 ++-- tests/test_cli.py | 18 ++++++++++++------ tests/test_plugin.py | 5 +++++ tests/test_workspacebuilder.py | 22 +++++++++++++--------- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 77465d8b0e..1de3ec58df 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,8 +11,8 @@ logger = logging.getLogger(__name__) -@pytest.fixture(autouse=True, scope='function') -def site_packages_test_fixtures(monkeypatch): +@pytest.fixture(scope='function') +def monkeypatch_plugin_test_packages(monkeypatch): paths = [ "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/", "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/", diff --git a/tests/test_cli.py b/tests/test_cli.py index f340be3e8f..bfd23457e9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -994,7 +994,7 @@ def test_ls_cli(monkeypatch, tmpdir): assert cli_output == '\n'.join(stems) + '\n' -def test_load_plugins(): +def test_load_plugins(monkeypatch_plugin_test_packages): from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") @@ -1024,7 +1024,9 @@ def test_load_plugins(): ) ], ) -def test_load_plugins_version_fail_skip(cli_args, inputs): +def test_load_plugins_version_fail_skip( + monkeypatch_plugin_test_packages, cli_args, inputs +): runner = CliRunner() results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) @@ -1040,7 +1042,9 @@ def test_load_plugins_version_fail_skip(cli_args, inputs): ) ], ) -def test_load_plugins_version_fail_no_skip(cli_args, inputs): +def test_load_plugins_version_fail_no_skip( + monkeypatch_plugin_test_packages, cli_args, inputs +): runner = CliRunner() results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) @@ -1050,14 +1054,16 @@ def test_load_plugins_version_fail_no_skip(cli_args, inputs): @pytest.mark.parametrize( "cli_args", [(['load', 'tests/fixtures/workspacebuilder/plugin_missing_fail.yaml'])] ) -def test_load_plugins_plugin_missing(cli_args): +def test_load_plugins_plugin_missing(monkeypatch_plugin_test_packages, cli_args): runner = CliRunner() results = runner.invoke(cli.cli, cli_args) assert '[Plugin Error]' in results.output -def test_plugin_system_before_script(server, monkeypatch): +def test_plugin_system_before_script( + monkeypatch_plugin_test_packages, server, monkeypatch +): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. @@ -1073,7 +1079,7 @@ def test_plugin_system_before_script(server, monkeypatch): assert session.name == 'plugin_test_bs' -def test_reattach_plugins(server): +def test_reattach_plugins(monkeypatch_plugin_test_packages, server): config_plugins = loadfixture("workspacebuilder/plugin_r.yaml") sconfig = kaptan.Kaptan(handler='yaml') diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 488465e0bd..88372c8fcf 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -24,6 +24,11 @@ ) +@pytest.fixture(autouse=True) +def autopatch_sitedir(monkeypatch_plugin_test_packages): + pass + + def test_all_pass(): AllVersionPassPlugin() diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index ce3584dc43..b38abadb3e 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -14,8 +14,8 @@ from libtmux.test import retry, temp_session from tmuxp import config, exc from tmuxp._compat import text_type -from tmuxp.workspacebuilder import WorkspaceBuilder from tmuxp.cli import load_plugins +from tmuxp.workspacebuilder import WorkspaceBuilder from . import example_dir, fixtures_dir from .fixtures._util import loadfixture @@ -676,7 +676,9 @@ def test_before_load_true_if_test_passes_with_args(server): builder.build(session=session) -def test_plugin_system_before_workspace_builder(session): +def test_plugin_system_before_workspace_builder( + monkeypatch_plugin_test_packages, session +): config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -692,7 +694,7 @@ def test_plugin_system_before_workspace_builder(session): assert proc.stdout[0] == "'plugin_test_bwb'" -def test_plugin_system_on_window_create(session): +def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_owc.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -708,7 +710,7 @@ def test_plugin_system_on_window_create(session): assert proc.stdout[0] == "'plugin_test_owc'" -def test_plugin_system_after_window_finished(session): +def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_awf.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -741,7 +743,9 @@ def test_plugin_system_on_window_create_multiple_windows(session): assert "'plugin_test_owc_mw_2'" in proc.stdout -def test_plugin_system_after_window_finished_multiple_windows(session): +def test_plugin_system_after_window_finished_multiple_windows( + monkeypatch_plugin_test_packages, session +): config_plugins = loadfixture("workspacebuilder/plugin_awf_multiple_windows.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -758,7 +762,7 @@ def test_plugin_system_after_window_finished_multiple_windows(session): assert "'plugin_test_awf_mw_2'" in proc.stdout -def test_plugin_system_multiple_plugins(session): +def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_multiple_plugins.yaml") sconfig = kaptan.Kaptan(handler='yaml') @@ -858,9 +862,9 @@ def test_find_current_active_pane(server, monkeypatch): # Assign an active pane to the session second_session = server.list_sessions()[1] - first_pane_on_second_session_id = ( - second_session.list_windows()[0].list_panes()[0]["pane_id"] - ) + first_pane_on_second_session_id = second_session.list_windows()[0].list_panes()[0][ + "pane_id" + ] monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) builder = WorkspaceBuilder(sconf=sconfig, server=server) From e0689e1e71fc9a136825fe7a3dc3a68a6c50432e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 10:08:43 -0600 Subject: [PATCH 0741/2998] CHANGES: Update for #666 / #658 --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index e571b3e048..c914cf3cf0 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,10 @@ Here you can find the recent changes to tmuxp current ------- - :issue:`662` CI: Only update docs when changed +- :issue:`665` Support for passing tmux config file (``-f``), thanks + @jfindlay! Fixes :issue:`654` +- :issue:`666` CI: Move test plugin packages from pyproject.toml to + pytest fixtures. Fixes :issue:`658` - *Insert changes/features/fixes for next release here* tmuxp 1.7.1 (2021-02-03) From 3176403515da71c3a77fa5f615f15bee21e7cd59 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 10:12:41 -0600 Subject: [PATCH 0742/2998] Update CHANGES --- CHANGES | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index c914cf3cf0..f5939eb0bc 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,11 @@ current pytest fixtures. Fixes :issue:`658` - *Insert changes/features/fixes for next release here* +tmuxp 1.7.2 (2021-02-03) +------------------------ +- :issue:`666` CI: Move test plugin packages from pyproject.toml to + pytest fixtures. Fixes :issue:`658` + tmuxp 1.7.1 (2021-02-03) ------------------------ - :issue:`665` Support for passing tmux config file (``-f``), thanks @@ -25,7 +30,6 @@ tmuxp 1.6.5 (2021-02-03) tmuxp 1.7.0 (2021-01-09) ------------------------ - This will be the last Python 2.7 release of tmuxp. Bug fixes for python 2.7 will live in the `1.7.x branch`_. From 890e038b5a10ba2e39dc4158ebcef722baca32d8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 3 Feb 2021 10:18:20 -0600 Subject: [PATCH 0743/2998] Sync poetry.lock --- poetry.lock | 132 +++++----------------------------------------------- 1 file changed, 12 insertions(+), 120 deletions(-) diff --git a/poetry.lock b/poetry.lock index 59b4af636a..4c10050208 100644 --- a/poetry.lock +++ b/poetry.lock @@ -116,7 +116,7 @@ description = "An easy safelist-based HTML-sanitizing tool." name = "bleach" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.2.3" +version = "3.3.0" [package.dependencies] packaging = "*" @@ -474,7 +474,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.2" +version = "2.11.3" [package.dependencies] MarkupSafe = ">=0.23" @@ -935,7 +935,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" -version = "2020.5" +version = "2021.1" [[package]] category = "dev" @@ -1248,108 +1248,6 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-awf" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.0.2" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf" - -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-bs" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.0.2" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs" - -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-bwb" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.0.2" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb" - -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-fail" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.1.0" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail" - -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-owc" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.0.2" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc" - -[[package]] -category = "dev" -description = "" -develop = true -name = "tmuxp-test-plugin-r" -optional = false -python-versions = "~2.7 || ^3.5" -version = "0.0.2" - -[package.dependencies] -tmuxp = "^1.7.0" - -[package.source] -reference = "" -type = "directory" -url = "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r" - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" @@ -1435,7 +1333,7 @@ version = "3.7.4.3" [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\"" name = "typing-extensions" optional = false python-versions = "*" @@ -1497,7 +1395,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" +marker = "python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" @@ -1516,7 +1414,7 @@ lint = [] test = [] [metadata] -content-hash = "b2634966ff0baa0d081c246b681bf7794a19c518e81ea6c5f5f43ec9543c1cf0" +content-hash = "77432007847ff3d4dfb7b62412e8db50dfd30076ba6bb1e019851c7b0502e7ed" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1557,8 +1455,8 @@ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] bleach = [ - {file = "bleach-3.2.3-py2.py3-none-any.whl", hash = "sha256:2d3b3f7e7d69148bb683b26a3f21eabcf62fa8fb7bc75d0e7a13bcecd9568d4d"}, - {file = "bleach-3.2.3.tar.gz", hash = "sha256:c6ad42174219b64848e2e2cd434e44f56cd24a93a9b4f8bc52cfed55a1cd5aad"}, + {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, + {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, ] certifi = [ {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, @@ -1757,8 +1655,8 @@ jeepney = [ {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, ] kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, @@ -1986,8 +1884,8 @@ pytest-rerunfailures = [ {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, ] pytz = [ - {file = "pytz-2020.5-py2.py3-none-any.whl", hash = "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4"}, - {file = "pytz-2020.5.tar.gz", hash = "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5"}, + {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, + {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -2153,12 +2051,6 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] -tmuxp-test-plugin-awf = [] -tmuxp-test-plugin-bs = [] -tmuxp-test-plugin-bwb = [] -tmuxp-test-plugin-fail = [] -tmuxp-test-plugin-owc = [] -tmuxp-test-plugin-r = [] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, From 9a04474976b721f3b17583ced677f06da275f1e1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 24 Feb 2021 15:49:03 -0600 Subject: [PATCH 0744/2998] Add session var example with variable (#671) --- examples/session-environment.json | 6 ++++-- examples/session-environment.yaml | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/session-environment.json b/examples/session-environment.json index a2f50b71af..93b2796d45 100644 --- a/examples/session-environment.json +++ b/examples/session-environment.json @@ -1,14 +1,16 @@ { "environment": { "EDITOR": "/usr/bin/vim", - "HOME": "/tmp/hm", + "DJANGO_SETTINGS_MODULE": "my_app.settings.local", + "SERVER_PORT": "8009", }, "windows": [ { "panes": [ null, + "./manage.py runserver 0.0.0.0:${SERVER_PORT}" ], - "window_name": "Blank pane test" + "window_name": "Django project" }, ], "session_name": "Environment variables test" diff --git a/examples/session-environment.yaml b/examples/session-environment.yaml index f5dee52164..2f1bdec5d5 100644 --- a/examples/session-environment.yaml +++ b/examples/session-environment.yaml @@ -1,10 +1,10 @@ session_name: Environment variables test environment: EDITOR: /usr/bin/vim - HOME: /tmp/hm + DJANGO_SETTINGS_MODULE: my_app.settings.local + SERVER_PORT: "8009" windows: - # Emptiness will simply open a blank pane, if no shell_command_before. - # All these are equivalent - - window_name: Blank pane test + - window_name: Django project panes: - - \ No newline at end of file + - + - ./manage.py runserver 0.0.0.0:${SERVER_PORT} From c8b1775d29a368b212fe11929f14e4e1aa2d1b4e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 24 Feb 2021 17:25:16 -0600 Subject: [PATCH 0745/2998] ci(publish-docs): Also check examples --- .github/workflows/publish-docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 736325455b..259d71e855 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -28,6 +28,7 @@ jobs: docs: - 'docs/**/*.rst' - 'docs/**/*.md' + - 'examples/**' python_files: - 'tmuxp/**' - name: Should publish From e15f97713aac0459dc0cd553cf36658506c47367 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 24 Feb 2021 17:26:22 -0600 Subject: [PATCH 0746/2998] docs: Make copyright perpetual --- tmuxp/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/__init__.py b/tmuxp/__init__.py index 3280528113..6d2c3228f1 100644 --- a/tmuxp/__init__.py +++ b/tmuxp/__init__.py @@ -5,7 +5,7 @@ tmuxp ~~~~~ -:copyright: Copyright 2013-2018 Tony Narlock. +:copyright: Copyright 2013- Tony Narlock. :license: MIT, see LICENSE for details """ From ddaeec64a51424eeb4b3ba2934e403c114b14b88 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 24 Feb 2021 17:32:52 -0600 Subject: [PATCH 0747/2998] docs: Remove null example --- examples/session-environment.json | 1 - examples/session-environment.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/session-environment.json b/examples/session-environment.json index 93b2796d45..d4c5c17cf9 100644 --- a/examples/session-environment.json +++ b/examples/session-environment.json @@ -7,7 +7,6 @@ "windows": [ { "panes": [ - null, "./manage.py runserver 0.0.0.0:${SERVER_PORT}" ], "window_name": "Django project" diff --git a/examples/session-environment.yaml b/examples/session-environment.yaml index 2f1bdec5d5..09573331d5 100644 --- a/examples/session-environment.yaml +++ b/examples/session-environment.yaml @@ -6,5 +6,4 @@ environment: windows: - window_name: Django project panes: - - - ./manage.py runserver 0.0.0.0:${SERVER_PORT} From 336e0504ffb24111e7df566f504dd598a8957709 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Feb 2021 17:34:56 -0600 Subject: [PATCH 0748/2998] docs: Add details on poetry --- docs/developing.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/developing.rst b/docs/developing.rst index 3bc9df9073..084e555daf 100644 --- a/docs/developing.rst +++ b/docs/developing.rst @@ -20,8 +20,8 @@ using ``$ tmux -L test_case``. Install the latest code from git -------------------------------- -Using pip -^^^^^^^^^ +Get the source +^^^^^^^^^^^^^^ To begin developing, check out the code from github: @@ -30,6 +30,9 @@ To begin developing, check out the code from github: $ git clone git@github.com:tmux-python/tmuxp.git $ cd tmuxp +Advanced: Manual virtual +^^^^^^^^^^^^^^^^^^^^^^^^ + Now create a virtualenv, if you don't know how to, you can create a virtualenv with: @@ -57,8 +60,12 @@ adjust the code and the installed software will reflect the changes. $ tmuxp -Using poetry -^^^^^^^^^^^^ +Simple: Using poetry +^^^^^^^^^^^^^^^^^^^^ + +The easiest way to configure a dev environment is through `poetry`_. This +automatically will manage virtualenv and python dependencies for tmuxp. +For information on installing poetry visit the `poetry's documentation`_. To begin developing, check out the code from github: @@ -91,6 +98,8 @@ Then activate it to your current tty / terminal session with: That is it! You are now ready to code! +.. _poetry: https://python-poetry.org/ +.. _poetry's documentation: https://python-poetry.org/docs/ Test Runner ----------- From c64bc95949d06b65bee04aea066420558662c963 Mon Sep 17 00:00:00 2001 From: Thord Setsaas Date: Fri, 14 May 2021 04:33:06 +0200 Subject: [PATCH 0749/2998] Update README.rst (#676) * Updated broken link for `tmuxp-demo.gif` to point to correct location --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 10b1eea074..49ec015850 100644 --- a/README.rst +++ b/README.rst @@ -138,7 +138,7 @@ You can also load sessions in the background by passing ``-d`` flag Screenshot ---------- -.. image:: https://raw.github.com/tmux-python/tmuxp/master/doc/_static/tmuxp-demo.gif +.. image:: https://raw.githubusercontent.com/tmux-python/tmuxp/master/docs/_static/tmuxp-demo.gif :scale: 100% :width: 45% :align: center From ac3c0aa2dbfdcd59a9cae3b6769c42da6753fe9d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:32:06 -0500 Subject: [PATCH 0750/2998] chore: Move code of conduct to decorum, use Ruby's Community Conduct Guideline --- CODE_OF_CONDUCT.md | 46 ---------------------------------------------- CONTRIBUTING.md | 11 +++++++++++ 2 files changed, 11 insertions(+), 46 deletions(-) delete mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index eecfdfa15d..0000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at team@git-pull.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ae2ca3ed0c..c13ceb8927 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,3 +22,14 @@ Please note we have a code of conduct, please follow it in all your interactions Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). 7. You may merge the Pull Request in once you have the sign-off of one other developer. If you do not have permission to do that, you may request reviewer to merge it for you. + +## Decorum + +- Participants will be tolerant of opposing views. +- Participants must ensure that their language and actions are free of personal + attacks and disparaging personal remarks. +- When interpreting the words and actions of others, participants should always + assume good intentions. +- Behaviour which can be reasonably considered harassment will not be tolerated. + +Based on [Ruby's Community Conduct Guideline](https://www.ruby-lang.org/en/conduct/) From 2fdbc9a1c10ee8ea717d69ee56444779ff587f6d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:34:41 -0500 Subject: [PATCH 0751/2998] chore: Move contributing to .github/ --- CONTRIBUTING.md => .github/contributing.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CONTRIBUTING.md => .github/contributing.md (100%) diff --git a/CONTRIBUTING.md b/.github/contributing.md similarity index 100% rename from CONTRIBUTING.md rename to .github/contributing.md From 602d780a3c232e1f1ad5bd599980b95368a19de5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:38:44 -0500 Subject: [PATCH 0752/2998] chore: Remove .gitmodules (empty) --- .gitmodules | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8b13789179..0000000000 --- a/.gitmodules +++ /dev/null @@ -1 +0,0 @@ - From 547968eb1b3f4c6aa4f83854c75473bfbf9cb689 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:47:18 -0500 Subject: [PATCH 0753/2998] chore(pyproject): Fix click version constraint ^7 is equivalent to >=7<8 See also: https://python-poetry.org/docs/versions/#caret-requirements This doesn't affect normal releases since we still use setup.py pending #625 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 303d32cc86..db84686451 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] python = "~2.7 || ^3.5" -click = ">=7<8" +click = "^7" kaptan = ">=0.5.10" libtmux = "<0.9" colorama = ">=0.3.9" From 26b10ea1cbf263b676e2614cf9b4693b3a764802 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:48:53 -0500 Subject: [PATCH 0754/2998] chore(pyproject): Update dev packages (pytest, sphinx) --- poetry.lock | 817 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 507 insertions(+), 310 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4c10050208..086b791542 100644 --- a/poetry.lock +++ b/poetry.lock @@ -49,14 +49,14 @@ description = "Classes Without Boilerplate" marker = "python_version < \"3\" or python_version >= \"3\"" name = "attrs" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.3.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "21.2.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] category = "dev" @@ -65,7 +65,7 @@ marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.9.0" +version = "2.9.1" [package.dependencies] pytz = ">=2015.7" @@ -77,11 +77,11 @@ marker = "python_version < \"3.2\"" name = "backports.functools-lru-cache" optional = false python-versions = ">=2.6" -version = "1.6.1" +version = "1.6.4" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-checkdocs (>=2.4)"] [[package]] category = "dev" @@ -138,7 +138,7 @@ marker = "sys_platform == \"linux\"" name = "cffi" optional = false python-versions = "*" -version = "1.14.4" +version = "1.14.5" [package.dependencies] pycparser = "*" @@ -223,7 +223,7 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.4" +version = "5.5" [package.extras] toml = ["toml"] @@ -234,19 +234,19 @@ description = "cryptography is a package which provides cryptographic recipes an marker = "sys_platform == \"linux\"" name = "cryptography" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" -version = "3.3.1" +python-versions = ">=3.6" +version = "3.4.7" [package.dependencies] cffi = ">=1.12" -six = ">=1.4.1" [package.extras] docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] +test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] [[package]] category = "dev" @@ -265,6 +265,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.16" +[[package]] +category = "dev" +description = "Docutils -- Python Documentation Utilities" +name = "docutils" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.17.1" + [[package]] category = "dev" description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" @@ -279,13 +287,13 @@ category = "dev" description = "the modular source code checker: pep8 pyflakes and co" name = "flake8" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "3.8.4" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "3.9.2" [package.dependencies] mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" +pycodestyle = ">=2.7.0,<2.8.0" +pyflakes = ">=2.3.0,<2.4.0" [package.dependencies.configparser] python = "<3.2" @@ -391,11 +399,10 @@ testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = ">=3.6" -version = "3.4.0" +version = "4.3.1" [package.dependencies] zipp = ">=0.5" @@ -406,7 +413,7 @@ version = ">=3.6.4" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] category = "dev" @@ -448,7 +455,7 @@ marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.7.0" +version = "5.8.0" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -482,6 +489,21 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "A very fast and expressive template engine." +marker = "python_version >= \"3\"" +name = "jinja2" +optional = false +python-versions = ">=3.6" +version = "3.0.1" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] category = "main" description = "Configuration manager" @@ -499,20 +521,17 @@ description = "Store and access your passwords safely." name = "keyring" optional = false python-versions = ">=3.6" -version = "22.0.1" +version = "23.0.1" [package.dependencies] SecretStorage = ">=3.2" +importlib-metadata = ">=3.6" jeepney = ">=0.4.2" pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=1" - [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] category = "main" @@ -531,6 +550,15 @@ optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" version = "1.1.1" +[[package]] +category = "dev" +description = "Safely add untrusted strings to HTML/XML markup." +marker = "python_version >= \"3\"" +name = "markupsafe" +optional = false +python-versions = ">=3.6" +version = "2.0.1" + [[package]] category = "dev" description = "McCabe checker, plugin for flake8" @@ -654,7 +682,7 @@ marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.6" -version = "8.1.0" +version = "8.2.0" [[package]] category = "dev" @@ -699,7 +727,7 @@ description = "Python style guide checker" name = "pycodestyle" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.6.0" +version = "2.7.0" [[package]] category = "dev" @@ -716,7 +744,7 @@ description = "passive checker of Python programs" name = "pyflakes" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.2.0" +version = "2.3.1" [[package]] category = "dev" @@ -732,7 +760,7 @@ description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false python-versions = ">=3.5" -version = "2.7.4" +version = "2.9.0" [[package]] category = "dev" @@ -819,7 +847,7 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.6" -version = "6.2.2" +version = "6.2.4" [package.dependencies] atomicwrites = ">=1.0" @@ -861,12 +889,15 @@ marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.1" +version = "2.12.0" [package.dependencies] -coverage = ">=5.2.1" pytest = ">=4.6" +[package.dependencies.coverage] +extras = ["toml"] +version = ">=5.2.1" + [package.extras] testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] @@ -904,6 +935,21 @@ pytest = ">=5.0" [package.extras] dev = ["pre-commit", "tox", "pytest-asyncio"] +[[package]] +category = "dev" +description = "Thin-wrapper around the mock package for easier use with pytest" +marker = "python_version >= \"3\"" +name = "pytest-mock" +optional = false +python-versions = ">=3.6" +version = "3.6.1" + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "tox", "pytest-asyncio"] + [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -928,6 +974,18 @@ version = "9.1.1" pytest = ">=5.0" setuptools = ">=40.0" +[[package]] +category = "dev" +description = "pytest plugin to re-run tests to eliminate flaky failures" +name = "pytest-rerunfailures" +optional = false +python-versions = ">=3.6" +version = "10.0" + +[package.dependencies] +pytest = ">=5.3" +setuptools = ">=40.0" + [[package]] category = "dev" description = "World timezone definitions, modern and historical" @@ -968,7 +1026,7 @@ description = "readme_renderer is a library for rendering \"readme\" description name = "readme-renderer" optional = false python-versions = "*" -version = "28.0" +version = "29.0" [package.dependencies] Pygments = ">=2.5.1" @@ -977,7 +1035,7 @@ docutils = ">=0.13.1" six = "*" [package.extras] -md = ["cmarkgfm (>=0.2.0)"] +md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] category = "dev" @@ -999,7 +1057,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.11.13" +version = "2021.4.4" [[package]] category = "dev" @@ -1036,7 +1094,7 @@ description = "Validating URI References per RFC 3986" name = "rfc3986" optional = false python-versions = "*" -version = "1.4.0" +version = "1.5.0" [package.extras] idna2008 = ["idna"] @@ -1057,7 +1115,7 @@ marker = "sys_platform == \"linux\"" name = "secretstorage" optional = false python-versions = ">=3.6" -version = "3.3.0" +version = "3.3.1" [package.dependencies] cryptography = ">=2.0" @@ -1069,7 +1127,7 @@ description = "Python 2 and 3 compatibility utilities" name = "six" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" +version = "1.16.0" [[package]] category = "dev" @@ -1117,7 +1175,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.4.3" +version = "3.5.4" [package.dependencies] Jinja2 = ">=2.3" @@ -1125,7 +1183,7 @@ Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" colorama = ">=0.3.5" -docutils = ">=0.12" +docutils = ">=0.12,<0.17" imagesize = "*" packaging = "*" requests = ">=2.5.0" @@ -1140,7 +1198,39 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.790)", "docutils-stubs"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] + +[[package]] +category = "dev" +description = "Python documentation generator" +name = "sphinx" +optional = false +python-versions = ">=3.6" +version = "4.0.2" + +[package.dependencies] +Jinja2 = ">=2.3" +Pygments = ">=2.0" +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = ">=0.3.5" +docutils = ">=0.14,<0.18" +imagesize = "*" +packaging = "*" +requests = ">=2.5.0" +setuptools = "*" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] @@ -1198,6 +1288,19 @@ version = "1.0.3" lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest", "html5lib"] +[[package]] +category = "dev" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +marker = "python_version >= \"3\"" +name = "sphinxcontrib-htmlhelp" +optional = false +python-versions = ">=3.6" +version = "2.0.0" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" @@ -1230,7 +1333,7 @@ marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" -version = "1.1.4" +version = "1.1.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -1263,10 +1366,11 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.56.0" +version = "4.61.0" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] telegram = ["requests"] [[package]] @@ -1295,23 +1399,19 @@ description = "Collection of utilities for publishing packages on PyPI" name = "twine" optional = false python-versions = ">=3.6" -version = "3.3.0" +version = "3.4.1" [package.dependencies] colorama = ">=0.4.3" +importlib-metadata = ">=3.6" keyring = ">=15.1" pkginfo = ">=1.4.2" readme-renderer = ">=21.0" requests = ">=2.20" requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" rfc3986 = ">=1.4.0" -setuptools = ">=0.7.0" tqdm = ">=4.14" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1319,7 +1419,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "typed-ast" optional = false python-versions = "*" -version = "1.4.2" +version = "1.4.3" [[package]] category = "dev" @@ -1327,17 +1427,17 @@ description = "Type Hints for Python" marker = "python_version < \"3.5\"" name = "typing" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.7.4.3" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <3.5" +version = "3.10.0.0" [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" name = "typing-extensions" optional = false python-versions = "*" -version = "3.7.4.3" +version = "3.10.0.0" [[package]] category = "dev" @@ -1345,7 +1445,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.26.3" +version = "1.26.5" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1395,15 +1495,14 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"3\" and python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" -version = "3.4.0" +version = "3.4.1" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] coverage = [] @@ -1414,7 +1513,7 @@ lint = [] test = [] [metadata] -content-hash = "77432007847ff3d4dfb7b62412e8db50dfd30076ba6bb1e019851c7b0502e7ed" +content-hash = "93dd01034663e935ae6d194015952cbaa939b17701e716adc8efd00d98d9658d" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1440,16 +1539,16 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] babel = [ - {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"}, - {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"}, + {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, + {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] "backports.functools-lru-cache" = [ - {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, - {file = "backports.functools_lru_cache-1.6.1.tar.gz", hash = "sha256:8fde5f188da2d593bd5bc0be98d9abc46c95bb8a9dde93429570192ee6cc2d4a"}, + {file = "backports.functools_lru_cache-1.6.4-py2.py3-none-any.whl", hash = "sha256:dbead04b9daa817909ec64e8d2855fb78feafe0b901d4568758e3a60559d8978"}, + {file = "backports.functools_lru_cache-1.6.4.tar.gz", hash = "sha256:d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, @@ -1463,40 +1562,55 @@ certifi = [ {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] cffi = [ - {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, - {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, - {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, - {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, - {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, - {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, - {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, - {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, - {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, - {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, - {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, - {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, - {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, - {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, - {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, - {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, - {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, - {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, - {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, + {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, + {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, + {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, + {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, + {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, + {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, + {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, + {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, + {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, + {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, + {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, + {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, ] chardet = [ {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, @@ -1528,71 +1642,72 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6d9c88b787638a451f41f97446a1c9fd416e669b4d9717ae4615bd29de1ac135"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:66a5aae8233d766a877c5ef293ec5ab9520929c2578fd2069308a98b7374ea8c"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9754a5c265f991317de2bac0c70a746efc2b695cf4d49f5d2cddeac36544fb44"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:fbb17c0d0822684b7d6c09915677a32319f16ff1115df5ec05bdcaaee40b35f3"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b7f7421841f8db443855d2854e25914a79a1ff48ae92f70d0a5c2f8907ab98c9"}, - {file = "coverage-5.4-cp27-cp27m-win32.whl", hash = "sha256:4a780807e80479f281d47ee4af2eb2df3e4ccf4723484f77da0bb49d027e40a1"}, - {file = "coverage-5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:87c4b38288f71acd2106f5d94f575bc2136ea2887fdb5dfe18003c881fa6b370"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6809ebcbf6c1049002b9ac09c127ae43929042ec1f1dbd8bb1615f7cd9f70a0"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ba7ca81b6d60a9f7a0b4b4e175dcc38e8fef4992673d9d6e6879fd6de00dd9b8"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:89fc12c6371bf963809abc46cced4a01ca4f99cba17be5e7d416ed7ef1245d19"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a8eb7785bd23565b542b01fb39115a975fefb4a82f23d407503eee2c0106247"}, - {file = "coverage-5.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:7e40d3f8eb472c1509b12ac2a7e24158ec352fc8567b77ab02c0db053927e339"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1ccae21a076d3d5f471700f6d30eb486da1626c380b23c70ae32ab823e453337"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:755c56beeacac6a24c8e1074f89f34f4373abce8b662470d3aa719ae304931f3"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:322549b880b2d746a7672bf6ff9ed3f895e9c9f108b714e7360292aa5c5d7cf4"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:60a3307a84ec60578accd35d7f0c71a3a971430ed7eca6567399d2b50ef37b8c"}, - {file = "coverage-5.4-cp35-cp35m-win32.whl", hash = "sha256:1375bb8b88cb050a2d4e0da901001347a44302aeadb8ceb4b6e5aa373b8ea68f"}, - {file = "coverage-5.4-cp35-cp35m-win_amd64.whl", hash = "sha256:16baa799ec09cc0dcb43a10680573269d407c159325972dd7114ee7649e56c66"}, - {file = "coverage-5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2f2cf7a42d4b7654c9a67b9d091ec24374f7c58794858bff632a2039cb15984d"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b62046592b44263fa7570f1117d372ae3f310222af1fc1407416f037fb3af21b"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:812eaf4939ef2284d29653bcfee9665f11f013724f07258928f849a2306ea9f9"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:859f0add98707b182b4867359e12bde806b82483fb12a9ae868a77880fc3b7af"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:04b14e45d6a8e159c9767ae57ecb34563ad93440fc1b26516a89ceb5b33c1ad5"}, - {file = "coverage-5.4-cp36-cp36m-win32.whl", hash = "sha256:ebfa374067af240d079ef97b8064478f3bf71038b78b017eb6ec93ede1b6bcec"}, - {file = "coverage-5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:84df004223fd0550d0ea7a37882e5c889f3c6d45535c639ce9802293b39cd5c9"}, - {file = "coverage-5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1b811662ecf72eb2d08872731636aee6559cae21862c36f74703be727b45df90"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6b588b5cf51dc0fd1c9e19f622457cc74b7d26fe295432e434525f1c0fae02bc"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3fe50f1cac369b02d34ad904dfe0771acc483f82a1b54c5e93632916ba847b37"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:32ab83016c24c5cf3db2943286b85b0a172dae08c58d0f53875235219b676409"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:68fb816a5dd901c6aff352ce49e2a0ffadacdf9b6fae282a69e7a16a02dad5fb"}, - {file = "coverage-5.4-cp37-cp37m-win32.whl", hash = "sha256:a636160680c6e526b84f85d304e2f0bb4e94f8284dd765a1911de9a40450b10a"}, - {file = "coverage-5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:bb32ca14b4d04e172c541c69eec5f385f9a075b38fb22d765d8b0ce3af3a0c22"}, - {file = "coverage-5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4d7165a4e8f41eca6b990c12ee7f44fef3932fac48ca32cecb3a1b2223c21f"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a565f48c4aae72d1d3d3f8e8fb7218f5609c964e9c6f68604608e5958b9c60c3"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fff1f3a586246110f34dc762098b5afd2de88de507559e63553d7da643053786"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a839e25f07e428a87d17d857d9935dd743130e77ff46524abb992b962eb2076c"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:6625e52b6f346a283c3d563d1fd8bae8956daafc64bb5bbd2b8f8a07608e3994"}, - {file = "coverage-5.4-cp38-cp38-win32.whl", hash = "sha256:5bee3970617b3d74759b2d2df2f6a327d372f9732f9ccbf03fa591b5f7581e39"}, - {file = "coverage-5.4-cp38-cp38-win_amd64.whl", hash = "sha256:03ed2a641e412e42cc35c244508cf186015c217f0e4d496bf6d7078ebe837ae7"}, - {file = "coverage-5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14a9f1887591684fb59fdba8feef7123a0da2424b0652e1b58dd5b9a7bb1188c"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9564ac7eb1652c3701ac691ca72934dd3009997c81266807aef924012df2f4b3"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0f48fc7dc82ee14aeaedb986e175a429d24129b7eada1b7e94a864e4f0644dde"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:107d327071061fd4f4a2587d14c389a27e4e5c93c7cba5f1f59987181903902f"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:0cdde51bfcf6b6bd862ee9be324521ec619b20590787d1655d005c3fb175005f"}, - {file = "coverage-5.4-cp39-cp39-win32.whl", hash = "sha256:c67734cff78383a1f23ceba3b3239c7deefc62ac2b05fa6a47bcd565771e5880"}, - {file = "coverage-5.4-cp39-cp39-win_amd64.whl", hash = "sha256:c669b440ce46ae3abe9b2d44a913b5fd86bb19eb14a8701e88e3918902ecd345"}, - {file = "coverage-5.4-pp36-none-any.whl", hash = "sha256:c0ff1c1b4d13e2240821ef23c1efb1f009207cb3f56e16986f713c2b0e7cd37f"}, - {file = "coverage-5.4-pp37-none-any.whl", hash = "sha256:cd601187476c6bed26a0398353212684c427e10a903aeafa6da40c63309d438b"}, - {file = "coverage-5.4.tar.gz", hash = "sha256:6d2e262e5e8da6fa56e774fb8e2643417351427604c2b177f8e8c5f75fc928ca"}, + {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, + {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, + {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, + {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, + {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, + {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, + {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, + {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, + {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, + {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, + {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, + {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, + {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, + {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, + {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, + {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, + {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, + {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, + {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, + {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, + {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, + {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, + {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, + {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, ] cryptography = [ - {file = "cryptography-3.3.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030"}, - {file = "cryptography-3.3.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0"}, - {file = "cryptography-3.3.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812"}, - {file = "cryptography-3.3.1-cp27-cp27m-win32.whl", hash = "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e"}, - {file = "cryptography-3.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901"}, - {file = "cryptography-3.3.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d"}, - {file = "cryptography-3.3.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5"}, - {file = "cryptography-3.3.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c"}, - {file = "cryptography-3.3.1-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c"}, - {file = "cryptography-3.3.1-cp36-abi3-win32.whl", hash = "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a"}, - {file = "cryptography-3.3.1-cp36-abi3-win_amd64.whl", hash = "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7"}, - {file = "cryptography-3.3.1.tar.gz", hash = "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, + {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, + {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, + {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, + {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, + {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, + {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, + {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, ] dataclasses = [ {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, @@ -1601,6 +1716,8 @@ dataclasses = [ docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] enum34 = [ {file = "enum34-1.1.10-py2-none-any.whl", hash = "sha256:a98a201d6de3f2ab3db284e70a33b0f896fbf35f8086594e8c9e74b909058d53"}, @@ -1608,8 +1725,8 @@ enum34 = [ {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, ] flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] funcsigs = [ {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, @@ -1637,8 +1754,8 @@ imagesize = [ importlib-metadata = [ {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, - {file = "importlib_metadata-3.4.0-py3-none-any.whl", hash = "sha256:ace61d5fc652dc280e7b6b4ff732a9c2d40db2c0f92bc6cb74e07b73d53a1771"}, - {file = "importlib_metadata-3.4.0.tar.gz", hash = "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d"}, + {file = "importlib_metadata-4.3.1-py3-none-any.whl", hash = "sha256:c2e27fa8b6c8b34ebfcd4056ae2ca290e36250d1fbeceec85c1c67c711449fac"}, + {file = "importlib_metadata-4.3.1.tar.gz", hash = "sha256:2d932ea08814f745863fd20172fe7de4794ad74567db78f2377343e24520a5b6"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1647,8 +1764,8 @@ iniconfig = [ isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, - {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, - {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, + {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, + {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jeepney = [ {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, @@ -1657,13 +1774,15 @@ jeepney = [ jinja2 = [ {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-22.0.1-py3-none-any.whl", hash = "sha256:9f44660a5d4931bdc14c08a1d01ef30b18a7a8147380710d8c9f9531e1f6c3c0"}, - {file = "keyring-22.0.1.tar.gz", hash = "sha256:9acb3e1452edbb7544822b12fd25459078769e560fa51f418b6d00afaa6178df"}, + {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, + {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] libtmux = [ {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, @@ -1688,21 +1807,74 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, @@ -1794,34 +1966,40 @@ pillow = [ {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, - {file = "Pillow-8.1.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:d355502dce85ade85a2511b40b4c61a128902f246504f7de29bbeec1ae27933a"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:93a473b53cc6e0b3ce6bf51b1b95b7b1e7e6084be3a07e40f79b42e83503fbf2"}, - {file = "Pillow-8.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2353834b2c49b95e1313fb34edf18fca4d57446675d05298bb694bca4b194174"}, - {file = "Pillow-8.1.0-cp36-cp36m-win32.whl", hash = "sha256:dd9eef866c70d2cbbea1ae58134eaffda0d4bfea403025f4db6859724b18ab3d"}, - {file = "Pillow-8.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b09e10ec453de97f9a23a5aa5e30b334195e8d2ddd1ce76cc32e52ba63c8b31d"}, - {file = "Pillow-8.1.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:b02a0b9f332086657852b1f7cb380f6a42403a6d9c42a4c34a561aa4530d5234"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ca20739e303254287138234485579b28cb0d524401f83d5129b5ff9d606cb0a8"}, - {file = "Pillow-8.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:604815c55fd92e735f9738f65dabf4edc3e79f88541c221d292faec1904a4b17"}, - {file = "Pillow-8.1.0-cp37-cp37m-win32.whl", hash = "sha256:47c0d93ee9c8b181f353dbead6530b26980fe4f5485aa18be8f1fd3c3cbc685e"}, - {file = "Pillow-8.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:96d4dc103d1a0fa6d47c6c55a47de5f5dafd5ef0114fa10c85a1fd8e0216284b"}, - {file = "Pillow-8.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7916cbc94f1c6b1301ac04510d0881b9e9feb20ae34094d3615a8a7c3db0dcc0"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3de6b2ee4f78c6b3d89d184ade5d8fa68af0848f9b6b6da2b9ab7943ec46971a"}, - {file = "Pillow-8.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cdbbe7dff4a677fb555a54f9bc0450f2a21a93c5ba2b44e09e54fcb72d2bd13d"}, - {file = "Pillow-8.1.0-cp38-cp38-win32.whl", hash = "sha256:cb192176b477d49b0a327b2a5a4979552b7a58cd42037034316b8018ac3ebb59"}, - {file = "Pillow-8.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6c5275bd82711cd3dcd0af8ce0bb99113ae8911fc2952805f1d012de7d600a4c"}, - {file = "Pillow-8.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:165c88bc9d8dba670110c689e3cc5c71dbe4bfb984ffa7cbebf1fac9554071d6"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5e2fe3bb2363b862671eba632537cd3a823847db4d98be95690b7e382f3d6378"}, - {file = "Pillow-8.1.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7612520e5e1a371d77e1d1ca3a3ee6227eef00d0a9cddb4ef7ecb0b7396eddf7"}, - {file = "Pillow-8.1.0-cp39-cp39-win32.whl", hash = "sha256:dc577f4cfdda354db3ae37a572428a90ffdbe4e51eda7849bf442fb803f09c9b"}, - {file = "Pillow-8.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:22d070ca2e60c99929ef274cfced04294d2368193e935c5d6febfd8b601bf865"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:a3d3e086474ef12ef13d42e5f9b7bbf09d39cf6bd4940f982263d6954b13f6a9"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:731ca5aabe9085160cf68b2dbef95fc1991015bc0a3a6ea46a371ab88f3d0913"}, - {file = "Pillow-8.1.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:bba80df38cfc17f490ec651c73bb37cd896bc2400cfba27d078c2135223c1206"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c3d911614b008e8a576b8e5303e3db29224b455d3d66d1b2848ba6ca83f9ece9"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:39725acf2d2e9c17356e6835dccebe7a697db55f25a09207e38b835d5e1bc032"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:81c3fa9a75d9f1afafdb916d5995633f319db09bd773cb56b8e39f1e98d90820"}, - {file = "Pillow-8.1.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:b6f00ad5ebe846cc91763b1d0c6d30a8042e02b2316e27b05de04fa6ec831ec5"}, - {file = "Pillow-8.1.0.tar.gz", hash = "sha256:887668e792b7edbfb1d3c9d8b5d8c859269a0f0eba4dda562adb95500f60dbba"}, + {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, + {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, + {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, + {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, + {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, + {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, + {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, + {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, + {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, + {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, + {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, + {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, + {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, + {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, + {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, + {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, + {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, + {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, + {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1836,22 +2014,22 @@ py = [ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] pycparser = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, - {file = "Pygments-2.7.4-py3-none-any.whl", hash = "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435"}, - {file = "Pygments-2.7.4.tar.gz", hash = "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337"}, + {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, + {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1862,26 +2040,30 @@ pytest = [ {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, - {file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, - {file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, + {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, + {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"}, - {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, - {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, + {file = "pytest-cov-2.12.0.tar.gz", hash = "sha256:8535764137fecce504a49c2b742288e3d34bc09eed298ad65963616cc98fd45e"}, + {file = "pytest_cov-2.12.0-py2.py3-none-any.whl", hash = "sha256:95d4933dcbbacfa377bb60b29801daa30d90c33981ab2a79e9ab4452c165066e"}, ] pytest-mock = [ {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, {file = "pytest-mock-3.5.1.tar.gz", hash = "sha256:a1e2aba6af9560d313c642dae7e00a2a12b022b80301d9d7fc8ec6858e1dd9fc"}, {file = "pytest_mock-3.5.1-py3-none-any.whl", hash = "sha256:379b391cfad22422ea2e252bdfc008edd08509029bcde3c25b2c0bd741e0424e"}, + {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, + {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, {file = "pytest-rerunfailures-9.1.1.tar.gz", hash = "sha256:1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2"}, {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, + {file = "pytest-rerunfailures-10.0.tar.gz", hash = "sha256:3906e611f962e3bdf15501e8a24ad2d12a703eff7d2030ea88acf68ad8d6b391"}, + {file = "pytest_rerunfailures-10.0-py3-none-any.whl", hash = "sha256:fb5f276df942944da80f3c7a84507ac4f92cc3f462fe6bd4bbcbef94de22db8b"}, ] pytz = [ {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, @@ -1902,6 +2084,8 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1909,72 +2093,80 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] readme-renderer = [ - {file = "readme_renderer-28.0-py2.py3-none-any.whl", hash = "sha256:267854ac3b1530633c2394ead828afcd060fc273217c42ac36b6be9c42cd9a9d"}, - {file = "readme_renderer-28.0.tar.gz", hash = "sha256:6b7e5aa59210a40de72eb79931491eaf46fefca2952b9181268bd7c7c65c260a"}, + {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, + {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] recommonmark = [ {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, + {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, + {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, + {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, + {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, + {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, + {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, + {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, + {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, + {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, + {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, + {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, + {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, @@ -1985,8 +2177,8 @@ requests-toolbelt = [ {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] rfc3986 = [ - {file = "rfc3986-1.4.0-py2.py3-none-any.whl", hash = "sha256:af9147e9aceda37c91a05f4deb128d4b4b49d6b199775fd2d2927768abdc8f50"}, - {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] scandir = [ {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, @@ -2002,12 +2194,12 @@ scandir = [ {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, ] secretstorage = [ - {file = "SecretStorage-3.3.0-py3-none-any.whl", hash = "sha256:5c36f6537a523ec5f969ef9fad61c98eb9e017bc601d811e53aa25bece64892f"}, - {file = "SecretStorage-3.3.0.tar.gz", hash = "sha256:30cfdef28829dad64d6ea1ed08f8eff6aa115a77068926bcc9f5225d5a3246aa"}, + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] snowballstemmer = [ {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, @@ -2016,8 +2208,10 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.4.3-py3-none-any.whl", hash = "sha256:c314c857e7cd47c856d2c5adff514ac2e6495f8b8e0f886a8a37e9305dfea0d8"}, - {file = "Sphinx-3.4.3.tar.gz", hash = "sha256:41cad293f954f7d37f803d97eb184158cfd90f51195131e94875bc07cd08b93c"}, + {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"}, + {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"}, + {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, + {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -2034,6 +2228,8 @@ sphinxcontrib-devhelp = [ sphinxcontrib-htmlhelp = [ {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, ] sphinxcontrib-jsmath = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, @@ -2044,8 +2240,8 @@ sphinxcontrib-qthelp = [ {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, - {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, @@ -2056,59 +2252,60 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.56.0-py2.py3-none-any.whl", hash = "sha256:4621f6823bab46a9cc33d48105753ccbea671b68bab2c50a9f0be23d4065cb5a"}, - {file = "tqdm-4.56.0.tar.gz", hash = "sha256:fe3d08dd00a526850568d542ff9de9bbc2a09a791da3c334f3213d8d0bbbca65"}, + {file = "tqdm-4.61.0-py2.py3-none-any.whl", hash = "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493"}, + {file = "tqdm-4.61.0.tar.gz", hash = "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, - {file = "twine-3.3.0-py3-none-any.whl", hash = "sha256:2f6942ec2a17417e19d2dd372fc4faa424c87ee9ce49b4e20c427eb00a0f3f41"}, - {file = "twine-3.3.0.tar.gz", hash = "sha256:fcffa8fc37e8083a5be0728371f299598870ee1eccc94e9a25cef7b1dcfa8297"}, + {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, + {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] typing = [ - {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, - {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, + {file = "typing-3.10.0.0-py2-none-any.whl", hash = "sha256:c7219ef20c5fbf413b4567092adfc46fa6203cb8454eda33c3fc1afe1398a308"}, + {file = "typing-3.10.0.0-py3-none-any.whl", hash = "sha256:12fbdfbe7d6cca1a42e485229afcb0b0c8259258cfb919b8a5e2a5c953742f89"}, + {file = "typing-3.10.0.0.tar.gz", hash = "sha256:13b4ad211f54ddbf93e5901a9967b1e07720c1d1b78d596ac6a439641aa1b130"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, + {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, + {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ - {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, - {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, + {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, + {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -2121,6 +2318,6 @@ webencodings = [ zipp = [ {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, - {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, - {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, ] From 3f88649a79f7a068aa0d0ac09638bc59243681db Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 May 2021 11:49:09 -0500 Subject: [PATCH 0755/2998] chore(doc,test): Relax requirements.txt versions --- requirements/doc.txt | 2 +- requirements/test.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/doc.txt b/requirements/doc.txt index f10de812e7..d5f02629f7 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,6 +1,6 @@ -r ./base.txt docutils>=0.14 -sphinx>=2.0.0 +sphinx>=4.0.0 alagitpull>=0.1.0 sphinx_issues==1.2.0 aafigure>=0.6 diff --git a/requirements/test.txt b/requirements/test.txt index 87f12558c3..888665119b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,5 +1,5 @@ -pytest<6 -pytest-rerunfailures<9 +pytest<6.3 +pytest-rerunfailures<11 pytest-cov coverage codecov From 64556e3635b27186a2e4febb8555ecfa983150ed Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 09:27:05 -0500 Subject: [PATCH 0756/2998] Fix tests on local environments (#682) --- tests/test_cli.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index bfd23457e9..3f0dd323cc 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -148,6 +148,8 @@ def test_tmuxp_configdir_xdg_config_dir(tmpdir, monkeypatch): def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): monkeypatch.setenv('HOME', str(homedir)) + monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir.join('.config'))) + projectdir.join('.tmuxp.yaml').ensure() user_config_name = 'myconfig' user_config = configdir.join('%s.yaml' % user_config_name).ensure() @@ -966,6 +968,7 @@ def check_cmd(config_arg): def test_ls_cli(monkeypatch, tmpdir): monkeypatch.setenv("HOME", str(tmpdir)) + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir.join('.config'))) filenames = [ '.git/', From d611a2ab0a45796c95eb7a15e56218b7899a6684 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 09:33:23 -0500 Subject: [PATCH 0757/2998] start tests sessions with a blank config and /bin/sh (#311) * test tests sessions with a blank config and /bin/sh on start * Add 3.2a to testbed --- .github/workflows/tests.yml | 2 +- tests/conftest.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 984af9c993..d12bbe349e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: python-version: [ '2.7', '3.x' ] - tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', 'master' ] + tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', '3.2a', 'master' ] steps: - uses: actions/checkout@v1 diff --git a/tests/conftest.py b/tests/conftest.py index 1de3ec58df..a4909a45af 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -48,7 +48,14 @@ def session(server): session_name = 'tmuxp' if not server.has_session(session_name): - server.cmd('new-session', '-d', '-s', session_name) + server.cmd( + '-f', '/dev/null', # use a blank config to reduce side effects + 'new-session', + '-d', # detached + '-s', session_name, + '/bin/sh', # use /bin/sh as a shell to reduce side effects + # normally, it'd be -c, but new-session is special + ) # find current sessions prefixed with tmuxp old_test_sessions = [ From f9d35f56758cc910eff4b307efc670e33dde8385 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Jan 2021 12:31:43 -0600 Subject: [PATCH 0758/2998] Remove Python 2.7 stuff --- .github/workflows/tests.yml | 2 +- README.rst | 2 +- docs/plugin_system.rst | 2 +- poetry.lock | 558 +----------------- pyproject.toml | 29 +- requirements/dev.txt | 4 +- requirements/test.txt | 4 +- setup.py | 1 - .../tmuxp_test_plugin_awf/pyproject.toml | 2 +- .../tmuxp_test_plugin_bs/pyproject.toml | 4 +- .../tmuxp_test_plugin_bwb/pyproject.toml | 2 +- .../tmuxp_test_plugin_fail/pyproject.toml | 2 +- .../tmuxp_test_plugin_owc/pyproject.toml | 2 +- .../tmuxp_test_plugin_r/pyproject.toml | 2 +- tests/test_shell.py | 3 +- tests/test_workspacebuilder.py | 9 +- tmuxp/_compat.py | 91 +-- tmuxp/cli.py | 24 +- tmuxp/config.py | 23 +- 19 files changed, 76 insertions(+), 690 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d12bbe349e..534b8c67ef 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '2.7', '3.x' ] + python-version: [ '3.x' ] tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', '3.2a', 'master' ] steps: - uses: actions/checkout@v1 diff --git a/README.rst b/README.rst index 49ec015850..037c703a78 100644 --- a/README.rst +++ b/README.rst @@ -252,7 +252,7 @@ See donation options at https://git-pull.com/support.html. Project details --------------- - tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 -- python support: 2.7, >= 3.3, pypy, pypy3 +- python support: >= 3.3, pypy, pypy3 - Source: https://github.com/tmux-python/tmuxp - Docs: https://tmuxp.git-pull.com - API: https://tmuxp.git-pull.com/api.html diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 31aad33628..71319b4cec 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -67,7 +67,7 @@ directory. The resulting file looks something like this: authors = ["Author Name .com>"] [tool.poetry.dependencies] - python = "~2.7 || ^3.5" + python = "^3.5" tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/poetry.lock b/poetry.lock index 086b791542..908d9e2a50 100644 --- a/poetry.lock +++ b/poetry.lock @@ -37,7 +37,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version >= \"3\" and sys_platform == \"win32\" or python_version < \"3\"" +marker = "sys_platform == \"win32\"" name = "atomicwrites" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -46,7 +46,6 @@ version = "1.4.0" [[package]] category = "dev" description = "Classes Without Boilerplate" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -61,7 +60,6 @@ tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0 [[package]] category = "dev" description = "Internationalization utilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "babel" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -70,19 +68,6 @@ version = "2.9.1" [package.dependencies] pytz = ">=2015.7" -[[package]] -category = "dev" -description = "Backport of functools.lru_cache" -marker = "python_version < \"3.2\"" -name = "backports.functools-lru-cache" -optional = false -python-versions = ">=2.6" -version = "1.6.4" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-checkdocs (>=2.4)"] - [[package]] category = "dev" description = "The uncompromising code formatter." @@ -129,7 +114,7 @@ description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false python-versions = "*" -version = "2020.12.5" +version = "2021.5.30" [[package]] category = "dev" @@ -187,36 +172,9 @@ optional = false python-versions = "*" version = "0.9.1" -[package.dependencies] -[package.dependencies.future] -python = "<3" -version = ">=0.14.0" - [package.extras] test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] -[[package]] -category = "dev" -description = "Updated configparser from Python 3.7 for Python 2.6+." -marker = "python_version < \"3.2\"" -name = "configparser" -optional = false -python-versions = ">=2.6" -version = "4.0.2" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytest-flake8", "pytest-black-multipy"] - -[[package]] -category = "dev" -description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3.4\"" -name = "contextlib2" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.6.0.post1" - [[package]] category = "dev" description = "Code coverage measurement for Python" @@ -273,15 +231,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.17.1" -[[package]] -category = "dev" -description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" -marker = "python_version < \"3.4\"" -name = "enum34" -optional = false -python-versions = "*" -version = "1.1.10" - [[package]] category = "dev" description = "the modular source code checker: pep8 pyflakes and co" @@ -295,62 +244,10 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.7.0,<2.8.0" pyflakes = ">=2.3.0,<2.4.0" -[package.dependencies.configparser] -python = "<3.2" -version = "*" - -[package.dependencies.enum34] -python = "<3.4" -version = "*" - -[package.dependencies.functools32] -python = "<3.2" -version = "*" - [package.dependencies.importlib-metadata] python = "<3.8" version = "*" -[package.dependencies.typing] -python = "<3.5" -version = "*" - -[[package]] -category = "dev" -description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -marker = "python_version < \"3\"" -name = "funcsigs" -optional = false -python-versions = "*" -version = "1.0.2" - -[[package]] -category = "dev" -description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." -marker = "python_version < \"3.2\"" -name = "functools32" -optional = false -python-versions = "*" -version = "3.2.3-2" - -[[package]] -category = "dev" -description = "Clean single-source support for Python 3 and 2" -marker = "python_version < \"3\"" -name = "future" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.18.2" - -[[package]] -category = "dev" -description = "Backport of the concurrent.futures package from Python 3" -marker = "python_version < \"3.2\"" -name = "futures" -optional = false -python-versions = ">=2.6, <3" -version = "3.3.0" - [[package]] category = "dev" description = "Internationalized Domain Names in Applications (IDNA)" @@ -362,7 +259,6 @@ version = "2.10" [[package]] category = "dev" description = "Getting image size from png/jpeg/jpeg2000/gif file" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "imagesize" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -371,7 +267,7 @@ version = "1.2.0" [[package]] category = "dev" description = "Read metadata from Python packages" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" @@ -380,18 +276,6 @@ version = "2.1.1" [package.dependencies] zipp = ">=0.5" -[package.dependencies.configparser] -python = "<3" -version = ">=3.5" - -[package.dependencies.contextlib2] -python = "<3" -version = "*" - -[package.dependencies.pathlib2] -python = "<3" -version = "*" - [package.extras] docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] @@ -402,7 +286,7 @@ description = "Read metadata from Python packages" name = "importlib-metadata" optional = false python-versions = ">=3.6" -version = "4.3.1" +version = "4.5.0" [package.dependencies] zipp = ">=0.5" @@ -418,7 +302,6 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] category = "dev" description = "iniconfig: brain-dead simple config-ini parsing" -marker = "python_version >= \"3\"" name = "iniconfig" optional = false python-versions = "*" @@ -433,15 +316,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "4.3.21" -[package.dependencies] -[package.dependencies."backports.functools-lru-cache"] -python = "<3.2" -version = "*" - -[package.dependencies.futures] -python = "<3.2" -version = "*" - [package.extras] pipfile = ["pipreqs", "requirementslib"] pyproject = ["toml"] @@ -477,7 +351,6 @@ test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -492,7 +365,6 @@ i18n = ["Babel (>=0.8)"] [[package]] category = "dev" description = "A very fast and expressive template engine." -marker = "python_version >= \"3\"" name = "jinja2" optional = false python-versions = ">=3.6" @@ -544,7 +416,6 @@ version = "0.8.5" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" @@ -553,7 +424,6 @@ version = "1.1.1" [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." -marker = "python_version >= \"3\"" name = "markupsafe" optional = false python-versions = ">=3.6" @@ -567,39 +437,6 @@ optional = false python-versions = "*" version = "0.6.1" -[[package]] -category = "dev" -description = "Rolling backport of unittest.mock for all Pythons" -marker = "python_version < \"3\"" -name = "mock" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.0.5" - -[package.dependencies] -six = "*" - -[package.dependencies.funcsigs] -python = "<3.3" -version = ">=1" - -[package.extras] -build = ["twine", "wheel", "blurb"] -docs = ["sphinx"] -test = ["pytest", "pytest-cov"] - -[[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -marker = "python_version <= \"2.7\"" -name = "more-itertools" -optional = false -python-versions = "*" -version = "5.0.0" - -[package.dependencies] -six = ">=1.0.0,<2.0.0" - [[package]] category = "dev" description = "Experimental type system extensions for programs checked with the mypy typechecker." @@ -623,23 +460,7 @@ pyparsing = ">=2.0.2" [[package]] category = "dev" description = "Object-oriented filesystem paths" -marker = "python_version < \"3\"" -name = "pathlib2" -optional = false -python-versions = "*" -version = "2.3.4" - -[package.dependencies] -six = "*" - -[package.dependencies.scandir] -python = "<3.5" -version = "*" - -[[package]] -category = "dev" -description = "Object-oriented filesystem paths" -marker = "python_version >= \"3\" and python_version < \"3.6\"" +marker = "python_version < \"3.6\"" name = "pathlib2" optional = false python-versions = "*" @@ -660,16 +481,6 @@ version = "0.8.1" [[package]] category = "dev" description = "Python Imaging Library (Fork)" -marker = "python_version < \"3\" or python_version >= \"3\"" -name = "pillow" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "6.2.2" - -[[package]] -category = "dev" -description = "Python Imaging Library (Fork)" -marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.5" @@ -678,7 +489,6 @@ version = "7.2.0" [[package]] category = "dev" description = "Python Imaging Library (Fork)" -marker = "python_version >= \"3\"" name = "pillow" optional = false python-versions = ">=3.6" @@ -698,7 +508,6 @@ testing = ["nose", "coverage"] [[package]] category = "dev" description = "plugin and hook calling mechanisms for python" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pluggy" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -715,7 +524,6 @@ dev = ["pre-commit", "tox"] [[package]] category = "dev" description = "library with cross-python path, ini-parsing, io, code, log facilities" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -746,14 +554,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.3.1" -[[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." -name = "pygments" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.5.2" - [[package]] category = "dev" description = "Pygments is a syntax highlighting package written in Python." @@ -765,52 +565,11 @@ version = "2.9.0" [[package]] category = "dev" description = "Python parsing module" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" -[[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" -name = "pytest" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.6.11" - -[package.dependencies] -atomicwrites = ">=1.0" -attrs = ">=17.4.0" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -six = ">=1.10.0" -wcwidth = "*" - -[package.dependencies.colorama] -python = "<3.4.0 || >=3.5.0" -version = "*" - -[package.dependencies.funcsigs] -python = "<3.0" -version = ">=1.0" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.more-itertools] -python = "<2.8" -version = ">=4.0.0,<6.0.0" - -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] - [[package]] category = "dev" description = "pytest: simple powerful testing with Python" @@ -869,61 +628,22 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] category = "dev" description = "Pytest plugin for measuring coverage." -marker = "python_version < \"3\" or python_version >= \"3\"" -name = "pytest-cov" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.9.0" - -[package.dependencies] -coverage = ">=4.4" -pytest = ">=3.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] - -[[package]] -category = "dev" -description = "Pytest plugin for measuring coverage." -marker = "python_version >= \"3\"" name = "pytest-cov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.12.0" +version = "2.12.1" [package.dependencies] +coverage = ">=5.2.1" pytest = ">=4.6" - -[package.dependencies.coverage] -extras = ["toml"] -version = ">=5.2.1" - -[package.extras] -testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] - -[[package]] -category = "dev" -description = "Thin-wrapper around the mock package for easier use with py.test" -marker = "python_version < \"3\" or python_version >= \"3\"" -name = "pytest-mock" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.0" - -[package.dependencies] -pytest = ">=2.7" - -[package.dependencies.mock] -python = "<3.0" -version = "*" +toml = "*" [package.extras] -dev = ["pre-commit", "tox"] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] [[package]] category = "dev" description = "Thin-wrapper around the mock package for easier use with pytest" -marker = "python_version >= \"3\"" name = "pytest-mock" optional = false python-versions = ">=3.5" @@ -938,7 +658,6 @@ dev = ["pre-commit", "tox", "pytest-asyncio"] [[package]] category = "dev" description = "Thin-wrapper around the mock package for easier use with pytest" -marker = "python_version >= \"3\"" name = "pytest-mock" optional = false python-versions = ">=3.6" @@ -950,18 +669,6 @@ pytest = ">=5.0" [package.extras] dev = ["pre-commit", "tox", "pytest-asyncio"] -[[package]] -category = "dev" -description = "pytest plugin to re-run tests to eliminate flaky failures" -name = "pytest-rerunfailures" -optional = false -python-versions = "*" -version = "8.0" - -[package.dependencies] -pytest = ">=4.4" -setuptools = ">=40.0" - [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -989,7 +696,6 @@ setuptools = ">=40.0" [[package]] category = "dev" description = "World timezone definitions, modern and historical" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pytz" optional = false python-versions = "*" @@ -1099,15 +805,6 @@ version = "1.5.0" [package.extras] idna2008 = ["idna"] -[[package]] -category = "dev" -description = "scandir, a better directory iterator and faster os.walk()" -marker = "python_version < \"3\"" -name = "scandir" -optional = false -python-versions = "*" -version = "1.10.0" - [[package]] category = "dev" description = "Python bindings to FreeDesktop.org Secret Service API" @@ -1132,43 +829,11 @@ version = "1.16.0" [[package]] category = "dev" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -marker = "python_version < \"3\" or python_version >= \"3\"" name = "snowballstemmer" optional = false python-versions = "*" version = "2.1.0" -[[package]] -category = "dev" -description = "Python documentation generator" -name = "sphinx" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.8.5" - -[package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" -alabaster = ">=0.7,<0.8" -babel = ">=1.3,<2.0 || >2.0" -colorama = ">=0.3.5" -docutils = ">=0.11" -imagesize = "*" -packaging = "*" -requests = ">=2.0.0" -setuptools = "*" -six = ">=1.5" -snowballstemmer = ">=1.1" -sphinxcontrib-websupport = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" - -[package.extras] -test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] -websupport = ["sqlalchemy (>=0.9)", "whoosh (>=2.0)"] - [[package]] category = "dev" description = "Python documentation generator" @@ -1252,7 +917,6 @@ tests = ["pytest", "mock"] [[package]] category = "dev" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -marker = "python_version >= \"3\"" name = "sphinxcontrib-applehelp" optional = false python-versions = ">=3.5" @@ -1265,7 +929,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-devhelp" optional = false python-versions = ">=3.5" @@ -1278,7 +941,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.5" @@ -1291,7 +953,6 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -marker = "python_version >= \"3\"" name = "sphinxcontrib-htmlhelp" optional = false python-versions = ">=3.6" @@ -1304,7 +965,6 @@ test = ["pytest", "html5lib"] [[package]] category = "dev" description = "A sphinx extension which renders display math in HTML via JavaScript" -marker = "python_version >= \"3\"" name = "sphinxcontrib-jsmath" optional = false python-versions = ">=3.5" @@ -1316,7 +976,6 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -marker = "python_version >= \"3\"" name = "sphinxcontrib-qthelp" optional = false python-versions = ">=3.5" @@ -1329,7 +988,6 @@ test = ["pytest"] [[package]] category = "dev" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -marker = "python_version >= \"3\"" name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" @@ -1339,22 +997,9 @@ version = "1.1.5" lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] -[[package]] -category = "dev" -description = "Sphinx API for Web Apps" -marker = "python_version < \"3\"" -name = "sphinxcontrib-websupport" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.2" - -[package.extras] -test = ["pytest", "mock"] - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version >= \"3\"" name = "toml" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -1366,7 +1011,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.61.0" +version = "4.61.1" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] @@ -1421,19 +1066,10 @@ optional = false python-versions = "*" version = "1.4.3" -[[package]] -category = "dev" -description = "Type Hints for Python" -marker = "python_version < \"3.5\"" -name = "typing" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <3.5" -version = "3.10.0.0" - [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" +marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" name = "typing-extensions" optional = false python-versions = "*" @@ -1452,20 +1088,6 @@ brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] -[[package]] -category = "dev" -description = "Measures the displayed width of unicode strings in a terminal" -marker = "python_version < \"3\"" -name = "wcwidth" -optional = false -python-versions = "*" -version = "0.2.5" - -[package.dependencies] -[package.dependencies."backports.functools-lru-cache"] -python = "<3.2" -version = ">=1.2.1" - [[package]] category = "dev" description = "Character encoding aliases for legacy web content" @@ -1477,17 +1099,12 @@ version = "0.5.1" [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\" or python_version >= \"3\" and python_version < \"3.8\"" +marker = "python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=2.7" version = "1.2.0" -[package.dependencies] -[package.dependencies.contextlib2] -python = "<3.4" -version = "*" - [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] @@ -1513,9 +1130,9 @@ lint = [] test = [] [metadata] -content-hash = "93dd01034663e935ae6d194015952cbaa939b17701e716adc8efd00d98d9658d" +content-hash = "b68c28d11a493ba4c02fbf993639a22d2d0d5fb28d23dcd0c3febc3211d5644a" lock-version = "1.0" -python-versions = "~2.7 || ^3.5" +python-versions = "^3.5" [metadata.files] aafigure = [ @@ -1546,10 +1163,6 @@ babel = [ {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] -"backports.functools-lru-cache" = [ - {file = "backports.functools_lru_cache-1.6.4-py2.py3-none-any.whl", hash = "sha256:dbead04b9daa817909ec64e8d2855fb78feafe0b901d4568758e3a60559d8978"}, - {file = "backports.functools_lru_cache-1.6.4.tar.gz", hash = "sha256:d5ed2169378b67d3c545e5600d363a923b09c456dab1593914935a68ad478271"}, -] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] @@ -1558,8 +1171,8 @@ bleach = [ {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, ] certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] cffi = [ {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, @@ -1578,36 +1191,24 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -1633,14 +1234,6 @@ commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] -configparser = [ - {file = "configparser-4.0.2-py2.py3-none-any.whl", hash = "sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c"}, - {file = "configparser-4.0.2.tar.gz", hash = "sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df"}, -] -contextlib2 = [ - {file = "contextlib2-0.6.0.post1-py2.py3-none-any.whl", hash = "sha256:3355078a159fbb44ee60ea80abd0d87b80b78c248643b49aa6d94673b413609b"}, - {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, -] coverage = [ {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, @@ -1719,30 +1312,10 @@ docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] -enum34 = [ - {file = "enum34-1.1.10-py2-none-any.whl", hash = "sha256:a98a201d6de3f2ab3db284e70a33b0f896fbf35f8086594e8c9e74b909058d53"}, - {file = "enum34-1.1.10-py3-none-any.whl", hash = "sha256:c3858660960c984d6ab0ebad691265180da2b43f07e061c0f8dca9ef3cffd328"}, - {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, -] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] -funcsigs = [ - {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, - {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"}, -] -functools32 = [ - {file = "functools32-3.2.3-2.tar.gz", hash = "sha256:f6253dfbe0538ad2e387bd8fdfd9293c925d63553f5813c4e587745416501e6d"}, - {file = "functools32-3.2.3-2.zip", hash = "sha256:89d824aa6c358c421a234d7f9ee0bd75933a67c29588ce50aaa3acdf4d403fa0"}, -] -future = [ - {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, -] -futures = [ - {file = "futures-3.3.0-py2-none-any.whl", hash = "sha256:49b3f5b064b6e3afc3316421a3f25f66c137ae88f068abbf72830170033c5e16"}, - {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, -] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, @@ -1754,8 +1327,8 @@ imagesize = [ importlib-metadata = [ {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, - {file = "importlib_metadata-4.3.1-py3-none-any.whl", hash = "sha256:c2e27fa8b6c8b34ebfcd4056ae2ca290e36250d1fbeceec85c1c67c711449fac"}, - {file = "importlib_metadata-4.3.1.tar.gz", hash = "sha256:2d932ea08814f745863fd20172fe7de4794ad74567db78f2377343e24520a5b6"}, + {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, + {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1880,15 +1453,6 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mock = [ - {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, - {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, -] -more-itertools = [ - {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, - {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, - {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -1898,8 +1462,6 @@ packaging = [ {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pathlib2 = [ - {file = "pathlib2-2.3.4-py2.py3-none-any.whl", hash = "sha256:2156525d6576d21c4dcaddfa427fae887ef89a7a9de5cbfe0728b3aafa78427e"}, - {file = "pathlib2-2.3.4.tar.gz", hash = "sha256:446014523bb9be5c28128c4d2a10ad6bb60769e78bd85658fe44a450674e0ef8"}, {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, ] @@ -1908,36 +1470,6 @@ pathspec = [ {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-6.2.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:834dd023b7f987d6b700ad93dc818098d7eb046bd445e9992b3093c6f9d7a95f"}, - {file = "Pillow-6.2.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d3a98444a00b4643b22b0685dbf9e0ddcaf4ebfd4ea23f84f228adf5a0765bb2"}, - {file = "Pillow-6.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2b4a94be53dff02af90760c10a2e3634c3c7703410f38c98154d5ce71fe63d20"}, - {file = "Pillow-6.2.2-cp27-cp27m-win32.whl", hash = "sha256:87ef0eca169f7f0bc050b22f05c7e174a65c36d584428431e802c0165c5856ea"}, - {file = "Pillow-6.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:cbd5647097dc55e501f459dbac7f1d0402225636deeb9e0a98a8d2df649fc19d"}, - {file = "Pillow-6.2.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:4adc3302df4faf77c63ab3a83e1a3e34b94a6a992084f4aa1cb236d1deaf4b39"}, - {file = "Pillow-6.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e3a797a079ce289e59dbd7eac9ca3bf682d52687f718686857281475b7ca8e6a"}, - {file = "Pillow-6.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:bb7861e4618a0c06c40a2e509c1bea207eea5fd4320d486e314e00745a402ca5"}, - {file = "Pillow-6.2.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:535e8e0e02c9f1fc2e307256149d6ee8ad3aa9a6e24144b7b6e6fb6126cb0e99"}, - {file = "Pillow-6.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:bc149dab804291a18e1186536519e5e122a2ac1316cb80f506e855a500b1cdd4"}, - {file = "Pillow-6.2.2-cp35-cp35m-win32.whl", hash = "sha256:1a3bc8e1db5af40a81535a62a591fafdb30a8a1b319798ea8052aa65ef8f06d2"}, - {file = "Pillow-6.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:d6b4dc325170bee04ca8292bbd556c6f5398d52c6149ca881e67daf62215426f"}, - {file = "Pillow-6.2.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:43ef1cff7ee57f9c8c8e6fa02a62eae9fa23a7e34418c7ce88c0e3fe09d1fb38"}, - {file = "Pillow-6.2.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:900de1fdc93764be13f6b39dc0dd0207d9ff441d87ad7c6e97e49b81987dc0f3"}, - {file = "Pillow-6.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b83b380f9181cacc994f4c983d95a9c8b00b50bf786c66d235716b526a3332"}, - {file = "Pillow-6.2.2-cp36-cp36m-win32.whl", hash = "sha256:00e0bbe9923adc5cc38a8da7d87d4ce16cde53b8d3bba8886cb928e84522d963"}, - {file = "Pillow-6.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:5ccfcb0a34ad9b77ad247c231edb781763198f405a5c8dc1b642449af821fb7f"}, - {file = "Pillow-6.2.2-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:5dcbbaa3a24d091a64560d3c439a8962866a79a033d40eb1a75f1b3413bfc2bc"}, - {file = "Pillow-6.2.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6e2a7e74d1a626b817ecb7a28c433b471a395c010b2a1f511f976e9ea4363e64"}, - {file = "Pillow-6.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c424d35a5259be559b64490d0fd9e03fba81f1ce8e5b66e0a59de97547351d80"}, - {file = "Pillow-6.2.2-cp37-cp37m-win32.whl", hash = "sha256:aa4792ab056f51b49e7d59ce5733155e10a918baf8ce50f64405db23d5627fa2"}, - {file = "Pillow-6.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0d5c99f80068f13231ac206bd9b2e80ea357f5cf9ae0fa97fab21e32d5b61065"}, - {file = "Pillow-6.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03457e439d073770d88afdd90318382084732a5b98b0eb6f49454746dbaae701"}, - {file = "Pillow-6.2.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ccf16fe444cc43800eeacd4f4769971200982200a71b1368f49410d0eb769543"}, - {file = "Pillow-6.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b72c39585f1837d946bd1a829a4820ccf86e361f28cbf60f5d646f06318b61e2"}, - {file = "Pillow-6.2.2-cp38-cp38-win32.whl", hash = "sha256:3ba7d8f1d962780f86aa747fef0baf3211b80cb13310fff0c375da879c0656d4"}, - {file = "Pillow-6.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3e81485cec47c24f5fb27acb485a4fc97376b2b332ed633867dc68ac3077998c"}, - {file = "Pillow-6.2.2-pp273-pypy_73-win32.whl", hash = "sha256:aa1b0297e352007ec781a33f026afbb062a9a9895bb103c8f49af434b1666880"}, - {file = "Pillow-6.2.2-pp373-pypy36_pp73-win32.whl", hash = "sha256:82859575005408af81b3e9171ae326ff56a69af5439d3fc20e8cb76cd51c8246"}, - {file = "Pillow-6.2.2.tar.gz", hash = "sha256:db9ff0c251ed066d367f53b64827cc9e18ccea001b986d08c265e53625dab950"}, {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, @@ -2026,8 +1558,6 @@ pyflakes = [ {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ - {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, - {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] @@ -2036,30 +1566,22 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, - {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] pytest-cov = [ - {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, - {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"}, - {file = "pytest-cov-2.12.0.tar.gz", hash = "sha256:8535764137fecce504a49c2b742288e3d34bc09eed298ad65963616cc98fd45e"}, - {file = "pytest_cov-2.12.0-py2.py3-none-any.whl", hash = "sha256:95d4933dcbbacfa377bb60b29801daa30d90c33981ab2a79e9ab4452c165066e"}, + {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, + {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, ] pytest-mock = [ - {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, - {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, {file = "pytest-mock-3.5.1.tar.gz", hash = "sha256:a1e2aba6af9560d313c642dae7e00a2a12b022b80301d9d7fc8ec6858e1dd9fc"}, {file = "pytest_mock-3.5.1-py3-none-any.whl", hash = "sha256:379b391cfad22422ea2e252bdfc008edd08509029bcde3c25b2c0bd741e0424e"}, {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-rerunfailures = [ - {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, - {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, {file = "pytest-rerunfailures-9.1.1.tar.gz", hash = "sha256:1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2"}, {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, {file = "pytest-rerunfailures-10.0.tar.gz", hash = "sha256:3906e611f962e3bdf15501e8a24ad2d12a703eff7d2030ea88acf68ad8d6b391"}, @@ -2093,26 +1615,18 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, @@ -2180,19 +1694,6 @@ rfc3986 = [ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] -scandir = [ - {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, - {file = "scandir-1.10.0-cp27-cp27m-win_amd64.whl", hash = "sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"}, - {file = "scandir-1.10.0-cp34-cp34m-win32.whl", hash = "sha256:2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f"}, - {file = "scandir-1.10.0-cp34-cp34m-win_amd64.whl", hash = "sha256:2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e"}, - {file = "scandir-1.10.0-cp35-cp35m-win32.whl", hash = "sha256:2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f"}, - {file = "scandir-1.10.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32"}, - {file = "scandir-1.10.0-cp36-cp36m-win32.whl", hash = "sha256:2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022"}, - {file = "scandir-1.10.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4"}, - {file = "scandir-1.10.0-cp37-cp37m-win32.whl", hash = "sha256:67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173"}, - {file = "scandir-1.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d"}, - {file = "scandir-1.10.0.tar.gz", hash = "sha256:4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae"}, -] secretstorage = [ {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, @@ -2206,8 +1707,6 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, - {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"}, {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"}, {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, @@ -2243,17 +1742,13 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] -sphinxcontrib-websupport = [ - {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, - {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, -] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.61.0-py2.py3-none-any.whl", hash = "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493"}, - {file = "tqdm-4.61.0.tar.gz", hash = "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"}, + {file = "tqdm-4.61.1-py2.py3-none-any.whl", hash = "sha256:aa0c29f03f298951ac6318f7c8ce584e48fa22ec26396e6411e43d038243bdb2"}, + {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"}, ] twine = [ {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, @@ -2293,11 +1788,6 @@ typed-ast = [ {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] -typing = [ - {file = "typing-3.10.0.0-py2-none-any.whl", hash = "sha256:c7219ef20c5fbf413b4567092adfc46fa6203cb8454eda33c3fc1afe1398a308"}, - {file = "typing-3.10.0.0-py3-none-any.whl", hash = "sha256:12fbdfbe7d6cca1a42e485229afcb0b0c8259258cfb919b8a5e2a5c953742f89"}, - {file = "typing-3.10.0.0.tar.gz", hash = "sha256:13b4ad211f54ddbf93e5901a9967b1e07720c1d1b78d596ac6a439641aa1b130"}, -] typing-extensions = [ {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, @@ -2307,10 +1797,6 @@ urllib3 = [ {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, ] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, diff --git a/pyproject.toml b/pyproject.toml index db84686451..d70783a826 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ classifiers = [ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", @@ -37,7 +36,7 @@ Repository = "https://github.com/tmux-python/tmuxp" tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" click = "^7" kaptan = ">=0.5.10" libtmux = "<0.9" @@ -45,38 +44,22 @@ colorama = ">=0.3.9" [tool.poetry.dev-dependencies] ### Docs ### -sphinx = [ - {version="<2", python="<3"}, - {version="*", python=">=3"} -] +sphinx = "*" recommonmark = {version = "^0.6.0"} alagitpull = {version = "~0.1.0"} sphinx-issues = {version = "^1.2.0"} aafigure = ">=0.6" -pillow = [ - {version="<7", python="<3"}, - {version="*", python=">=3"} -] +pillow = "*" ### Testing ### -pytest = [ - {version="<4.7.0", python="<3"}, - {version="*", python=">=3"} -] -pathlib2 = {version="<2.3.5", python="<3"} # Untangle pytest peer-dependency +pytest = "*" pytest-rerunfailures = "*" -pytest-mock = [ - {version="<3.0.0", python="<3"}, - {version="*", python=">=3"} -] +pytest-mock = "*" +pytest-cov = "*" ### Coverage ### codecov = "*" coverage = "*" -pytest-cov = [ - {version="<2.10.0", python="<3"}, - {version="*", python=">=3"} -] ### Format ### black = {version="==20.08b1", python="^3.6"} diff --git a/requirements/dev.txt b/requirements/dev.txt index 7b832b3f25..1b6470493e 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,3 +1,3 @@ -isort<5 -flake8<4 +isort +flake8 twine diff --git a/requirements/test.txt b/requirements/test.txt index 888665119b..ecaefb1b8b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,5 +1,5 @@ -pytest<6.3 -pytest-rerunfailures<11 +pytest +pytest-rerunfailures pytest-cov coverage codecov diff --git a/setup.py b/setup.py index 83b8ad9d94..ebd40c6e09 100644 --- a/setup.py +++ b/setup.py @@ -51,7 +51,6 @@ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml index 97d3597e59..1fe4beb5cb 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test after_window_finished part of the tmuxp pl authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index 01a1fe2858..653eec9096 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -5,8 +5,8 @@ description = "A tmuxp plugin to test before_script part of the tmuxp plugin sys authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" -tmuxp = "^1.7.0" +python = "^3.5" +tmuxp = "^1.7.0." [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml index 1693dc04ba..b63716fe6f 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test before_workspace_build part of the tmuxp p authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml index fbce74c992..aa7cfae357 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml @@ -5,7 +5,7 @@ description = "A test plugin designed to fail to test the cli" authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml index 1484f2b3eb..f4d2934471 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test on_window_create part of the tmuxp plugin authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml index 9e18628f92..dbf6f6ce3e 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test reattach part of the tmuxp plugin system" authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "~2.7 || ^3.5" +python = "^3.5" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/test_shell.py b/tests/test_shell.py index 9c700b5039..ca6a97b265 100644 --- a/tests/test_shell.py +++ b/tests/test_shell.py @@ -1,10 +1,9 @@ from tmuxp import shell -from tmuxp._compat import string_types def test_detect_best_shell(): result = shell.detect_best_shell() - assert isinstance(result, string_types) + assert isinstance(result, str) def test_shell_detect(): diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index b38abadb3e..94dd04ceaa 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -13,7 +13,6 @@ from libtmux.common import has_gte_version from libtmux.test import retry, temp_session from tmuxp import config, exc -from tmuxp._compat import text_type from tmuxp.cli import load_plugins from tmuxp.workspacebuilder import WorkspaceBuilder @@ -326,14 +325,14 @@ def test_window_shell(session): for w, wconf in builder.iter_create_windows(s): if 'window_shell' in wconf: - assert wconf['window_shell'] == text_type('top') + assert wconf['window_shell'] == str('top') while retry(): session.server._update_windows() if w['window_name'] != 'top': break - assert w.name != text_type('top') + assert w.name != str('top') def test_environment_variables(session): @@ -392,7 +391,7 @@ def test_automatic_rename_option(session): if w.name == 'sh': break - assert w.name == text_type('sh') + assert w.name == 'sh' w.select_pane('-D') @@ -401,7 +400,7 @@ def test_automatic_rename_option(session): if w['window_name'] != 'sh': break - assert w.name != text_type('sh') + assert w.name != 'sh' def test_blank_pane_count(session): diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index b4b1298686..fb5fd4dea0 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -2,14 +2,12 @@ # flake8: NOQA import sys -PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 PYMINOR = sys.version_info[1] PYPATCH = sys.version_info[2] _identity = lambda x: x - if PY3 and PYMINOR >= 7: breakpoint = breakpoint else: @@ -18,89 +16,14 @@ breakpoint = pdb.set_trace -if PY2: - unichr = unichr - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) - from urllib import urlretrieve - - text_to_native = lambda s, enc: s.encode(enc) - - iterkeys = lambda d: d.iterkeys() - itervalues = lambda d: d.itervalues() - iteritems = lambda d: d.iteritems() - - from itertools import imap, izip - - import ConfigParser as configparser - import cPickle as pickle - from cStringIO import StringIO as BytesIO - from StringIO import StringIO - - range_type = xrange +console_encoding = sys.__stdout__.encoding - cmp = cmp +implements_to_string = _identity - input = raw_input - from string import lower as ascii_lowercase - import urlparse - - exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') - - def implements_to_string(cls): - cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode('utf-8') - return cls - - def console_to_str(s): +def console_to_str(s): + """ From pypa/pip project, pip.backwardwardcompat. License MIT. """ + try: + return s.decode(console_encoding) + except UnicodeDecodeError: return s.decode('utf_8') - - -else: - unichr = chr - text_type = str - string_types = (str,) - integer_types = (int,) - - text_to_native = lambda s, enc: s - - iterkeys = lambda d: iter(d.keys()) - itervalues = lambda d: iter(d.values()) - iteritems = lambda d: iter(d.items()) - - import configparser - import pickle - from io import BytesIO, StringIO - - izip = zip - imap = map - range_type = range - - cmp = lambda a, b: (a > b) - (a < b) - - input = input - import urllib.parse as urllib - import urllib.parse as urlparse - from string import ascii_lowercase - from urllib.request import urlretrieve - - console_encoding = sys.__stdout__.encoding - - implements_to_string = _identity - - def console_to_str(s): - """ From pypa/pip project, pip.backwardwardcompat. License MIT. """ - try: - return s.decode(console_encoding) - except UnicodeDecodeError: - return s.decode('utf_8') - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise (value.with_traceback(tb)) - raise value - - -number_types = integer_types + (float,) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 74f5142c06..0b107a3536 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -17,21 +17,20 @@ import kaptan from click.exceptions import FileError +from libtmux import __version__ as libtmux_version from libtmux.common import ( + get_version, has_gte_version, has_minimum_version, - which, - get_version, tmux_cmd, + which, ) from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server -from libtmux import __version__ as libtmux_version - -from . import config, exc, log, util, __file__ as tmuxp_path +from . import __file__ as tmuxp_path, config, exc, log, util from .__about__ import __version__ -from ._compat import PY3, PYMINOR, string_types +from ._compat import PY3, PYMINOR from .workspacebuilder import WorkspaceBuilder, freeze logger = logging.getLogger(__name__) @@ -263,7 +262,7 @@ def scan_config_argument(ctx, param, value, config_dir=None): tmuxp_echo(ctx.get_help(), color=ctx.color) ctx.exit() - if isinstance(value, string_types): + if isinstance(value, str): value = scan_config(value, config_dir=config_dir) elif isinstance(value, tuple): @@ -712,8 +711,10 @@ def load_workspace( return _setup_plugins(builder) if 'TMUX' in os.environ: # tmuxp ran from inside tmux - msg = "Already inside TMUX, switch to session? yes/no\n"\ - "Or (a)ppend windows in the current active session?\n[y/n/a]" + msg = ( + "Already inside TMUX, switch to session? yes/no\n" + "Or (a)ppend windows in the current active session?\n[y/n/a]" + ) options = ['y', 'n', 'a'] choice = click.prompt(msg, value_proc=_validate_choices(options)) @@ -749,7 +750,6 @@ def load_workspace( return _setup_plugins(builder) - @click.group(context_settings={'obj': {}}) @click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') @click.option( @@ -1008,7 +1008,7 @@ def command_freeze(session_name, socket_name, socket_path, force): '-a', 'append', help='Load configuration, appending windows to the current session', - is_flag=True + is_flag=True, ) @click.option( 'colors', @@ -1081,7 +1081,7 @@ def command_load( tmuxp_echo(ctx.get_help(), color=ctx.color) ctx.exit() - if isinstance(config, string_types): + if isinstance(config, str): load_workspace(config, **tmux_options) elif isinstance(config, tuple): diff --git a/tmuxp/config.py b/tmuxp/config.py index eee39ce45c..22c23c20ac 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -5,14 +5,11 @@ ~~~~~~~~~~~~ """ -from __future__ import absolute_import, unicode_literals - import copy import logging import os from . import exc -from ._compat import string_types logger = logging.getLogger(__name__) @@ -64,7 +61,7 @@ def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): ------- bool """ - extensions = [extensions] if isinstance(extensions, string_types) else extensions + extensions = [extensions] if isinstance(extensions, str) else extensions return any(filename.endswith(e) for e in extensions) @@ -224,7 +221,7 @@ def expand(sconf, cwd=None, parent=None): if 'global_options' in sconf: for key in sconf['global_options']: val = sconf['global_options'][key] - if isinstance(val, string_types): + if isinstance(val, str): val = expandshell(val) if any(val.startswith(a) for a in ['.', './']): val = os.path.normpath(os.path.join(cwd, val)) @@ -232,7 +229,7 @@ def expand(sconf, cwd=None, parent=None): if 'options' in sconf: for key in sconf['options']: val = sconf['options'][key] - if isinstance(val, string_types): + if isinstance(val, str): val = expandshell(val) if any(val.startswith(a) for a in ['.', './']): val = os.path.normpath(os.path.join(cwd, val)) @@ -262,11 +259,11 @@ def expand(sconf, cwd=None, parent=None): os.path.join(cwd, sconf['before_script']) ) - if 'shell_command' in sconf and isinstance(sconf['shell_command'], string_types): + if 'shell_command' in sconf and isinstance(sconf['shell_command'], str): sconf['shell_command'] = [sconf['shell_command']] if 'shell_command_before' in sconf and isinstance( - sconf['shell_command_before'], string_types + sconf['shell_command_before'], str ): sconf['shell_command_before'] = [sconf['shell_command_before']] @@ -287,7 +284,7 @@ def expand(sconf, cwd=None, parent=None): p = copy.deepcopy(pconf) pconf = sconf['panes'][p_index] = {} - if isinstance(p, string_types): + if isinstance(p, str): p = {'shell_command': [p]} elif not p: p = {'shell_command': []} @@ -296,7 +293,7 @@ def expand(sconf, cwd=None, parent=None): if 'shell_command' in p: cmd = p['shell_command'] - if isinstance(p['shell_command'], string_types): + if isinstance(p['shell_command'], str): cmd = [cmd] if not cmd or any(a == cmd for a in [None, 'blank', 'pane']): @@ -446,12 +443,12 @@ def import_tmuxinator(sconf): if 'pre' in sconf and 'pre_window' in sconf: tmuxp_config['shell_command'] = sconf['pre'] - if isinstance(sconf['pre'], string_types): + if isinstance(sconf['pre'], str): tmuxp_config['shell_command_before'] = [sconf['pre_window']] else: tmuxp_config['shell_command_before'] = sconf['pre_window'] elif 'pre' in sconf: - if isinstance(sconf['pre'], string_types): + if isinstance(sconf['pre'], str): tmuxp_config['shell_command_before'] = [sconf['pre']] else: tmuxp_config['shell_command_before'] = sconf['pre'] @@ -466,7 +463,7 @@ def import_tmuxinator(sconf): windowdict = {'window_name': k} - if isinstance(v, string_types) or v is None: + if isinstance(v, str) or v is None: windowdict['panes'] = [v] tmuxp_config['windows'].append(windowdict) continue From 3cc7ce2645816bfe632a8a283968c62774143de0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:26:58 -0500 Subject: [PATCH 0759/2998] libtmux: Update to v0.9.0 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- requirements/base.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 908d9e2a50..fe29bf26cb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -411,7 +411,7 @@ description = "scripting library / orm for tmux" name = "libtmux" optional = false python-versions = "*" -version = "0.8.5" +version = "0.9.0" [[package]] category = "dev" @@ -1130,7 +1130,7 @@ lint = [] test = [] [metadata] -content-hash = "b68c28d11a493ba4c02fbf993639a22d2d0d5fb28d23dcd0c3febc3211d5644a" +content-hash = "e43047a3bc9b35df4c2d822a1867acbeae0ed95e21e57dfe7e99fa91d3abe4f6" lock-version = "1.0" python-versions = "^3.5" @@ -1358,8 +1358,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] libtmux = [ - {file = "libtmux-0.8.5-py3-none-any.whl", hash = "sha256:640b315497dba2235778d9fe6924e995523f61bfbbca35a0f8036fe07c1627b3"}, - {file = "libtmux-0.8.5.tar.gz", hash = "sha256:1d35b9f8451944d31c5ed22ed9e6c8e18034adcc75718fcc5b27fbd9621543e1"}, + {file = "libtmux-0.9.0-py3-none-any.whl", hash = "sha256:9684fa7c42e05275d0872b9d1f329b921211a107bc6cf98cb569b8f7f68a9096"}, + {file = "libtmux-0.9.0.tar.gz", hash = "sha256:c42727cbbcd02403cffb79c8ba8ea4f95ff1bd8c9328612fea537acd25e5ae16"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, diff --git a/pyproject.toml b/pyproject.toml index d70783a826..38092dc44b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.5" click = "^7" kaptan = ">=0.5.10" -libtmux = "<0.9" +libtmux = "<0.10" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] diff --git a/requirements/base.txt b/requirements/base.txt index fb2ab61bc7..50f749e54e 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux>=0.8,<0.9 +libtmux>=0.9,<0.10 click>=7,<8 colorama>=0.3.9 From 9ab8d2e98262292a89a192f240d019c823feb7e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:30:03 -0500 Subject: [PATCH 0760/2998] chore: Remove __future__ and mode headers --- docs/_ext/aafig.py | 4 ---- docs/conf.py | 1 - tests/__init__.py | 3 --- tests/conftest.py | 9 +++++---- tests/test_cli.py | 3 --- tests/test_config.py | 4 ---- tests/test_config_teamocil.py | 4 ---- tests/test_config_tmuxinator.py | 4 ---- tests/test_plugin.py | 3 --- tests/test_util.py | 4 ---- tests/test_workspacebuilder.py | 4 ---- tests/test_workspacefreezer.py | 4 ---- tests/tests/test_helpers.py | 4 ---- tmuxp/__init__.py | 3 --- tmuxp/cli.py | 9 ++++----- tmuxp/config.py | 1 - tmuxp/exc.py | 4 ---- tmuxp/log.py | 3 --- tmuxp/shell.py | 3 --- tmuxp/util.py | 3 --- tmuxp/workspacebuilder.py | 6 +----- 21 files changed, 10 insertions(+), 73 deletions(-) diff --git a/docs/_ext/aafig.py b/docs/_ext/aafig.py index 5b27529f2e..38dd315d3e 100644 --- a/docs/_ext/aafig.py +++ b/docs/_ext/aafig.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ sphinxcontrib.aafig ~~~~~~~~~~~~~~~~~~~ @@ -11,9 +10,6 @@ :author: Leandro Lucarella :license: BOLA, see LICENSE for details """ - -from __future__ import unicode_literals - import posixpath from os import path diff --git a/docs/conf.py b/docs/conf.py index 65f4b5b9fc..a05fcdbd6d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import inspect import os import sys diff --git a/tests/__init__.py b/tests/__init__.py index ce09160529..8cee3f54f4 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,12 +1,9 @@ -# -*- coding: utf-8 -*- """Tests for tmuxp. tmuxp.tests ~~~~~~~~~~~ """ -from __future__ import absolute_import, unicode_literals - import os current_dir = os.path.abspath(os.path.dirname(__file__)) diff --git a/tests/conftest.py b/tests/conftest.py index a4909a45af..410171cc8a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import logging import os @@ -49,12 +48,14 @@ def session(server): if not server.has_session(session_name): server.cmd( - '-f', '/dev/null', # use a blank config to reduce side effects + '-f', + '/dev/null', # use a blank config to reduce side effects 'new-session', '-d', # detached - '-s', session_name, + '-s', + session_name, '/bin/sh', # use /bin/sh as a shell to reduce side effects - # normally, it'd be -c, but new-session is special + # normally, it'd be -c, but new-session is special ) # find current sessions prefixed with tmuxp diff --git a/tests/test_cli.py b/tests/test_cli.py index 3f0dd323cc..8a06b723f7 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,7 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp command line interface.""" -from __future__ import absolute_import - import json import os diff --git a/tests/test_config.py b/tests/test_config.py index e1085cf47b..74e58ea829 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp configuration import, inlining, expanding and export.""" - -from __future__ import absolute_import, unicode_literals - import os import pytest diff --git a/tests/test_config_teamocil.py b/tests/test_config_teamocil.py index bd92ee9b9f..dda802fbd8 100644 --- a/tests/test_config_teamocil.py +++ b/tests/test_config_teamocil.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp teamocil configuration.""" - -from __future__ import absolute_import, unicode_literals - import os import pytest diff --git a/tests/test_config_tmuxinator.py b/tests/test_config_tmuxinator.py index 5701fac3d6..3f2341ca30 100644 --- a/tests/test_config_tmuxinator.py +++ b/tests/test_config_tmuxinator.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp tmuxinator configuration.""" - -from __future__ import absolute_import, unicode_literals - import os import pytest diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 88372c8fcf..d894c98937 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -1,7 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp plugin api.""" -from __future__ import absolute_import - import pytest from tmuxp.exc import TmuxpPluginException diff --git a/tests/test_util.py b/tests/test_util.py index 6f3d33b16a..17568ce7c1 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Tests for utility functions in tmux.""" - -from __future__ import absolute_import, unicode_literals - import os import pytest diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 94dd04ceaa..e85b409177 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp workspacebuilder.""" - -from __future__ import absolute_import, unicode_literals - import os import pytest diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 373b29b271..62acb5bdaf 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Test for tmuxp workspacefreezer.""" - -from __future__ import absolute_import, unicode_literals - import time import kaptan diff --git a/tests/tests/test_helpers.py b/tests/tests/test_helpers.py index 17394a95f0..6418cce579 100644 --- a/tests/tests/test_helpers.py +++ b/tests/tests/test_helpers.py @@ -1,8 +1,4 @@ -# -*- coding: utf-8 -*- """Tests for .'s helper and utility functions.""" - -from __future__ import absolute_import, unicode_literals - import pytest from libtmux.test import get_test_session_name, temp_session diff --git a/tmuxp/__init__.py b/tmuxp/__init__.py index 6d2c3228f1..145a640bc7 100644 --- a/tmuxp/__init__.py +++ b/tmuxp/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # flake8: NOQA """tmux session manager. @@ -9,8 +8,6 @@ :license: MIT, see LICENSE for details """ -from __future__ import absolute_import, unicode_literals - from . import cli, config, util from .__about__ import ( __author__, diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 0b107a3536..72699f8f8c 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1,12 +1,9 @@ -# -*- coding: utf-8 -*- """Command line tool for managing tmux workspaces and tmuxp configurations. tmuxp.cli ~~~~~~~~~ """ -from __future__ import absolute_import - import importlib import logging import os @@ -663,8 +660,10 @@ def load_workspace( sconfig = config.trickle(sconfig) t = Server( # create tmux server object - socket_name=socket_name, socket_path=socket_path, - config_file=tmux_config_file, colors=colors, + socket_name=socket_name, + socket_path=socket_path, + config_file=tmux_config_file, + colors=colors, ) which('tmux') # raise exception if tmux not found diff --git a/tmuxp/config.py b/tmuxp/config.py index 22c23c20ac..d7b8047ebe 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Configuration parsing and export for tmuxp. tmuxp.config diff --git a/tmuxp/exc.py b/tmuxp/exc.py index fb847f82c1..7ddcb24a09 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -1,13 +1,9 @@ -# -*- coding: utf-8 -*- """Exceptions for tmuxp. tmuxp.exc ~~~~~~~~~ """ - -from __future__ import absolute_import, unicode_literals - from ._compat import implements_to_string diff --git a/tmuxp/log.py b/tmuxp/log.py index bb9b3d0a45..15f3b8b669 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -1,13 +1,10 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- """Log utilities for tmuxp. tmuxp.log ~~~~~~~~~ """ -from __future__ import absolute_import, unicode_literals - import logging import time diff --git a/tmuxp/shell.py b/tmuxp/shell.py index 2920b590fd..3607b75290 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -1,12 +1,9 @@ -# -*- coding: utf-8 -*- """Utility and helper methods for tmuxp. tmuxp.shell ~~~~~~~~~~~ """ -from __future__ import absolute_import, unicode_literals - import logging import os diff --git a/tmuxp/util.py b/tmuxp/util.py index 249b23f473..7fc32f713d 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -1,12 +1,9 @@ -# -*- coding: utf-8 -*- """Utility and helper methods for tmuxp. tmuxp.util ~~~~~~~~~~ """ -from __future__ import absolute_import, unicode_literals - import logging import os import shlex diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 45992cb21f..3263342a2e 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -1,13 +1,9 @@ -# -*- coding: utf-8 -*- """Create a tmux workspace from a configuration :py:obj:`dict`. tmuxp.workspacebuilder ~~~~~~~~~~~~~~~~~~~~~~ """ - -from __future__ import absolute_import, unicode_literals - import logging from libtmux.exc import TmuxSessionExists @@ -17,7 +13,7 @@ from libtmux.window import Window from . import exc -from .util import run_before_script, get_current_pane +from .util import get_current_pane, run_before_script logger = logging.getLogger(__name__) From c37a7fa4c4dfbaa3ae8f0bb98d6edb79bd1757dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:34:16 -0500 Subject: [PATCH 0761/2998] Bump minimum version 3.5 -> 3.6 --- README.rst | 2 +- docs/plugin_system.rst | 2 +- pyproject.toml | 3 +-- setup.py | 1 - .../pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml | 2 +- .../pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml | 2 +- 10 files changed, 9 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 037c703a78..0fc89c95d7 100644 --- a/README.rst +++ b/README.rst @@ -252,7 +252,7 @@ See donation options at https://git-pull.com/support.html. Project details --------------- - tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 -- python support: >= 3.3, pypy, pypy3 +- python support: >= 3.6, pypy, pypy3 - Source: https://github.com/tmux-python/tmuxp - Docs: https://tmuxp.git-pull.com - API: https://tmuxp.git-pull.com/api.html diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst index 71319b4cec..8ac5c80e9a 100644 --- a/docs/plugin_system.rst +++ b/docs/plugin_system.rst @@ -67,7 +67,7 @@ directory. The resulting file looks something like this: authors = ["Author Name .com>"] [tool.poetry.dependencies] - python = "^3.5" + python = "^3.6" tmuxp = "^1.6.0" [tool.poetry.dev-dependencies] diff --git a/pyproject.toml b/pyproject.toml index 38092dc44b..672b512cc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ classifiers = [ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", @@ -36,7 +35,7 @@ Repository = "https://github.com/tmux-python/tmuxp" tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" click = "^7" kaptan = ">=0.5.10" libtmux = "<0.10" diff --git a/setup.py b/setup.py index ebd40c6e09..bfa9a2e43c 100644 --- a/setup.py +++ b/setup.py @@ -51,7 +51,6 @@ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml index 1fe4beb5cb..c2f98acbcd 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test after_window_finished part of the tmuxp pl authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index 653eec9096..e16a31af38 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test before_script part of the tmuxp plugin sys authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0." [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml index b63716fe6f..9fbf0d76a1 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test before_workspace_build part of the tmuxp p authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml index aa7cfae357..5c0f72184e 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/pyproject.toml @@ -5,7 +5,7 @@ description = "A test plugin designed to fail to test the cli" authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml index f4d2934471..cdb9a1ed50 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test on_window_create part of the tmuxp plugin authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml index dbf6f6ce3e..ac1291b400 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/pyproject.toml @@ -5,7 +5,7 @@ description = "A tmuxp plugin to test reattach part of the tmuxp plugin system" authors = ["Joseph Flinn "] [tool.poetry.dependencies] -python = "^3.5" +python = "^3.6" tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] From f9ddbf12034b494ae0b28fa2bb8c9e16462f4737 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:35:11 -0500 Subject: [PATCH 0762/2998] docs(CHANGES): Update --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index f5939eb0bc..dcd2a9168d 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,9 @@ current @jfindlay! Fixes :issue:`654` - :issue:`666` CI: Move test plugin packages from pyproject.toml to pytest fixtures. Fixes :issue:`658` +- Bump minimum version 3.5 -> 3.6 +- Drop python 2.7 support +- Modernize syntax (remove ``__future__`` and modesets) - *Insert changes/features/fixes for next release here* tmuxp 1.7.2 (2021-02-03) From 584772d14b7da1e156494596580fb272148b00c0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:37:43 -0500 Subject: [PATCH 0763/2998] black: Update to 21.6b0 --- poetry.lock | 384 ++++--------------------------------------------- pyproject.toml | 2 +- 2 files changed, 27 insertions(+), 359 deletions(-) diff --git a/poetry.lock b/poetry.lock index fe29bf26cb..9f18ef1fb1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -28,7 +28,7 @@ alabaster = "<0.8" [[package]] category = "dev" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "appdirs" optional = false python-versions = "*" @@ -71,29 +71,37 @@ pytz = ">=2015.7" [[package]] category = "dev" description = "The uncompromising code formatter." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "black" optional = false -python-versions = ">=3.6" -version = "20.8b1" +python-versions = ">=3.6.2" +version = "21.6b0" [package.dependencies] appdirs = "*" click = ">=7.1.2" mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" +pathspec = ">=0.8.1,<1" regex = ">=2020.1.8" toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" [package.dependencies.dataclasses] python = "<3.7" version = ">=0.6" +[package.dependencies.typed-ast] +python = "<3.8" +version = ">=1.4.2" + +[package.dependencies.typing-extensions] +python = "<3.8" +version = ">=3.7.4" + [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] category = "dev" @@ -209,20 +217,12 @@ test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pret [[package]] category = "dev" description = "A backport of the dataclasses module for Python 3.6" -marker = "python_version >= \"3.6\" and python_version < \"3.7\"" +marker = "python_version >= \"3.6.2\" and python_version < \"3.7\"" name = "dataclasses" optional = false python-versions = ">=3.6, <3.7" version = "0.8" -[[package]] -category = "dev" -description = "Docutils -- Python Documentation Utilities" -name = "docutils" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.16" - [[package]] category = "dev" description = "Docutils -- Python Documentation Utilities" @@ -264,22 +264,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.2.0" -[[package]] -category = "dev" -description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" -name = "importlib-metadata" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "2.1.1" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] - [[package]] category = "dev" description = "Read metadata from Python packages" @@ -307,21 +291,6 @@ optional = false python-versions = "*" version = "1.1.1" -[[package]] -category = "dev" -description = "A Python utility / library to sort Python imports." -marker = "python_version < \"3.6\" or python_version >= \"3.6\"" -name = "isort" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "4.3.21" - -[package.extras] -pipfile = ["pipreqs", "requirementslib"] -pyproject = ["toml"] -requirements = ["pipreqs", "pip-api"] -xdg_home = ["appdirs (>=1.4.0)"] - [[package]] category = "dev" description = "A Python utility / library to sort Python imports." @@ -348,20 +317,6 @@ version = "0.6.0" [package.extras] test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] -[[package]] -category = "dev" -description = "A very fast and expressive template engine." -name = "jinja2" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.3" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - [[package]] category = "dev" description = "A very fast and expressive template engine." @@ -413,14 +368,6 @@ optional = false python-versions = "*" version = "0.9.0" -[[package]] -category = "dev" -description = "Safely add untrusted strings to HTML/XML markup." -name = "markupsafe" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" - [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -440,7 +387,7 @@ version = "0.6.1" [[package]] category = "dev" description = "Experimental type system extensions for programs checked with the mypy typechecker." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "mypy-extensions" optional = false python-versions = "*" @@ -457,35 +404,15 @@ version = "20.9" [package.dependencies] pyparsing = ">=2.0.2" -[[package]] -category = "dev" -description = "Object-oriented filesystem paths" -marker = "python_version < \"3.6\"" -name = "pathlib2" -optional = false -python-versions = "*" -version = "2.3.5" - -[package.dependencies] -six = "*" - [[package]] category = "dev" description = "Utility library for gitignore style pattern matching of file paths." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.8.1" -[[package]] -category = "dev" -description = "Python Imaging Library (Fork)" -name = "pillow" -optional = false -python-versions = ">=3.5" -version = "7.2.0" - [[package]] category = "dev" description = "Python Imaging Library (Fork)" @@ -570,36 +497,6 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.7" -[[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" -name = "pytest" -optional = false -python-versions = ">=3.5" -version = "6.1.2" - -[package.dependencies] -atomicwrites = ">=1.0" -attrs = ">=17.4.0" -colorama = "*" -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.8.2" -toml = "*" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" - -[package.extras] -checkqa_mypy = ["mypy (0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - [[package]] category = "dev" description = "pytest: simple powerful testing with Python" @@ -641,20 +538,6 @@ toml = "*" [package.extras] testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] -[[package]] -category = "dev" -description = "Thin-wrapper around the mock package for easier use with pytest" -name = "pytest-mock" -optional = false -python-versions = ">=3.5" -version = "3.5.1" - -[package.dependencies] -pytest = ">=5.0" - -[package.extras] -dev = ["pre-commit", "tox", "pytest-asyncio"] - [[package]] category = "dev" description = "Thin-wrapper around the mock package for easier use with pytest" @@ -669,18 +552,6 @@ pytest = ">=5.0" [package.extras] dev = ["pre-commit", "tox", "pytest-asyncio"] -[[package]] -category = "dev" -description = "pytest plugin to re-run tests to eliminate flaky failures" -name = "pytest-rerunfailures" -optional = false -python-versions = ">=3.5" -version = "9.1.1" - -[package.dependencies] -pytest = ">=5.0" -setuptools = ">=40.0" - [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -710,14 +581,6 @@ optional = false python-versions = "*" version = "0.2.0" -[[package]] -category = "main" -description = "YAML parser and emitter for Python" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" - [[package]] category = "main" description = "YAML parser and emitter for Python" @@ -759,7 +622,7 @@ sphinx = ">=1.3.1" [[package]] category = "dev" description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "regex" optional = false python-versions = "*" @@ -834,38 +697,6 @@ optional = false python-versions = "*" version = "2.1.0" -[[package]] -category = "dev" -description = "Python documentation generator" -name = "sphinx" -optional = false -python-versions = ">=3.5" -version = "3.5.4" - -[package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = ">=0.3.5" -docutils = ">=0.12,<0.17" -imagesize = "*" -packaging = "*" -requests = ">=2.5.0" -setuptools = "*" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - [[package]] category = "dev" description = "Python documentation generator" @@ -938,18 +769,6 @@ version = "1.0.2" lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] -[[package]] -category = "dev" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -name = "sphinxcontrib-htmlhelp" -optional = false -python-versions = ">=3.5" -version = "1.0.3" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - [[package]] category = "dev" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" @@ -1018,26 +837,6 @@ dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] telegram = ["requests"] -[[package]] -category = "dev" -description = "Collection of utilities for publishing packages on PyPI" -name = "twine" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.15.0" - -[package.dependencies] -pkginfo = ">=1.4.2" -readme-renderer = ">=21.0" -requests = ">=2.5.0,<2.15 || >2.15,<2.16 || >2.16" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -setuptools = ">=0.7.0" -tqdm = ">=4.14" - -[package.extras] -keyring = ["keyring"] -with-blake2 = ["pyblake2"] - [[package]] category = "dev" description = "Collection of utilities for publishing packages on PyPI" @@ -1060,7 +859,7 @@ tqdm = ">=4.14" [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" +marker = "python_version >= \"3.6.2\" and python_version < \"3.8\"" name = "typed-ast" optional = false python-versions = "*" @@ -1069,7 +868,7 @@ version = "1.4.3" [[package]] category = "dev" description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" or python_version < \"3.8\"" +marker = "python_version >= \"3.6.2\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "typing-extensions" optional = false python-versions = "*" @@ -1096,19 +895,6 @@ optional = false python-versions = "*" version = "0.5.1" -[[package]] -category = "dev" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" -name = "zipp" -optional = false -python-versions = ">=2.7" -version = "1.2.0" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] - [[package]] category = "dev" description = "Backport of pathlib-compatible object wrapper for zip files" @@ -1130,9 +916,9 @@ lint = [] test = [] [metadata] -content-hash = "e43047a3bc9b35df4c2d822a1867acbeae0ed95e21e57dfe7e99fa91d3abe4f6" +content-hash = "ffe3fac2dabd09b836f435faaf4d59098247b51fe0149720de6bf46ea291f620" lock-version = "1.0" -python-versions = "^3.5" +python-versions = "^3.6" [metadata.files] aafigure = [ @@ -1164,7 +950,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, + {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, + {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] bleach = [ {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, @@ -1307,8 +1094,6 @@ dataclasses = [ {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] docutils = [ - {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, - {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] @@ -1325,8 +1110,6 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, - {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, ] @@ -1335,8 +1118,6 @@ iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ - {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, - {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] @@ -1345,8 +1126,6 @@ jeepney = [ {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, ] jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, ] @@ -1362,58 +1141,6 @@ libtmux = [ {file = "libtmux-0.9.0.tar.gz", hash = "sha256:c42727cbbcd02403cffb79c8ba8ea4f95ff1bd8c9328612fea537acd25e5ae16"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, @@ -1461,43 +1188,11 @@ packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] -pathlib2 = [ - {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, - {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"}, -] pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"}, - {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"}, - {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"}, - {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"}, - {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"}, - {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"}, - {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"}, - {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"}, - {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"}, - {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"}, - {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"}, - {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"}, - {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"}, - {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"}, - {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"}, - {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"}, - {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"}, - {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"}, {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, @@ -1566,8 +1261,6 @@ pyparsing = [ {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, - {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, ] @@ -1576,14 +1269,10 @@ pytest-cov = [ {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, ] pytest-mock = [ - {file = "pytest-mock-3.5.1.tar.gz", hash = "sha256:a1e2aba6af9560d313c642dae7e00a2a12b022b80301d9d7fc8ec6858e1dd9fc"}, - {file = "pytest_mock-3.5.1-py3-none-any.whl", hash = "sha256:379b391cfad22422ea2e252bdfc008edd08509029bcde3c25b2c0bd741e0424e"}, {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-rerunfailures = [ - {file = "pytest-rerunfailures-9.1.1.tar.gz", hash = "sha256:1cb11a17fc121b3918414eb5eaf314ee325f2e693ac7cb3f6abf7560790827f2"}, - {file = "pytest_rerunfailures-9.1.1-py3-none-any.whl", hash = "sha256:2eb7d0ad651761fbe80e064b0fd415cf6730cdbc53c16a145fd84b66143e609f"}, {file = "pytest-rerunfailures-10.0.tar.gz", hash = "sha256:3906e611f962e3bdf15501e8a24ad2d12a703eff7d2030ea88acf68ad8d6b391"}, {file = "pytest_rerunfailures-10.0-py3-none-any.whl", hash = "sha256:fb5f276df942944da80f3c7a84507ac4f92cc3f462fe6bd4bbcbef94de22db8b"}, ] @@ -1596,19 +1285,6 @@ pywin32-ctypes = [ {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, ] pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, - {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, @@ -1707,8 +1383,6 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"}, - {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"}, {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"}, ] @@ -1725,8 +1399,6 @@ sphinxcontrib-devhelp = [ {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, - {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, ] @@ -1751,8 +1423,6 @@ tqdm = [ {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"}, ] twine = [ - {file = "twine-1.15.0-py2.py3-none-any.whl", hash = "sha256:630fadd6e342e725930be6c696537e3f9ccc54331742b16245dab292a17d0460"}, - {file = "twine-1.15.0.tar.gz", hash = "sha256:a3d22aab467b4682a22de4a422632e79d07eebd07ff2a7079effb13f8a693787"}, {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, ] @@ -1802,8 +1472,6 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] zipp = [ - {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, - {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, ] diff --git a/pyproject.toml b/pyproject.toml index 672b512cc0..b0cf092c4a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ codecov = "*" coverage = "*" ### Format ### -black = {version="==20.08b1", python="^3.6"} +black = {version="==21.6b0", python="^3.6.2"} isort = [ {version="<5", python="<3.6"}, {version="*", python=">=3.6"} From 07e0037ea973ab23a92da66e126c5f607fba27db Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:38:08 -0500 Subject: [PATCH 0764/2998] docs(CHANGES): Update for black change --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index dcd2a9168d..72f5b80f53 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ current - Bump minimum version 3.5 -> 3.6 - Drop python 2.7 support - Modernize syntax (remove ``__future__`` and modesets) +- Update black to 21.6b0 - *Insert changes/features/fixes for next release here* tmuxp 1.7.2 (2021-02-03) From 62dc1b84237e8ba3bc9a06ae9d441f1fe50ab722 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:38:22 -0500 Subject: [PATCH 0765/2998] chore: Format with black 21.6b0 --- tmuxp/_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index fb5fd4dea0..4569077291 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -22,7 +22,7 @@ def console_to_str(s): - """ From pypa/pip project, pip.backwardwardcompat. License MIT. """ + """From pypa/pip project, pip.backwardwardcompat. License MIT.""" try: return s.decode(console_encoding) except UnicodeDecodeError: From 2b5fefdae94ef767d528237b7167017c4d248480 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 11:54:54 -0500 Subject: [PATCH 0766/2998] docs(CHANGES): Update for #661 merger --- CHANGES | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 72f5b80f53..d12c981d6f 100644 --- a/CHANGES +++ b/CHANGES @@ -11,10 +11,11 @@ current @jfindlay! Fixes :issue:`654` - :issue:`666` CI: Move test plugin packages from pyproject.toml to pytest fixtures. Fixes :issue:`658` -- Bump minimum version 3.5 -> 3.6 -- Drop python 2.7 support -- Modernize syntax (remove ``__future__`` and modesets) -- Update black to 21.6b0 +- :issue:`661` + - Bump minimum version 3.5 -> 3.6 + - Drop python 2.7 support + - Modernize syntax (remove ``__future__`` and modesets) + - Update black to 21.6b0 - *Insert changes/features/fixes for next release here* tmuxp 1.7.2 (2021-02-03) From 9555298b756cb802f6785791e9f1cec157eb0c53 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 12:10:02 -0500 Subject: [PATCH 0767/2998] Tag v1.8.0: Drop python 2.7 and 3.5 --- CHANGES | 7 ++++--- pyproject.toml | 3 ++- setup.py | 1 + tmuxp/__about__.py | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index d12c981d6f..fa4b74b26c 100644 --- a/CHANGES +++ b/CHANGES @@ -6,9 +6,11 @@ Here you can find the recent changes to tmuxp current ------- +- *Insert changes/features/fixes for next release here* + +tmuxp 1.8.0 (2021-06-14) +------------------------ - :issue:`662` CI: Only update docs when changed -- :issue:`665` Support for passing tmux config file (``-f``), thanks - @jfindlay! Fixes :issue:`654` - :issue:`666` CI: Move test plugin packages from pyproject.toml to pytest fixtures. Fixes :issue:`658` - :issue:`661` @@ -16,7 +18,6 @@ current - Drop python 2.7 support - Modernize syntax (remove ``__future__`` and modesets) - Update black to 21.6b0 -- *Insert changes/features/fixes for next release here* tmuxp 1.7.2 (2021-02-03) ------------------------ diff --git a/pyproject.toml b/pyproject.toml index b0cf092c4a..9a06df0330 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.7.0" +version = "1.8.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] @@ -18,6 +18,7 @@ classifiers = [ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells" diff --git a/setup.py b/setup.py index bfa9a2e43c..4ffdbf0a44 100644 --- a/setup.py +++ b/setup.py @@ -54,6 +54,7 @@ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells", diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 035d1fd44a..f90ce28676 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.7.0' +__version__ = '1.8.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 100389f1b6b873246e2d0965a7b156ff8a893ae3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 12:13:11 -0500 Subject: [PATCH 0768/2998] docs(CHANGES): Indentation fix --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index fa4b74b26c..04b1768b5c 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ tmuxp 1.8.0 (2021-06-14) - :issue:`666` CI: Move test plugin packages from pyproject.toml to pytest fixtures. Fixes :issue:`658` - :issue:`661` + - Bump minimum version 3.5 -> 3.6 - Drop python 2.7 support - Modernize syntax (remove ``__future__`` and modesets) From d108625fbf0b24f2b2a370ece287eb9322c7146e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20V=C3=ADtor=20Carli?= Date: Mon, 14 Jun 2021 14:14:48 -0300 Subject: [PATCH 0769/2998] Include Homebrew in installation methods (#681) --- README.rst | 10 ++++++++++ docs/quickstart.rst | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/README.rst b/README.rst index 0fc89c95d7..0c40eca72e 100644 --- a/README.rst +++ b/README.rst @@ -13,10 +13,20 @@ available on Leanpub and `Amazon Kindle`_. Read and browse the book for free Installation ------------ +Pip +^^^ + .. code-block:: shell $ pip install --user tmuxp +Homebrew +^^^^^^^^ + +.. code-block:: shell + + $ brew install tmuxp + Load a tmux session ------------------- diff --git a/docs/quickstart.rst b/docs/quickstart.rst index a575582a8b..113663d425 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -21,6 +21,12 @@ You can upgrade to the latest release with: Then install :ref:`completion`. +If you are a Homebrew user you can install it with: + +.. code-block:: bash + + $ brew install tmuxp + CLI --- From d1662db054828acd1a60bc565b4a3e2aee9ae123 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 12:15:23 -0500 Subject: [PATCH 0770/2998] docs: Thanks to @jvcarli for the homebrew package! See also: https://github.com/Homebrew/homebrew-core/pull/79011 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 04b1768b5c..eb0b95c82c 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* +- :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! tmuxp 1.8.0 (2021-06-14) ------------------------ From 7b3fcbabcfc6ab04a22a3626bf83cfcf60908625 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 12:18:33 -0500 Subject: [PATCH 0771/2998] Tag v1.8.0post0 Note homebrew release --- CHANGES | 4 ++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index eb0b95c82c..9e2f3aeec1 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,10 @@ current - *Insert changes/features/fixes for next release here* - :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! +tmuxp 1.8.0.post0 (2021-06-14) +------------------------------ +- :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! + tmuxp 1.8.0 (2021-06-14) ------------------------ - :issue:`662` CI: Only update docs when changed diff --git a/pyproject.toml b/pyproject.toml index 9a06df0330..161f811bad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.8.0" +version = "1.8.0post0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index f90ce28676..55f009bff5 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.8.0' +__version__ = '1.8.0post0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 7448f348b10706b60a08cc5e6261c1a2c09b002c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 12:21:44 -0500 Subject: [PATCH 0772/2998] docs: Remove duplication --- CHANGES | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES b/CHANGES index 9e2f3aeec1..6eb384f175 100644 --- a/CHANGES +++ b/CHANGES @@ -7,7 +7,6 @@ Here you can find the recent changes to tmuxp current ------- - *Insert changes/features/fixes for next release here* -- :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! tmuxp 1.8.0.post0 (2021-06-14) ------------------------------ From 2ff9727e5ef2abe1b6c20161283df65c669721cc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Jun 2021 16:48:08 -0500 Subject: [PATCH 0773/2998] Tag v1.8.1 See also: #681 issue with homebrew --- CHANGES | 4 ++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 6eb384f175..aacb9b2aae 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,10 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.8.1 (2021-06-14) +------------------------ +- :issue:`681` Bump version to make homebrew release easier + tmuxp 1.8.0.post0 (2021-06-14) ------------------------------ - :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! diff --git a/pyproject.toml b/pyproject.toml index 161f811bad..530769ba7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.8.0post0" +version = "1.8.1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 55f009bff5..604284bdb0 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.8.0post0' +__version__ = '1.8.1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 873dd89393b92f83adfa4dcee36c6077f7bbe6d0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 15 Jun 2021 13:02:23 -0500 Subject: [PATCH 0774/2998] Tag v1.8.2 --- CHANGES | 5 +++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index aacb9b2aae..da129e4b95 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,11 @@ current ------- - *Insert changes/features/fixes for next release here* +tmuxp 1.8.2 (2021-06-15) +------------------------ +- :issue:`474` Re-release with ``python setup.py sdist bdist_wheel`` to + fix missing test files + tmuxp 1.8.1 (2021-06-14) ------------------------ - :issue:`681` Bump version to make homebrew release easier diff --git a/pyproject.toml b/pyproject.toml index 530769ba7f..163159f8f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.8.1" +version = "1.8.2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 604284bdb0..a9bd6faa6d 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.8.1' +__version__ = '1.8.2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From ef21c89d8b06f1d6d9f5430cc018cb41874909aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 08:22:01 -0500 Subject: [PATCH 0775/2998] pyproject: Remove pathlib2 from extras (deprecated) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 163159f8f7..11994f4354 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,7 +76,7 @@ twine = "*" [tool.poetry.extras] docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull", "aafigure", "pillow"] -test = ["pytest", "pathlib2", "pytest-rerunfailures", "pytest-mock"] +test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] From f3561b80841098edd3600cd9be295947a6257b83 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 08:22:27 -0500 Subject: [PATCH 0776/2998] pyproject: versioning tweaks --- pyproject.toml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 11994f4354..7b5d1180f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,9 +45,9 @@ colorama = ">=0.3.9" [tool.poetry.dev-dependencies] ### Docs ### sphinx = "*" -recommonmark = {version = "^0.6.0"} -alagitpull = {version = "~0.1.0"} -sphinx-issues = {version = "^1.2.0"} +recommonmark = "^0.6.0" +alagitpull = "~0.1.0" +sphinx-issues = "^1.2.0" aafigure = ">=0.6" pillow = "*" @@ -63,10 +63,7 @@ coverage = "*" ### Format ### black = {version="==21.6b0", python="^3.6.2"} -isort = [ - {version="<5", python="<3.6"}, - {version="*", python=">=3.6"} -] +isort = "*" ### Lint ### flake8 = "*" From 5e24ca8d4c615bb9691b51d95f9b779d1fd564f9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 08:49:11 -0500 Subject: [PATCH 0777/2998] ci: Update poetry lockfile --- poetry.lock | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9f18ef1fb1..c2008ffc80 100644 --- a/poetry.lock +++ b/poetry.lock @@ -294,7 +294,6 @@ version = "1.1.1" [[package]] category = "dev" description = "A Python utility / library to sort Python imports." -marker = "python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=3.6,<4.0" @@ -916,7 +915,7 @@ lint = [] test = [] [metadata] -content-hash = "ffe3fac2dabd09b836f435faaf4d59098247b51fe0149720de6bf46ea291f620" +content-hash = "5aba34057a2a996ec0bdbfd06f42893b8c2b72a13fb023936d0d68f53e00db31" lock-version = "1.0" python-versions = "^3.6" @@ -978,24 +977,36 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -1291,18 +1302,26 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, From 165c8d360b288e419b004d544c90cd1ab02a9190 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:00:28 -0500 Subject: [PATCH 0778/2998] docs: Update Makefile to python 3 --- docs/Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 6f47067bbc..17dc3d3017 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -2,7 +2,6 @@ # WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.].md\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null SHELL := /bin/bash -PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8031 # You can set these variables from the command line. @@ -169,10 +168,7 @@ serve: @echo 'docs server running at http://localhost:${HTTP_PORT}/' @echo @echo '==============================================================' - @if test ${PYVERSION} -eq 2; then $(MAKE) serve_py2; else make serve_py3; fi - -serve_py2: - pushd _build/html; python2 -m SimpleHTTPServer ${HTTP_PORT}; popd + @$(MAKE) serve_py3 serve_py3: python -m http.server ${HTTP_PORT} --directory _build/html From aec67159742ab9c141f3ee06a9b05cd049538e5c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:00:50 -0500 Subject: [PATCH 0779/2998] Docs: Check for md files --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 17dc3d3017..92bc4524fd 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,6 +1,6 @@ # Makefile for Sphinx documentation # -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.].md\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]\(rst\|md\)\$\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null SHELL := /bin/bash HTTP_PORT = 8031 From 68460047a639b09bae00c80ae36e64b25186aa79 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:13:27 -0500 Subject: [PATCH 0780/2998] chore: Add newline --- .github/workflows/publish-docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 259d71e855..863e17d86f 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -4,6 +4,7 @@ on: push: branches: - master + jobs: build: From aea34dfd4f6926005903c6897387e8f2d052295d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:39:57 -0500 Subject: [PATCH 0781/2998] packages: Add markdown parsing (myst_parser), remove recommonmark --- poetry.lock | 126 ++++++++++++++++++++++++++++++++++++------------- pyproject.toml | 5 +- 2 files changed, 96 insertions(+), 35 deletions(-) diff --git a/poetry.lock b/poetry.lock index c2008ffc80..f00f3ceb4b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -172,17 +172,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.4.4" -[[package]] -category = "dev" -description = "Python parser for the CommonMark Markdown spec" -name = "commonmark" -optional = false -python-versions = "*" -version = "0.9.1" - -[package.extras] -test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] - [[package]] category = "dev" description = "Code coverage measurement for Python" @@ -367,6 +356,29 @@ optional = false python-versions = "*" version = "0.9.0" +[[package]] +category = "dev" +description = "Python port of markdown-it. Markdown parsing, done right!" +name = "markdown-it-py" +optional = false +python-versions = "~=3.6" +version = "1.1.0" + +[package.dependencies] +attrs = ">=19,<22" + +[package.dependencies.typing-extensions] +python = "<3.8" +version = ">=3.7.4" + +[package.extras] +code_style = ["pre-commit (2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +rtd = ["myst-nb (0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] + [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -383,6 +395,22 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "Collection of plugins for markdown-it-py" +name = "mdit-py-plugins" +optional = false +python-versions = "~=3.6" +version = "0.2.8" + +[package.dependencies] +markdown-it-py = ">=1.0,<2.0" + +[package.extras] +code_style = ["pre-commit (2.6)"] +rtd = ["myst-parser (0.14.0a3)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] + [[package]] category = "dev" description = "Experimental type system extensions for programs checked with the mypy typechecker." @@ -392,6 +420,28 @@ optional = false python-versions = "*" version = "0.4.3" +[[package]] +category = "dev" +description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +name = "myst-parser" +optional = false +python-versions = ">=3.6" +version = "0.15.0" + +[package.dependencies] +docutils = ">=0.15,<0.18" +jinja2 = "*" +markdown-it-py = ">=1.0.0,<2.0.0" +mdit-py-plugins = ">=0.2.8,<0.3.0" +pyyaml = "*" +sphinx = ">=3,<5" + +[package.extras] +code_style = ["pre-commit (>=2.12,<3.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)"] +testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] + [[package]] category = "dev" description = "Core utilities for Python packages" @@ -605,19 +655,6 @@ six = "*" [package.extras] md = ["cmarkgfm (>=0.5.0,<0.6.0)"] -[[package]] -category = "dev" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -name = "recommonmark" -optional = false -python-versions = "*" -version = "0.6.0" - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - [[package]] category = "dev" description = "Alternative regular expression module, to replace re." @@ -728,6 +765,21 @@ docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +[[package]] +category = "dev" +description = "Type hints (PEP 484) support for the Sphinx autodoc extension" +name = "sphinx-autodoc-typehints" +optional = false +python-versions = ">=3.6" +version = "1.12.0" + +[package.dependencies] +Sphinx = ">=3.0" + +[package.extras] +test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"] +type_comments = ["typed-ast (>=1.4.0)"] + [[package]] category = "dev" description = "A Sphinx extension for linking to your project's issue tracker" @@ -915,7 +967,7 @@ lint = [] test = [] [metadata] -content-hash = "5aba34057a2a996ec0bdbfd06f42893b8c2b72a13fb023936d0d68f53e00db31" +content-hash = "a6016efed57089caf7829ace922fb60fc48930b36825834650bc22b7c36e62c1" lock-version = "1.0" python-versions = "^3.6" @@ -1028,10 +1080,6 @@ colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] coverage = [ {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, @@ -1151,6 +1199,10 @@ libtmux = [ {file = "libtmux-0.9.0-py3-none-any.whl", hash = "sha256:9684fa7c42e05275d0872b9d1f329b921211a107bc6cf98cb569b8f7f68a9096"}, {file = "libtmux-0.9.0.tar.gz", hash = "sha256:c42727cbbcd02403cffb79c8ba8ea4f95ff1bd8c9328612fea537acd25e5ae16"}, ] +markdown-it-py = [ + {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, + {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, +] markupsafe = [ {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, @@ -1191,10 +1243,18 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mdit-py-plugins = [ + {file = "mdit-py-plugins-0.2.8.tar.gz", hash = "sha256:5991cef645502e80a5388ec4fc20885d2313d4871e8b8e320ca2de14ac0c015f"}, + {file = "mdit_py_plugins-0.2.8-py3-none-any.whl", hash = "sha256:1833bf738e038e35d89cb3a07eb0d227ed647ce7dd357579b65343740c6d249c"}, +] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] +myst-parser = [ + {file = "myst-parser-0.15.0.tar.gz", hash = "sha256:3bddfbc8d8afb8dfbd4a6d4b626633585f2ef3480f2ac17eb0e771f96dd743ba"}, + {file = "myst_parser-0.15.0-py3-none-any.whl", hash = "sha256:dd9d5ab06bc7cd047f672785b44f2d172988e63452ef67dbefe0a9a38e6a4a41"}, +] packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, @@ -1330,10 +1390,6 @@ readme-renderer = [ {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] -recommonmark = [ - {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, - {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, -] regex = [ {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, @@ -1405,6 +1461,10 @@ sphinx = [ {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"}, ] +sphinx-autodoc-typehints = [ + {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, + {file = "sphinx_autodoc_typehints-1.12.0-py3-none-any.whl", hash = "sha256:5e81776ec422dd168d688ab60f034fccfafbcd94329e9537712c93003bddc04a"}, +] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, diff --git a/pyproject.toml b/pyproject.toml index 7b5d1180f7..ce8f168f65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,11 +45,12 @@ colorama = ">=0.3.9" [tool.poetry.dev-dependencies] ### Docs ### sphinx = "*" -recommonmark = "^0.6.0" alagitpull = "~0.1.0" sphinx-issues = "^1.2.0" aafigure = ">=0.6" pillow = "*" +sphinx-autodoc-typehints = "^1.12.0" +myst_parser = "^0.15.0" ### Testing ### pytest = "*" @@ -72,7 +73,7 @@ flake8 = "*" twine = "*" [tool.poetry.extras] -docs = ["sphinx", "recommonmark", "sphinx-issues", "alagitpull", "aafigure", "pillow"] +docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] From 2042a69820e2b060ab4eb14ddccb1d69131f5c4c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:40:21 -0500 Subject: [PATCH 0782/2998] docs: Only build and upload when files change (on master) --- .github/workflows/publish-docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 863e17d86f..8590b19354 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -18,6 +18,7 @@ jobs: run: | git config --global user.name 'travis-ci' git config --global user.email 'travis@nowhere.edu' + - name: Filter changed file paths to outputs uses: dorny/paths-filter@v2.7.0 id: changes @@ -32,9 +33,11 @@ jobs: - 'examples/**' python_files: - 'tmuxp/**' + - name: Should publish if: steps.changes.outputs.docs == 'true' || steps.changes.outputs.root_docs == 'true' || steps.changes.outputs.python_files == 'true' run: echo "PUBLISH=$(echo true)" >> $GITHUB_ENV + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: From 6978bd5b54eedd07569189c92d6d4b1aa4867a2a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:40:58 -0500 Subject: [PATCH 0783/2998] docs: Update to use myst_parser --- docs/conf.py | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index a05fcdbd6d..ce47d99e7f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,7 +4,6 @@ from os.path import dirname, relpath import alagitpull -from recommonmark.transform import AutoStructify import tmuxp @@ -30,7 +29,7 @@ 'aafig', 'alagitpull', 'sphinx_issues', - 'recommonmark', + 'myst_parser', ] issues_github_path = about['__github__'].replace('https://github.com/', '') @@ -41,22 +40,6 @@ master_doc = 'index' -# app setup hook -def setup(app): - app.add_config_value( - 'recommonmark_config', - { - #'url_resolver': lambda url: github_doc_root + url, - 'enable_auto_toc_tree': True, - 'auto_toc_tree_section': 'Contents', - 'auto_code_block': True, - 'enable_eval_rst': True, - }, - True, - ) - app.add_transform(AutoStructify) - - project = about['__title__'] copyright = about['__copyright__'] From 08a8d770146729032146ab653832b6e33ff08411 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 09:45:51 -0500 Subject: [PATCH 0784/2998] docs: Add autodoc_typehints --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index ce47d99e7f..4d5c06d55e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,6 +23,7 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', + 'sphinx_autodoc_typehints', 'sphinx.ext.todo', 'sphinx.ext.napoleon', 'sphinx.ext.linkcode', From 314e34c1358f7ac543cfc520b2b6f23c98451f28 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 10:25:48 -0500 Subject: [PATCH 0785/2998] docs: Convert README to markdown pandoc 2.14, prettier 2.3.1, myst-parser 0.15.0 pandoc --from rst --to gfm README.rst --markdown-headings=atx | \ sed s/"<"/"\("/g | sed s/">"/"\)"/g | \ sed s/"- "/"- "/g > tmp; mv tmp README.md prettier --parser=markdown -w README.md Inside of docs/index.md: ```{include} ../README.md ``` --- README.md | 251 +++++++++++++++++++++++++++++++++++++++++ README.rst | 297 ------------------------------------------------- pyproject.toml | 2 +- 3 files changed, 252 insertions(+), 298 deletions(-) create mode 100644 README.md delete mode 100644 README.rst diff --git a/README.md b/README.md new file mode 100644 index 0000000000..bd3bd738db --- /dev/null +++ b/README.md @@ -0,0 +1,251 @@ +tmuxp, tmux session manager. built on +[libtmux](https://github.com/tmux-python/libtmux). + +[![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](http://badge.fury.io/py/tmuxp) +[![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22Publish+Docs%22) +[![Build status](https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22tests%22) +[![Code Coverage](https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg)](https://codecov.io/gh/tmux-python/tmuxp) +![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg) + +**We need help!** tmuxp is a trusted session manager for tmux. If you +could lend your time to helping answer issues and QA pull requests, +please do! See [issue +#290](https://github.com/tmux-python/tmuxp/issues/290)! + +**New to tmux?** [The Tao of tmux](https://leanpub.com/the-tao-of-tmux) +is available on Leanpub and [Amazon Kindle](http://amzn.to/2gPfRhC). +Read and browse the book for free [on the +web](https://leanpub.com/the-tao-of-tmux/read). + +# Installation + +## Pip + +```shell +$ pip install --user tmuxp +``` + +## Homebrew + +```shell +$ brew install tmuxp +``` + +# Load a tmux session + +Load tmux sessions via json and YAML, +[tmuxinator](https://github.com/aziz/tmuxinator) and +[teamocil](https://github.com/remiprev/teamocil) style. + +```yaml +session_name: 4-pane-split +windows: + - window_name: dev window + layout: tiled + shell_command_before: + - cd ~/ # run as a first command in all panes + panes: + - shell_command: # pane no. 1 + - cd /var/log # run multiple commands in this pane + - ls -al | grep \.log + - echo second pane # pane no. 2 + - echo third pane # pane no. 3 + - echo forth pane # pane no. 4 +``` + +Save as _mysession.yaml_, and load: + +```sh +$ tmuxp load ./mysession.yaml +``` + +Projects with _.tmuxp.yaml_ or _.tmuxp.json_ load via directory: + +```sh +$ tmuxp load path/to/my/project/ +``` + +Load multiple at once (in bg, offer to attach last): + +```sh +$ tmuxp load mysession ./another/project/ +``` + +Name a session: + +```bash +$ tmxup load -s session_name ./mysession.yaml +``` + +[simple](http://tmuxp.git-pull.com/examples.html#short-hand-inline) and +[very +elaborate](http://tmuxp.git-pull.com/examples.html#super-advanced-dev-environment) +config examples + +# User-level configurations + +tmuxp checks for configs in user directories: + +- `$TMUXP_CONFIGDIR`, if set +- `$XDG_CONFIG_HOME`, usually _$HOME/.config/tmuxp/_ +- `$HOME/.tmuxp/` + +Load your tmuxp config from anywhere by using the filename, assuming +_\~/.config/tmuxp/mysession.yaml_ (or _.json_): + +```sh +$ tmuxp load mysession +``` + +See [author's tmuxp configs](https://github.com/tony/tmuxp-config) and +the projects' +[tmuxp.yaml](https://github.com/tmux-python/tmuxp/blob/master/.tmuxp.yaml). + +# Shell + +_New in 1.6.0_: + +`tmuxp shell` launches into a python console preloaded with the attached +server, session, and window in +[libtmux](https://github.com/tmux-python/libtmux) objects. + +```shell +$ tmuxp shell + +(Pdb) server + +(Pdb) server.sessions +[Session($1 your_project)] +(Pdb) session +Session($1 your_project) +(Pdb) session.name +'your_project' +(Pdb) window +Window(@3 1:your_window, Session($1 your_project)) +(Pdb) window.name +'your_window' +(Pdb) window.panes +[Pane(%6 Window(@3 1:your_window, Session($1 your_project))) +(Pdb) pane +Pane(%6 Window(@3 1:your_window, Session($1 your_project)) +``` + +Python 3.7+ supports [PEP +553](https://www.python.org/dev/peps/pep-0553/) `breakpoint()` +(including `PYTHONBREAKPOINT`). Also supports direct commands via `-c`: + +```shell +$ tmuxp shell -c 'print(window.name)' +my_window + +$ tmuxp shell -c 'print(window.name.upper())' +MY_WINDOW +``` + +Read more on [tmuxp shell](https://tmuxp.git-pull.com/cli.html#shell) in +the CLI docs. + +# Pre-load hook + +Run custom startup scripts (such as installing project dependencies +before loading tmux. See the +[bootstrap_env.py](https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py) +and +[before_script](http://tmuxp.git-pull.com/examples.html#bootstrap-project-before-launch) +example + +# Load in detached state + +You can also load sessions in the background by passing `-d` flag + +# Screenshot + +image + +# Freeze a tmux session + +Snapshot your tmux layout, pane paths, and window/session names. + +```sh +$ tmuxp freeze session-name +``` + +See more about [freezing +tmux](http://tmuxp.git-pull.com/cli.html#freeze-sessions) sessions. + +# Convert a session file + +Convert a session file from yaml to json and vice versa. + +```sh +$ tmuxp convert filename +``` + +This will prompt you for confirmation and shows you the new file that is +going to be written. + +You can auto confirm the prompt. In this case no preview will be shown. + +```sh +$ tmuxp convert -y filename +$ tmuxp convert --yes filename +``` + +# Plugin System + +tmuxp has a plugin system to allow for custom behavior. See more about +the [Plugin System](http://tmuxp.git-pull.com/plugin_system.html). + +# Debugging Helpers + +The `load` command provides a way to log output to a log file for +debugging purposes. + +```sh +$ tmuxp load --log-file . +``` + +Collect system info to submit with a Github issue: + +```sh +$ tmuxp debug-info +------------------ +environment: + system: Linux + arch: x86_64 + +# ... so on +``` + +# Docs / Reading material + +See the [Quickstart](http://tmuxp.git-pull.com/quickstart.html). + +[Documentation](http://tmuxp.git-pull.com) homepage (also in +[中文](http://tmuxp-zh.rtfd.org/)) + +Want to learn more about tmux itself? [Read The Tao of Tmux +online](http://tmuxp.git-pull.com/about_tmux.html). + +# Donations + +Your donations fund development of new features, testing and support. +Your money will go directly to maintenance and development of the +project. If you are an individual, feel free to give whatever feels +right for the value you get out of the project. + +See donation options at . + +# Project details + +- tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 +- python support: >= 3.6, pypy, pypy3 +- Source: +- Docs: +- API: +- Changelog: +- Issues: +- Test Coverage: +- pypi: +- Open Hub: +- License: [MIT](http://opensource.org/licenses/MIT). diff --git a/README.rst b/README.rst deleted file mode 100644 index 0c40eca72e..0000000000 --- a/README.rst +++ /dev/null @@ -1,297 +0,0 @@ -tmuxp, tmux session manager. built on `libtmux`_. - -|pypi| |docs| |build-status| |coverage| |license| - -**We need help!** tmuxp is a trusted session manager for tmux. If you -could lend your time to helping answer issues and QA pull requests, please -do! See `issue #290 `__! - -**New to tmux?** `The Tao of tmux `_ is -available on Leanpub and `Amazon Kindle`_. Read and browse the book for free -`on the web`_. - -Installation ------------- - -Pip -^^^ - -.. code-block:: shell - - $ pip install --user tmuxp - -Homebrew -^^^^^^^^ - -.. code-block:: shell - - $ brew install tmuxp - -Load a tmux session -------------------- - -Load tmux sessions via json and YAML, `tmuxinator`_ and -`teamocil`_ style. - -.. code-block:: yaml - - session_name: 4-pane-split - windows: - - window_name: dev window - layout: tiled - shell_command_before: - - cd ~/ # run as a first command in all panes - panes: - - shell_command: # pane no. 1 - - cd /var/log # run multiple commands in this pane - - ls -al | grep \.log - - echo second pane # pane no. 2 - - echo third pane # pane no. 3 - - echo forth pane # pane no. 4 - -Save as *mysession.yaml*, and load: - -.. code-block:: sh - - $ tmuxp load ./mysession.yaml - -Projects with *.tmuxp.yaml* or *.tmuxp.json* load via directory: - -.. code-block:: sh - - $ tmuxp load path/to/my/project/ - -Load multiple at once (in bg, offer to attach last): - -.. code-block:: sh - - $ tmuxp load mysession ./another/project/ - -Name a session: - -.. code-block:: bash - - $ tmxup load -s session_name ./mysession.yaml - -`simple`_ and `very elaborate`_ config examples - -User-level configurations -------------------------- -tmuxp checks for configs in user directories: - -- ``$TMUXP_CONFIGDIR``, if set -- ``$XDG_CONFIG_HOME``, usually *$HOME/.config/tmuxp/* -- ``$HOME/.tmuxp/`` - -Load your tmuxp config from anywhere by using the filename, assuming -*~/.config/tmuxp/mysession.yaml* (or *.json*): - -.. code-block:: sh - - $ tmuxp load mysession - -See `author's tmuxp configs`_ and the projects' `tmuxp.yaml`_. - -Shell ------ -*New in 1.6.0*: - -``tmuxp shell`` launches into a python console preloaded with the attached server, -session, and window in `libtmux`_ objects. - -.. code-block:: shell - - $ tmuxp shell - - (Pdb) server - - (Pdb) server.sessions - [Session($1 your_project)] - (Pdb) session - Session($1 your_project) - (Pdb) session.name - 'your_project' - (Pdb) window - Window(@3 1:your_window, Session($1 your_project)) - (Pdb) window.name - 'your_window' - (Pdb) window.panes - [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) - (Pdb) pane - Pane(%6 Window(@3 1:your_window, Session($1 your_project)) - -Python 3.7+ supports `PEP 553`_ ``breakpoint()`` (including -``PYTHONBREAKPOINT``). Also supports direct commands via ``-c``: - -.. code-block:: shell - - $ tmuxp shell -c 'print(window.name)' - my_window - - $ tmuxp shell -c 'print(window.name.upper())' - MY_WINDOW - -Read more on `tmuxp shell`_ in the CLI docs. - -.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ -.. _tmuxp shell: https://tmuxp.git-pull.com/cli.html#shell - -Pre-load hook -------------- -Run custom startup scripts (such as installing project dependencies before -loading tmux. See the `bootstrap_env.py`_ and `before_script`_ example - -Load in detached state ----------------------- -You can also load sessions in the background by passing ``-d`` flag - -Screenshot ----------- - -.. image:: https://raw.githubusercontent.com/tmux-python/tmuxp/master/docs/_static/tmuxp-demo.gif - :scale: 100% - :width: 45% - :align: center - - -Freeze a tmux session ---------------------- - -Snapshot your tmux layout, pane paths, and window/session names. - -.. code-block:: sh - - $ tmuxp freeze session-name - -See more about `freezing tmux`_ sessions. - -Convert a session file ----------------------- - -Convert a session file from yaml to json and vice versa. - -.. code-block:: sh - - $ tmuxp convert filename - -This will prompt you for confirmation and shows you the new file that is going -to be written. - - -You can auto confirm the prompt. In this case no preview will be shown. - -.. code-block:: sh - - $ tmuxp convert -y filename - $ tmuxp convert --yes filename - -Plugin System -------------- - -tmuxp has a plugin system to allow for custom behavior. See more about the -`Plugin System`_. - -Debugging Helpers ------------------ - -The ``load`` command provides a way to log output to a log file for debugging -purposes. - -.. code-block:: sh - - $ tmuxp load --log-file . - -Collect system info to submit with a Github issue: - -.. code-block:: sh - - $ tmuxp debug-info - ------------------ - environment: - system: Linux - arch: x86_64 - - # ... so on - - -Docs / Reading material ------------------------ - -See the `Quickstart`_. - -`Documentation`_ homepage (also in `中文`_) - -Want to learn more about tmux itself? `Read The Tao of Tmux online`_. - -.. _Documentation: http://tmuxp.git-pull.com -.. _Source: https://github.com/tmux-python/tmuxp -.. _中文: http://tmuxp-zh.rtfd.org/ -.. _before_script: http://tmuxp.git-pull.com/examples.html#bootstrap-project-before-launch -.. _virtualenv: https://virtualenv.git-pull.com/ -.. _Read The Tao of tmux online: http://tmuxp.git-pull.com/about_tmux.html -.. _author's tmuxp configs: https://github.com/tony/tmuxp-config -.. _python library: https://tmuxp.git-pull.com/api.html -.. _python API quickstart: https://tmuxp.git-pull.com/quickstart_python.html -.. _tmux(1): http://tmux.sourceforge.net/ -.. _tmuxinator: https://github.com/aziz/tmuxinator -.. _teamocil: https://github.com/remiprev/teamocil -.. _Examples: http://tmuxp.git-pull.com/examples.html -.. _freezing tmux: http://tmuxp.git-pull.com/cli.html#freeze-sessions -.. _Plugin System: http://tmuxp.git-pull.com/plugin_system.html -.. _bootstrap_env.py: https://github.com/tmux-python/tmuxp/blob/master/bootstrap_env.py -.. _testing: http://tmuxp.git-pull.com/developing.html#test-runner -.. _python objects: http://tmuxp.git-pull.com/api.html#api -.. _tmuxp.yaml: https://github.com/tmux-python/tmuxp/blob/master/.tmuxp.yaml -.. _simple: http://tmuxp.git-pull.com/examples.html#short-hand-inline -.. _very elaborate: http://tmuxp.git-pull.com/examples.html#super-advanced-dev-environment -.. _Quickstart: http://tmuxp.git-pull.com/quickstart.html -.. _Commands: http://tmuxp.git-pull.com/cli.html -.. _libtmux: https://github.com/tmux-python/libtmux -.. _on the web: https://leanpub.com/the-tao-of-tmux/read - -Donations ---------- - -Your donations fund development of new features, testing and support. -Your money will go directly to maintenance and development of the project. -If you are an individual, feel free to give whatever feels right for the -value you get out of the project. - -See donation options at https://git-pull.com/support.html. - -Project details ---------------- -- tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 -- python support: >= 3.6, pypy, pypy3 -- Source: https://github.com/tmux-python/tmuxp -- Docs: https://tmuxp.git-pull.com -- API: https://tmuxp.git-pull.com/api.html -- Changelog: https://tmuxp.git-pull.com/history.html -- Issues: https://github.com/tmux-python/tmuxp/issues -- Test Coverage: https://codecov.io/gh/tmux-python/tmuxp -- pypi: https://pypi.python.org/pypi/tmuxp -- Open Hub: https://www.openhub.net/p/tmuxp-python -- License: `MIT`_. - -.. _MIT: http://opensource.org/licenses/MIT -.. _developing and testing: http://tmuxp.git-pull.com/developing.html -.. _Amazon Kindle: http://amzn.to/2gPfRhC - -.. |pypi| image:: https://img.shields.io/pypi/v/tmuxp.svg - :alt: Python Package - :target: http://badge.fury.io/py/tmuxp - -.. |docs| image:: https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg - :alt: Docs - :target: https://github.com/tmux-python/tmuxp/actions?query=workflow%3A"Publish+Docs" - -.. |build-status| image:: https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg - :alt: Build status - :target: https://github.com/tmux-python/tmuxp/actions?query=workflow%3A"tests" - -.. |coverage| image:: https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg - :alt: Code Coverage - :target: https://codecov.io/gh/tmux-python/tmuxp - -.. |license| image:: https://img.shields.io/github/license/tmux-python/tmuxp.svg - :alt: License diff --git a/pyproject.toml b/pyproject.toml index ce8f168f65..82746ce7f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ classifiers = [ ] keywords = ["tmux", "session manager", "terminal", "ncurses"] homepage = "http://github.com/tmux-python/tmuxp/" -readme = "README.rst" +readme = "README.md" [tool.poetry.urls] "Bug Tracker" = "https://github.com/tmux-python/tmuxp/issues" From 27de41b7064d1ba70586f9577706af673be6c0b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 10:34:14 -0500 Subject: [PATCH 0786/2998] docs: docs/index to use markdown --- docs/index.md | 33 +++++++++++++++++++++++++++++++++ docs/index.rst | 36 ------------------------------------ 2 files changed, 33 insertions(+), 36 deletions(-) create mode 100644 docs/index.md delete mode 100644 docs/index.rst diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..0913e88cf0 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,33 @@ +(index)= + +# tmuxp + +## tmux session manager + +```{include} ../README.md +``` + +```{image} _static/tmuxp-demo.gif +:width: 100% + +``` + +### Table of Contents + +```{toctree} +:maxdepth: 2 + +about +quickstart +examples +cli +plugin_system +developing +api +history +about_tmux +glossary + +``` + + diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 6f1a1919c3..0000000000 --- a/docs/index.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _index: - -##### -tmuxp -##### -==================== -tmux session manager -==================== - -.. include:: ../README.rst - :start-line: 2 - :end-before: .. image - -.. image:: _static/tmuxp-demo.gif - :width: 100% - -Freeze a tmux session ---------------------- -.. include:: ../README.rst - :start-after: --------------------- - -Table of Contents ------------------ -.. toctree:: - :maxdepth: 2 - - about - quickstart - examples - cli - plugin_system - developing - api - history - about_tmux - glossary From ec8d716987bb3abce677c2c22e8817bd2b3cf800 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 10:35:43 -0500 Subject: [PATCH 0787/2998] manual/readme: To markdown, also update git repo --- manual/README.md | 26 ++++++++++++++++++++++++++ manual/README.rst | 26 -------------------------- 2 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 manual/README.md delete mode 100644 manual/README.rst diff --git a/manual/README.md b/manual/README.md new file mode 100644 index 0000000000..c7788c0f8b --- /dev/null +++ b/manual/README.md @@ -0,0 +1,26 @@ +For studying the differences between prior tmux versions to check +compatibility with legacy versions. + +Get source: + +```bash +$ git clone https://github.com/tmux/tmux +$ cd tmux +``` + +Converted with: + +```bash +$ git checkout +$ ./configure +$ make +$ groff -t -e -mandoc -Tascii tmux.1 | col -bx > manpage.txt +``` + +repeat for versions. + +Create a git-diff style diff of version manuals: + +```bash +$ diff -u 1.6 1.8 > 1_6__1_8.diff +``` diff --git a/manual/README.rst b/manual/README.rst deleted file mode 100644 index 161af64ca2..0000000000 --- a/manual/README.rst +++ /dev/null @@ -1,26 +0,0 @@ -For studying the differences between prior tmux versions to check -compatibility with legacy versions. - -Get source: - -.. code-block:: bash - - $ git clone git://git.code.sf.net/p/tmux/tmux-code tmux-tmux-code tmux - $ cd tmux - -Converted with: - -.. code-block:: bash - - $ git checkout - $ ./configure - $ make - $ groff -t -e -mandoc -Tascii tmux.1 | col -bx > manpage.txt - -repeat for versions. - -Create a git-diff style diff of version manuals: - -.. code-block:: bash - - $ diff -u 1.6 1.8 > 1_6__1_8.diff From 2faf5607870f7baf4b7bd471c2c647384a7bb03c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 10:36:31 -0500 Subject: [PATCH 0788/2998] setup.py, Manual: Update for readme.md --- MANIFEST.in | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index abc5eab53a..286f82ec1d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml +include README.md LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt recursive-include docs *.rst recursive-include tests *.py *.yaml *.json *.sh diff --git a/setup.py b/setup.py index 4ffdbf0a44..b8c70ccab3 100644 --- a/setup.py +++ b/setup.py @@ -14,9 +14,9 @@ tests_reqs = [line for line in f.read().split('\n') if line] if sys.version_info[0] > 2: - readme = open('README.rst', encoding='utf-8').read() + readme = open('README.md', encoding='utf-8').read() else: - readme = open('README.rst').read() + readme = open('README.md').read() history = open('CHANGES').read().replace('.. :changelog:', '') From 3cdc9b06103323e08161316131980a836002f3e7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 11:57:00 -0500 Subject: [PATCH 0789/2998] To markdown --- CHANGES | 1545 ++++++++++++------------ MANIFEST.in | 2 +- docs/about.md | 119 ++ docs/about.rst | 115 -- docs/{about_tmux.rst => about_tmux.md} | 467 ++++--- docs/{api.rst => api.md} | 107 +- docs/cli.md | 279 +++++ docs/cli.rst | 264 ---- docs/conf.py | 2 + docs/developing.md | 293 +++++ docs/developing.rst | 254 ---- docs/examples.md | 537 ++++++++ docs/examples.rst | 486 -------- docs/{glossary.rst => glossary.md} | 15 +- docs/history.md | 12 + docs/history.rst | 10 - docs/plugin_system.md | 149 +++ docs/plugin_system.rst | 131 -- docs/quickstart.md | 133 ++ docs/quickstart.rst | 112 -- 20 files changed, 2654 insertions(+), 2378 deletions(-) create mode 100644 docs/about.md delete mode 100644 docs/about.rst rename docs/{about_tmux.rst => about_tmux.md} (70%) rename docs/{api.rst => api.md} (60%) create mode 100644 docs/cli.md delete mode 100644 docs/cli.rst create mode 100644 docs/developing.md delete mode 100644 docs/developing.rst create mode 100644 docs/examples.md delete mode 100644 docs/examples.rst rename docs/{glossary.rst => glossary.md} (93%) create mode 100644 docs/history.md delete mode 100644 docs/history.rst create mode 100644 docs/plugin_system.md delete mode 100644 docs/plugin_system.rst create mode 100644 docs/quickstart.md delete mode 100644 docs/quickstart.rst diff --git a/CHANGES b/CHANGES index da129e4b95..6ee081c17a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,59 +1,55 @@ -========= -Changelog -========= +# Changelog -Here you can find the recent changes to tmuxp +## current -current -------- -- *Insert changes/features/fixes for next release here* +- _Insert changes/features/fixes for next release here_ -tmuxp 1.8.2 (2021-06-15) ------------------------- -- :issue:`474` Re-release with ``python setup.py sdist bdist_wheel`` to +## tmuxp 1.8.2 (2021-06-15) + +- {issue}`474` Re-release with `python setup.py sdist bdist_wheel` to fix missing test files -tmuxp 1.8.1 (2021-06-14) ------------------------- -- :issue:`681` Bump version to make homebrew release easier +## tmuxp 1.8.1 (2021-06-14) + +- {issue}`681` Bump version to make homebrew release easier + +## tmuxp 1.8.0.post0 (2021-06-14) -tmuxp 1.8.0.post0 (2021-06-14) ------------------------------- -- :issue:`681` tmuxp is now available on homebrew! Thank you @jvcarli! +- {issue}`681` tmuxp is now available on homebrew! Thank you @jvcarli! -tmuxp 1.8.0 (2021-06-14) ------------------------- -- :issue:`662` CI: Only update docs when changed -- :issue:`666` CI: Move test plugin packages from pyproject.toml to - pytest fixtures. Fixes :issue:`658` -- :issue:`661` +## tmuxp 1.8.0 (2021-06-14) + +- {issue}`662` CI: Only update docs when changed +- {issue}`666` CI: Move test plugin packages from pyproject.toml to + pytest fixtures. Fixes {issue}`658` +- {issue}`661` - Bump minimum version 3.5 -> 3.6 - Drop python 2.7 support - - Modernize syntax (remove ``__future__`` and modesets) + - Modernize syntax (remove `__future__` and modesets) - Update black to 21.6b0 -tmuxp 1.7.2 (2021-02-03) ------------------------- -- :issue:`666` CI: Move test plugin packages from pyproject.toml to - pytest fixtures. Fixes :issue:`658` +## tmuxp 1.7.2 (2021-02-03) + +- {issue}`666` CI: Move test plugin packages from pyproject.toml to + pytest fixtures. Fixes {issue}`658` -tmuxp 1.7.1 (2021-02-03) ------------------------- -- :issue:`665` Support for passing tmux config file (``-f``), thanks - @jfindlay! Fixes :issue:`654` +## tmuxp 1.7.1 (2021-02-03) -tmuxp 1.6.5 (2021-02-03) ------------------------- -- :issue:`665` Support for passing tmux config file (``-f``), thanks @jfindlay! Fixes - :issue:`654` +- {issue}`665` Support for passing tmux config file (`-f`), thanks + @jfindlay! Fixes {issue}`654` + +## tmuxp 1.6.5 (2021-02-03) + +- {issue}`665` Support for passing tmux config file (`-f`), thanks @jfindlay! Fixes + {issue}`654` + +## tmuxp 1.7.0 (2021-01-09) -tmuxp 1.7.0 (2021-01-09) ------------------------- This will be the last Python 2.7 release of tmuxp. Bug fixes for python -2.7 will live in the `1.7.x branch`_. +2.7 will live in the [1.7.x branch][1.7.x branch]. -- :issue:`530` New feature: Plugin system +- {issue}`530` New feature: Plugin system - Add plugin system for user customization of tmuxp - Add tests for the plugin system @@ -62,37 +58,40 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python - Add in depth documentation for the plugin system Thank you @joseph-flinn! -- :issue:`656` New feature: Ability to append windows to a session - ``tmuxp load -a configfile`` will append a configuration to your current +- {issue}`656` New feature: Ability to append windows to a session + + `tmuxp load -a configfile` will append a configuration to your current tmux session. Thank you @will-ockmore! -- :issue:`647` Improvement: Logging to file: - ``tmuxp load --log-level outputfile.log`` -- :issue:`643` New command: Debug information +- {issue}`647` Improvement: Logging to file: + + `tmuxp load --log-level outputfile.log` - Port ``tmuxp debug-info`` from via v1.6.2 +- {issue}`643` New command: Debug information -.. _1.7.x branch: https://github.com/tmux-python/tmuxp/tree/v1.7.x + Port `tmuxp debug-info` from via v1.6.2 + +[1.7.x branch]: https://github.com/tmux-python/tmuxp/tree/v1.7.x + +## tmuxp 1.7.0a4 (2021-01-06) -tmuxp 1.7.0a4 (2021-01-06) --------------------------- - Port click package fix from 1.6.4 -tmuxp 1.7.0a3 (2020-11-22) --------------------------- -- Port ``tmuxp load --log-level outputfile.log`` from +## tmuxp 1.7.0a3 (2020-11-22) + +- Port `tmuxp load --log-level outputfile.log` from 1.6.3 -tmuxp 1.7.0a2 (2020-11-08) --------------------------- -- Port ``tmuxp debug-info`` from :issue:`643` from via v1.6.2 +## tmuxp 1.7.0a2 (2020-11-08) + +- Port `tmuxp debug-info` from {issue}`643` from via v1.6.2 + +## tmuxp 1.7.0a1 (2020-11-07) -tmuxp 1.7.0a1 (2020-11-07) --------------------------- -- :issue:`530` Plugin system +- {issue}`530` Plugin system - Add plugin system for user customization of tmuxp - Add tests for the plugin system @@ -102,223 +101,231 @@ tmuxp 1.7.0a1 (2020-11-07) Thank you @joseph-flinn! -tmuxp 1.6.4 (2021-01-06) ------------------------- -- :issue:`651` Fix packaging issue with click, thanks @dougharris! Fixes - :issue:`649` +## tmuxp 1.6.4 (2021-01-06) -tmuxp 1.6.3 (2020-11-22) ------------------------- -- :issue:`647` Adding option to dump `load` output to log file, thank you +- {issue}`651` Fix packaging issue with click, thanks @dougharris! Fixes + {issue}`649` + +## tmuxp 1.6.3 (2020-11-22) + +- {issue}`647` Adding option to dump {}`load` output to log file, thank you @joseph-flinn! - ``tmuxp load file.yaml --log-file yourfile.txt`` + `tmuxp load file.yaml --log-file yourfile.txt` Adjust log levels: - ``tmuxp --log-level DEBUG load file.yaml --log-file yourfile.txt`` + `tmuxp --log-level DEBUG load file.yaml --log-file yourfile.txt` + +## tmuxp 1.6.2 (2020-11-08) -tmuxp 1.6.2 (2020-11-08) ------------------------- -- :issue:`643` New command ``tmuxp debug-info`` for creating github - issues, fixes :issue:`352`. Thank you @joseph-flinn! +- {issue}`643` New command `tmuxp debug-info` for creating github + issues, fixes {issue}`352`. Thank you @joseph-flinn! -.. _v1.6.1: +(v1-6-1)= -tmuxp 1.6.1 (2020-11-07) ------------------------- -- :issue:`641` Improvements to ``shell`` +## tmuxp 1.6.1 (2020-11-07) - Thanks `django-extensions`_ (licensed MIT) for the shell detection abstraction. +- {issue}`641` Improvements to `shell` - - Deprecate ``shell_plus`` - - ``tmuxp shell`` now detects the best shell available by default - - Python 3.7+ with ``PYTHONBREAKPOINT`` set in env will drop into ``pdb`` by + Thanks [django-extensions][django-extensions] (licensed MIT) for the shell detection abstraction. + + - Deprecate `shell_plus` + - `tmuxp shell` now detects the best shell available by default + - Python 3.7+ with `PYTHONBREAKPOINT` set in env will drop into `pdb` by default - - Drop into ``code.interact`` by default instead of ``pdb`` if no third + - Drop into `code.interact` by default instead of `pdb` if no third party shells found - New options, override: - - ``--pdb``: Use plain old ``breakpoint()`` (python 3.7+) or - ``pdb.set_trace`` - - ``--code``: Drop into ``code.interact``, accepts ``--use-pythonrc`` - - ``--bpython``: Drop into `bpython`_ - - ``--ipython``: Drop into `ipython`_ - - ``--ptpython``: Drop into `ptpython`_, accepts ``--use-vi-mode`` - - ``--ptipython``: Drop into `ipython`_ + `ptpython`_, accepts - ``--use-vi-mode`` + - `--pdb`: Use plain old `breakpoint()` (python 3.7+) or + `pdb.set_trace` + - `--code`: Drop into `code.interact`, accepts `--use-pythonrc` + - `--bpython`: Drop into [bpython][bpython] + - `--ipython`: Drop into [ipython][ipython] + - `--ptpython`: Drop into [ptpython][ptpython], accepts `--use-vi-mode` + - `--ptipython`: Drop into [ipython][ipython] + [ptpython][ptpython], accepts + `--use-vi-mode` + +[django-extensions]: https://github.com/django-extensions/django-extensions -.. _django-extensions: https://github.com/django-extensions/django-extensions +## tmuxp 1.6.0 (2020-11-06) -tmuxp 1.6.0 (2020-11-06) ------------------------- -- :issue:`636` + :issue:`638` New command: ``tmuxp shell`` +- {issue}`636` + {issue}`638` New command: `tmuxp shell` - Automatically preloads session, window, and pane via `libtmux`_ - :ref:`API objects ` and makes them available in a python + Automatically preloads session, window, and pane via [libtmux][libtmux] + {ref}`API objects ` and makes them available in a python console. - .. image:: _static/tmuxp-shell.gif - :width: 100% + ```{image} _static/tmuxp-shell.gif + :width: 100% - As of :ref:`1.6.1 (above) `, ``tmuxp shell`` will find the most - feature-rich shell available. If you have `ipython`_, `ptpython`_, or - `bpython`_ available, it will be selected automatically. Pass ``--pdb`` - to use standard library pdb, or ``--code`` to use ``code.interact``. + ``` - In python 3.7+, supports ``PYTHONBREAKPOINT``: + As of {ref}`1.6.1 (above) `, `tmuxp shell` will find the most + feature-rich shell available. If you have [ipython][ipython], [ptpython][ptpython], or + [bpython][bpython] available, it will be selected automatically. Pass `--pdb` + to use standard library pdb, or `--code` to use `code.interact`. - .. code-block:: sh + In python 3.7+, supports `PYTHONBREAKPOINT`: - $ pip install ipdb - $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell + ```{code-block} sh - You can execute python directly via ``-c``: + $ pip install ipdb + $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell - .. code-block:: sh + ``` - $ tmuxp shell -c 'print(session.name); print(window.name)' - my_server - my_window + You can execute python directly via `-c`: - $ tmuxp shell my_server -c 'print(session.name); print(window.name)' - my_server - my_window + ```{code-block} sh - $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' - my_server - my_window + $ tmuxp shell -c 'print(session.name); print(window.name)' + my_server + my_window - $ tmuxp shell my_server my_window -c 'print(window.name.upper())' - MY_WINDOW + $ tmuxp shell my_server -c 'print(session.name); print(window.name)' + my_server + my_window -.. _bpython: https://bpython-interpreter.org/ -.. _ipython: https://ipython.org/ -.. _ptpython: https://github.com/prompt-toolkit/ptpython + $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' + my_server + my_window -tmuxp 1.5.8 (2020-10-31) ------------------------- -- :issue:`639` Passes start_directory through to new tmux session - Fixes :issue:`631`, thank you @joseph-flinn! + $ tmuxp shell my_server my_window -c 'print(window.name.upper())' + MY_WINDOW -tmuxp 1.5.7 (2020-10-31) ------------------------- -- :issue:`637` Support for loading directories with periods in it + ``` - ``tmuxp load ~/work/your.project`` will now work +[bpython]: https://bpython-interpreter.org/ +[ipython]: https://ipython.org/ +[ptpython]: https://github.com/prompt-toolkit/ptpython - Earlier workaround was to do ``tmuxp load ~/work/your.project/.tmuxp.yaml`` +## tmuxp 1.5.8 (2020-10-31) - Fixes :issue:`212` and :issue:`201` +- {issue}`639` Passes start_directory through to new tmux session + Fixes {issue}`631`, thank you @joseph-flinn! -tmuxp 1.5.6 (2020-10-12) ------------------------- -- :issue:`618`: allow passing ``--overwrite`` to ``tmuxp freeze``. Thank you +## tmuxp 1.5.7 (2020-10-31) + +- {issue}`637` Support for loading directories with periods in it + + `tmuxp load ~/work/your.project` will now work + + Earlier workaround was to do `tmuxp load ~/work/your.project/.tmuxp.yaml` + + Fixes {issue}`212` and {issue}`201` + +## tmuxp 1.5.6 (2020-10-12) + +- {issue}`618`: allow passing `--overwrite` to `tmuxp freeze`. Thank you @betoSolares! -- :issue:`589` added option for the the confirm command to auto-confirm the prompt. +- {issue}`589` added option for the the confirm command to auto-confirm the prompt. Thank you @aRkedos! -- :issue:`626` Add new session name option to cli. Thank you @joseph-flinn! -- :issue:`626` Add test for new session name option -- :issue:`626` Update docs for new session name option -- :issue:`623` Move docs from RTD to self-serve site -- :issue:`623` Modernize Makefiles -- :issue:`623` New development docs -- :issue:`623` Move doc -> docs -- :issue:`623` Move tests to GitHub Actions -- :issue:`623` Update pyproject.toml to experiment with poetry packaging -- :issue:`619` isort 5 -- :issue:`629` Update black from 19.10b0 to 20.08b1 - -tmuxp 1.5.5 (2020-07-26) ------------------------- -- :issue:`616` (via: :issue:`599`) New command: ``tmuxp ls`` - +- {issue}`626` Add new session name option to cli. Thank you @joseph-flinn! +- {issue}`626` Add test for new session name option +- {issue}`626` Update docs for new session name option +- {issue}`623` Move docs from RTD to self-serve site +- {issue}`623` Modernize Makefiles +- {issue}`623` New development docs +- {issue}`623` Move doc -> docs +- {issue}`623` Move tests to GitHub Actions +- {issue}`623` Update pyproject.toml to experiment with poetry packaging +- {issue}`619` isort 5 +- {issue}`629` Update black from 19.10b0 to 20.08b1 + +## tmuxp 1.5.5 (2020-07-26) + +- {issue}`616` (via: {issue}`599`) New command: `tmuxp ls` + List commands available via config directory. If the config is printed, - it's loadable via ``tmuxp load configfilename`` without needing to type the + it's loadable via `tmuxp load configfilename` without needing to type the full filepath. Thank you @pythops! -- :issue:`480` Fix typo, thanks @jstoja -- :issue:`578` Fix typo, thanks @mauroporras -- :issue:`519` Fix typo, thanks @timgates42 -- :issue:`506` Fix Makefile typo, thanks @wolfgangpfnuer -- :issue:`619` Update isort to 5.x + +- {issue}`480` Fix typo, thanks @jstoja +- {issue}`578` Fix typo, thanks @mauroporras +- {issue}`519` Fix typo, thanks @timgates42 +- {issue}`506` Fix Makefile typo, thanks @wolfgangpfnuer +- {issue}`619` Update isort to 5.x - Travis: Only run on master and PRs one time - Travis: Add caching for tmux builds - Travis: Test 2.9 and 3.0a -- :issue:`613`: Move from Pipenv to Poetry +- {issue}`613`: Move from Pipenv to Poetry -tmuxp 1.5.4 (2019-11-06) ------------------------- -- :issue:`500`: Fix window focus +## tmuxp 1.5.4 (2019-11-06) + +- {issue}`500`: Fix window focus - Fix travis CI builds for python 3.7 -tmuxp 1.5.3 (2019-06-06) ------------------------- -- :issue:`377`: Include examples in source distribution package +## tmuxp 1.5.3 (2019-06-06) + +- {issue}`377`: Include examples in source distribution package + +## tmuxp 1.5.2 (2019-06-02) -tmuxp 1.5.2 (2019-06-02) ------------------------- - Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2 released today) -- :issue:`484` CHANGES converted to plain reStructuredText -- :issue:`491` ``tmuxp freeze`` will now infer active session with freezing -- :issue:`490` Fix XDG's ``$XDG_CONFIG_HOME`` behavior -- :issue:`483`, :issue:`482`, :issue:`480` Doc fixes -- :issue:`487` Simplifying handling of configs with no panes (Fixes - :issue:`470`) - -tmuxp 1.5.1 (2019-02-18) ------------------------- +- {issue}`484` CHANGES converted to plain reStructuredText +- {issue}`491` `tmuxp freeze` will now infer active session with freezing +- {issue}`490` Fix XDG's `$XDG_CONFIG_HOME` behavior +- {issue}`483`, {issue}`482`, {issue}`480` Doc fixes +- {issue}`487` Simplifying handling of configs with no panes (Fixes + {issue}`470`) + +## tmuxp 1.5.1 (2019-02-18) + - Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package. - Include twine to dev packages on requirements and Pipfile files. -tmuxp 1.5.0 (2018-10-02) ------------------------- +## tmuxp 1.5.0 (2018-10-02) + - Support Click 7.0 -- Remove unused ``__future__`` imports -- :issue:`471` Update libtmux 0.8.0 -> 0.8.1 -- :issue:`404` from @anddam, support XDG base directory +- Remove unused `__future__` imports +- {issue}`471` Update libtmux 0.8.0 -> 0.8.1 +- {issue}`404` from @anddam, support XDG base directory - Sort imports - Add configuration and make command for isort. - Add sphinxcontrib-napoleon. -- Assure *requirements/dev.txt* dependencies are in *Pipfile* +- Assure _requirements/dev.txt_ dependencies are in _Pipfile_ - Update sphinx, releases to latest version -- Sync *requirements/\*.txt* dependencies with *Pipfile*. +- Sync _requirements/_.txt* dependencies with *Pipfile\*. - Update docstring style to use numpy-style documentation. This enhances readability and plays nicely with sphinx documentation. - Documentation overhaul. - - Areas like :meth:`tmuxp.cli.load_workspace` are now documented verbosely. + - Areas like {meth}`tmuxp.cli.load_workspace` are now documented verbosely. This is so contributors helping on the project can more quickly gain situational awareness in this tricky area of code. -tmuxp 1.4.2 (2018-09-30) ------------------------- -- :issue:`431` Include tests in source distribution +## tmuxp 1.4.2 (2018-09-30) + +- {issue}`431` Include tests in source distribution + +## tmuxp 1.4.1 (2018-09-26) -tmuxp 1.4.1 (2018-09-26) ------------------------- - Loosen click restraint to <7 -tmuxp 1.4.0 (2018-03-11) ------------------------- +## tmuxp 1.4.0 (2018-03-11) + - Bump libtmux to 0.8.0 -- :issue:`264` Update license from BSD to MIT -- :issue:`348` Continuous integration updates and fixes for Travis CI +- {issue}`264` Update license from BSD to MIT +- {issue}`348` Continuous integration updates and fixes for Travis CI - Update builds to use trusty - Remove older python 3 versions (before 3.6) - Update pypy versions -- :issue:`349` flake8 via continuous integration + +- {issue}`349` flake8 via continuous integration - Improve reliability of time-sensitive tests by - using ``while True`` with a timeout. + using `while True` with a timeout. - Update sphinx to 1.7.1 - Update alagitpull (sphinx theme) to 0.0.19. External websites open in new window. - Update pytest to 3.4.1 -tmuxp 1.3.5 (2017-11-10) ------------------------- -- :issue:`312` Support for tmux 2.6 layout setting (via hooks) in the +## tmuxp 1.3.5 (2017-11-10) + +- {issue}`312` Support for tmux 2.6 layout setting (via hooks) in the following scenarios: - loading outside tmux @@ -327,823 +334,807 @@ tmuxp 1.3.5 (2017-11-10) reattaching/switching to after - loading session outside tmux in background with -d, and reattaching/switching after -- :issue:`308` Fix bug where layouts don't correctly set on tmux 2.6 + +- {issue}`308` Fix bug where layouts don't correctly set on tmux 2.6 - Upgrade libtmux to 0.7.7 -tmuxp 1.3.4 (2017-10-12) ------------------------- -- `before_script` now respects `start_directory` - in the session root. This makes it easier to run things like `pipenv - install` as a `before_script`. +## tmuxp 1.3.4 (2017-10-12) + +- {}`before_script` now respects {}`start_directory` + in the session root. This makes it easier to run things like {}`pipenv install` as a {}`before_script`. + +## tmuxp 1.3.3 (2017-10-07) -tmuxp 1.3.3 (2017-10-07) ------------------------- - Update libtmux to 0.7.5 for tmux 2.6 hotfix -tmuxp 1.3.2 (2017-08-20) ------------------------- -- :issue:`184` - update libtmux to fix environmental variables in the +## tmuxp 1.3.2 (2017-08-20) + +- {issue}`184` - update libtmux to fix environmental variables in the session scope - Update libtmux to 0.7.4 - Updates to pytest and pytest-rerunfailures -tmuxp 1.3.1 (2017-05-29) ------------------------- -- :issue:`252` Fix bug where loading a session with a name matching a subset +## tmuxp 1.3.1 (2017-05-29) + +- {issue}`252` Fix bug where loading a session with a name matching a subset of current session causes undesired behavior. - Update libtmux to 0.7.3 - Switch theme to alagitpull (alabaster subtheme) - Remove unneeded doc dependency packages -tmuxp 1.3.0 (2017-04-27) ------------------------- -- :issue:`239` Improve support for formatted options when freezing and +## tmuxp 1.3.0 (2017-04-27) + +- {issue}`239` Improve support for formatted options when freezing and using configs with them. -- :issue:`236` Support for symlinked directories, thanks @rafi. -- :issue:`235` Support for ``options_after``, for setting options like - ``synchronize-panes``. Thanks @sebastianst. -- :issue:`248` Drop python 2.6 support -- :issue:`248` Upgrade libtmux to 0.7.1 +- {issue}`236` Support for symlinked directories, thanks @rafi. +- {issue}`235` Support for `options_after`, for setting options like + `synchronize-panes`. Thanks @sebastianst. +- {issue}`248` Drop python 2.6 support +- {issue}`248` Upgrade libtmux to 0.7.1 - Upgrade colorama from 0.3.7 to 0.3.9 -tmuxp 1.2.8 (2017-04-02) ------------------------- -- :issue:`229` More helpful error message on systems missing +## tmuxp 1.2.8 (2017-04-02) + +- {issue}`229` More helpful error message on systems missing tmux. - Update libtmux from 0.6.4 to 0.6.5. -tmuxp 1.2.7 (2017-03-25) ------------------------- +## tmuxp 1.2.7 (2017-03-25) + - Support for OpenBSD. -tmuxp 1.2.6 (2017-02-24) ------------------------- -- :issue:`218` Fix pane ordering by running ``select-layout`` before +## tmuxp 1.2.6 (2017-02-24) + +- {issue}`218` Fix pane ordering by running `select-layout` before splits. -tmuxp 1.2.5 (2017-02-08) ------------------------- -- :issue:`207` add custom tmuxp config directory via - ``TMUXP_CONFIGDIR`` variable. -- :issue:`199` support for running tmuxp on tmux ``master``. +## tmuxp 1.2.5 (2017-02-08) + +- {issue}`207` add custom tmuxp config directory via + `TMUXP_CONFIGDIR` variable. +- {issue}`199` support for running tmuxp on tmux `master`. - update libtmux from 0.6.2 to 0.6.3. -tmuxp 1.2.4 (2017-01-13) ------------------------- -- :issue:`198` bump click from 6.6 to 6.7 -- :issue:`195` pin packages for colorama and doc requirements +## tmuxp 1.2.4 (2017-01-13) + +- {issue}`198` bump click from 6.6 to 6.7 +- {issue}`195` pin packages for colorama and doc requirements + +## tmuxp 1.2.3 (2016-12-21) -tmuxp 1.2.3 (2016-12-21) ------------------------- - bump libtmux 0.6.0 to 0.6.1 -- :issue:`193` improve suppress history test, courtesy of @abeyer. -- :issue:`191` documentation typo from @modille -- :issue:`186` documentation typo from @joelwallis +- {issue}`193` improve suppress history test, courtesy of @abeyer. +- {issue}`191` documentation typo from @modille +- {issue}`186` documentation typo from @joelwallis + +## tmuxp 1.2.2 (2016-09-16) -tmuxp 1.2.2 (2016-09-16) ------------------------- -- :issue:`181` Support tmux 2.3 +- {issue}`181` Support tmux 2.3 -tmuxp 1.2.1 (2016-09-16) ------------------------- -- :issue:`132` Handle cases with invalid session names +## tmuxp 1.2.1 (2016-09-16) + +- {issue}`132` Handle cases with invalid session names - update libtmux from 0.5.0 to 0.6.0 -tmuxp 1.2.0 (2016-06-16) ------------------------- -- :issue:`65` Ability to specify ``options`` and ``global_options`` via +## tmuxp 1.2.0 (2016-06-16) + +- {issue}`65` Ability to specify `options` and `global_options` via configuration. Also you can specify environment variables via that. Include tests and add example. -tmuxp 1.1.1 (2016-06-02) ------------------------- -- :issue:`167` fix attaching multiple sessions -- :issue:`165` fix typo in error output, thanks @fpietka -- :issue:`166` add new docs on zsh/bash completion -- Add back ``tmuxp -V`` for version info - -tmuxp 1.1.0 (2016-06-01) ------------------------- -- :issue:`160` load tmuxp configs by name -- :issue:`134` Use ``click`` for command-line completion, Rewrite command +## tmuxp 1.1.1 (2016-06-02) + +- {issue}`167` fix attaching multiple sessions +- {issue}`165` fix typo in error output, thanks @fpietka +- {issue}`166` add new docs on zsh/bash completion +- Add back `tmuxp -V` for version info + +## tmuxp 1.1.0 (2016-06-01) + +- {issue}`160` load tmuxp configs by name +- {issue}`134` Use `click` for command-line completion, Rewrite command line functionality for importing, config finding, conversion and prompts. -- Remove ``-l`` from ``tmuxp import tmuxinator|teamocil`` -- :issue:`158` argparse bug overcome by switch to click +- Remove `-l` from `tmuxp import tmuxinator|teamocil` +- {issue}`158` argparse bug overcome by switch to click +## tmuxp 1.0.2 (2016-05-25) -tmuxp 1.0.2 (2016-05-25) ------------------------- -- :issue:`163` fix issue re-attaching sessions that are already loaded -- :issue:`159` improved support for tmuxinator imports, from @fpietka. -- :issue:`161` readme link fixes from @Omeryl. +- {issue}`163` fix issue re-attaching sessions that are already loaded +- {issue}`159` improved support for tmuxinator imports, from @fpietka. +- {issue}`161` readme link fixes from @Omeryl. + +## tmuxp 1.0.1 (2016-05-25) -tmuxp 1.0.1 (2016-05-25) ------------------------- - switch to readthedocs.io for docs -- :issue:`157` bump libtmux to 0.4.1 +- {issue}`157` bump libtmux to 0.4.1 + +## tmuxp 1.0.0-rc1 (2016-05-25) -tmuxp 1.0.0-rc1 (2016-05-25) ----------------------------- - version jump 0.11.1 to 1.0 - tests moved to py.test framework -- `libtmux`_ core split into its own project -- :issue:`145` Add new-window command functionality, @ikirudennis -- :issue:`146` Optionally disable shell history suppression, @kmactavish -- :issue:`147` Patching unittest timing for shell history suppression +- [libtmux][libtmux] core split into its own project +- {issue}`145` Add new-window command functionality, @ikirudennis +- {issue}`146` Optionally disable shell history suppression, @kmactavish +- {issue}`147` Patching unittest timing for shell history suppression - move doc building, tests and watcher to Makefile - update .tmuxp.yaml and .tmuxp.json for Makefile change - overhaul README -tmuxp 0.11.0 (2016-02-29) -------------------------- -- :issue:`137` Support for environment settings in configs, thanks - `@tasdomas` -- Spelling correction, thanks `@sehe`_. - -tmuxp 0.10.0 (2016-01-30) -------------------------- -- :issue:`135` Load multiple tmux sessions at once, thanks `@madprog`_. -- :issue:`131` :issue:`133` README and Documentation fixes - -tmuxp 0.9.3 (2016-01-06) ------------------------- -- switch to ``.venv`` for virtualenv directory to not conflict - with ``.env`` (used by `autoenv`_). -- :issue:`130` move to `entr(1)`_ for file watching in tests. update docs. -- [compatibility] Support `Anaconda Python`_ 2 and 3 - -tmuxp 0.9.2 (2015-10-21) ------------------------- -- :issue:`122` Update to support tmux 2.1, thank you `@estin`_. +## tmuxp 0.11.0 (2016-02-29) + +- {issue}`137` Support for environment settings in configs, thanks + {}`@tasdomas` +- Spelling correction, thanks [@sehe][@sehe]. + +## tmuxp 0.10.0 (2016-01-30) + +- {issue}`135` Load multiple tmux sessions at once, thanks [@madprog][@madprog]. +- {issue}`131` {issue}`133` README and Documentation fixes + +## tmuxp 0.9.3 (2016-01-06) + +- switch to `.venv` for virtualenv directory to not conflict + with `.env` (used by [autoenv][autoenv]). +- {issue}`130` move to [entr(1)][entr(1)] for file watching in tests. update docs. +- [compatibility] Support [Anaconda Python][anaconda python] 2 and 3 + +## tmuxp 0.9.2 (2015-10-21) + +- {issue}`122` Update to support tmux 2.1, thank you [@estin][@estin]. - use travis container infrastructure for faster tests -- change test in workspace builder test to use ``top(1)`` instead of - ``man(1)``. ``man(1)`` caused errors on some systems where ``PAGER`` is set. +- change test in workspace builder test to use `top(1)` instead of + `man(1)`. `man(1)` caused errors on some systems where `PAGER` is set. + +## tmuxp 0.9.1 (2015-08-23) -tmuxp 0.9.1 (2015-08-23) ------------------------- -- :issue:`119` Add fix python 3 for `sysutils/pytmuxp`_ on FreeBSD ports. - See GH issue 119 and `#201564`_ @ FreeBSD Bugzilla. Thanks Ruslan +- {issue}`119` Add fix python 3 for [sysutils/pytmuxp][sysutils/pytmuxp] on FreeBSD ports. + See GH issue 119 and [#201564][#201564] @ FreeBSD Bugzilla. Thanks Ruslan Makhmatkhanov. -tmuxp 0.9.0 (2015-07-08) ------------------------- -- Renamed ``config.expandpath`` to ``config.expandshell``. -- compat 2.7/3.3 wrapper for ``EnvironmentVarGuard`` for +## tmuxp 0.9.0 (2015-07-08) + +- Renamed `config.expandpath` to `config.expandshell`. +- compat 2.7/3.3 wrapper for `EnvironmentVarGuard` for testing. - You can now use environment variables inside of - ``start_directory``, ``before_script``, ``shell_command_before``, - ``session_name`` and ``window_name``. + `start_directory`, `before_script`, `shell_command_before`, + `session_name` and `window_name`. - [examples]: add example for environmental variables, - ``examples/env-variables.json`` and ``examples/env-variables.yaml``. -- :issue:`110` de-vendorize `colorama`_. Thanks `@marbu`_. -- :issue:`109` fix failure of test_pane_order on fedora machines from - `@marbu`_ -- :issue:`105` append ``.txt`` extension to manuals (repo ony) - from `@yegortimoshenko`_. -- :issue:`107` Fix Server.attached_sessions return type by - `@thomasballinger`_. + `examples/env-variables.json` and `examples/env-variables.yaml`. +- {issue}`110` de-vendorize [colorama][colorama]. Thanks [@marbu][@marbu]. +- {issue}`109` fix failure of test_pane_order on fedora machines from + [@marbu][@marbu] +- {issue}`105` append `.txt` extension to manuals (repo ony) + from [@yegortimoshenko][@yegortimoshenko]. +- {issue}`107` Fix Server.attached_sessions return type by + [@thomasballinger][@thomasballinger]. - update travis to use new tmux git repository. -tmuxp 0.8.1 (2015-05-09) ------------------------- +## tmuxp 0.8.1 (2015-05-09) + - [testing]: fix sniffer test runner in python 3 - new animated image demo for RTD and README -tmuxp 0.8.0 (2015-05-07) ------------------------- +## tmuxp 0.8.0 (2015-05-07) + - version bump 0.1.13 -> 0.8.0 - tmux 2.0 support -- Fix documentation for :meth:``Session.switch_client()``. -- Add ``--log-level`` argument. -- Refactor ``{Server,Session,Window,Pane}.tmux`` into: - - - :meth:`Server.cmd()` - - :meth:`Session.cmd()` - - :meth:`Window.cmd()` - - :meth:`Pane.cmd()` - - (See conversation at https://github.com/bitprophet/dotfiles/issues/5) -- Refactor ``util.tmux`` into :meth:`util.tmux_cmd`. - -tmuxp 0.1.13 (2015-03-25) -------------------------- -- Remove ``package_metadata.py`` in favor of ``__about__.py``. -- ``scent.py`` for building docs +- Fix documentation for :meth:`Session.switch_client()`. +- Add `--log-level` argument. +- Refactor `{Server,Session,Window,Pane}.tmux` into: + + - {meth}`Server.cmd()` + - {meth}`Session.cmd()` + - {meth}`Window.cmd()` + - {meth}`Pane.cmd()` + + (See conversation at ) + +- Refactor `util.tmux` into {meth}`util.tmux_cmd`. + +## tmuxp 0.1.13 (2015-03-25) + +- Remove `package_metadata.py` in favor of `__about__.py`. +- `scent.py` for building docs - docutils from 0.11 to 0.12 -- ``bootstrap_env.py`` will check for linux, darwin (OS X) and - windows and install the correct `sniffer`_ file watcher plugin. -- testsuite for cli uses :py:func:`tempfile.mkdtemp()` instead - ``TMP_DIR`` (which resolved to ``.tmuxp`` in the testsuite directory. -- replace `watchingtestrunner`_ with `sniffer`_ in examples. - ``.tmuxp.conf`` and ``.tmux.json`` updated +- `bootstrap_env.py` will check for linux, darwin (OS X) and + windows and install the correct [sniffer][sniffer] file watcher plugin. +- testsuite for cli uses {py:func}`tempfile.mkdtemp()` instead + `TMP_DIR` (which resolved to `.tmuxp` in the testsuite directory. +- replace [watchingtestrunner][watchingtestrunner] with [sniffer][sniffer] in examples. + `.tmuxp.conf` and `.tmux.json` updated - updates to doc links -- ``make checkbuild`` for verifying internal / intersphinx doc +- `make checkbuild` for verifying internal / intersphinx doc references. -- Add Warning tmux versions less than 1.4 from `@techtonik`_. -- Add documentation on leading space in ``send_keys`` - from `@thomasballinger`_. -- Update about page from teamocil and erb support from `@raine`_. - -tmuxp 0.1.12 (2014-08-06) -------------------------- -- [config] :meth:`config.expand` now resolves directories in configuration - via :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars`. -- [config] :meth:`config.expandpath` for helping resolve paths. +- Add Warning tmux versions less than 1.4 from [@techtonik][@techtonik]. +- Add documentation on leading space in `send_keys` + from [@thomasballinger][@thomasballinger]. +- Update about page from teamocil and erb support from [@raine][@raine]. + +## tmuxp 0.1.12 (2014-08-06) + +- [config] {meth}`config.expand` now resolves directories in configuration + via {py:func}`os.path.expanduser` and {py:func}`os.path.expandvars`. +- [config] {meth}`config.expandpath` for helping resolve paths. - improved support for loading tmuxp project files from outside current working directory. e.g. - .. code-block:: bash - - $ tmuxp load /path/to/my/project/.tmuxp.yaml + ``` + $ tmuxp load /path/to/my/project/.tmuxp.yaml + ``` Will behave better with relative directories. -tmuxp 0.1.11 (2014-04-06) -------------------------- -- ``before_script`` now loads relative to project directory with - ``./``. -- Use ``bootstrap_env.py`` in tmuxp's ``.tmuxp.yaml`` and - ``.tmuxp.json`` project files. -- Improvements to :meth:`util.run_before_script()`, - :class:`exc.BeforeLoadScriptFailed` behavior to print ``stdout`` and - return ``stderr`` is a non-zero exit is returned. -- ``run_script_before`` has moved to ``util``. -- ``BeforeLoadScriptFailed`` and ``BeforeLoadScriptNotExists`` - has moved to the ``exc`` module. -- Tests for ``run_script_before`` refactored. - -tmuxp 0.1.10 (2014-04-02) -------------------------- +## tmuxp 0.1.11 (2014-04-06) + +- `before_script` now loads relative to project directory with + `./`. +- Use `bootstrap_env.py` in tmuxp's `.tmuxp.yaml` and + `.tmuxp.json` project files. +- Improvements to {meth}`util.run_before_script()`, + {class}`exc.BeforeLoadScriptFailed` behavior to print `stdout` and + return `stderr` is a non-zero exit is returned. +- `run_script_before` has moved to `util`. +- `BeforeLoadScriptFailed` and `BeforeLoadScriptNotExists` + has moved to the `exc` module. +- Tests for `run_script_before` refactored. + +## tmuxp 0.1.10 (2014-04-02) + - 2 bug fixes and allow panes with no shell commands to accept options, - thanks for these 3 patches, `@ThiefMaster`_: -- :issue:`73` Fix an error caused by spaces in - ``start_directory``. -- :issue:`77` Fix bug where having a ``-`` in a - ``shell_command`` would cauesd a build error. -- :issue:`76` Don't require ``shell_command`` to - pass options to panes (like ``focus: true``). - -tmuxp 0.1.9 (2014-04-01) ------------------------- -- The ``--force`` was not with us. - -tmuxp 0.1.8 (2014-03-30) ------------------------- -- :issue:`72` Create destination directory if it doesn't exist. Thanks - `@ThiefMaster`_. -- New context manager for tests, ``temp_session``. -- New testsuite, ``testsuite.test_utils`` for testing testsuite + thanks for these 3 patches, [@ThiefMaster][@thiefmaster]: +- {issue}`73` Fix an error caused by spaces in + `start_directory`. +- {issue}`77` Fix bug where having a `-` in a + `shell_command` would cauesd a build error. +- {issue}`76` Don't require `shell_command` to + pass options to panes (like `focus: true`). + +## tmuxp 0.1.9 (2014-04-01) + +- The `--force` was not with us. + +## tmuxp 0.1.8 (2014-03-30) + +- {issue}`72` Create destination directory if it doesn't exist. Thanks + [@ThiefMaster][@thiefmaster]. +- New context manager for tests, `temp_session`. +- New testsuite, `testsuite.test_utils` for testing testsuite tools. -- New command, ``before_script``, which is a file to +- New command, `before_script`, which is a file to be executed with a return code. It can be a bash, perl, python etc. script. -- :issue:`56` :ref:`python_api_quickstart ` +- {issue}`56` {ref}`python_api_quickstart ` + +## tmuxp 0.1.7 (2014-02-25) -tmuxp 0.1.7 (2014-02-25) ------------------------- -- :issue:`55` where tmuxp would crash with letter numbers in version. +- {issue}`55` where tmuxp would crash with letter numbers in version. Write tests. -tmuxp 0.1.6 (2014-02-08) ------------------------- -- :meth:`Window.split_window()` now allows ``-c - start_directory``. -- :issue:`35` Builder will now use ``-c start_directory`` to +## tmuxp 0.1.6 (2014-02-08) + +- {meth}`Window.split_window()` now allows `-c start_directory`. +- {issue}`35` Builder will now use `-c start_directory` to create new windows and panes. - - This removes a hack where ``default-path`` would be set for new pane and + + This removes a hack where `default-path` would be set for new pane and window creations. This would bleed into tmux user sessions after creations. -tmuxp 0.1.5-1 (2014-02-05) --------------------------- -- :issue:`49` bug where ``package_manifest.py`` missing - from ``MANIFEST.in`` would cause error installing. +## tmuxp 0.1.5-1 (2014-02-05) + +- {issue}`49` bug where `package_manifest.py` missing + from `MANIFEST.in` would cause error installing. + +## tmuxp 0.1.5 (2014-02-05) -tmuxp 0.1.5 (2014-02-05) ------------------------- - section heading normalization. - tao of tmux section now treated as a chatper. tao of tmux may be split off into its own project. -- use conventions from `tony/cookiecutter-pypackage`_. - -tmuxp 0.1.4 (2014-02-02) ------------------------- -- Fix ``$ tmuxp freeze`` CLI output. -- Update ``_compat`` support module. -- Fix extra space in `PEP 263`_. - -tmuxp 0.1.3 (2014-01-29) ------------------------- -- :issue:`48` Fix Python 3 CLI issue. -- :issue:`48` ``$ tmuxp`` without option raises an error. +- use conventions from [tony/cookiecutter-pypackage][tony/cookiecutter-pypackage]. + +## tmuxp 0.1.4 (2014-02-02) + +- Fix `$ tmuxp freeze` CLI output. +- Update `_compat` support module. +- Fix extra space in [PEP 263][pep 263]. + +## tmuxp 0.1.3 (2014-01-29) + +- {issue}`48` Fix Python 3 CLI issue. +- {issue}`48` `$ tmuxp` without option raises an error. - Add space before send-keys to not populate bash and zsh history. -tmuxp 0.1.2 (2014-01-08) ------------------------- +## tmuxp 0.1.2 (2014-01-08) + - now using werkzeug / flask style testsuites. -- :issue:`43` Merge ``tmuxp -d`` for loading in detached mode. - Thanks `roxit`_. +- {issue}`43` Merge `tmuxp -d` for loading in detached mode. + Thanks [roxit][roxit]. + +## tmuxp 0.1.1 (2013-12-25) -tmuxp 0.1.1 (2013-12-25) ------------------------- -- :issue:`32` Fix bug where special characters caused unicode caused +- {issue}`32` Fix bug where special characters caused unicode caused unexpected outcomes loading and freezing sessions. -tmuxp 0.1.0 (2013-12-18) ------------------------- -- fix duplicate print out of filename with using ``tmuxp load .``. -- version to 0.1. No ``--pre`` needed. Future versions will not use rc. +## tmuxp 0.1.0 (2013-12-18) + +- fix duplicate print out of filename with using `tmuxp load .`. +- version to 0.1. No `--pre` needed. Future versions will not use rc. + +## tmuxp 0.1-rc8 (2013-12-17) -tmuxp 0.1-rc8 (2013-12-17) --------------------------- -- ``unicode_literals`` -- Move py2/py3 compliancy code to ``_compat``. +- `unicode_literals` +- Move py2/py3 compliancy code to `_compat`. -tmuxp 0.1-rc7 (2013-12-07) --------------------------- -- :issue:`33` Partial rewrite of :meth:`config.expand`. -- tmuxp will exit silently with ``Ctrl-c``. +## tmuxp 0.1-rc7 (2013-12-07) -tmuxp 0.1-rc6 (2013-12-06) --------------------------- -- :issue:`31` [examples] from stratoukos add ``window_index`` option, +- {issue}`33` Partial rewrite of {meth}`config.expand`. +- tmuxp will exit silently with `Ctrl-c`. + +## tmuxp 0.1-rc6 (2013-12-06) + +- {issue}`31` [examples] from stratoukos add `window_index` option, and example. -tmuxp 0.1-rc5 (2013-12-04) --------------------------- -- :issue:`28` shell_command_before in session scope of config causing +## tmuxp 0.1-rc5 (2013-12-04) + +- {issue}`28` shell_command_before in session scope of config causing duplication. New test. -- :issue:`26` :issue:`29` for OS X tests. Thanks stratoukos. -- :issue:`27` ``$ tmuxp freeze`` raises unhelpful message if session doesn't +- {issue}`26` {issue}`29` for OS X tests. Thanks stratoukos. +- {issue}`27` `$ tmuxp freeze` raises unhelpful message if session doesn't exist. -tmuxp 0.1-rc4 (2013-12-03) --------------------------- -- fix bug were ``focus: true`` would not launch sessions when using - ``$ tmuxp load`` in a tmux session. +## tmuxp 0.1-rc4 (2013-12-03) + +- fix bug were `focus: true` would not launch sessions when using + `$ tmuxp load` in a tmux session. + +## tmuxp 0.1-rc3 (2013-12-03) -tmuxp 0.1-rc3 (2013-12-03) --------------------------- -- :issue:`25` ``focus: true`` not working in panes. Add +- {issue}`25` `focus: true` not working in panes. Add tests for focusing panes in config. -- :meth:`Pane.select_pane()`. -- add new example for ``focus: true``. - -tmuxp 0.1-rc2 (2013-11-23) --------------------------- -- :issue:`23` fix bug where workspace would not build with pane-base-index - set to 1. Update tests to fix if ``pane-base-index`` is not 0. -- removed ``$ tmuxp load --list`` functionality. Update - :ref:`quickstart` accordingly. - -tmuxp 0.1-rc1 (2013-11-23) --------------------------- -- `pep8`_ and `pep257`_ in unit tests. -- Changelog will now be updated on a version basis, use `pep440`_ +- {meth}`Pane.select_pane()`. +- add new example for `focus: true`. + +## tmuxp 0.1-rc2 (2013-11-23) + +- {issue}`23` fix bug where workspace would not build with pane-base-index + set to 1. Update tests to fix if `pane-base-index` is not 0. +- removed `$ tmuxp load --list` functionality. Update + {ref}`quickstart` accordingly. + +## tmuxp 0.1-rc1 (2013-11-23) + +- [pep8][pep8] and [pep257][pep257] in unit tests. +- Changelog will now be updated on a version basis, use [pep440][pep440] versioning. -tmuxp 0.1-dev (2013-11-21) --------------------------- -- :meth:`Session.show_options`, :meth:`Session.show_option` now - accept ``g`` to pass in ``-g``. +## tmuxp 0.1-dev (2013-11-21) + +- {meth}`Session.show_options`, {meth}`Session.show_option` now + accept `g` to pass in `-g`. -tmuxp 0.1-dev (2013-11-20) --------------------------- -- :meth:`Window.show_window_options`, - :meth:`Window.show_window_option` now accept ``g`` to pass in ``-g``. -- :issue:`15` Behavioral changes in the WorkspaceBuilder to fix pane +## tmuxp 0.1-dev (2013-11-20) + +- {meth}`Window.show_window_options`, + {meth}`Window.show_window_option` now accept `g` to pass in `-g`. +- {issue}`15` Behavioral changes in the WorkspaceBuilder to fix pane ordering. -- :issue:`21` Error with unit testing python 2.6 python configuration tests. - Use :py:mod:`tempfile` instead. +- {issue}`21` Error with unit testing python 2.6 python configuration tests. + Use {py:mod}`tempfile` instead. - WorkspaceBuilder tests have been improved to use async better. +## tmuxp 0.1-dev (2013-11-17) -tmuxp 0.1-dev (2013-11-17) --------------------------- - fix a bug where missing tmux didn't show correct warning. -tmuxp 0.1-dev (2013-11-15) --------------------------- +## tmuxp 0.1-dev (2013-11-15) + - Travis now tests python 2.6 as requirement and not allowed to fail. -tmuxp 0.1-dev (2013-11-13) --------------------------- -- :issue:`19` accept ``-y`` argument to answer yes to questions. -- :meth:`cli.SessionCompleter` no longer allows a duplicate session +## tmuxp 0.1-dev (2013-11-13) + +- {issue}`19` accept `-y` argument to answer yes to questions. +- {meth}`cli.SessionCompleter` no longer allows a duplicate session after one is added. -- ongoing work on :ref:`about_tmux`. - -tmuxp 0.1-dev (2013-11-09) --------------------------- -- [translation] `documentation in Chinese`_ from `wrongwaycn`_. -- More work done on the :ref:`about_tmux` page. -- :meth:`Pane.split_window()` for splitting :class:`Window` at - ``target-pane`` location. - -tmuxp 0.1-dev (2013-11-08) --------------------------- -- [freeze] - ``$ tmuxp freeze`` will now freeze a window with a - ``start_directory`` when all panes in a window are inside the same +- ongoing work on {ref}`about_tmux`. + +## tmuxp 0.1-dev (2013-11-09) + +- [translation] [documentation in Chinese][documentation in chinese] from [wrongwaycn][wrongwaycn]. +- More work done on the {ref}`about_tmux` page. +- {meth}`Pane.split_window()` for splitting {class}`Window` at + `target-pane` location. + +## tmuxp 0.1-dev (2013-11-08) + +- [freeze] - `$ tmuxp freeze` will now freeze a window with a + `start_directory` when all panes in a window are inside the same directory. -- [config] :meth:`config.inline` will now turn panes with no +- [config] {meth}`config.inline` will now turn panes with no other attributes and 1 command into a single item value. - .. code-block:: yaml + ``` + - panes: + - shell_command: top - - panes: - - shell_command: top + # will now inline to: - # will now inline to: + - panes + - top - - panes - - top + This will improve ``$ tmuxp freeze`` + ``` - This will improve ``$ tmuxp freeze`` +## tmuxp 0.1-dev (2013-11-07) -tmuxp 0.1-dev (2013-11-07) --------------------------- -- Remove old logger (based on `tornado's log.py`_), replace +- Remove old logger (based on [tornado's log.py][tornado's log.py]), replace with new, simpler one. -- fix `teamocil`_ import. -- support import teamocil ``root`` to - ``start_directory``. +- fix [teamocil][teamocil] import. +- support import teamocil `root` to + `start_directory`. + +## tmuxp 0.1-dev (2013-11-06) -tmuxp 0.1-dev (2013-11-06) --------------------------- - tagged v0.0.37. Many fixes. Python 2.6 support. Will switch to per-version changelog after 0.1 release. -- support for blank panes (null, ``pane``, ``blank``) and panes +- support for blank panes (null, `pane`, `blank`) and panes with empty strings. -- tmuxp freeze supports exporting to blank panes. +- tmuxp freeze supports exporting to blank panes. - tmuxp freeze will now return a blank pane for panes that would - previously return a duplicate shell command, or generic python, node - interpreter. + previously return a duplicate shell command, or generic python, node + interpreter. + +## tmuxp 0.1-dev (2013-11-05) -tmuxp 0.1-dev (2013-11-05) --------------------------- -- Support for ``[-L socket-name]`` and ``[-S socket-path]`` in +- Support for `[-L socket-name]` and `[-S socket-path]` in autocompletion and when loading. Note, switching client into another socket may cause an error. -- Documentation tweaking to :ref:`API`, :ref:`about_tmux`. -- `pep257`_, `pep8`_. - -tmuxp 0.1-dev (2013-11-04) --------------------------- -- `pep257`_, `pep8`_. -- tagged version ``v0.0.36``. - -tmuxp 0.1-dev (2013-11-02) --------------------------- -- Many documentation, `pep257`_, `pep8`_ fixes -- move old :class:`Server` methods ``__list_panes()``, - ``__list_windows`` and ``__list_sessions`` into the single underscore. -- :issue:`12` fix for ``$ tmuxp freeze`` by @finder. -- Support for spaces in ``$ tmuxp attach-session`` and - ``$ tmuxp kill-session``, and ``$ tmuxp freeze``. -- [config] support for relative paths of ``start_directory``. Add an - update config in *Start Directory* on :ref:`examples`. - -tmuxp 0.1-dev (2013-11-01) --------------------------- -- New servers for :class:`Server` arguments ``socket_name``, - ``socket_path``, ``config_file``. -- :class:`Server` support for ``-2`` with ``colors=256`` and - ``colors=8``. -- ``$ tmuxp -2`` for forcing 256 colors and ``tmuxp -8`` for forcing 88. -- [config] Concatenation with ``start_directory`` via - :meth:`config.trickle()` if window ``start_directory`` is alphanumeric / - relative (doesn't start with ``/``). See :ref:`Examples` in *start directory*. +- Documentation tweaking to {ref}`API`, {ref}`about_tmux`. +- [pep257][pep257], [pep8][pep8]. + +## tmuxp 0.1-dev (2013-11-04) + +- [pep257][pep257], [pep8][pep8]. +- tagged version `v0.0.36`. + +## tmuxp 0.1-dev (2013-11-02) + +- Many documentation, [pep257][pep257], [pep8][pep8] fixes +- move old {class}`Server` methods `__list_panes()`, + `__list_windows` and `__list_sessions` into the single underscore. +- {issue}`12` fix for `$ tmuxp freeze` by @finder. +- Support for spaces in `$ tmuxp attach-session` and + `$ tmuxp kill-session`, and `$ tmuxp freeze`. +- [config] support for relative paths of `start_directory`. Add an + update config in _Start Directory_ on {ref}`examples`. + +## tmuxp 0.1-dev (2013-11-01) + +- New servers for {class}`Server` arguments `socket_name`, + `socket_path`, `config_file`. +- {class}`Server` support for `-2` with `colors=256` and + `colors=8`. +- `$ tmuxp -2` for forcing 256 colors and `tmuxp -8` for forcing 88. +- [config] Concatenation with `start_directory` via + {meth}`config.trickle()` if window `start_directory` is alphanumeric / + relative (doesn't start with `/`). See {ref}`Examples` in _start directory_. - Fix bug with import teamocil and tmuxinator -- Improve quality of tmuxinator imports. Especially ``session_name`` - and ``start_directory``. -- Allow saving with ``~`` in file destination. - -tmuxp 0.1-dev (2013-10-31) --------------------------- -- :meth:`util.is_version()` -- correctly :meth:`config.trickle()` the ``start_directory``. -- get ``start_directory`` working for configs -- fix :meth:``Window.kill_window()`` target to - ``session_id:window_index`` for compatibility and pass tests. -- [examples]: Example for ``start_directory``. +- Improve quality of tmuxinator imports. Especially `session_name` + and `start_directory`. +- Allow saving with `~` in file destination. + +## tmuxp 0.1-dev (2013-10-31) + +- {meth}`util.is_version()` +- correctly {meth}`config.trickle()` the `start_directory`. +- get `start_directory` working for configs +- fix :meth:`Window.kill_window()` target to + `session_id:window_index` for compatibility and pass tests. +- [examples]: Example for `start_directory`. - fix bug where first and second window would load in mixed order -- :class:`Window.move_window()` for moving window. +- {class}`Window.move_window()` for moving window. - doc overhaul. front page, renamed orm_al.rst to internals.rst. -tmuxp 0.1-dev (2013-10-30) --------------------------- +## tmuxp 0.1-dev (2013-10-30) + - fix bug where if inside tmux, loading a workspace via switch_client wouldn't work. -- fix bug where ``tmuxp load .`` would return an error instead of a +- fix bug where `tmuxp load .` would return an error instead of a notice. -- ``tmuxp freeze `` experimental +- `tmuxp freeze ` experimental - tmuxp now has experimental support for freezing live sessions. -- :meth:`Window.kill_window()` -- support for ``start_directory`` (work in progress) - -tmuxp 0.1-dev (2013-10-29) --------------------------- -- :meth:`Window.select_pane` now accepts ``-l``, ``-U``, ``-D``, - ``-L``, ``-R``. -- support for ``automatic-rename`` option. -- 3 new :ref:`examples`, 'main-pane-height', 'automatic-rename', and +- {meth}`Window.kill_window()` +- support for `start_directory` (work in progress) + +## tmuxp 0.1-dev (2013-10-29) + +- {meth}`Window.select_pane` now accepts `-l`, `-U`, `-D`, + `-L`, `-R`. +- support for `automatic-rename` option. +- 3 new {ref}`examples`, 'main-pane-height', 'automatic-rename', and 'shorthands'. - enhancements to prompts -- ``tmuxp import`` for teamocil and tmuxinator now has a wizard and offers +- `tmuxp import` for teamocil and tmuxinator now has a wizard and offers to save in JSON or YAML format. - [b6c2e84] Fix bug where tmuxp load w/ session already loaded would switch/attach even if no was entered - when workspace loader crashes, give option to kill session, attach it or detach it. -- tmux 1.8 ``set-option`` / ``set-window-options`` command - ``target-window`` fix. -- :class:`WorkspaceBuilder` now has ``.session`` attribute accessible +- tmux 1.8 `set-option` / `set-window-options` command + `target-window` fix. +- {class}`WorkspaceBuilder` now has `.session` attribute accessible publicly. -- tmux will now use :meth:`Session.switch_client` and - :meth:`Session.attach_session` to open new sessions instead of ``os.exec``. +- tmux will now use {meth}`Session.switch_client` and + {meth}`Session.attach_session` to open new sessions instead of `os.exec`. - [config] tmuxp now allows a new shorter form for panes. Panes can just be a - string. See the shorthand form in the :ref:`examples` section. -- [config] support loading ``.yml``. - -tmuxp 0.1-dev (2013-10-28) --------------------------- -- fix ``tmuxp load .`` fixed -- fix ``tmuxp convert `` fixed. -- `pep257`_ fixes. -- :class:`Pane` now has :meth:`Pane.set_width` and - :meth:`Pane.set_height`. -- ``./run_tests.py --tests`` now automatically prepends - ``tmuxp.testsuite`` to names. -- :meth:`Window.tmux` and :meth:`Pane.tmux` will automatically add - their ``{window/pane}_id`` if one isn't specific. - -tmuxp 0.1-dev (2013-10-27) --------------------------- -- `argcomplete`_ overhaul for CLI bash completion. -- ``tmuxp load``, ``tmuxp convert`` and ``tmuxp import`` now support + string. See the shorthand form in the {ref}`examples` section. +- [config] support loading `.yml`. + +## tmuxp 0.1-dev (2013-10-28) + +- fix `tmuxp load .` fixed +- fix `tmuxp convert ` fixed. +- [pep257][pep257] fixes. +- {class}`Pane` now has {meth}`Pane.set_width` and + {meth}`Pane.set_height`. +- `./run_tests.py --tests` now automatically prepends + `tmuxp.testsuite` to names. +- {meth}`Window.tmux` and {meth}`Pane.tmux` will automatically add + their `{window/pane}_id` if one isn't specific. + +## tmuxp 0.1-dev (2013-10-27) + +- [argcomplete][argcomplete] overhaul for CLI bash completion. +- `tmuxp load`, `tmuxp convert` and `tmuxp import` now support relative and full filenames in addition to searching the config directory. -tmuxp 0.1-dev (2013-10-26) --------------------------- -- initial version of `tmuxinator`_ and `teamocil`_ +## tmuxp 0.1-dev (2013-10-26) + +- initial version of [tmuxinator][tmuxinator] and [teamocil][teamocil] config importer. it does not support all options and it not guaranteed to fully convert window/pane size and state. -- :meth:`config.in_dir` supports a list of ``extensions`` for - filetypes to search, i.e. ``['.yaml', '.json']``. -- :meth:`config.is_config_file` now supports ``extensions`` +- {meth}`config.in_dir` supports a list of `extensions` for + filetypes to search, i.e. `['.yaml', '.json']`. +- {meth}`config.is_config_file` now supports `extensions` argument as a string also. -- fix ``$ tmuxp load -l`` to work correctly alongside - ``$ tmuxp load filename``. +- fix `$ tmuxp load -l` to work correctly alongside + `$ tmuxp load filename`. -tmuxp 0.1-dev (2013-10-25) --------------------------- -- fix bug where ``-v`` and ``--version`` wouldn't print version. +## tmuxp 0.1-dev (2013-10-25) + +- fix bug where `-v` and `--version` wouldn't print version. - property handle case where no tmux server exists when - ``attach-session`` or ``kill-session`` is used. + `attach-session` or `kill-session` is used. - test fixtures and inital work for importing - `tmuxinator`_ and `teamocil`_ configs + [tmuxinator][tmuxinator] and [teamocil][teamocil] configs + +## tmuxp 0.1-dev (2013-10-24) -tmuxp 0.1-dev (2013-10-24) --------------------------- -- clean out old code for ``automatic-rename`` option. it will +- clean out old code for `automatic-rename` option. it will be reimplemented fresh. -- check for ``oh-my-zsh`` when using ``$SHELL`` ``zsh``. Prompt if - ``DISABLE_AUTO_TITLE`` is unset or set to ``true``. -- tmuxp can now ``$ tmuxp convert `` from JSON <=> YAML, back +- check for `oh-my-zsh` when using `$SHELL` `zsh`. Prompt if + `DISABLE_AUTO_TITLE` is unset or set to `true`. +- tmuxp can now `$ tmuxp convert ` from JSON <=> YAML, back and forth. -- New examples in JSON. Update the :ref:`examples` page in the +- New examples in JSON. Update the {ref}`examples` page in the docs. -- [dev] ``.tmuxp.json`` now exists as a config for tmuxp development and +- [dev] `.tmuxp.json` now exists as a config for tmuxp development and as an example. -- Fix bug where ``tmuxp kill-session`` would give bad output +- Fix bug where `tmuxp kill-session` would give bad output - Fix bug in tab completion for listing sessions with no tmux server is active. -tmuxp 0.1-dev (2013-10-23) --------------------------- +## tmuxp 0.1-dev (2013-10-23) + - zsh/bash/tcsh completion improvements for tab-completion options -- tmuxp ``kill-session`` with tab-completion. -- tmuxp ``attach-session`` with tab-completion. Attach session will - ``switch-client`` for you if you are inside of of a tmux client. -- tmuxp ``load`` for loading configs. +- tmuxp `kill-session` with tab-completion. +- tmuxp `attach-session` with tab-completion. Attach session will + `switch-client` for you if you are inside of of a tmux client. +- tmuxp `load` for loading configs. - unit test fixes. -tmuxp 0.1-dev (2013-10-21) --------------------------- +## tmuxp 0.1-dev (2013-10-21) + - Make 1.8 the official minimym version, give warning notice to upgrade tmux if out of date - Fix regression causing unexpected build behavior due to unremoved code supporting old tmux versions. -- Added 2 new examples to the :ref:`examples` page. +- Added 2 new examples to the {ref}`examples` page. - Examples now have graphics -- ``$ tmuxp -v`` will print the version info. +- `$ tmuxp -v` will print the version info. + +## tmuxp 0.1-dev (2013-10-19) -tmuxp 0.1-dev (2013-10-19) --------------------------- - tmuxp will now give warning and sys.exit() with a message if - ``tmux`` not found in system PATH -- internal overhaul of :class:`Server`, :class:`Session` - , :class:`Window`, and :class:`Pane` continues. - - - :class:`Server` has @property :meth:`Server.sessions`, which is forward - to :meth:`Server.list_sessions()` (kept to keep tmux commands in - serendipty with api), :meth:`Server._list_sessions()` returns dict - object from :meth:`Server.__list_sessions()` tmux command. - :meth:`Server.__list_sessions()` exists to keep the command layered so + `tmux` not found in system PATH +- internal overhaul of {class}`Server`, {class}`Session` + , {class}`Window`, and {class}`Pane` continues. + + - {class}`Server` has @property {meth}`Server.sessions`, which is forward + to {meth}`Server.list_sessions()` (kept to keep tmux commands in + serendipty with api), {meth}`Server._list_sessions()` returns dict + object from {meth}`Server.__list_sessions()` tmux command. + {meth}`Server.__list_sessions()` exists to keep the command layered so it can be tested against in a matrix with travis and compatibility methods can be made. - - - :class:`Session` now has @proprety :meth:`Session.windows` returning a - list of :class:`Window` objects via :meth:`Session.list_windows()`. - @property :meth:`Session._windows` to :meth:`Session._list_windows()` + - {class}`Session` now has @proprety {meth}`Session.windows` returning a + list of {class}`Window` objects via {meth}`Session.list_windows()`. + @property {meth}`Session._windows` to {meth}`Session._list_windows()` to return a list of dicts without making objects. - - - :class:`Window` now has @proprety :meth:`Window.panes` returning a - list of :class:`Pane` objects via :meth:`Window.list_panes()`. - @property :meth:`Window._panes` to :meth:`Window._list_panes()` + - {class}`Window` now has @proprety {meth}`Window.panes` returning a + list of {class}`Pane` objects via {meth}`Window.list_panes()`. + @property {meth}`Window._panes` to {meth}`Window._list_panes()` to return a list of dicts without making objects. -tmuxp 0.1-dev (2013-10-18) --------------------------- -- internal overhaul of :class:`Server`, :class:`Session`, - :class:`Window`, and :class:`Pane`. +## tmuxp 0.1-dev (2013-10-18) - - ``Session``, ``Window`` and ``Pane`` now refer to a data object - in :class:`Server` internally and always pull the freshest data. +- internal overhaul of {class}`Server`, {class}`Session`, + {class}`Window`, and {class}`Pane`. + - `Session`, `Window` and `Pane` now refer to a data object + in {class}`Server` internally and always pull the freshest data. - A lot of code and complexity regarding setting new data for objects has been reduced since objects use their unique key identifier to - filter their objects through the windows and panes in ``Server`` + filter their objects through the windows and panes in `Server` object. + - `Server` object is what does the updating now. - - ``Server`` object is what does the updating now. - [project] some research into supporting legacy tmux versions. tmux 1.6 and 1.7 support seem likely eventually if there is enough demand. - python 3 support -tmuxp 0.1-dev (2013-10-17) --------------------------- +## tmuxp 0.1-dev (2013-10-17) + - updated README docs with new project details, screenshots -- new example ``.tmuxp.yaml`` file updated to include +- new example `.tmuxp.yaml` file updated to include development workflow. Removed nodemon as the tool for checking files for now. - Support for switching sessions from within tmux. In both cases after the the session is built and if session already exists. -tmuxp 0.1-dev (2013-10-16) --------------------------- -- use :meth:`util.which()` from salt.util to find tmux binary. +## tmuxp 0.1-dev (2013-10-16) + +- use {meth}`util.which()` from salt.util to find tmux binary. - add MANIFEST.in, fix issue where package would not install because missing file - bash / zsh completion. -- New page on :ref:`internals`. -- Updates to :ref:`about_tmux` page. +- New page on {ref}`internals`. +- Updates to {ref}`about_tmux` page. - add vim modeline for rst to bottom of this page -- Server is now a subclass of ``util.TmuxObject``. -- subclasses of :class:`util.TmuxRelationalObject`, - :class:`Server`, :class:`Session`, :class:`Window`, :class:`Pane` now - have :meth:`util.TmuxRelationalObject.getById` (similar to `.get()`_ in - `backbone.js`_ collection), :meth:`util.TmuxRelationalObject.where` and - :meth:`util.TmuxRelationalObject.findWhere` (`.where()`_ and - `.findWhere()`_ in `underscore.js`_), to easily find child objects. +- Server is now a subclass of `util.TmuxObject`. +- subclasses of {class}`util.TmuxRelationalObject`, + {class}`Server`, {class}`Session`, {class}`Window`, {class}`Pane` now + have {meth}`util.TmuxRelationalObject.getById` (similar to [.get()][.get()] in + [backbone.js][backbone.js] collection), {meth}`util.TmuxRelationalObject.where` and + {meth}`util.TmuxRelationalObject.findWhere` ([.where()][.where()] and + [.findWhere()][.findwhere()] in [underscore.js][underscore.js]), to easily find child objects. - tmux object mapping has been split into - :class:`util.TmuxMappingObject`. The mapping and the relational has been - decoupled to allow :class:`Server` to have children while not being a + {class}`util.TmuxMappingObject`. The mapping and the relational has been + decoupled to allow {class}`Server` to have children while not being a dict-like object. -- :class:`Server`, :class:`Session`, :class:`Window`, - :class:`Pane` now explicitly mixin subclasses. +- {class}`Server`, {class}`Session`, {class}`Window`, + {class}`Pane` now explicitly mixin subclasses. + +## tmuxp 0.1-dev (2013-10-15) -tmuxp 0.1-dev (2013-10-15) --------------------------- - new theme - initial examples, misc. updates, front page update. -- support for ``$ tmux .`` to load ``.tmuxp.{yaml/json/py}`` in current +- support for `$ tmux .` to load `.tmuxp.{yaml/json/py}` in current working directory. -- support for ``socket-name`` (``-L``) and ``socket-path`` - (``socket-path``) +- support for `socket-name` (`-L`) and `socket-path` + (`socket-path`) - [config] Support for 1-command pane items. - .. code-block:: yaml + ``` + session_name: my session + windows: + - window_name: hi + panes: + - bash + - htop + ``` - session_name: my session - windows: - - window_name: hi - panes: - - bash - - htop - If session name is already exists, prompt to attach. -tmuxp 0.1-dev (2013-10-14) --------------------------- +## tmuxp 0.1-dev (2013-10-14) + - can now -l to list configs in current directory and $HOME/.tmuxp - tmuxp can now launch configs and build sessions - new exceptions -- :meth:`config.check_consistency()` to verify and diagnose +- {meth}`config.check_consistency()` to verify and diagnose issues with config files. -- :meth:`cli.startup()` -- :meth:`config.is_config_file()` -- :meth:`config.in_dir()` -- :meth:`config.in_cwd()` - -tmuxp 0.1-dev (2013-10-13) --------------------------- -- :meth:`config.inline()` to produce far far better looking +- {meth}`cli.startup()` +- {meth}`config.is_config_file()` +- {meth}`config.in_dir()` +- {meth}`config.in_cwd()` + +## tmuxp 0.1-dev (2013-10-13) + +- {meth}`config.inline()` to produce far far better looking config exports and tests. -- :meth:`Pane.resize_pane()` and tests +- {meth}`Pane.resize_pane()` and tests - documentation fixes and updates -- :meth:`Session.refresh()`, :meth:`Window.refresh()`, - :meth:`Pane.refresh()`. -- :meth:`Server.find()`, :meth:`Session.find()`, - :meth:`Window.find()`. +- {meth}`Session.refresh()`, {meth}`Window.refresh()`, + {meth}`Pane.refresh()`. +- {meth}`Server.find()`, {meth}`Session.find()`, + {meth}`Window.find()`. + +## tmuxp 0.1-dev (2013-10-12) -tmuxp 0.1-dev (2013-10-12) --------------------------- - Test documentation updates -- Builder is now :class:`WorkspaceBuilder` + tests. +- Builder is now {class}`WorkspaceBuilder` + tests. - WorkspaceBuilder can build panes - WorkspaceBuilder can build windows and set options -- :meth:`Window.show_window_options()`, - :meth:`Window.show_window_option()`, :meth:`Window.set_window_option()` -- :meth:`Session.show_options()`, - :meth:`Session.show_option()`, :meth:`Session.set_option()` +- {meth}`Window.show_window_options()`, + {meth}`Window.show_window_option()`, {meth}`Window.set_window_option()` +- {meth}`Session.show_options()`, + {meth}`Session.show_option()`, {meth}`Session.set_option()` + +## tmuxp 0.1-dev (2013-10-11) -tmuxp 0.1-dev (2013-10-11) --------------------------- - More preparation for builder / session maker utility. - test runner and test suite overhaul. - Documentation for development environment and test runner updated. - Travis now tests against tmux 1.8 and latest source. Door open for future testing against python 3 and earlier tmux versions in the future. - Quiet logger down in some areas -- __future__ imports for future python 3 compatibility -- setup.py import __version__ via regex from tmuxp package -- move beginnings of cli to ``tmuxp.cli`` +- **future** imports for future python 3 compatibility +- setup.py import **version** via regex from tmuxp package +- move beginnings of cli to `tmuxp.cli` + +## tmuxp 0.1-dev (2013-10-09) -tmuxp 0.1-dev (2013-10-09) --------------------------- - New logging module - Removed dependency logutils - Removed dependency sh -tmuxp 0.1-dev (2013-10-08) --------------------------- -- switch to semver - -.. _tmuxinator: https://github.com/aziz/tmuxinator -.. _teamocil: https://github.com/remiprev/teamocil -.. _argcomplete: https://github.com/kislyuk/argcomplete -.. _pep257: http://www.python.org/dev/peps/pep-0257/ -.. _pep8: http://www.python.org/dev/peps/pep-0008/ -.. _pep440: http://www.python.org/dev/peps/pep-0440/ -.. _tony/cookiecutter-pypackage: https://github.com/tony/cookiecutter-pypackage - -.. _@tasdomas: https://github.com/tasdomas -.. _@sehe: https://github.com/sehe -.. _@madprog: https://github.com/madprog - -.. _autoenv: https://github.com/kennethreitz/autoenv -.. _entr(1): http://entrproject.org/ -.. _Anaconda Python: http://docs.continuum.io/anaconda/index - -.. _@estin: https://github.com/estin - -.. _sysutils/pytmuxp: http://www.freshports.org/sysutils/py-tmuxp/ -.. _#201564: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201564 +## tmuxp 0.1-dev (2013-10-08) -.. _colorama: https://pypi.python.org/pypi/colorama -.. _@marbu: https://github.com/marbu -.. _@yegortimoshenko: https://github.com/yegortimoshenko -.. _@thomasballinger: https://github.com/thomasballinger - -.. _sniffer: https://github.com/jeffh/sniffer -.. _watchingtestrunner: https://pypi.python.org/pypi/watching_testrunner/1.0 -.. _@raine: https://github.com/raine -.. _@thomasballinger: https://github.com/thomasballinger -.. _@techtonik: https://github.com/techtonik - -.. _@ThiefMaster: https://github.com/ThiefMaster - -.. _PEP 263: http://www.python.org/dev/peps/pep-0263/ - -.. _roxit: https://github.com/roxit - -.. _documentation in Chinese: http://tmuxp-zh.readthedocs.io -.. _wrongwaycn: https://github.com/wrongwaycn - -.. _tornado's log.py: https://github.com/facebook/tornado/blob/master/tornado/log.py - -.. _underscore.js: http://underscorejs.org/ -.. _backbone.js: http://backbonejs.org/ -.. _.get(): http://backbonejs.org/#Collection-get -.. _.where(): http://underscorejs.org/#where -.. _.findWhere(): http://underscorejs.org/#findWhere - -.. _libtmux: https://github.com/tmux-python/libtmux +- switch to semver -.. # vim: set filetype=rst: +[tmuxinator]: https://github.com/aziz/tmuxinator +[teamocil]: https://github.com/remiprev/teamocil +[argcomplete]: https://github.com/kislyuk/argcomplete +[pep257]: http://www.python.org/dev/peps/pep-0257/ +[pep8]: http://www.python.org/dev/peps/pep-0008/ +[pep440]: http://www.python.org/dev/peps/pep-0440/ +[tony/cookiecutter-pypackage]: https://github.com/tony/cookiecutter-pypackage +[@tasdomas]: https://github.com/tasdomas +[@sehe]: https://github.com/sehe +[@madprog]: https://github.com/madprog +[autoenv]: https://github.com/kennethreitz/autoenv +[entr(1)]: http://entrproject.org/ +[anaconda python]: http://docs.continuum.io/anaconda/index +[@estin]: https://github.com/estin +[sysutils/pytmuxp]: http://www.freshports.org/sysutils/py-tmuxp/ +[#201564]: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201564 +[colorama]: https://pypi.python.org/pypi/colorama +[@marbu]: https://github.com/marbu +[@yegortimoshenko]: https://github.com/yegortimoshenko +[@thomasballinger]: https://github.com/thomasballinger +[sniffer]: https://github.com/jeffh/sniffer +[watchingtestrunner]: https://pypi.python.org/pypi/watching_testrunner/1.0 +[@raine]: https://github.com/raine +[@techtonik]: https://github.com/techtonik +[@thiefmaster]: https://github.com/ThiefMaster +[pep 263]: http://www.python.org/dev/peps/pep-0263/ +[roxit]: https://github.com/roxit +[documentation in chinese]: http://tmuxp-zh.readthedocs.io +[wrongwaycn]: https://github.com/wrongwaycn +[tornado's log.py]: https://github.com/facebook/tornado/blob/master/tornado/log.py +[underscore.js]: http://underscorejs.org/ +[backbone.js]: http://backbonejs.org/ +[.get()]: http://backbonejs.org/#Collection-get +[.where()]: http://underscorejs.org/#where +[.findwhere()]: http://underscorejs.org/#findWhere +[libtmux]: https://github.com/tmux-python/libtmux + + diff --git a/MANIFEST.in b/MANIFEST.in index 286f82ec1d..59830093c7 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ include README.md LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt -recursive-include docs *.rst +recursive-include docs *.md recursive-include tests *.py *.yaml *.json *.sh recursive-include examples *.yaml *.json diff --git a/docs/about.md b/docs/about.md new file mode 100644 index 0000000000..f0fe880825 --- /dev/null +++ b/docs/about.md @@ -0,0 +1,119 @@ +```{module} tmuxp + +``` + +(about)= + +# About + +tmuxp helps you manage tmux workspaces. + +Built on a object relational mapper for tmux. tmux users can reload common +workspaces from YAML, JSON and {py:obj}`dict` configurations like +[tmuxinator][tmuxinator] and [teamocil][teamocil]. + +tmuxp is used by developers for tmux automation at great companies like +[Bugsnag][bugsnag], [Pragmatic Coders][pragmatic coders] and many others. + +To jump right in, see {ref}`quickstart` and {ref}`examples`. + +Interested in some kung-fu or joining the effort? {ref}`api` and +{ref}`developing`. + +[MIT-licensed][mit-licensed]. Code on [github](). + +[bugsnag]: https://blog.bugsnag.com/benefits-of-using-tmux/ + +[pragmatic coders]: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ + +## Differences from tmuxinator / teamocil + +:::{note} + +If you use teamocil / tmuxinator and can clarify or add differences, +please free to [edit this page][edit this page] on github. + +::: + +### Similarities + +**Load sessions** Loads tmux sessions from config + +**YAML** Supports YAML format + +**Inlining / shorthand configuration** All three support short-hand and +simplified markup for panes that have one command. + +**Maturity and stability** As of 2016, all three are considered stable, +well tested and adopted. + +### Missing + +**Version support** tmuxp only supports `tmux >= 1.8`. Teamocil and +tmuxinator may have support for earlier versions. + +### Differences + +**Programming Language** python. teamocil and tmuxinator uses ruby. + +**Workspace building process** teamocil and tmuxinator process configs +directly shell commands. tmuxp processes configuration via ORM layer. + +## Additional Features + +**CLI** tmuxp's CLI can attach and kill sessions with tab-completion +support. See {ref}`commands`. + +**Import config** import configs from Teamocil / Tmuxinator [^id4]. See +{ref}`cli_import`. + +**Session freezing** Supports session freezing into YAML and JSON +format [^id4]. See {ref}`cli_freeze`. + +**JSON config** JSON config support. See {ref}`Examples`. + +**ORM-based API** via [libtmux][libtmux] - Utilitizes tmux >= 1.8's unique ID's for +panes, windows and sessions to create an object relational view of the tmux +{class}`~libtmux.Server`, its {class}`~libtmux.Session`, +{class}`~libtmux.Window`, and {class}`~libtmux.Pane`. +See {ref}`libtmux's internals `. + +**Conversion** `$ tmuxp convert ` can convert files to and +from JSON and YAML. + +[^id4]: While freezing and importing sessions is a great way to save time, + tweaking will probably be required - There is no substitute to a + config made with love. + +[libtmux]: https://libtmux.git-pull.com + +## Minor tweaks + +- Unit tests against live tmux version to test statefulness of tmux + sessions, windows and panes. See {ref}`travis`. +- Load + switch to new session from inside tmux. +- Resume session if config loaded. +- Pre-commands virtualenv / rvm / any other commands. +- Load config from anywhere `$ tmuxp load /full/file/path.json`. +- Load config `.tmuxp.yaml` or `.tmuxp.json` from current working + directory with `$ tmuxp load .`. +- `$ tmuxp -2`, `$ tmuxp -8` for forcing term colors a la + {term}`tmux(1)`. +- `$ tmuxp -L`, `$ tmuxp -S` for sockets and + `$ tmuxp -f` for config file. + +[attempt at 1.7 test]: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 + +[kaptan]: https://github.com/emre/kaptan + +[mit-licensed]: http://opensource.org/licenses/MIT + +[tmuxinator]: https://github.com/aziz/tmuxinator + +[teamocil]: https://github.com/remiprev/teamocil + +[erb]: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html + +[edit this page]: https://github.com/tmux-python/tmuxp/edit/master/doc/about.rst + + diff --git a/docs/about.rst b/docs/about.rst deleted file mode 100644 index 0b693e4759..0000000000 --- a/docs/about.rst +++ /dev/null @@ -1,115 +0,0 @@ -.. module:: tmuxp - -.. _about: - -===== -About -===== - -tmuxp helps you manage tmux workspaces. - -Built on a object relational mapper for tmux. tmux users can reload common -workspaces from YAML, JSON and :py:obj:`dict` configurations like -`tmuxinator`_ and `teamocil`_. - -tmuxp is used by developers for tmux automation at great companies like -`Bugsnag`_, `Pragmatic Coders`_ and many others. - -To jump right in, see :ref:`quickstart` and :ref:`examples`. - -Interested in some kung-fu or joining the effort? :ref:`api` and -:ref:`developing`. - -`MIT-licensed`_. Code on `github -`_. - -.. _Bugsnag: https://blog.bugsnag.com/benefits-of-using-tmux/ -.. _Pragmatic Coders: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ - -Differences from tmuxinator / teamocil --------------------------------------- - -.. note:: - - If you use teamocil / tmuxinator and can clarify or add differences, - please free to `edit this page`_ on github. - -Similarities -~~~~~~~~~~~~ - -**Load sessions** Loads tmux sessions from config - -**YAML** Supports YAML format - -**Inlining / shorthand configuration** All three support short-hand and -simplified markup for panes that have one command. - -**Maturity and stability** As of 2016, all three are considered stable, -well tested and adopted. - -Missing -~~~~~~~ - -**Version support** tmuxp only supports ``tmux >= 1.8``. Teamocil and -tmuxinator may have support for earlier versions. - -Differences -~~~~~~~~~~~ - -**Programming Language** python. teamocil and tmuxinator uses ruby. - -**Workspace building process** teamocil and tmuxinator process configs -directly shell commands. tmuxp processes configuration via ORM layer. - -Additional Features -------------------- - -**CLI** tmuxp's CLI can attach and kill sessions with tab-completion -support. See :ref:`commands`. - -**Import config** import configs from Teamocil / Tmuxinator [1]_. See -:ref:`cli_import`. - -**Session freezing** Supports session freezing into YAML and JSON -format [1]_. See :ref:`cli_freeze`. - -**JSON config** JSON config support. See :ref:`Examples`. - -**ORM-based API** via `libtmux`_ - Utilitizes tmux >= 1.8's unique ID's for -panes, windows and sessions to create an object relational view of the tmux -:class:`~libtmux.Server`, its :class:`~libtmux.Session`, -:class:`~libtmux.Window`, and :class:`~libtmux.Pane`. -See :ref:`libtmux's internals `. - -**Conversion** ``$ tmuxp convert `` can convert files to and -from JSON and YAML. - -.. [1] While freezing and importing sessions is a great way to save time, - tweaking will probably be required - There is no substitute to a - config made with love. - -.. _libtmux: https://libtmux.git-pull.com - -Minor tweaks ------------- - -- Unit tests against live tmux version to test statefulness of tmux - sessions, windows and panes. See :ref:`travis`. -- Load + switch to new session from inside tmux. -- Resume session if config loaded. -- Pre-commands virtualenv / rvm / any other commands. -- Load config from anywhere ``$ tmuxp load /full/file/path.json``. -- Load config ``.tmuxp.yaml`` or ``.tmuxp.json`` from current working - directory with ``$ tmuxp load .``. -- ``$ tmuxp -2``, ``$ tmuxp -8`` for forcing term colors a la - :term:`tmux(1)`. -- ``$ tmuxp -L``, ``$ tmuxp -S`` for sockets and - ``$ tmuxp -f`` for config file. - -.. _attempt at 1.7 test: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 -.. _kaptan: https://github.com/emre/kaptan -.. _MIT-licensed: http://opensource.org/licenses/MIT -.. _tmuxinator: https://github.com/aziz/tmuxinator -.. _teamocil: https://github.com/remiprev/teamocil -.. _ERB: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html -.. _edit this page: https://github.com/tmux-python/tmuxp/edit/master/doc/about.rst diff --git a/docs/about_tmux.rst b/docs/about_tmux.md similarity index 70% rename from docs/about_tmux.rst rename to docs/about_tmux.md index 72dfee9929..e3cc88a3f6 100644 --- a/docs/about_tmux.rst +++ b/docs/about_tmux.md @@ -1,14 +1,14 @@ -.. _about_tmux: +(about-tmux)= -############### -The Tao of tmux -############### +# The Tao of tmux -.. figure:: /_static/tao-tmux-screenshot.png - :scale: 60% - :align: center +:::{figure} /_static/tao-tmux-screenshot.png +:scale: 60% +:align: center - ISC-licensed terminal multiplexer. +ISC-licensed terminal multiplexer. + +::: tmux is geared for developers and admins who interact regularly with CLI (text-only interfaces) @@ -29,13 +29,11 @@ the text dimension. Inside tmux you can: - have multiple windows (window) in the workspace (session) - switch between multiple workspaces, like virtual desktops -============= -Thinking tmux -============= +## Thinking tmux -Text-based window manager -------------------------- +### Text-based window manager +```{eval_rst} =================== ====================== =============================== **tmux** **"Desktop"-Speak** **Plain English** ------------------- ---------------------- ------------------------------- @@ -46,8 +44,10 @@ Window Virtual Desktop or A desktop that stores it own applications screen Pane Application Performs operations =================== ====================== =============================== +``` -.. aafig:: +```{eval-rst} +.. aafig:: :textual: +----------------------------------------------------------------+ @@ -65,27 +65,32 @@ Pane Application Performs operations +----------------------------------------------------------------+ | session | \----------------------------------------------------------------/ +``` + +- 1 {term}`Server`. + + - has 1 or more {term}`Session`. -- 1 :term:`Server`. + - has 1 or more {term}`Window`. - - has 1 or more :term:`Session`. + - has 1 or more {term}`Pane`. - - has 1 or more :term:`Window`. +:::{seealso} - - has 1 or more :term:`Pane`. +{ref}`glossary` has a dictionary of tmux words. -.. seealso:: :ref:`glossary` has a dictionary of tmux words. +::: -CLI Power Tool --------------- +### CLI Power Tool Multiple applications or terminals to run on the same screen by splitting up 1 terminal into multiple. One screen can be used to edit a file, and another may be used to -``$ tail -F`` a logfile. +`$ tail -F` a logfile. -.. aafig:: +```{eval-rst} +.. aafig:: +--------+--------+ | $ bash | $ bash | @@ -96,8 +101,10 @@ One screen can be used to edit a file, and another may be used to | | | | | | +--------+--------+ +``` -.. aafig:: +```{eval-rst} +.. aafig:: +--------+--------+ | $ bash | $ bash | @@ -108,10 +115,12 @@ One screen can be used to edit a file, and another may be used to | | | | | | +--------+--------+ +``` tmux supports as manys terminals as you want. -.. aafig:: +```{eval-rst} +.. aafig:: :textual: +---------+---------+ @@ -139,16 +148,17 @@ tmux supports as manys terminals as you want. +-------------------+ | '1:sys 2:vim*' | +-------------------+ +``` You can switch between the windows you create. -Resume everything later ------------------------ +### Resume everything later You can leave tmux and all applications running (detach), log out, make a sandwich, and re-(attach), all applications are still running! -.. aafig:: +```{eval-rst} +.. aafig:: :textual: +--------+--------+ @@ -197,24 +207,22 @@ sandwich, and re-(attach), all applications are still running! | | | | | | +--------+--------+ +``` -Manage workflow ---------------- +### Manage workflow - System administrators monitor logs and services. - Programmers like to have an editor open with a CLI nearby. Applications running on a remote server can be launched inside of a tmux -session, detached, and reattached next timeyour `"train of thought"`_ and +session, detached, and reattached next timeyour ["train of thought"]["train of thought"] and work. Multitasking. Preserving the thinking you have. -.. _"train of thought": http://en.wikipedia.org/wiki/Train_of_thought +["train of thought"]: http://en.wikipedia.org/wiki/Train_of_thought -=============== -Installing tmux -=============== +## Installing tmux tmux is packaged on most Linux and BSD systems. @@ -224,76 +232,83 @@ slightly different between distributions. This documentation is written for version **1.8**. It's important that you have the latest stable release of tmux. The latest stable version is -viewable on the `tmux homepage`_. +viewable on the [tmux homepage][tmux homepage]. **Mac OS X** users may install that latest stable version of tmux through -`MacPorts`_, `fink`_ or `Homebrew`_ (aka brew). +[MacPorts][macports], [fink][fink] or [Homebrew][homebrew] (aka brew). + +If **compiling from source**, the dependencies are [libevent][libevent] and +[ncurses][ncurses]. + +[tmux homepage]: http://tmux.sourceforge.net/ -If **compiling from source**, the dependencies are `libevent`_ and -`ncurses`_. +[libevent]: http://www.monkey.org/~provos/libevent/ -.. _tmux homepage: http://tmux.sourceforge.net/ -.. _libevent: http://www.monkey.org/~provos/libevent/ -.. _ncurses: http://invisible-island.net/ncurses/ -.. _MacPorts: http://www.macports.org/ -.. _Fink: http://fink.thetis.ig42.org/ -.. _Homebrew: http://www.brew.sh +[ncurses]: http://invisible-island.net/ncurses/ -========== -Using tmux -========== +[macports]: http://www.macports.org/ -Start a new session -------------------- +[fink]: http://fink.thetis.ig42.org/ -.. code-block:: bash +[homebrew]: http://www.brew.sh - $ tmux +## Using tmux + +### Start a new session + +```{code-block} bash + +$ tmux + +``` That's all it takes to launch yourself into a tmux session. -.. admonition:: Common pitfall - :class: note +:::{admonition} Common pitfall +:class: note + +Running `$ tmux list-sessions` or any other command for listing tmux +entities (such as `$ tmux list-windows` or `$ tmux list-panes`). +This can generate the error "failed to connect to server". - Running ``$ tmux list-sessions`` or any other command for listing tmux - entities (such as ``$ tmux list-windows`` or ``$ tmux list-panes``). - This can generate the error "failed to connect to server". +This could be because: - This could be because: +- tmux server has killed its' last session, killing the server. +- tmux server has encountered a crash. (tmux is highly stable, + this will rarely happen) +- tmux has not be launched yet at all. - - tmux server has killed its' last session, killing the server. - - tmux server has encountered a crash. (tmux is highly stable, - this will rarely happen) - - tmux has not be launched yet at all. +::: -.. _Prefix key: +(prefix-key)= -The prefix key --------------- +### The prefix key Tmux hot keys have to be pressed in a special way. **Read this carefully**, then try it yourself. -First, you press the *prefix* key. This is ``C-b`` by default. +First, you press the *prefix* key. This is `C-b` by default. Release. Then pause. For less than second. Then type what's next. -``C-b o`` means: Press ``Ctrl`` and ``b`` at the same time. Release, -Then press ``o``. +`C-b o` means: Press `Ctrl` and `b` at the same time. Release, +Then press `o`. -**Remember, prefix + short cut!** ``C`` is ``Ctrl`` key. +**Remember, prefix + short cut!** `C` is `Ctrl` key. -Session Name ------------- +### Session Name Sessions can be *named upon creation*. -.. code-block:: bash +```{code-block} bash - $ tmux new-session [-s session-name] +$ tmux new-session [-s session-name] + +``` Sessions can be *renamed after creation*. +```{eval_rst} =============== ========================================================= Command .. code-block:: bash @@ -301,18 +316,21 @@ Command .. code-block:: bash Short cut ``Prefix`` + ``$`` =============== ========================================================= +``` -Window Name ------------ +### Window Name Windows can be *named upon creation*. -.. code-block:: bash +```{code-block} bash + +$ tmux new-window [-n window-name] - $ tmux new-window [-n window-name] +``` Windows can be *renamed after creation*. +```{eval_rst} =============== ========================================================== Command .. code-block:: bash @@ -320,10 +338,11 @@ Command .. code-block:: bash Short cut ``Prefix`` + ``,`` =============== ========================================================== +``` -Creating new windows --------------------- +### Creating new windows +```{eval_rst} =============== ========================================================= Command .. code-block:: bash @@ -333,34 +352,43 @@ Short cut ``Prefix`` + ``c`` You may then rename window. =============== ========================================================= +``` -Traverse windows ----------------- +### Traverse windows By number -.. code-block:: bash +```{code-block} bash + +$ tmux select-window - $ tmux select-window +``` Next -.. code-block:: bash +```{code-block} bash - $ tmux next-window +$ tmux next-window + +``` Previous -.. code-block:: bash +```{code-block} bash + +$ tmux previous-window - $ tmux previous-window +``` Last-window -.. code-block:: bash +```{code-block} bash - $ tmux last-window +$ tmux last-window +``` + +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -375,36 +403,43 @@ Short cut Action marker. =================== ==================================================== +``` -Move windows ------------- +### Move windows Move window -.. code-block:: bash +```{code-block} bash + +$ tmux move-window [-t dst-window] - $ tmux move-window [-t dst-window] +``` Swap the window -.. code-block:: bash +```{code-block} bash + +$ tmux swap-window [-t dst-window] - $ tmux swap-window [-t dst-window] +``` +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- ``.`` Prompt for an index to move the current window. =================== ==================================================== +``` +### Move panes -Move panes ----------- +```{code-block} bash -.. code-block:: bash +$ tmux move-pane [-t dst-pane] - $ tmux move-pane [-t dst-pane] +``` +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -412,157 +447,176 @@ Short cut Action ``{`` Swap the current pane with the previous pane. ``}`` Swap the current pane with the next pane. =================== ==================================================== +``` - -Traverse panes --------------- +### Traverse panes Shortcut to move between panes. -.. code-block:: bash +```{code-block} bash + +$ tmux last-window - $ tmux last-window +``` -.. code-block:: bash +```{code-block} bash - $ tmux next-window +$ tmux next-window +``` + +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- ``Up, Down`` Change to the pane above, below, to the left, or to ``Left, Right`` the right of the current pane. =================== ==================================================== +``` +Recipe: tmux conf to `hjkl` commands, add this to your +`~/.tmux.conf`: -Recipe: tmux conf to ``hjkl`` commands, add this to your -``~/.tmux.conf``:: +``` +# hjkl pane traversal +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R +``` - # hjkl pane traversal - bind h select-pane -L - bind j select-pane -D - bind k select-pane -U - bind l select-pane -R +### Kill window -Kill window ------------ +```{code-block} bash -.. code-block:: bash +$ tmux kill-window [-t target-window] - $ tmux kill-window [-t target-window] +``` +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- ``&`` Kill the current window. =================== ==================================================== +``` + +### Kill pane -Kill pane ---------- +```{code-block} bash -.. code-block:: bash +$ tmux kill-pane [-t target-pane] - $ tmux kill-pane [-t target-pane] +``` +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- ``x`` Kill the current pane. =================== ==================================================== +``` + +### Splitting windows into panes -Splitting windows into panes ----------------------------- +```{code-block} bash -.. code-block:: bash +$ tmux split-window [-c start-directory] - $ tmux split-window [-c start-directory] +``` Tmux windows can be split into multiple panes. +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- ``%`` Split the current pane into two, left and right. ``"`` Split the current pane into two, top and bottom. =================== ==================================================== +``` -================ -Configuring tmux -================ +## Configuring tmux -Tmux can be configured via a configuration at ``~/.tmux.conf``. +Tmux can be configured via a configuration at `~/.tmux.conf`. Depending on your tmux version, there is different options available. -Vi-style copy and paste ------------------------ +### Vi-style copy and paste + +```{code-block} sh + +# Vi copypaste mode +set-window-option -g mode-keys vi +bind-key -t vi-copy 'v' begin-selection +bind-key -t vi-copy 'y' copy-selection -.. code-block:: sh +``` - # Vi copypaste mode - set-window-option -g mode-keys vi - bind-key -t vi-copy 'v' begin-selection - bind-key -t vi-copy 'y' copy-selection +### Aggressive resizing for clients -Aggressive resizing for clients -------------------------------- +```{code-block} sh -.. code-block:: sh +setw -g aggressive-resize on - setw -g aggressive-resize on +``` -Reload config -------------- +### Reload config -```` + ``r``. +`` + `r`. -.. code-block:: sh +```{code-block} sh - bind r source-file ~/.tmux.conf \; display-message "Config reloaded." +bind r source-file ~/.tmux.conf \; display-message "Config reloaded." -Status lines ------------- +``` + +### Status lines Tmux allows configuring a status line that displays system information, -window list, and even pipe in the ``stdout`` of an application. +window list, and even pipe in the `stdout` of an application. -You can use `tmux-mem-cpu-load`_ to get stats (requires compilation) and -`basic-cpu-and-memory.tmux`_. You can pipe in a bash command to a tmux +You can use [tmux-mem-cpu-load][tmux-mem-cpu-load] to get stats (requires compilation) and +[basic-cpu-and-memory.tmux][basic-cpu-and-memory.tmux]. You can pipe in a bash command to a tmux status line like: -.. code-block:: sh +```{code-block} sh + +$(shell-command) - $(shell-command) +``` -So if ``/usr/local/bin/tmux-mem-cpu-load`` outputs stats to -``stdout``, then ``$(tmux-mem-cpu-load)`` is going to output the first +So if `/usr/local/bin/tmux-mem-cpu-load` outputs stats to +`stdout`, then `$(tmux-mem-cpu-load)` is going to output the first line to the status line. The interval is determined by the -``status-interval``:: +`status-interval`: + +``` +set -g status-interval 1 +``` - set -g status-interval 1 +[tmux-mem-cpu-load]: https://github.com/thewtex/tmux-mem-cpu-load -.. _tmux-mem-cpu-load: https://github.com/thewtex/tmux-mem-cpu-load -.. _basic-cpu-and-memory.tmux: https://github.com/zaiste/tmuxified/blob/master/scripts/basic-cpu-and-memory.tmux +[basic-cpu-and-memory.tmux]: https://github.com/zaiste/tmuxified/blob/master/scripts/basic-cpu-and-memory.tmux -Examples --------- +### Examples -- https://github.com/tony/tmux-config - works with tmux 1.5+. Supports - screen's ``ctrl-a`` :ref:`Prefix key`. Support for system cpu, memory, +- - works with tmux 1.5+. Supports + screen's `ctrl-a` {ref}`Prefix key`. Support for system cpu, memory, uptime stats. - Add yours, edit this page on github. -========= -Reference -========= +## Reference -Short cuts ----------- +### Short cuts -.. tip:: +:::{tip} - :ref:`Prefix key` is pressed before a short cut! +{ref}`Prefix key` is pressed before a short cut! +::: + +```{eval_rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -624,50 +678,65 @@ Short cut Action ``M-Up, M-Down`` Resize the current pane in steps of five cells. ``M-Left, M-Right`` =================== ==================================================== +``` + +Source: tmux manpage [^id2]. + +To get the text documentation of a `.1` manual file: + +```{code-block} bash + +$ nroff -mdoc tmux.1|less + +``` + +[^id2]: + +[creative commons by-nc-nd 3.0 us]: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ + +### The Book + +:::::::{container} book-container + +::::{container} leftside-book -Source: tmux manpage [1]_. +:::{figure} https://s3.amazonaws.com/titlepages.leanpub.com/the-tao-of-tmux/large +:scale: 100% +:width: 301 +:height: 390 +:align: left +:target: https://leanpub.com/the-tao-of-tmux +:alt: The Tao of tmux -To get the text documentation of a ``.1`` manual file: +::: -.. code-block:: bash +:::: - $ nroff -mdoc tmux.1|less +::::{container} rightside-book -.. [1] http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/tmux.1 +*The Tao of tmux* is available on [Leanpub][leanpub] and [Kindle][kindle] (Amazon). -.. _Creative Commons BY-NC-ND 3.0 US: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ +:::{figure} _static/img/books/amazon-logo.png +:scale: 19% +:target: http://amzn.to/2gPfRhC +:alt: Amazon Kindle -The Book --------- +::: -.. container:: book-container +Read and browse the book for [free on the web][free on the web]. - .. container:: leftside-book +:::: - .. figure:: https://s3.amazonaws.com/titlepages.leanpub.com/the-tao-of-tmux/large - :scale: 100% - :width: 301 - :height: 390 - :align: left - :target: https://leanpub.com/the-tao-of-tmux - :alt: The Tao of tmux +[free on the web]: https://leanpub.com/the-tao-of-tmux/read - .. container:: rightside-book +[leanpub]: https://leanpub.com/the-tao-of-tmux - *The Tao of tmux* is available on `Leanpub`_ and `Kindle`_ (Amazon). +[kindle]: http://amzn.to/2gPfRhC - .. figure:: _static/img/books/amazon-logo.png - :scale: 19% - :target: http://amzn.to/2gPfRhC - :alt: Amazon Kindle +::::::: - Read and browse the book for `free on the web`_. +### License - .. _free on the web: https://leanpub.com/the-tao-of-tmux/read - .. _Leanpub: https://leanpub.com/the-tao-of-tmux - .. _Kindle: http://amzn.to/2gPfRhC +This page is licensed [Creative Commons BY-NC-ND 3.0 US][creative commons by-nc-nd 3.0 us]. -License -------- -This page is licensed `Creative Commons BY-NC-ND 3.0 US`_. diff --git a/docs/api.rst b/docs/api.md similarity index 60% rename from docs/api.rst rename to docs/api.md index c3b523ddd3..37beeb2360 100644 --- a/docs/api.rst +++ b/docs/api.md @@ -1,84 +1,147 @@ -.. _api: +(api)= -============= -API Reference -============= +# API Reference -.. seealso:: - See :ref:`libtmux's API ` and :ref:`Quickstart - ` to see how you can control tmux via python API calls. +:::{seealso} -.. module:: tmuxp +See {ref}`libtmux's API ` and {ref}`Quickstart +` to see how you can control tmux via python API calls. -Internals ---------- +::: +```{module} tmuxp + +``` + +## Internals + +```{eval-rst} .. automethod:: tmuxp.util.run_before_script +``` +```{eval-rst} .. automethod:: tmuxp.util.oh_my_zsh_auto_title +``` +```{eval-rst} .. automethod:: tmuxp.util.raise_if_tmux_not_running +``` +```{eval-rst} .. automethod:: tmuxp.util.get_current_pane +``` +```{eval-rst} .. automethod:: tmuxp.util.get_session +``` +```{eval-rst} .. automethod:: tmuxp.util.get_window +``` +```{eval-rst} .. automethod:: tmuxp.util.get_pane +``` -CLI ---- +## CLI +```{eval-rst} .. automethod:: tmuxp.cli._reattach +``` + +```{eval-rst} .. automethod:: tmuxp.cli.get_config_dir +``` + +```{eval-rst} .. automethod:: tmuxp.cli.get_teamocil_dir +``` + +```{eval-rst} .. automethod:: tmuxp.cli.get_tmuxinator_dir +``` + +```{eval-rst} .. automethod:: tmuxp.cli.load_workspace +``` + +```{eval-rst} .. automethod:: tmuxp.cli._validate_choices +``` -Configuration -------------- +## Configuration -Finding -""""""" +### Finding +```{eval-rst} .. automethod:: tmuxp.config.is_config_file +``` + +```{eval-rst} .. automethod:: tmuxp.config.in_dir +``` + +```{eval-rst} .. automethod:: tmuxp.config.in_cwd +``` -Import and export -""""""""""""""""" +### Import and export +```{eval-rst} .. automethod:: tmuxp.config.validate_schema +``` +```{eval-rst} .. automethod:: tmuxp.config.expandshell +``` +```{eval-rst} .. automethod:: tmuxp.config.expand +``` +```{eval-rst} .. automethod:: tmuxp.config.inline +``` +```{eval-rst} .. automethod:: tmuxp.config.trickle +``` +```{eval-rst} .. automethod:: tmuxp.config.import_teamocil +``` +```{eval-rst} .. automethod:: tmuxp.config.import_tmuxinator +``` -Workspace Builder ------------------ +## Workspace Builder +```{eval-rst} .. autoclass:: tmuxp.workspacebuilder.WorkspaceBuilder :members: +``` +```{eval-rst} .. automethod:: tmuxp.workspacebuilder.freeze +``` -Exceptions ----------- +## Exceptions +```{eval-rst} .. autoexception:: tmuxp.exc.EmptyConfigException +``` +```{eval-rst} .. autoexception:: tmuxp.exc.ConfigError +``` +```{eval-rst} .. autoexception:: tmuxp.exc.BeforeLoadScriptError +``` +```{eval-rst} .. autoexception:: tmuxp.exc.BeforeLoadScriptNotExists +``` + + diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000000..8241f8eb63 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,279 @@ +(cli)= + +(commands)= + +# Command Line Interface + +(completion)= + +## Completion + +In bash (`~/.bashrc`): + +```{code-block} sh + +eval "$(_TMUXP_COMPLETE=source tmuxp)" + +``` + +In zsh (`~/.zshrc`): + +```{code-block} sh + +eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" + +``` + +(cli-shell)= + +## Shell + +``` +tmuxp shell + +tmuxp shell + +tmuxp shell + +tmuxp shell -c 'python code' +``` + +Launch into a python console with [libtmux][libtmux] objects. Compare to django's shell. + +> > ```{image} _static/tmuxp-shell.gif +> :width: 100% +> +> ``` +> +Automatically preloads current tmux {class}`server `, +{class}`session `, {class}`window ` +{class}`pane `. Pass additional arguments to select a +specific one of your choice: + +``` +(Pdb) server + +(Pdb) server.sessions +[Session($1 your_project)] +(Pdb) session +Session($1 your_project) +(Pdb) session.name +'your_project' +(Pdb) window +Window(@3 1:your_window, Session($1 your_project)) +(Pdb) window.name +'your_window' +(Pdb) window.panes +[Pane(%6 Window(@3 1:your_window, Session($1 your_project))) +(Pdb) pane +Pane(%6 Window(@3 1:your_window, Session($1 your_project))) +``` + +Python 3.7 supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and supports +compatible debuggers, for instance [ipdb][ipdb]: + +```{code-block} sh + +$ pip install ipdb +$ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell + +``` + +You can also pass in python code directly, similar to `python -c`, do +this via `tmuxp -c`: + +```{code-block} shell + +$ tmuxp shell -c 'print(session.name); print(window.name)' +my_server +my_window + +$ tmuxp shell my_server -c 'print(session.name); print(window.name)' +my_server +my_window + +$ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' +my_server +my_window + +$ tmuxp shell my_server my_window -c 'print(window.name.upper())' +MY_WINDOW + +# Assuming inside a tmux pane or one is attached on default server +$ tmuxp shell -c 'print(pane.id); print(pane.window.name)' +%2 +my_window + +``` + +[pep 553]: https://www.python.org/dev/peps/pep-0553/ + +[ipdb]: https://pypi.org/project/ipdb/ + +[libtmux]: https://libtmux.git-pull.com + +### Shell detection + +`tmuxp shell` detects the richest shell available in your *site packages*, you can also pick your shell via args: + +- `--pdb`: Use plain old `breakpoint()` (python 3.7+) or + `pdb.set_trace` +- `--code`: Drop into `code.interact`, accepts `--use-pythonrc` +- `--bpython`: Drop into bpython +- `--ipython`: Drop into ipython +- `--ptpython`: Drop into ptpython, accepts `--use-vi-mode` +- `--ptipython`: Drop into ipython + ptpython, accepts + `--use-vi-mode` + +(cli-freeze)= + +## Freeze sessions + +``` +tmuxp freeze +``` + +You can save the state of your tmux session by freezing it. + +Tmuxp will offer to save your session state to `.json` or `.yaml`. + +(cli-load)= + +## Load session + +You can load your tmuxp file and attach the vim session via a few +shorthands: + +1. The directory with a `.tmuxp.{yaml,yml,json}` file in it +2. The name of the project file in your {}`$HOME/.tmuxp` folder +3. The direct path of the tmuxp file you want to load + +``` +# path to folder with .tmuxp.{yaml,yml,json} +tmuxp load . +tmuxp load ../ +tmuxp load path/to/folder/ +tmuxp load /path/to/folder/ + +# name of the config, assume $HOME/.tmuxp/myconfig.yaml +tmuxp load myconfig + +# direct path to json/yaml file +tmuxp load ./myfile.yaml +tmuxp load /abs/path/to/myfile.yaml +tmuxp load ~/myfile.yaml +``` + +Absolute and relative directory paths are supported. + +```{code-block} bash + +$ tmuxp load + +``` + +Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working +directory may be loaded with: + +```{code-block} bash + +$ tmuxp load . + +``` + +If you try to load a config file from within a tmux session, it will ask you +if you want to load and attach to the new session, or just load detached. +You can also load a config file and append the windows to the current active session. + +``` +Already inside TMUX, switch to session? yes/no +Or (a)ppend windows in the current active session? +[y/n/a]: +``` + +All of these options can be preselected to skip the prompt: + +```{code-block} bash $ tmuxp load -y config # load attached $ tmuxp load -d config # load detached $ tmuxp load -a config # append windows + +``` + +Multiple sessions can be loaded at once. The first ones will be created +without being attached. The last one will be attached if there is no +`-d` flag on the command line. + +```{code-block} bash + +$ tmuxp load ... + +``` + +A session name can be provided at the terminal. If multiple sessions +are created, the last session is named from the terminal. + +```{code-block} bash + +$ tmxup load -s ... + +``` + +The output of the `load` command can be logged to a file for +debugging purposes. the log level can be controlled with the global +`--log-level` option (defaults to INFO). + +```{code-block} bash + +$ tmuxp load --log-file +$ tmuxp --log-level load --log-file + +``` + +(cli-debug-info)= + +## Debug Info + +Use to collect all relevant information for submitting an issue to +the project. + +```{code-block} bash + +$ tmuxp debug-info +-------------------------- +environment: + system: Linux + arch: x86_64 +... + +``` + +(cli-import)= + +## Import + +(import-teamocil)= + +### From teamocil + +``` +tmuxp import teamocil /path/to/file.{json,yaml} +``` + +(import-tmuxinator)= + +### From tmuxinator + +``` +tmuxp import tmuxinator /path/to/file.{json,yaml} +``` + +(convert-config)= + +## Convert between YAML and JSON + +``` +tmuxp convert /path/to/file.{json,yaml} +``` + +tmuxp automatically will prompt to convert `.yaml` to `.json` and +`.json` to `.yaml`. + + diff --git a/docs/cli.rst b/docs/cli.rst deleted file mode 100644 index 703ad8cdcb..0000000000 --- a/docs/cli.rst +++ /dev/null @@ -1,264 +0,0 @@ -.. _cli: -.. _commands: - -====================== -Command Line Interface -====================== - -.. _completion: - -Completion ----------- - -In bash (``~/.bashrc``): - -.. code-block:: sh - - eval "$(_TMUXP_COMPLETE=source tmuxp)" - -In zsh (``~/.zshrc``): - -.. code-block:: sh - - eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" - -.. _cli_shell: - -Shell ------ - -:: - - tmuxp shell - - tmuxp shell - - tmuxp shell - - tmuxp shell -c 'python code' - -Launch into a python console with `libtmux`_ objects. Compare to django's shell. - - .. image:: _static/tmuxp-shell.gif - :width: 100% - -Automatically preloads current tmux :class:`server `, -:class:`session `, :class:`window ` -:class:`pane `. Pass additional arguments to select a -specific one of your choice:: - - (Pdb) server - - (Pdb) server.sessions - [Session($1 your_project)] - (Pdb) session - Session($1 your_project) - (Pdb) session.name - 'your_project' - (Pdb) window - Window(@3 1:your_window, Session($1 your_project)) - (Pdb) window.name - 'your_window' - (Pdb) window.panes - [Pane(%6 Window(@3 1:your_window, Session($1 your_project))) - (Pdb) pane - Pane(%6 Window(@3 1:your_window, Session($1 your_project))) - -Python 3.7 supports `PEP 553`_'s ``PYTHONBREAKPOINT`` and supports -compatible debuggers, for instance `ipdb`_: - -.. code-block:: sh - - $ pip install ipdb - $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell - -You can also pass in python code directly, similar to ``python -c``, do -this via ``tmuxp -c``: - -.. code-block:: shell - - $ tmuxp shell -c 'print(session.name); print(window.name)' - my_server - my_window - - $ tmuxp shell my_server -c 'print(session.name); print(window.name)' - my_server - my_window - - $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' - my_server - my_window - - $ tmuxp shell my_server my_window -c 'print(window.name.upper())' - MY_WINDOW - - # Assuming inside a tmux pane or one is attached on default server - $ tmuxp shell -c 'print(pane.id); print(pane.window.name)' - %2 - my_window - -.. _PEP 553: https://www.python.org/dev/peps/pep-0553/ -.. _ipdb: https://pypi.org/project/ipdb/ -.. _libtmux: https://libtmux.git-pull.com - -Shell detection -~~~~~~~~~~~~~~~ - -``tmuxp shell`` detects the richest shell available in your *site packages*, you can also pick your shell via args: - -- ``--pdb``: Use plain old ``breakpoint()`` (python 3.7+) or - ``pdb.set_trace`` -- ``--code``: Drop into ``code.interact``, accepts ``--use-pythonrc`` -- ``--bpython``: Drop into bpython -- ``--ipython``: Drop into ipython -- ``--ptpython``: Drop into ptpython, accepts ``--use-vi-mode`` -- ``--ptipython``: Drop into ipython + ptpython, accepts - ``--use-vi-mode`` - -.. _cli_freeze: - -Freeze sessions ---------------- - -:: - - tmuxp freeze - -You can save the state of your tmux session by freezing it. - -Tmuxp will offer to save your session state to ``.json`` or ``.yaml``. - -.. _cli_load: - -Load session ------------- - -You can load your tmuxp file and attach the vim session via a few -shorthands: - -1. The directory with a ``.tmuxp.{yaml,yml,json}`` file in it -2. The name of the project file in your `$HOME/.tmuxp` folder -3. The direct path of the tmuxp file you want to load - -:: - - # path to folder with .tmuxp.{yaml,yml,json} - tmuxp load . - tmuxp load ../ - tmuxp load path/to/folder/ - tmuxp load /path/to/folder/ - - # name of the config, assume $HOME/.tmuxp/myconfig.yaml - tmuxp load myconfig - - # direct path to json/yaml file - tmuxp load ./myfile.yaml - tmuxp load /abs/path/to/myfile.yaml - tmuxp load ~/myfile.yaml - -Absolute and relative directory paths are supported. - -.. code-block:: bash - - $ tmuxp load - -Files named ``.tmuxp.yaml`` or ``.tmuxp.json`` in the current working -directory may be loaded with: - -.. code-block:: bash - - $ tmuxp load . - -If you try to load a config file from within a tmux session, it will ask you -if you want to load and attach to the new session, or just load detached. -You can also load a config file and append the windows to the current active session. - -:: - - Already inside TMUX, switch to session? yes/no - Or (a)ppend windows in the current active session? - [y/n/a]: - -All of these options can be preselected to skip the prompt: - -.. code-block:: bash - $ tmuxp load -y config # load attached - $ tmuxp load -d config # load detached - $ tmuxp load -a config # append windows - -Multiple sessions can be loaded at once. The first ones will be created -without being attached. The last one will be attached if there is no -``-d`` flag on the command line. - -.. code-block:: bash - - $ tmuxp load ... - -A session name can be provided at the terminal. If multiple sessions -are created, the last session is named from the terminal. - -.. code-block:: bash - - $ tmxup load -s ... - -The output of the ``load`` command can be logged to a file for -debugging purposes. the log level can be controlled with the global -``--log-level`` option (defaults to INFO). - -.. code-block:: bash - - $ tmuxp load --log-file - $ tmuxp --log-level load --log-file - - -.. _cli_debug_info: - -Debug Info ----------- - -Use to collect all relevant information for submitting an issue to -the project. - -.. code-block:: bash - - $ tmuxp debug-info - -------------------------- - environment: - system: Linux - arch: x86_64 - ... - -.. _cli_import: - -Import ------- - -.. _import_teamocil: - -From teamocil -~~~~~~~~~~~~~ - -:: - - tmuxp import teamocil /path/to/file.{json,yaml} - -.. _import_tmuxinator: - -From tmuxinator -~~~~~~~~~~~~~~~ - -:: - - tmuxp import tmuxinator /path/to/file.{json,yaml} - -.. _convert_config: - -Convert between YAML and JSON ------------------------------ - -:: - - tmuxp convert /path/to/file.{json,yaml} - -tmuxp automatically will prompt to convert ``.yaml`` to ``.json`` and -``.json`` to ``.yaml``. diff --git a/docs/conf.py b/docs/conf.py index 4d5c06d55e..ebd532c8d5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,6 +33,8 @@ 'myst_parser', ] +myst_enable_extensions = ["colon_fence"] + issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 0000000000..f74069df46 --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,293 @@ +(developing)= + +# Developing and Testing + +```{eval-rst} +.. todo:: + link to sliderepl or ipython notebook slides +``` + +Our tests are inside `tests/`. Tests are implemented using +[pytest][pytest]. + +`make test` will create a tmux server on a separate `socket_name` +using `$ tmux -L test_case`. + +[pytest]: http://pytest.org/ + +(install-dev-env)= + +## Install the latest code from git + +### Get the source + +To begin developing, check out the code from github: + +```{code-block} bash + +$ git clone git@github.com:tmux-python/tmuxp.git +$ cd tmuxp + +``` + +### Advanced: Manual virtual + +Now create a virtualenv, if you don't know how to, you can create a +virtualenv with: + +```{code-block} bash + +$ virtualenv .venv + +``` + +Then activate it to your current tty / terminal session with: + +```{code-block} bash + +$ source .venv/bin/activate + +``` + +Good! Now let's run this: + +```{code-block} bash + +$ pip install -e . + +``` + +This has `pip`, a python package manager install the python package +in the current directory. `-e` means `--editable`, which means you can +adjust the code and the installed software will reflect the changes. + +```{code-block} bash + +$ tmuxp + +``` + +### Simple: Using poetry + +The easiest way to configure a dev environment is through [poetry][poetry]. This +automatically will manage virtualenv and python dependencies for tmuxp. +For information on installing poetry visit the [poetry's documentation][poetry's documentation]. + +To begin developing, check out the code from github: + +```{code-block} bash + +$ git clone git@github.com:tmux-python/tmuxp.git +$ cd tmuxp + +``` + +You can create a virtualenv, and install all of the locked +packages as listed in poetry.lock: + +```{code-block} bash + +$ poetry install + +``` + +If you ever need to update packages during your development session, the +following command can be used to update all packages as per poetry settings or +individual package (second command): + +```{code-block} bash + +$ poetry update +$ poetry update requests + +``` + +Then activate it to your current tty / terminal session with: + +```{code-block} bash + +$ poetry shell + +``` + +That is it! You are now ready to code! + +[poetry]: https://python-poetry.org/ + +[poetry's documentation]: https://python-poetry.org/docs/ + +## Test Runner + +As you seen above, the `tmuxp` command will now be available to you, +since you are in the virtual environment, your {}`PATH` environment was +updated to include a special version of `python` inside your `.venv` +folder with its own packages. + +```{code-block} bash + +$ make test + +``` + +You probably didn't see anything but tests scroll by. + +If you found a problem or are trying to write a test, you can file an +[issue on github][issue on github]. + +(test-specific-tests)= + +### Test runner options + +Test only a file: + +```{code-block} bash + +$ py.test tests/test_config.py + +``` + +will test the `tests/test_config.py` tests. + +```{code-block} bash + +$ py.test tests/test_config.py::test_export_json + +``` + +tests `test_export_json` inside of `tests/test_config.py`. + +Multiple can be separated by spaces: + +```{code-block} bash + +$ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json + +``` + +(test-builder-visually)= + +## Visual testing + +You can watch tmux testsuite build sessions visually by keeping a client +open in a separate terminal. + +Create two terminals: + +> > - Terminal 1: `$ tmux -L test_case` +> - Terminal 2: `$ cd` into the tmuxp project and into the +> `virtualenv` if you are using one, see details on installing the dev +> version of tmuxp above. Then: +> +> ``` +> $ py.test tests/test_workspacebuilder.py +> ``` + +Terminal 1 should have flickered and built the session before your eyes. +tmuxp hides this building from normal users. + +## Run tests on save + +You can re-run tests automatically on file edit. + +:::{note} + +This requires `entr(1)`. + +::: + +Install [entr][entr]. Packages are available available on most Linux and BSD +variants, including Debian, Ubuntu, FreeBSD, OS X. + +To run all tests upon editing any `.py` file: + +```{code-block} bash + +$ make watch_test + +``` + +You can also re-run a specific test file or any other [py.test usage +argument][py.test usage argument]: + +```{code-block} bash + +$ make watch_test test=tests/test_config.py + +$ make watch_test test='-x tests/test_config.py tests/test_util.py' + +``` + +## Rebuild sphinx docs on save + +Rebuild the documentation when an `.rst` file is edited: + +```{code-block} bash + +$ cd doc +$ make watch + +# If you're not source'd via `poetry shell`, you can use this: +$ make SPHINXBUILD='poetry run sphinx-build' watch + +``` + +(tmuxp-developer-config)= + +## tmuxp developer config + +```{image} _static/tmuxp-dev-screenshot.png +:align: center + +``` + +After you {ref}`install_dev_env`, when inside the tmuxp checkout: + +```{code-block} bash + +$ tmuxp load . + +``` + +this will load the `.tmuxp.yaml` in the root of the project. + +```{literalinclude} ../.tmuxp.yaml +:language: yaml + +``` + +(gh-actions)= + +## Github Actions + +tmuxp uses [github actions][github actions] for continuous integration / automatic unit +testing. + +To view the tmux and python versions tested see the [.github/workflows/tests.yml][.github/workflows/tests.yml]. +Builds are done on `master` and pull requests and can be viewed on +the [gh build site][gh build site]. + +## Testing options + +`RETRY_TIMEOUT_SECONDS` can be toggled if certain workspace builder +tests are being stubborn. + +e.g. `RETRY_TIMEOUT_SECONDS=10 py.test` + +```{literalinclude} ../.github/workflows/tests.yml +:language: yaml + +``` + +[py.test usage argument]: https://pytest.org/latest/usage.html + +[entr]: http://entrproject.org/ + +[github actions]: https://github.com/features/actions + +[gh build site]: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests + +[.github/workflows/tests.yml]: https://github.com/tmux-python/tmuxp/blob/master/.github/workflows/tests.yml + +[issue on github]: https://github.com/tmux-python/tmuxp/issues + + diff --git a/docs/developing.rst b/docs/developing.rst deleted file mode 100644 index 084e555daf..0000000000 --- a/docs/developing.rst +++ /dev/null @@ -1,254 +0,0 @@ -.. _developing: - -====================== -Developing and Testing -====================== - -.. todo:: - link to sliderepl or ipython notebook slides - -Our tests are inside ``tests/``. Tests are implemented using -`pytest`_. - -``make test`` will create a tmux server on a separate ``socket_name`` -using ``$ tmux -L test_case``. - -.. _pytest: http://pytest.org/ - -.. _install_dev_env: - -Install the latest code from git --------------------------------- - -Get the source -^^^^^^^^^^^^^^ - -To begin developing, check out the code from github: - -.. code-block:: bash - - $ git clone git@github.com:tmux-python/tmuxp.git - $ cd tmuxp - -Advanced: Manual virtual -^^^^^^^^^^^^^^^^^^^^^^^^ - -Now create a virtualenv, if you don't know how to, you can create a -virtualenv with: - -.. code-block:: bash - - $ virtualenv .venv - -Then activate it to your current tty / terminal session with: - -.. code-block:: bash - - $ source .venv/bin/activate - -Good! Now let's run this: - -.. code-block:: bash - - $ pip install -e . - -This has ``pip``, a python package manager install the python package -in the current directory. ``-e`` means ``--editable``, which means you can -adjust the code and the installed software will reflect the changes. - -.. code-block:: bash - - $ tmuxp - -Simple: Using poetry -^^^^^^^^^^^^^^^^^^^^ - -The easiest way to configure a dev environment is through `poetry`_. This -automatically will manage virtualenv and python dependencies for tmuxp. -For information on installing poetry visit the `poetry's documentation`_. - -To begin developing, check out the code from github: - -.. code-block:: bash - - $ git clone git@github.com:tmux-python/tmuxp.git - $ cd tmuxp - -You can create a virtualenv, and install all of the locked -packages as listed in poetry.lock: - -.. code-block:: bash - - $ poetry install - -If you ever need to update packages during your development session, the -following command can be used to update all packages as per poetry settings or -individual package (second command): - -.. code-block:: bash - - $ poetry update - $ poetry update requests - -Then activate it to your current tty / terminal session with: - -.. code-block:: bash - - $ poetry shell - -That is it! You are now ready to code! - -.. _poetry: https://python-poetry.org/ -.. _poetry's documentation: https://python-poetry.org/docs/ - -Test Runner ------------ - -As you seen above, the ``tmuxp`` command will now be available to you, -since you are in the virtual environment, your `PATH` environment was -updated to include a special version of ``python`` inside your ``.venv`` -folder with its own packages. - -.. code-block:: bash - - $ make test - -You probably didn't see anything but tests scroll by. - -If you found a problem or are trying to write a test, you can file an -`issue on github`_. - -.. _test_specific_tests: - -Test runner options -^^^^^^^^^^^^^^^^^^^ - -Test only a file: - -.. code-block:: bash - - $ py.test tests/test_config.py - -will test the ``tests/test_config.py`` tests. - -.. code-block:: bash - - $ py.test tests/test_config.py::test_export_json - -tests ``test_export_json`` inside of ``tests/test_config.py``. - -Multiple can be separated by spaces: - -.. code-block:: bash - - $ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json - -.. _test_builder_visually: - -Visual testing --------------- - -You can watch tmux testsuite build sessions visually by keeping a client -open in a separate terminal. - -Create two terminals: - - - Terminal 1: ``$ tmux -L test_case`` - - Terminal 2: ``$ cd`` into the tmuxp project and into the - ``virtualenv`` if you are using one, see details on installing the dev - version of tmuxp above. Then: - - .. code-block:: bash - - $ py.test tests/test_workspacebuilder.py - -Terminal 1 should have flickered and built the session before your eyes. -tmuxp hides this building from normal users. - -Run tests on save ------------------ - -You can re-run tests automatically on file edit. - -.. note:: - This requires ``entr(1)``. - -Install `entr`_. Packages are available available on most Linux and BSD -variants, including Debian, Ubuntu, FreeBSD, OS X. - -To run all tests upon editing any ``.py`` file: - -.. code-block:: bash - - $ make watch_test - -You can also re-run a specific test file or any other `py.test usage -argument`_: - -.. code-block:: bash - - $ make watch_test test=tests/test_config.py - - $ make watch_test test='-x tests/test_config.py tests/test_util.py' - -Rebuild sphinx docs on save ---------------------------- - -Rebuild the documentation when an ``.rst`` file is edited: - -.. code-block:: bash - - $ cd doc - $ make watch - - # If you're not source'd via `poetry shell`, you can use this: - $ make SPHINXBUILD='poetry run sphinx-build' watch - -.. _tmuxp developer config: - -tmuxp developer config ----------------------- - -.. image:: _static/tmuxp-dev-screenshot.png - :align: center - -After you :ref:`install_dev_env`, when inside the tmuxp checkout: - -.. code-block:: bash - - $ tmuxp load . - -this will load the ``.tmuxp.yaml`` in the root of the project. - -.. literalinclude:: ../.tmuxp.yaml - :language: yaml - -.. _gh_actions: - -Github Actions --------------- - -tmuxp uses `github actions`_ for continuous integration / automatic unit -testing. - -To view the tmux and python versions tested see the `.github/workflows/tests.yml`_. -Builds are done on ``master`` and pull requests and can be viewed on -the `gh build site`_. - -Testing options ---------------- - -``RETRY_TIMEOUT_SECONDS`` can be toggled if certain workspace builder -tests are being stubborn. - -e.g. ``RETRY_TIMEOUT_SECONDS=10 py.test`` - -.. literalinclude:: ../.github/workflows/tests.yml - :language: yaml - -.. _py.test usage argument: https://pytest.org/latest/usage.html -.. _entr: http://entrproject.org/ -.. _github actions: https://github.com/features/actions -.. _gh build site: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests -.. _.github/workflows/tests.yml: https://github.com/tmux-python/tmuxp/blob/master/.github/workflows/tests.yml -.. _issue on github: https://github.com/tmux-python/tmuxp/issues diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 0000000000..f4ea8acb41 --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,537 @@ +(examples)= + +# Example Configurations + +## Short hand / inline style + +tmuxp has a short-hand syntax to for those who wish to keep their configs +punctual. + +::::{sidebar} short hand + +```{eval-rst} +.. aafig:: + :textual: + + +-------------------+ + | 'did you know' | + | 'you can inline' | + +-------------------+ + | 'single commands' | + | | + +-------------------+ + | 'for panes' | + | | + +-------------------+ +``` + +:::: + +### YAML + +```{literalinclude} ../examples/shorthands.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/shorthands.json +:language: json + +``` + +## Blank panes + +No need to repeat `pwd` or a dummy command. A `null`, `'blank'`, +`'pane'` are valid. + +Note `''` counts as an empty carriage return. + +### YAML + +```{literalinclude} ../examples/blank-panes.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/blank-panes.json +:language: json + +``` + +## 2 panes + +::::{sidebar} 2 pane + +```{eval-rst} +.. aafig:: + + +-----------------+ + | $ pwd | + | | + | | + +-----------------+ + | $ pwd | + | | + | | + +-----------------+ +``` + +:::: + +### YAML + +```{literalinclude} ../examples/2-pane-vertical.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/2-pane-vertical.json +:language: json + +``` + +## 3 panes + +::::{sidebar} 3 panes + +```{eval-rst} +.. aafig:: + + +-----------------+ + | $ pwd | + | | + | | + +--------+--------+ + | $ pwd | $ pwd | + | | | + | | | + +--------+--------+ +``` + +:::: + +### YAML + +```{literalinclude} ../examples/3-pane.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/3-pane.json +:language: json + +``` + +## 4 panes + +::::{sidebar} 4 panes + +```{eval-rst} +.. aafig:: + + +--------+--------+ + | $ pwd | $ pwd | + | | | + | | | + +--------+--------+ + | $ pwd | $ pwd | + | | | + | | | + +--------+--------+ +``` + +:::: + +### YAML + +```{literalinclude} ../examples/4-pane.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/4-pane.json +:language: json + +``` + +## Start Directory + +Equivalent to `tmux new-window -c `. + +### YAML + +```{literalinclude} ../examples/start-directory.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/start-directory.json +:language: json + +``` + +## Environment variable replacing + +tmuxp will replace environment variables wrapped in curly brackets +for values of these settings: + +- `start_directory` +- `before_script` +- `session_name` +- `window_name` +- `shell_command_before` +- `global_options` +- `options` in session scope and window scope + +tmuxp replaces these variables before-hand with variables in the +terminal `tmuxp` invokes in. + +In this case of this example, assuming the username "user": + +``` +$ MY_ENV_VAR=foo tmuxp load examples/env-variables.yaml +``` + +and your session name will be `session - user (foo)`. + +Shell variables in `shell_command` do not support this type of +concatenation. `shell_command` and `shell_command_before` both +support normal shell variables, since they are sent into panes +automatically via `send-key` in `tmux(1)`. See `ls $PWD` in +example. + +If you have a special case and would like to see behavior changed, +please make a ticket on the [issue tracker][issue tracker]. + +[issue tracker]: https://github.com/tmux-python/tmuxp/issues + +### YAML + +```{literalinclude} ../examples/env-variables.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/env-variables.json +:language: json + +``` + +## Environment variables + +tmuxp will set session environment variables. + +### YAML + +```{literalinclude} ../examples/session-environment.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/session-environment.json +:language: json + +``` + +## Focusing + +tmuxp allows `focus: true` for assuring windows and panes are attached / +selected upon loading. + +### YAML + +```{literalinclude} ../examples/focus-window-and-panes.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/focus-window-and-panes.json +:language: json + +``` + +## Terminal History + +tmuxp allows `suppress_history: false` to override the default command / +suppression when building the workspace. +This will add the `shell_command` to the bash history in the pane. + +### YAML + +```{literalinclude} ../examples/suppress-history.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/suppress-history.json +:language: json + +``` + +## Window Index + +You can specify a window's index using the `window_index` property. Windows +without `window_index` will use the lowest available window index. + +### YAML + +```{literalinclude} ../examples/window-index.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/window-index.json +:language: json + +``` + +## Set tmux options + +Works with global (server-wide) options, session options +and window options. + +Including `automatic-rename`, `default-shell`, +`default-command`, etc. + +### YAML + +```{literalinclude} ../examples/options.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/options.json +:language: json + +``` + +## Set window options after pane creation + +Apply window options after panes have been created. Useful for +`synchronize-panes` option after executing individual commands in each +pane during creation. + +### YAML + +```{literalinclude} ../examples/2-pane-synchronized.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/2-pane-synchronized.json +:language: json + +``` + +## Main pane height + +### YAML + +```{literalinclude} ../examples/main-pane-height.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/main-pane-height.json +:language: json + +``` + +## Super-advanced dev environment + +:::{seealso} + +{ref}`tmuxp developer config` in the {ref}`developing` section. + +::: + +### YAML + +```{literalinclude} ../.tmuxp.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../.tmuxp.json +:language: json + +``` + +## Bootstrap project before launch + +You can use `before_script` to run a script before the tmux session +starts building. This can be used to start a script to create a virtualenv +or download a virtualenv/rbenv/package.json's dependency files before +tmuxp even begins building the session. + +It works by using the [Exit Status][exit status] code returned by a script. Your +script can be any type, including bash, python, ruby, etc. + +A successful script will exit with a status of `0`. + +Important: the script file must be chmod executable `+x` or `755`. + +Run a python script (and check for it's return code), the script is +*relative to the ``.tmuxp.yaml``'s root* (Windows and panes omitted in +this example): + +```{code-block} yaml + +session_name: my session +before_script: ./bootstrap.py +# ... the rest of your config + +``` + +```{code-block} json + +{ + "session_name": "my session", + "before_script": "./bootstrap.py" +} + +``` + +Run a shell script + check for return code on an absolute path. (Windows +and panes omitted in this example) + +```{code-block} yaml + +session_name: another example +before_script: /absolute/path/this.sh # abs path to shell script +# ... the rest of your config + +``` + +```{code-block} json + +{ + "session_name": "my session", + "before_script": "/absolute/path/this.sh" +} + +``` + +[exit status]: http://tldp.org/LDP/abs/html/exit-status.html + +## Per-project tmux config + +You can load your software project in tmux by placing a `.tmuxp.yaml` or +`.tmuxp.json` in the project's config and loading it. + +tmuxp supports loading configs via absolute filename with `tmuxp load` +and via `$ tmuxp load .` if config is in directory. + +```{code-block} bash + +$ tmuxp load ~/workspaces/myproject.yaml + +``` + +See examples of `tmuxp` in the wild. Have a project config to show off? +Edit this page. + +* +* +* + +You can use `start_directory: ./` to make the directories relative to +the config file / project root. + +## Bonus: pipenv auto-bootstrapping + +:::{versionadded} 1.3.4 + +`before_script` CWD's into the root (session)-level +`start_directory`. + +::: + +If you use [pipenv][pipenv] / [poetry][poetry], you can use a script like this to ensure +your packages are installed: + +```{code-block} yaml + +# assuming your .tmuxp.yaml is in your project root directory +session_name: my pipenv project +start_directory: ./ +before_script: pipenv install --dev --skip-lock # ensure dev deps install +windows: +- window_name: django project + focus: true + panes: + - blank + - pipenv run ./manage.py runserver + +``` + +You can also source yourself into the virtual environment using +`shell_command_before`: + +```{code-block} yaml + +# assuming your .tmuxp.yaml is in your project root directory +session_name: my pipenv project +start_directory: ./ +before_script: pipenv install --dev --skip-lock # ensure dev deps install +shell_command_before: +- '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' +windows: +- window_name: django project + focus: true + panes: + - blank + - ./manage.py runserver + +``` + +[pipenv]: https://docs.pipenv.org/ + +[poetry]: https://python-poetry.org/ + +## Kung fu + +:::{note} + +tmuxp sessions can be scripted in python. The first way is to use the +ORM in the {ref}`API`. The second is to pass a {py:obj}`dict` into +{class}`~tmuxp.workspacebuilder.WorkspaceBuilder` with a correct schema. +See: {meth}`tmuxp.config.validate_schema`. + +::: + +Add yours? Submit a pull request to the [github][github] site! + +[github]: https://github.com/tmux-python/tmuxp + + diff --git a/docs/examples.rst b/docs/examples.rst deleted file mode 100644 index f5cc8e2e6f..0000000000 --- a/docs/examples.rst +++ /dev/null @@ -1,486 +0,0 @@ -.. _examples: - -====================== -Example Configurations -====================== - -Short hand / inline style -------------------------- - -tmuxp has a short-hand syntax to for those who wish to keep their configs -punctual. - -.. sidebar:: short hand - - .. aafig:: - :textual: - - +-------------------+ - | 'did you know' | - | 'you can inline' | - +-------------------+ - | 'single commands' | - | | - +-------------------+ - | 'for panes' | - | | - +-------------------+ - -YAML -~~~~ - -.. literalinclude:: ../examples/shorthands.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/shorthands.json - :language: json - -Blank panes ------------ - -No need to repeat ``pwd`` or a dummy command. A ``null``, ``'blank'``, -``'pane'`` are valid. - -Note ``''`` counts as an empty carriage return. - -YAML -~~~~ - -.. literalinclude:: ../examples/blank-panes.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/blank-panes.json - :language: json - -2 panes -------- - -.. sidebar:: 2 pane - - .. aafig:: - - +-----------------+ - | $ pwd | - | | - | | - +-----------------+ - | $ pwd | - | | - | | - +-----------------+ - -YAML -~~~~ - -.. literalinclude:: ../examples/2-pane-vertical.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/2-pane-vertical.json - :language: json - -3 panes -------- - -.. sidebar:: 3 panes - - .. aafig:: - - +-----------------+ - | $ pwd | - | | - | | - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ - -YAML -~~~~ - -.. literalinclude:: ../examples/3-pane.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/3-pane.json - :language: json - -4 panes -------- - -.. sidebar:: 4 panes - - .. aafig:: - - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ - -YAML -~~~~ - -.. literalinclude:: ../examples/4-pane.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/4-pane.json - :language: json - -Start Directory ---------------- - -Equivalent to ``tmux new-window -c ``. - -YAML -~~~~ - -.. literalinclude:: ../examples/start-directory.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/start-directory.json - :language: json - -Environment variable replacing ------------------------------- - -tmuxp will replace environment variables wrapped in curly brackets -for values of these settings: - -- ``start_directory`` -- ``before_script`` -- ``session_name`` -- ``window_name`` -- ``shell_command_before`` -- ``global_options`` -- ``options`` in session scope and window scope - -tmuxp replaces these variables before-hand with variables in the -terminal ``tmuxp`` invokes in. - -In this case of this example, assuming the username "user":: - - $ MY_ENV_VAR=foo tmuxp load examples/env-variables.yaml - -and your session name will be ``session - user (foo)``. - -Shell variables in ``shell_command`` do not support this type of -concatenation. ``shell_command`` and ``shell_command_before`` both -support normal shell variables, since they are sent into panes -automatically via ``send-key`` in ``tmux(1)``. See ``ls $PWD`` in -example. - -If you have a special case and would like to see behavior changed, -please make a ticket on the `issue tracker`_. - -.. _issue tracker: https://github.com/tmux-python/tmuxp/issues - -YAML -~~~~ - -.. literalinclude:: ../examples/env-variables.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/env-variables.json - :language: json - -Environment variables ---------------------- - -tmuxp will set session environment variables. - -YAML -~~~~ - -.. literalinclude:: ../examples/session-environment.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/session-environment.json - :language: json - -Focusing --------- - -tmuxp allows ``focus: true`` for assuring windows and panes are attached / -selected upon loading. - -YAML -~~~~ - -.. literalinclude:: ../examples/focus-window-and-panes.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/focus-window-and-panes.json - :language: json - -Terminal History ----------------- - -tmuxp allows ``suppress_history: false`` to override the default command / -suppression when building the workspace. -This will add the ``shell_command`` to the bash history in the pane. - -YAML -~~~~ - -.. literalinclude:: ../examples/suppress-history.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/suppress-history.json - :language: json - -Window Index ------------- - -You can specify a window's index using the ``window_index`` property. Windows -without ``window_index`` will use the lowest available window index. - -YAML -~~~~ - -.. literalinclude:: ../examples/window-index.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/window-index.json - :language: json - -Set tmux options ----------------- - -Works with global (server-wide) options, session options -and window options. - -Including ``automatic-rename``, ``default-shell``, -``default-command``, etc. - -YAML -~~~~ - -.. literalinclude:: ../examples/options.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/options.json - :language: json - -Set window options after pane creation --------------------------------------- - -Apply window options after panes have been created. Useful for -``synchronize-panes`` option after executing individual commands in each -pane during creation. - -YAML -~~~~ - -.. literalinclude:: ../examples/2-pane-synchronized.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/2-pane-synchronized.json - :language: json - -Main pane height ----------------- - -YAML -~~~~ - -.. literalinclude:: ../examples/main-pane-height.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/main-pane-height.json - :language: json - -Super-advanced dev environment ------------------------------- - -.. seealso:: - :ref:`tmuxp developer config` in the :ref:`developing` section. - -YAML -~~~~ - -.. literalinclude:: ../.tmuxp.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../.tmuxp.json - :language: json - -Bootstrap project before launch -------------------------------- - -You can use ``before_script`` to run a script before the tmux session -starts building. This can be used to start a script to create a virtualenv -or download a virtualenv/rbenv/package.json's dependency files before -tmuxp even begins building the session. - -It works by using the `Exit Status`_ code returned by a script. Your -script can be any type, including bash, python, ruby, etc. - -A successful script will exit with a status of ``0``. - -Important: the script file must be chmod executable ``+x`` or ``755``. - -Run a python script (and check for it's return code), the script is -*relative to the ``.tmuxp.yaml``'s root* (Windows and panes omitted in -this example): - -.. code-block:: yaml - - session_name: my session - before_script: ./bootstrap.py - # ... the rest of your config - -.. code-block:: json - - { - "session_name": "my session", - "before_script": "./bootstrap.py" - } - -Run a shell script + check for return code on an absolute path. (Windows -and panes omitted in this example) - -.. code-block:: yaml - - session_name: another example - before_script: /absolute/path/this.sh # abs path to shell script - # ... the rest of your config - -.. code-block:: json - - { - "session_name": "my session", - "before_script": "/absolute/path/this.sh" - } - -.. _Exit Status: http://tldp.org/LDP/abs/html/exit-status.html - -Per-project tmux config ------------------------ - -You can load your software project in tmux by placing a ``.tmuxp.yaml`` or -``.tmuxp.json`` in the project's config and loading it. - -tmuxp supports loading configs via absolute filename with ``tmuxp load`` -and via ``$ tmuxp load .`` if config is in directory. - -.. code-block:: bash - - $ tmuxp load ~/workspaces/myproject.yaml - -See examples of ``tmuxp`` in the wild. Have a project config to show off? -Edit this page. - -* https://github.com/tony/dockerfiles/blob/master/.tmuxp.yaml -* https://github.com/tony/vcspull/blob/master/.tmuxp.yaml -* https://github.com/tony/sphinxcontrib-github/blob/master/.tmuxp.yaml - -You can use ``start_directory: ./`` to make the directories relative to -the config file / project root. - -Bonus: pipenv auto-bootstrapping --------------------------------- - -.. versionadded:: 1.3.4 - - ``before_script`` CWD's into the root (session)-level - ``start_directory``. - -If you use `pipenv`_ / `poetry`_, you can use a script like this to ensure -your packages are installed: - -.. code-block:: yaml - - # assuming your .tmuxp.yaml is in your project root directory - session_name: my pipenv project - start_directory: ./ - before_script: pipenv install --dev --skip-lock # ensure dev deps install - windows: - - window_name: django project - focus: true - panes: - - blank - - pipenv run ./manage.py runserver - -You can also source yourself into the virtual environment using -``shell_command_before``: - -.. code-block:: yaml - - # assuming your .tmuxp.yaml is in your project root directory - session_name: my pipenv project - start_directory: ./ - before_script: pipenv install --dev --skip-lock # ensure dev deps install - shell_command_before: - - '[ -d `pipenv --venv` ] && source `pipenv --venv`/bin/activate && reset' - windows: - - window_name: django project - focus: true - panes: - - blank - - ./manage.py runserver - -.. _pipenv: https://docs.pipenv.org/ -.. _poetry: https://python-poetry.org/ - -Kung fu -------- - -.. note:: - - tmuxp sessions can be scripted in python. The first way is to use the - ORM in the :ref:`API`. The second is to pass a :py:obj:`dict` into - :class:`~tmuxp.workspacebuilder.WorkspaceBuilder` with a correct schema. - See: :meth:`tmuxp.config.validate_schema`. - -Add yours? Submit a pull request to the `github`_ site! - -.. _github: https://github.com/tmux-python/tmuxp diff --git a/docs/glossary.rst b/docs/glossary.md similarity index 93% rename from docs/glossary.rst rename to docs/glossary.md index b30f406a2e..697ea69562 100644 --- a/docs/glossary.rst +++ b/docs/glossary.md @@ -1,11 +1,9 @@ -.. _glossary: +(glossary)= -======== -Glossary -======== +# Glossary - -.. glossary:: +```{eval-rst} +.. glossary:: tmuxp A tool to manage workspaces with tmux. A pythonic abstraction of @@ -63,5 +61,8 @@ Glossary Target A target, cited in the manual as ``[-t target]`` can be a session, window or pane. +``` + +[kaptan on github]: https://github.com/emre/kaptan + -.. _kaptan on github: https://github.com/emre/kaptan diff --git a/docs/history.md b/docs/history.md new file mode 100644 index 0000000000..b60bfafd8a --- /dev/null +++ b/docs/history.md @@ -0,0 +1,12 @@ +(history)= + +# History + +```{module} tmuxp + +``` + +```{include} ../CHANGES +``` + + diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 74672882b1..0000000000 --- a/docs/history.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _history: - -======= -History -======= - -.. module:: tmuxp - -.. include:: ../CHANGES - :start-line: 4 diff --git a/docs/plugin_system.md b/docs/plugin_system.md new file mode 100644 index 0000000000..ab75f2fc2a --- /dev/null +++ b/docs/plugin_system.md @@ -0,0 +1,149 @@ +(plugin-system)= + +# Plugin System + +The plugin system allows users to customize and extend different aspects of +tmuxp without the need to change tmuxp itself. + +## Using a Plugin + +To use a plugin, install it in your local python environment and add it to +your tmuxp configuration file. + +### Example Configurations + +#### YAML + +```{literalinclude} ../examples/plugin-system.yaml +:language: yaml + +``` + +#### JSON + +```{literalinclude} ../examples/plugin-system.json +:language: json + +``` + +[poetry]: https://python-poetry.org/ + +## Developing a Plugin + +tmuxp expects all plugins to be class within a python submodule named +`plugin` that is within a python module that is installed in the local +python environment. A plugin interface is provided by tmuxp to inherit. + +[poetry][poetry] is the chosen python package manager for tmuxp. It is highly +suggested to use it when developing plugins; however, `pip` will work +just as well. Only one of the configuration files is needed for the packaging +tool that the package developer desides to use. + +```{code-block} bash + +python_module +├── tmuxp_plugin_my_plugin_module +│   ├── __init__.py +│   └── plugin.py +├── pyproject.toml # Poetry's module configuration file +└── setup.py # pip's module configuration file + +``` + +When publishing plugins to pypi, tmuxp advocates for standardized naming: +`tmuxp-plugin-{your-plugin-name}` to allow for easier searching. To create a +module configuration file with poetry, run `poetry init` in the module +directory. The resulting file looks something like this: + +```{code-block} toml + +[tool.poetry] +name = "tmuxp-plugin-my-tmuxp-plugin" +version = "0.0.2" +description = "An example tmuxp plugin." +authors = ["Author Name .com>"] + +[tool.poetry.dependencies] +python = "^3.6" +tmuxp = "^1.6.0" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" + +``` + +The {}`plugin.py` file could contain something like the following: + +```{code-block} python + +from tmuxp.plugin import TmuxpPlugin +import datetime + +class MyTmuxpPlugin(TmuxpPlugin): + def __init__(self): + """ + Initialize my custom plugin. + """ + # Optional version dependency configuration. See Plugin API docs + # for all supported config parameters + config = { + 'tmuxp_min_version' = '1.6.2' + } + + TmuxpPlugin.__init__( + self, + plugin_name='tmuxp-plugin-my-tmuxp-plugin', + **config + ) + + def before_workspace_builder(self, session): + session.rename_session('my-new-session-name') + + def reattach(self, session): + now = datetime.datetime.now().strftime('%Y-%m-%d') + session.rename_session('session_{}'.format(now)) + +``` + +Once this plugin is installed in the local python environment, it can be used +in a configuration file like the following: + +```{code-block} yaml + +session_name: plugin example +plugins: +- my_plugin_module.plugin.MyTmuxpPlugin +# ... the rest of your config + +``` + +## Plugin API + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.__init__ +``` + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.before_workspace_builder +``` + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.on_window_create +``` + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.after_window_finished +``` + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.before_script +``` + +```{eval-rst} +.. automethod:: tmuxp.plugin.TmuxpPlugin.reattach +``` + + diff --git a/docs/plugin_system.rst b/docs/plugin_system.rst deleted file mode 100644 index 8ac5c80e9a..0000000000 --- a/docs/plugin_system.rst +++ /dev/null @@ -1,131 +0,0 @@ -.. _plugin_system: - -============= -Plugin System -============= - -The plugin system allows users to customize and extend different aspects of -tmuxp without the need to change tmuxp itself. - - -Using a Plugin --------------- - -To use a plugin, install it in your local python environment and add it to -your tmuxp configuration file. - -Example Configurations -^^^^^^^^^^^^^^^^^^^^^^ -YAML -~~~~ - -.. literalinclude:: ../examples/plugin-system.yaml - :language: yaml - -JSON -~~~~ - -.. literalinclude:: ../examples/plugin-system.json - :language: json - -.. _poetry: https://python-poetry.org/ - - -Developing a Plugin -------------------- - -tmuxp expects all plugins to be class within a python submodule named -``plugin`` that is within a python module that is installed in the local -python environment. A plugin interface is provided by tmuxp to inherit. - -`poetry`_ is the chosen python package manager for tmuxp. It is highly -suggested to use it when developing plugins; however, ``pip`` will work -just as well. Only one of the configuration files is needed for the packaging -tool that the package developer desides to use. - -.. code-block:: bash - - python_module - ├── tmuxp_plugin_my_plugin_module - │   ├── __init__.py - │   └── plugin.py - ├── pyproject.toml # Poetry's module configuration file - └── setup.py # pip's module configuration file - - -When publishing plugins to pypi, tmuxp advocates for standardized naming: -``tmuxp-plugin-{your-plugin-name}`` to allow for easier searching. To create a -module configuration file with poetry, run ``poetry init`` in the module -directory. The resulting file looks something like this: - -.. code-block:: toml - - [tool.poetry] - name = "tmuxp-plugin-my-tmuxp-plugin" - version = "0.0.2" - description = "An example tmuxp plugin." - authors = ["Author Name .com>"] - - [tool.poetry.dependencies] - python = "^3.6" - tmuxp = "^1.6.0" - - [tool.poetry.dev-dependencies] - - [build-system] - requires = ["poetry>=0.12"] - build-backend = "poetry.masonry.api" - - -The `plugin.py` file could contain something like the following: - -.. code-block:: python - - from tmuxp.plugin import TmuxpPlugin - import datetime - - class MyTmuxpPlugin(TmuxpPlugin): - def __init__(self): - """ - Initialize my custom plugin. - """ - # Optional version dependency configuration. See Plugin API docs - # for all supported config parameters - config = { - 'tmuxp_min_version' = '1.6.2' - } - - TmuxpPlugin.__init__( - self, - plugin_name='tmuxp-plugin-my-tmuxp-plugin', - **config - ) - - def before_workspace_builder(self, session): - session.rename_session('my-new-session-name') - - def reattach(self, session): - now = datetime.datetime.now().strftime('%Y-%m-%d') - session.rename_session('session_{}'.format(now)) - - -Once this plugin is installed in the local python environment, it can be used -in a configuration file like the following: - -.. code-block:: yaml - - session_name: plugin example - plugins: - - my_plugin_module.plugin.MyTmuxpPlugin - # ... the rest of your config - - -Plugin API ----------- - -.. automethod:: tmuxp.plugin.TmuxpPlugin.__init__ -.. automethod:: tmuxp.plugin.TmuxpPlugin.before_workspace_builder -.. automethod:: tmuxp.plugin.TmuxpPlugin.on_window_create -.. automethod:: tmuxp.plugin.TmuxpPlugin.after_window_finished -.. automethod:: tmuxp.plugin.TmuxpPlugin.before_script -.. automethod:: tmuxp.plugin.TmuxpPlugin.reattach diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000000..7ad90e8647 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,133 @@ +(quickstart)= + +# Quickstart + +## Installation + +Assure you have at least tmux **>= 1.8** and python **>= 2.6**. + +```{code-block} bash + +$ pip install tmuxp + +``` + +You can upgrade to the latest release with: + +```{code-block} bash + +$ pip install tmuxp -U + +``` + +Then install {ref}`completion`. + +If you are a Homebrew user you can install it with: + +```{code-block} bash + +$ brew install tmuxp + +``` + +## CLI + +:::{seealso} + +{ref}`examples`, {ref}`cli`, {ref}`completion`. + +::: + +tmuxp launches workspaces / sessions from JSON and YAML files. + +Configuration files can be stored in `$HOME/.tmuxp` or in project +directories as `.tmuxp.py`, `.tmuxp.json` or `.tmuxp.yaml`. + +Every configuration is required to have: + +1. `session_name` +2. list of `windows` +3. list of `panes` for every window in `windows` + +Create a file, `~/.tmuxp/example.yaml`: + +```{literalinclude} ../examples/2-pane-vertical.yaml +:language: yaml + +``` + +```{code-block} bash + +$ tmuxp load example.yaml + +``` + +This creates your tmuxp session. + +Load multiple tmux sessions at once: + +```{code-block} bash + +$ tmuxp load example.yaml anothersession.yaml + +``` + +tmuxp will offer to `switch-client` for you if you're already in a +session. You can also load a configuration, and append the windows to +the current active session. + +You can also have a custom tmuxp config directory by setting the +`TMUX_CONFIGDIR` in your environment variables. + +```{code-block} bash + +$ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython + +``` + +Or in your `~/.bashrc` / `~/.zshrc` you can set: + +```{code-block} bash + +export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp + +``` + +You can also [Import][import] configs [teamocil][teamocil] and [tmuxinator][tmuxinator]. + +## Pythonics + +:::{seealso} + +{ref}`libtmux python API documentation ` and {ref}`developing`, +{ref}`internals`. + +::: + +ORM - [Object Relational Mapper][object relational mapper] + +AL - [Abstraction Layer][abstraction layer] + +### python abstraction layer + +| {ref}`tmuxp python api ` | {term}`tmux(1)` equivalent | +| ------------------------------------- | -------------------------- | +| {meth}`libtmux.Server.new_session` | `$ tmux new-session` | +| {meth}`libtmux.Server.list_sessions` | `$ tmux list-sessions` | +| {meth}`libtmux.Session.list_windows` | `$ tmux list-windows` | +| {meth}`libtmux.Session.new_window` | `$ tmux new-window` | +| {meth}`libtmux.Window.list_panes` | `$ tmux list-panes` | +| {meth}`libtmux.Window.split_window` | `$ tmux split-window` | +| {meth}`libtmux.Pane.send_keys` | `$ tmux send-keys` | + +[import]: http://tmuxp.git-pull.com/cli.html#import + +[tmuxinator]: https://github.com/aziz/tmuxinator + +[teamocil]: https://github.com/remiprev/teamocil + +[abstraction layer]: http://en.wikipedia.org/wiki/Abstraction_layer + +[object relational mapper]: http://en.wikipedia.org/wiki/Object-relational_mapping + + diff --git a/docs/quickstart.rst b/docs/quickstart.rst deleted file mode 100644 index 113663d425..0000000000 --- a/docs/quickstart.rst +++ /dev/null @@ -1,112 +0,0 @@ -.. _quickstart: - -========== -Quickstart -========== - -Installation ------------- - -Assure you have at least tmux **>= 1.8** and python **>= 2.6**. - -.. code-block:: bash - - $ pip install tmuxp - -You can upgrade to the latest release with: - -.. code-block:: bash - - $ pip install tmuxp -U - -Then install :ref:`completion`. - -If you are a Homebrew user you can install it with: - -.. code-block:: bash - - $ brew install tmuxp - -CLI ---- - -.. seealso:: :ref:`examples`, :ref:`cli`, :ref:`completion`. - -tmuxp launches workspaces / sessions from JSON and YAML files. - -Configuration files can be stored in ``$HOME/.tmuxp`` or in project -directories as ``.tmuxp.py``, ``.tmuxp.json`` or ``.tmuxp.yaml``. - -Every configuration is required to have: - -1. ``session_name`` -2. list of ``windows`` -3. list of ``panes`` for every window in ``windows`` - -Create a file, ``~/.tmuxp/example.yaml``: - -.. literalinclude:: ../examples/2-pane-vertical.yaml - :language: yaml - -.. code-block:: bash - - $ tmuxp load example.yaml - -This creates your tmuxp session. - -Load multiple tmux sessions at once: - -.. code-block:: bash - - $ tmuxp load example.yaml anothersession.yaml - -tmuxp will offer to ``switch-client`` for you if you're already in a -session. You can also load a configuration, and append the windows to -the current active session. - -You can also have a custom tmuxp config directory by setting the -``TMUX_CONFIGDIR`` in your environment variables. - -.. code-block:: bash - - $ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython - -Or in your ``~/.bashrc`` / ``~/.zshrc`` you can set: - -.. code-block:: bash - - export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp - -You can also `Import`_ configs `teamocil`_ and `tmuxinator`_. - -Pythonics ---------- - -.. seealso:: - :ref:`libtmux python API documentation ` and :ref:`developing`, - :ref:`internals`. - -ORM - `Object Relational Mapper`_ - -AL - `Abstraction Layer`_ - -python abstraction layer -"""""""""""""""""""""""" - -======================================== ================================= -:ref:`tmuxp python api ` :term:`tmux(1)` equivalent -======================================== ================================= -:meth:`libtmux.Server.new_session` ``$ tmux new-session`` -:meth:`libtmux.Server.list_sessions` ``$ tmux list-sessions`` -:meth:`libtmux.Session.list_windows` ``$ tmux list-windows`` -:meth:`libtmux.Session.new_window` ``$ tmux new-window`` -:meth:`libtmux.Window.list_panes` ``$ tmux list-panes`` -:meth:`libtmux.Window.split_window` ``$ tmux split-window`` -:meth:`libtmux.Pane.send_keys` ``$ tmux send-keys`` -======================================== ================================= - -.. _Import: http://tmuxp.git-pull.com/cli.html#import -.. _tmuxinator: https://github.com/aziz/tmuxinator -.. _teamocil: https://github.com/remiprev/teamocil -.. _Abstraction Layer: http://en.wikipedia.org/wiki/Abstraction_layer -.. _Object Relational Mapper: http://en.wikipedia.org/wiki/Object-relational_mapping From e81e10963da357c80c591a190701c15165079822 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 11:57:45 -0500 Subject: [PATCH 0790/2998] More markdown --- manual/NOTES.md | 81 ++++++++++++++++++++++++++++++++++++++++++++ manual/NOTES.rst | 88 ------------------------------------------------ 2 files changed, 81 insertions(+), 88 deletions(-) create mode 100644 manual/NOTES.md delete mode 100644 manual/NOTES.rst diff --git a/manual/NOTES.md b/manual/NOTES.md new file mode 100644 index 0000000000..d28a673f8d --- /dev/null +++ b/manual/NOTES.md @@ -0,0 +1,81 @@ +# Compatibility notes + +## master + +src: + +## 1.8 + +src: + +## 1.7 + +src: + +## 1.6 + +src: + +### new-window + +src: + + +```c +if (args_has(args, 'P')) + ctx->print(ctx, "%s:%u", s->name, wl->idx); +return (0); +``` + +### split-window + +src: + + +```c +if (args_has(args, 'P')) { + if (window_pane_index(new_wp, &paneidx) != 0) + fatalx("index not found"); + ctx->print(ctx, "%s:%u.%u", s->name, wl->idx, paneidx); +} +return (0); +``` + +### list-sessions + +src: + + +```c +template = "#{session_name}: #{session_windows} windows " + "(created #{session_created_string}) [#{session_width}x" + "#{session_height}]#{?session_grouped, (group ,}" + "#{session_group}#{?session_grouped,),}" + "#{?session_attached, (attached),}"; +``` + +### list-windows + +src: + + +```c +template = "#{session_name}:#{window_index}: " + "#{window_name} " + "[#{window_width}x#{window_height}] " + "[layout #{window_layout}]" + "#{?window_active, (active),}"; +``` + +### list-panes + +src: + + +```c +template = "#{session_name}:#{window_index}.#{pane_index}: " + "[#{pane_width}x#{pane_height}] [history " + "#{history_size}/#{history_limit}, " + "#{history_bytes} bytes] #{pane_id}" + "#{?pane_active, (active),}#{?pane_dead, (dead),}"; +``` diff --git a/manual/NOTES.rst b/manual/NOTES.rst deleted file mode 100644 index 080d4bf942..0000000000 --- a/manual/NOTES.rst +++ /dev/null @@ -1,88 +0,0 @@ -=================== -Compatibility notes -=================== - -master ------- - -src: http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/ - -1.8 ---- - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.8/tree/ - -1.7 ---- - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.7/tree/ - -1.6 ---- - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/ - -new-window -"""""""""" - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/cmd-new-window.c - -.. code-block:: c - - if (args_has(args, 'P')) - ctx->print(ctx, "%s:%u", s->name, wl->idx); - return (0); - -split-window -"""""""""""" - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/cmd-split-window.c - -.. code-block:: c - - if (args_has(args, 'P')) { - if (window_pane_index(new_wp, &paneidx) != 0) - fatalx("index not found"); - ctx->print(ctx, "%s:%u.%u", s->name, wl->idx, paneidx); - } - return (0); - -list-sessions -""""""""""""" - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/cmd-list-sessions.c - -.. code-block:: c - - template = "#{session_name}: #{session_windows} windows " - "(created #{session_created_string}) [#{session_width}x" - "#{session_height}]#{?session_grouped, (group ,}" - "#{session_group}#{?session_grouped,),}" - "#{?session_attached, (attached),}"; - -list-windows -"""""""""""" - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/cmd-list-windows.c - -.. code-block:: c - - template = "#{session_name}:#{window_index}: " - "#{window_name} " - "[#{window_width}x#{window_height}] " - "[layout #{window_layout}]" - "#{?window_active, (active),}"; - - -list-panes -"""""""""" - -src: http://sourceforge.net/p/tmux/tmux-code/ci/1.6/tree/cmd-list-panes.c - -.. code-block:: c - - template = "#{session_name}:#{window_index}.#{pane_index}: " - "[#{pane_width}x#{pane_height}] [history " - "#{history_size}/#{history_limit}, " - "#{history_bytes} bytes] #{pane_id}" - "#{?pane_active, (active),}#{?pane_dead, (dead),}"; From a462e91b3d0a5b6d3ec6505069914065055dd1a8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 13:11:26 -0500 Subject: [PATCH 0791/2998] Makefile: Add prettier --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 890440d777..053f22db24 100644 --- a/Makefile +++ b/Makefile @@ -39,3 +39,6 @@ flake8: watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi + +prettier: + prettier --parser=markdown -w *.md docs/*.md docs/**/*.md CHANGES From bf5da4eac1d6805037f049f82662a11418cc9db1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 13:11:39 -0500 Subject: [PATCH 0792/2998] docs: Format with prettier --- docs/about.md | 18 +++++------------- docs/about_tmux.md | 38 ++++++++++++++------------------------ docs/api.md | 5 +---- docs/cli.md | 24 +++++++++++------------- docs/developing.md | 15 ++++----------- docs/examples.md | 19 ++++++++----------- docs/glossary.md | 4 +--- docs/history.md | 3 +-- docs/index.md | 3 +-- docs/plugin_system.md | 2 -- docs/quickstart.md | 6 ------ 11 files changed, 46 insertions(+), 91 deletions(-) diff --git a/docs/about.md b/docs/about.md index f0fe880825..bfcca7fa39 100644 --- a/docs/about.md +++ b/docs/about.md @@ -20,10 +20,9 @@ To jump right in, see {ref}`quickstart` and {ref}`examples`. Interested in some kung-fu or joining the effort? {ref}`api` and {ref}`developing`. -[MIT-licensed][mit-licensed]. Code on [github](). +[MIT-licensed][mit-licensed]. Code on [github](http://github.com/tmux-python/tmuxp). [bugsnag]: https://blog.bugsnag.com/benefits-of-using-tmux/ - [pragmatic coders]: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ ## Differences from tmuxinator / teamocil @@ -81,9 +80,10 @@ See {ref}`libtmux's internals `. **Conversion** `$ tmuxp convert ` can convert files to and from JSON and YAML. -[^id4]: While freezing and importing sessions is a great way to save time, - tweaking will probably be required - There is no substitute to a - config made with love. +[^id4]: + While freezing and importing sessions is a great way to save time, + tweaking will probably be required - There is no substitute to a + config made with love. [libtmux]: https://libtmux.git-pull.com @@ -103,17 +103,9 @@ from JSON and YAML. `$ tmuxp -f` for config file. [attempt at 1.7 test]: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 - [kaptan]: https://github.com/emre/kaptan - [mit-licensed]: http://opensource.org/licenses/MIT - [tmuxinator]: https://github.com/aziz/tmuxinator - [teamocil]: https://github.com/remiprev/teamocil - [erb]: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html - [edit this page]: https://github.com/tmux-python/tmuxp/edit/master/doc/about.rst - - diff --git a/docs/about_tmux.md b/docs/about_tmux.md index e3cc88a3f6..be25479667 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -2,7 +2,7 @@ # The Tao of tmux -:::{figure} /_static/tao-tmux-screenshot.png +:::{figure} /\_static/tao-tmux-screenshot.png :scale: 60% :align: center @@ -47,7 +47,7 @@ Pane Application Performs operations ``` ```{eval-rst} -.. aafig:: +.. aafig:: :textual: +----------------------------------------------------------------+ @@ -90,7 +90,7 @@ One screen can be used to edit a file, and another may be used to `$ tail -F` a logfile. ```{eval-rst} -.. aafig:: +.. aafig:: +--------+--------+ | $ bash | $ bash | @@ -104,7 +104,7 @@ One screen can be used to edit a file, and another may be used to ``` ```{eval-rst} -.. aafig:: +.. aafig:: +--------+--------+ | $ bash | $ bash | @@ -120,7 +120,7 @@ One screen can be used to edit a file, and another may be used to tmux supports as manys terminals as you want. ```{eval-rst} -.. aafig:: +.. aafig:: :textual: +---------+---------+ @@ -158,7 +158,7 @@ You can leave tmux and all applications running (detach), log out, make a sandwich, and re-(attach), all applications are still running! ```{eval-rst} -.. aafig:: +.. aafig:: :textual: +--------+--------+ @@ -241,15 +241,10 @@ If **compiling from source**, the dependencies are [libevent][libevent] and [ncurses][ncurses]. [tmux homepage]: http://tmux.sourceforge.net/ - [libevent]: http://www.monkey.org/~provos/libevent/ - [ncurses]: http://invisible-island.net/ncurses/ - [macports]: http://www.macports.org/ - [fink]: http://fink.thetis.ig42.org/ - [homebrew]: http://www.brew.sh ## Using tmux @@ -287,7 +282,7 @@ This could be because: Tmux hot keys have to be pressed in a special way. **Read this carefully**, then try it yourself. -First, you press the *prefix* key. This is `C-b` by default. +First, you press the _prefix_ key. This is `C-b` by default. Release. Then pause. For less than second. Then type what's next. @@ -298,7 +293,7 @@ Then press `o`. ### Session Name -Sessions can be *named upon creation*. +Sessions can be _named upon creation_. ```{code-block} bash @@ -306,7 +301,7 @@ $ tmux new-session [-s session-name] ``` -Sessions can be *renamed after creation*. +Sessions can be _renamed after creation_. ```{eval_rst} =============== ========================================================= @@ -320,7 +315,7 @@ Short cut ``Prefix`` + ``$`` ### Window Name -Windows can be *named upon creation*. +Windows can be _named upon creation_. ```{code-block} bash @@ -328,7 +323,7 @@ $ tmux new-window [-n window-name] ``` -Windows can be *renamed after creation*. +Windows can be _renamed after creation_. ```{eval_rst} =============== ========================================================== @@ -588,7 +583,7 @@ $(shell-command) So if `/usr/local/bin/tmux-mem-cpu-load` outputs stats to `stdout`, then `$(tmux-mem-cpu-load)` is going to output the first -line to the status line. The interval is determined by the +line to the status line. The interval is determined by the `status-interval`: ``` @@ -596,7 +591,6 @@ set -g status-interval 1 ``` [tmux-mem-cpu-load]: https://github.com/thewtex/tmux-mem-cpu-load - [basic-cpu-and-memory.tmux]: https://github.com/zaiste/tmuxified/blob/master/scripts/basic-cpu-and-memory.tmux ### Examples @@ -714,9 +708,9 @@ $ nroff -mdoc tmux.1|less ::::{container} rightside-book -*The Tao of tmux* is available on [Leanpub][leanpub] and [Kindle][kindle] (Amazon). +_The Tao of tmux_ is available on [Leanpub][leanpub] and [Kindle][kindle] (Amazon). -:::{figure} _static/img/books/amazon-logo.png +:::{figure} \_static/img/books/amazon-logo.png :scale: 19% :target: http://amzn.to/2gPfRhC :alt: Amazon Kindle @@ -728,9 +722,7 @@ Read and browse the book for [free on the web][free on the web]. :::: [free on the web]: https://leanpub.com/the-tao-of-tmux/read - [leanpub]: https://leanpub.com/the-tao-of-tmux - [kindle]: http://amzn.to/2gPfRhC ::::::: @@ -738,5 +730,3 @@ Read and browse the book for [free on the web][free on the web]. ### License This page is licensed [Creative Commons BY-NC-ND 3.0 US][creative commons by-nc-nd 3.0 us]. - - diff --git a/docs/api.md b/docs/api.md index 37beeb2360..1287d95420 100644 --- a/docs/api.md +++ b/docs/api.md @@ -4,8 +4,7 @@ :::{seealso} -See {ref}`libtmux's API ` and {ref}`Quickstart -` to see how you can control tmux via python API calls. +See {ref}`libtmux's API ` and {ref}`Quickstart ` to see how you can control tmux via python API calls. ::: @@ -143,5 +142,3 @@ See {ref}`libtmux's API ` and {ref}`Quickstart ```{eval-rst} .. autoexception:: tmuxp.exc.BeforeLoadScriptNotExists ``` - - diff --git a/docs/cli.md b/docs/cli.md index 8241f8eb63..f9bf3444b3 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -41,14 +41,16 @@ tmuxp shell -c 'python code' Launch into a python console with [libtmux][libtmux] objects. Compare to django's shell. > > ```{image} _static/tmuxp-shell.gif -> :width: 100% -> +> > :width: 100% +> > ``` +> +> ``` +> +> Automatically preloads current tmux {class}`server `, +> {class}`session `, {class}`window ` +> {class}`pane `. Pass additional arguments to select a +> specific one of your choice: > ``` -> -Automatically preloads current tmux {class}`server `, -{class}`session `, {class}`window ` -{class}`pane `. Pass additional arguments to select a -specific one of your choice: ``` (Pdb) server @@ -107,14 +109,12 @@ my_window ``` [pep 553]: https://www.python.org/dev/peps/pep-0553/ - [ipdb]: https://pypi.org/project/ipdb/ - [libtmux]: https://libtmux.git-pull.com ### Shell detection -`tmuxp shell` detects the richest shell available in your *site packages*, you can also pick your shell via args: +`tmuxp shell` detects the richest shell available in your _site packages_, you can also pick your shell via args: - `--pdb`: Use plain old `breakpoint()` (python 3.7+) or `pdb.set_trace` @@ -274,6 +274,4 @@ tmuxp convert /path/to/file.{json,yaml} ``` tmuxp automatically will prompt to convert `.yaml` to `.json` and -`.json` to `.yaml`. - - +`.json` to `.yaml`. diff --git a/docs/developing.md b/docs/developing.md index f74069df46..005c71dd9f 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -3,7 +3,7 @@ # Developing and Testing ```{eval-rst} -.. todo:: +.. todo:: link to sliderepl or ipython notebook slides ``` @@ -113,7 +113,6 @@ $ poetry shell That is it! You are now ready to code! [poetry]: https://python-poetry.org/ - [poetry's documentation]: https://python-poetry.org/docs/ ## Test Runner @@ -174,10 +173,11 @@ open in a separate terminal. Create two terminals: > > - Terminal 1: `$ tmux -L test_case` +> > - Terminal 2: `$ cd` into the tmuxp project and into the > `virtualenv` if you are using one, see details on installing the dev > version of tmuxp above. Then: -> +> > ``` > $ py.test tests/test_workspacebuilder.py > ``` @@ -195,7 +195,7 @@ This requires `entr(1)`. ::: -Install [entr][entr]. Packages are available available on most Linux and BSD +Install [entr][entr]. Packages are available available on most Linux and BSD variants, including Debian, Ubuntu, FreeBSD, OS X. To run all tests upon editing any `.py` file: @@ -279,15 +279,8 @@ e.g. `RETRY_TIMEOUT_SECONDS=10 py.test` ``` [py.test usage argument]: https://pytest.org/latest/usage.html - [entr]: http://entrproject.org/ - [github actions]: https://github.com/features/actions - [gh build site]: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests - [.github/workflows/tests.yml]: https://github.com/tmux-python/tmuxp/blob/master/.github/workflows/tests.yml - [issue on github]: https://github.com/tmux-python/tmuxp/issues - - diff --git a/docs/examples.md b/docs/examples.md index f4ea8acb41..8e39428138 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -10,7 +10,7 @@ punctual. ::::{sidebar} short hand ```{eval-rst} -.. aafig:: +.. aafig:: :textual: +-------------------+ @@ -67,7 +67,7 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 2 pane ```{eval-rst} -.. aafig:: +.. aafig:: +-----------------+ | $ pwd | @@ -101,7 +101,7 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 3 panes ```{eval-rst} -.. aafig:: +.. aafig:: +-----------------+ | $ pwd | @@ -135,7 +135,7 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 4 panes ```{eval-rst} -.. aafig:: +.. aafig:: +--------+--------+ | $ pwd | $ pwd | @@ -402,7 +402,7 @@ A successful script will exit with a status of `0`. Important: the script file must be chmod executable `+x` or `755`. Run a python script (and check for it's return code), the script is -*relative to the ``.tmuxp.yaml``'s root* (Windows and panes omitted in +_relative to the `.tmuxp.yaml`'s root_ (Windows and panes omitted in this example): ```{code-block} yaml @@ -461,9 +461,9 @@ $ tmuxp load ~/workspaces/myproject.yaml See examples of `tmuxp` in the wild. Have a project config to show off? Edit this page. -* -* -* +- +- +- You can use `start_directory: ./` to make the directories relative to the config file / project root. @@ -516,7 +516,6 @@ windows: ``` [pipenv]: https://docs.pipenv.org/ - [poetry]: https://python-poetry.org/ ## Kung fu @@ -533,5 +532,3 @@ See: {meth}`tmuxp.config.validate_schema`. Add yours? Submit a pull request to the [github][github] site! [github]: https://github.com/tmux-python/tmuxp - - diff --git a/docs/glossary.md b/docs/glossary.md index 697ea69562..3a24d8c450 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -3,7 +3,7 @@ # Glossary ```{eval-rst} -.. glossary:: +.. glossary:: tmuxp A tool to manage workspaces with tmux. A pythonic abstraction of @@ -64,5 +64,3 @@ ``` [kaptan on github]: https://github.com/emre/kaptan - - diff --git a/docs/history.md b/docs/history.md index b60bfafd8a..5fa27375f9 100644 --- a/docs/history.md +++ b/docs/history.md @@ -7,6 +7,5 @@ ``` ```{include} ../CHANGES -``` - +``` diff --git a/docs/index.md b/docs/index.md index 0913e88cf0..cc6be27282 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,6 +5,7 @@ ## tmux session manager ```{include} ../README.md + ``` ```{image} _static/tmuxp-demo.gif @@ -29,5 +30,3 @@ about_tmux glossary ``` - - diff --git a/docs/plugin_system.md b/docs/plugin_system.md index ab75f2fc2a..fa63b2ff51 100644 --- a/docs/plugin_system.md +++ b/docs/plugin_system.md @@ -145,5 +145,3 @@ plugins: ```{eval-rst} .. automethod:: tmuxp.plugin.TmuxpPlugin.reattach ``` - - diff --git a/docs/quickstart.md b/docs/quickstart.md index 7ad90e8647..0630be4f08 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -121,13 +121,7 @@ AL - [Abstraction Layer][abstraction layer] | {meth}`libtmux.Pane.send_keys` | `$ tmux send-keys` | [import]: http://tmuxp.git-pull.com/cli.html#import - [tmuxinator]: https://github.com/aziz/tmuxinator - [teamocil]: https://github.com/remiprev/teamocil - [abstraction layer]: http://en.wikipedia.org/wiki/Abstraction_layer - [object relational mapper]: http://en.wikipedia.org/wiki/Object-relational_mapping - - From 939b09242056ff5c06c2c4de86b14601f25f52fb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 13:23:54 -0500 Subject: [PATCH 0793/2998] Makefile: prettier -> format_markdown --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 053f22db24..93a623dc8e 100644 --- a/Makefile +++ b/Makefile @@ -40,5 +40,5 @@ flake8: watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi -prettier: +format_markdown: prettier --parser=markdown -w *.md docs/*.md docs/**/*.md CHANGES From 6fcbf1b9378957f6c536fa56b6699d08b0e90ec3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:17:30 -0500 Subject: [PATCH 0794/2998] libtmux: Update to 0.10.x --- CHANGES | 1 + poetry.lock | 8 ++++---- pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 6ee081c17a..673797be0d 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ ## current - _Insert changes/features/fixes for next release here_ +- libtmux: Update to 0.10.x ## tmuxp 1.8.2 (2021-06-15) diff --git a/poetry.lock b/poetry.lock index f00f3ceb4b..4b8169d9a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -354,7 +354,7 @@ description = "scripting library / orm for tmux" name = "libtmux" optional = false python-versions = "*" -version = "0.9.0" +version = "0.10.0" [[package]] category = "dev" @@ -967,7 +967,7 @@ lint = [] test = [] [metadata] -content-hash = "a6016efed57089caf7829ace922fb60fc48930b36825834650bc22b7c36e62c1" +content-hash = "1b78b0efe66005d54edd9b183d9bf4925f34e3c7b3303dfb8f1fb33efd879bf4" lock-version = "1.0" python-versions = "^3.6" @@ -1196,8 +1196,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] libtmux = [ - {file = "libtmux-0.9.0-py3-none-any.whl", hash = "sha256:9684fa7c42e05275d0872b9d1f329b921211a107bc6cf98cb569b8f7f68a9096"}, - {file = "libtmux-0.9.0.tar.gz", hash = "sha256:c42727cbbcd02403cffb79c8ba8ea4f95ff1bd8c9328612fea537acd25e5ae16"}, + {file = "libtmux-0.10.0-py3-none-any.whl", hash = "sha256:a6884df0400be68f05d13afcc606d90db81090a25ff887716e2111c299d071d2"}, + {file = "libtmux-0.10.0.tar.gz", hash = "sha256:cc1d64e72fc64d3d8ccf7c50fb0294c84894f07a74d53eef3df74c4fe98af521"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, diff --git a/pyproject.toml b/pyproject.toml index 82746ce7f0..fede994fa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.6" click = "^7" kaptan = ">=0.5.10" -libtmux = "<0.10" +libtmux = "<0.11" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From e96866521947e39364a35ff138ae117953e5034f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:19:22 -0500 Subject: [PATCH 0795/2998] setup.py: Add long_description to text/markdown --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index b8c70ccab3..419f20e706 100644 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ author_email=about['__email__'], description=about['__description__'], long_description=readme, + long_description_content_type="text/markdown", packages=['tmuxp'], include_package_data=True, install_requires=install_reqs, From 4b42212893efceb33c0f2f0a0acd95b820367a9c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:20:18 -0500 Subject: [PATCH 0796/2998] Tag v1.9.0 - convert to markdown --- CHANGES | 2 ++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 673797be0d..1c972374c1 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ ## current - _Insert changes/features/fixes for next release here_ + +## tmuxp 1.9.0 (2021-06-16) - libtmux: Update to 0.10.x ## tmuxp 1.8.2 (2021-06-15) diff --git a/pyproject.toml b/pyproject.toml index fede994fa4..e058cdc82a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.8.2" +version = "1.9.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index a9bd6faa6d..7619cfd798 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.8.2' +__version__ = '1.9.0' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 2ddd7550e4dbe0f790504aa1107ff2ff8377b869 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:22:15 -0500 Subject: [PATCH 0797/2998] docs: Fix double header --- docs/history.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/history.md b/docs/history.md index 5fa27375f9..7fba9cc2ee 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,7 +1,5 @@ (history)= -# History - ```{module} tmuxp ``` From ce0f7e846480bc0d91e40b799b2805d7bd0022c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:39:00 -0500 Subject: [PATCH 0798/2998] Bump libtmux to at least 0.10.1 See also: https://github.com/tmux-python/libtmux/pull/271 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- requirements/base.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4b8169d9a5..4d8d91521c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -354,7 +354,7 @@ description = "scripting library / orm for tmux" name = "libtmux" optional = false python-versions = "*" -version = "0.10.0" +version = "0.10.1" [[package]] category = "dev" @@ -967,7 +967,7 @@ lint = [] test = [] [metadata] -content-hash = "1b78b0efe66005d54edd9b183d9bf4925f34e3c7b3303dfb8f1fb33efd879bf4" +content-hash = "e4211e626fa323273adddab361fc864b657689b3897154f1d2545a59764dd11a" lock-version = "1.0" python-versions = "^3.6" @@ -1196,8 +1196,8 @@ keyring = [ {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, ] libtmux = [ - {file = "libtmux-0.10.0-py3-none-any.whl", hash = "sha256:a6884df0400be68f05d13afcc606d90db81090a25ff887716e2111c299d071d2"}, - {file = "libtmux-0.10.0.tar.gz", hash = "sha256:cc1d64e72fc64d3d8ccf7c50fb0294c84894f07a74d53eef3df74c4fe98af521"}, + {file = "libtmux-0.10.1-py3-none-any.whl", hash = "sha256:db307412e58214e0ca2db32ecdbe2649ae8f38c6540279624367681dcdbe3014"}, + {file = "libtmux-0.10.1.tar.gz", hash = "sha256:c8bc81499616ba899538704e419463a1c83ba7ca21e53b1efc6abbe98eb26b61"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, diff --git a/pyproject.toml b/pyproject.toml index e058cdc82a..9485c0b514 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.6" click = "^7" kaptan = ">=0.5.10" -libtmux = "<0.11" +libtmux = "~0.10.1" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] diff --git a/requirements/base.txt b/requirements/base.txt index 50f749e54e..f7216b774d 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux>=0.9,<0.10 +libtmux>=0.10.1,<0.11 click>=7,<8 colorama>=0.3.9 From c52a3a406ec062ab974a212a8fa08a4d7a08f6ac Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:40:29 -0500 Subject: [PATCH 0799/2998] Tag v1.9.1 --- CHANGES | 5 +++++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 1c972374c1..838671bf4b 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,11 @@ - _Insert changes/features/fixes for next release here_ +## tmuxp 1.9.1 (2021-06-16) +- libtmux: Update to 0.10.1+ to include `Window.select_window()` fix + + https://github.com/tmux-python/libtmux/pull/271 + ## tmuxp 1.9.0 (2021-06-16) - libtmux: Update to 0.10.x diff --git a/pyproject.toml b/pyproject.toml index 9485c0b514..53a4049247 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.9.0" +version = "1.9.1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 7619cfd798..45cba6a39b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.9.0' +__version__ = '1.9.1' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 98d4b052201a1d7c0af13215bd43f4dec8a31460 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:55:51 -0500 Subject: [PATCH 0800/2998] Remove manual/: Moved to https://github.com/tmux-python/tmux-manuals --- manual/0.8.txt | 808 ----------------- manual/0.9.txt | 917 ------------------- manual/1.0.txt | 1244 -------------------------- manual/1.1.txt | 1313 ---------------------------- manual/1.2.txt | 1473 ------------------------------- manual/1.3.txt | 1585 --------------------------------- manual/1.4.txt | 1633 ---------------------------------- manual/1.5.txt | 1741 ------------------------------------ manual/1.6.txt | 1891 ---------------------------------------- manual/1.7.txt | 2010 ------------------------------------------ manual/1.8.txt | 2178 ---------------------------------------------- manual/NOTES.md | 81 -- manual/README.md | 26 - 13 files changed, 16900 deletions(-) delete mode 100644 manual/0.8.txt delete mode 100644 manual/0.9.txt delete mode 100644 manual/1.0.txt delete mode 100644 manual/1.1.txt delete mode 100644 manual/1.2.txt delete mode 100644 manual/1.3.txt delete mode 100644 manual/1.4.txt delete mode 100644 manual/1.5.txt delete mode 100644 manual/1.6.txt delete mode 100644 manual/1.7.txt delete mode 100644 manual/1.8.txt delete mode 100644 manual/NOTES.md delete mode 100644 manual/README.md diff --git a/manual/0.8.txt b/manual/0.8.txt deleted file mode 100644 index 0550ae7d33..0000000000 --- a/manual/0.8.txt +++ /dev/null @@ -1,808 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28dqUuVv] [-f file] [-L socket-name] [-S socket-path] - [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer; it enables a number of terminals to be - accessed and controlled from a single terminal. - - tmux runs as a server-client system. A server is created automatically - when necessary and holds a number of sessions, each of which may have a - number of windows linked to it. A window may be split on screen into one - or more panes, each of which is a separate terminal. Any number of - clients may connect to a session, or the server may be controlled by - issuing commands with tmux. Communication takes place through a socket, - by default placed in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, indicates the terminal supports 88 colours. - - -d Force tmux to assume the terminal supports default colours. - - -f file Specify an alternative configuration file. By default, - tmux will look for a config file at ~/.tmux.conf. The con- - figuration file is a set of tmux commands which are exe- - cuted in sequence when the server is first started. - - -q Prevent the server sending various information messages, - for example when window flags are altered. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -U Unlock the server. - - -u Instruct tmux that the terminal support UTF-8. - - -V Print program version. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the pid of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, and described in the following sections. If no com- - mand and flags is specified, the new-session command is - assumed. - -QUICK START - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - $ - - Within an active session, a new window may be created by typing 'C-b' - (ctrl-b, known as the prefix key) followed by the 'c' key. - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'Q' to exit from it. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (ctrl-b) by default, followed by a command key. - - Some of the default key bindings include: - - 'd' Detach current client. - 'c' Create new window. - 'n' Change to next window in the current session. - 'p' Change to previous window in the current session. - 'l' Move to last (previously selected) window in the current session. - 't' Display a large clock. - '?' List current key bindings. - - A complete list may be obtained with the list-keys command (bound to '?' - by default). Key bindings may be changed with the bind-key and - unbind-key commands. - -HISTORY - tmux maintains a configurable history buffer for each window. By - default, up to 2000 lines are kept, this can be altered with the - history-limit option (see the set-option command below). - -MODES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The others are: - - output mode - This is entered when a command which produces output, such as - list-keys, is executed from a key binding. - - scroll mode - This is entered with the scroll-mode command (bound to '=' by - default) and permits the window history buffer to be inspected. - - copy mode - This permits a section of a window or its history to be copied to - a paste buffer for later insertion into another window. This - mode is entered with the copy-mode command, bound to ['' by - default. - - The keys available depend on whether emacs(1) or vi(1) mode is selected - (see the mode-keys option). The following keys are supported as appro- - priate for the mode: - - Function vi emacs - Start of line 0 or ^ C-a - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - End of line $ C-e - Cursor left h Left - Next page C-f Page down - Next word w M-f - Previous page C-u Page up - Previous word b M-b - Quit mode q Escape - Cursor right l Right - Start selection Space C-Space - Cursor up k Up - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - -PANES AND LAYOUTS - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. - - Panes are numbered beginning from zero; in horizontal layouts zero is the - leftmost pane and in vertical the topmost. - - Panes may be arranged using several layouts. The layout may be cycled - with the next-layout command (bound to 'C-space' by default), the current - pane may be changed with the up-pane and down-pane commands and the - rotate-window and swap-pane commands may be used to swap panes without - changing the window layout. - - The following layouts are supported: - - manual Manual layout splits windows vertically (running across); only - with this layout may panes be resized using the resize-pane-up - and resize-pane-down commands. - - active-only - Only the active pane is shown - all other panes are hidden. - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - left-vertical - A large (81 column) pane is shown on the left of the window and - the remaining panes are spread from top to bottom in the leftover - space to the right. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session or target-window. These specify the client, session or - window which a command should affect. target-client is the name of the - pty(4) file to which the client is connected, for example /dev/ttyp1. - Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command); or the name of a client as for target-client, in - this case, the session attached to the client is used. An fnmatch(3) - pattern may be used to match the session name. If a session is omitted - when required, tmux attempts to use the current session; if no current - session is available, the most recently created is chosen. If no client - is specified, the current client is chosen, if possible, or an error is - reported. - - target-window specifies a window in the form session:index, for example - mysession:1. The session is in the same form as for target-session. - session, index or both may be omitted. If session is omitted, the same - rules as for target-session are followed; if index is not present, the - current window for the given session is used. When the argument does not - contain a colon (:), tmux first attempts to parse it as window index; if - that fails, an attempt is made to match a session or client name. - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon (' - ; '); commands are executed sequentially from left to right. A literal - semicolon may be included by escaping it with a backslash (for example, - when specifying a command sequence to bind-key). - - Examples include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key D detach-client \; lock-server - - The following commands are available: - - attach-session [-d] [-t target-session] - (alias: attach) - Create a new client in the current terminal and attach it to a - session. If -d is specified, any other clients attached to the - session are detached. - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - bind-key [-r] key command [arguments] - (alias: bind) - Bind key key to command. Keys may be specified prefixed with - 'C-' or '^' for ctrl keys, or 'M-' for alt (meta) keys. The -r - flag indicates this key may repeat, see the repeat-time option. - - break-pane [-d] [-p pane-index] [-t target-window] - Break the current pane off from its containing window to make it - the only pane in a new window. If -d is given, the new window - does not become the current window. - - choose-session [-t target-window] - Put a window into session choice mode, where the session for the - current client may be selected interactively from a list. This - command works only from inside tmux. - - choose-window [-t target-window] - Put a window into window choice mode, where the window for the - session attached to the current client may be selected interac- - tively from a list. This command works only from inside tmux. - - clock-mode [-t target-window] - Display a large clock. - - command-prompt [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command; any %% in the template will - be replaced by what is entered at the prompt. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - copy-mode [-u] [-t target-window] - Enter copy mode. The -u option scrolls one page up. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - down-pane [-p pane-index] [-t target-window] - (alias: downp) - Move down a pane. - - find-window [-t target-window] match-string - (alias: findw) - Search for match-string in window names, titles, and visible con- - tent (but not history). If only one window is matched, it'll be - automatically selected, otherwise a choice list is shown. This - command only works from inside tmux. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-pane [-p pane-index] [-t target-window] - (alias: killp) - Destroy the given pane. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-keys - (alias: lsk) - List all key bindings. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - lock-server - (alias: lock) - Lock the server until a password is entered. - - move-window [-d] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-session [-d] [-n window-name] [-s session-name] [command] - (alias: new) - Create a new session with name session-name. The new session is - attached to the current terminal unless -d is given. window-name - and command are the name of and command to execute in the initial - window. - - new-window [-d] [-n window-name] [-t target-window] [command] - (alias: neww) - Create a new window. If -d is given, the session does not make - the new window the current window. target-window represents the - window to be created. command is the command to execute. If - command is not specified, the default command is used. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-t target-session] - (alias: next) - Move to the next window in the session. - - paste-buffer [-d] [-b buffer-index] [-t target-window] - (alias: pasteb) - Insert the contents of a paste buffer into the current window. - - previous-window [-t target-session] - (alias: prev) - Move to the previous window in the session. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane-down [-p pane-index] [-t target-window] [adjustment] - (alias: resizep-down) - - resize-pane-up [-p pane-index] [-t target-window] [adjustment] - (alias: resizep-up) - Resize a pane. The adjustment is given in lines (the default is - 1). - - respawn-window [-k] [-t target-window] [command] - (alias: respawnw) - Reactive a window in which the command has exited (see the - remain-on-exit window option). If command is not given, the com- - mand used when the window was created is executed. The window - must be already inactive, unless -k is given, in which case any - existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - scroll-mode [-u] [-t target-window] - Enter scroll mode. The -u has the same meaning as in the - copy-mode command. - - select-pane [-p pane-index] [-t target-window] - (alias: selectp) - Make pane pane-index the active pane in window target-window. - - select-prompt [-t target-client] - Open a prompt inside target-client allowing a window index to be - entered interactively. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - send-keys [-t target-window] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-window] - Send the prefix key to a window as if it was pressed. - - server-info - (alias: info) - Show server information and terminal details. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - set-option [-gu] [-t target-session] option value - (alias: set) - Set an option. If -g is specified, the option is set as a global - option. Global options apply to all sessions which don't have - the option explicitly set. If -g is not used, the option applies - only to target-session. The -u flag unsets an option, so a ses- - sion inherits the option from the global options - it is not pos- - sible to unset a global option. - - Possible options are: - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command command - Set the command used for new windows (if not specified - when the window is created) to command. The default is - ``exec $SHELL''. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is the current working directory when the server is - started. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the server after number seconds of inactivity. The - default is off (set to 0). This has no effect as a ses- - sion option; it must be set as a global option using -g. - - message-attr attributes - Set status line message attributes, where attributes is - either default or a comma-delimited list of one or more - of: bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white or default. - - message-fg colour - Set status line message foreground colour. - - prefix key - Set the current prefix key. - - repeat-time number - Allow multiple commands to be entered without pressing - the prefix-key again in the specified number milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys of the up-pane, - down-pane, resize-pane-up, and resize-pane-down commands. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code and the terminal appears to be an xterm. This - option is enabled by default. Note that elinks(1) will - only attempt to set the window title if the STY environ- - ment variable is set. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-keys [vi | emacs] - Use vi(1) - or emacs(1) -style key bindings in the status - line, for example at the command prompt. Defaults to - emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character pairs: - - Character pair Replaced with - #(command) First line of command's output - #H Hostname of local host - #S Session name - #T Current window title - ## A literal '#' - - Where appropriate, these may be prefixed with a number to - specify the maximum length, for example '#24T'. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the date and time will be shown. As with - status-left, string will be passed to strftime(3) and - character pairs are replaced. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - set-password [-c] password - (alias: pass) - Set the server password. If the -c option is given, a pre- - encrypted password may be specified. By default, the password is - blank, thus any entered password will be accepted when unlocking - the server (see the lock-server command). To prevent variable - expansion when an encrypted password is read from a configuration - file, enclose it in single quotes ('). - - set-window-option [-gu] [-t target-window] option value - (alias: setw) - Set a window-specific option. The -g and -u flags work similarly - to the set-option command. - - Supported options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi(1) - or emacs(1) -style key bindings in scroll and - copy modes. Key bindings default to emacs. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as shift, meta or ctrl. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - - show-options [-t target-session] option value - (alias: show) - Show the currently set options. If a target-session is speci- - fied, the options for that session are shown; otherwise, the - global options are listed. - - show-window-options [-t target-window] option value - (alias: showw) - List the current options for the given window. - - source-file path - (alias: source) - Execute commands from path. - - split-window [-d] [-l lines | -p percentage] [-t target-window] [command] - (alias: splitw) - Creates a new window by splitting it vertically. The -l and -p - options specify the size of the new window in lines, or as a per- - centage, respectively. All other options have the same meaning - as in the new-window command. - - A few notes with regard to panes: - 1. If attempting to split a window with less than eight lines, - an error will be shown. - 2. If the window is resized, as many panes are shown as can fit - without reducing them below four lines. - 3. The minimum pane size is four lines (including the separator - line). - 4. The panes are indexed from top (0) to bottom, with no num- - bers skipped. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c -target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - swap-pane [-dDU] [-p src-index] [-t target-window] [-q dst-index] - (alias: swapp) - Swap two panes within a window. If -U is used, the pane is - swapped with the pane above (before it numerically); -D swaps - with the pane below (the next numerically); or dst-index may be - give to swap with a specific pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - switch-client [-c target-client -t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - - unbind-key key - (alias: unbind) - Unbind the key bound to key. - - unlink-window [-t target-window] - (alias: unlinkw) - Unlink target-window. A window may be unlinked only if it is - linked to multiple sessions - windows may not be linked to no - sessions. - - up-pane [-p pane-index] [-t target-window] - (alias: upp) - Move up a pane. - -FILES - ~/.tmux.conf - default tmux configuration file - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD April 20, 2009 BSD diff --git a/manual/0.9.txt b/manual/0.9.txt deleted file mode 100644 index e0fb1eed6e..0000000000 --- a/manual/0.9.txt +++ /dev/null @@ -1,917 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28dqUuv] [-f file] [-L socket-name] [-S socket-path] - [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - accessed and controlled from a single terminal. - - tmux runs as a server-client system. A server is created automatically - when necessary and holds a number of sessions, each of which may have a - number of windows linked to it. A window may be split on screen into one - or more panes, each of which is a separate terminal. Any number of - clients may connect to a session, or the server may be controlled by - issuing commands with tmux. Communication takes place through a socket, - by default placed in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -d Force tmux to assume the terminal supports default colours. - - -f file Specify an alternative configuration file. By default, - tmux will look for a config file at ~/.tmux.conf. The con- - figuration file is a set of tmux commands which are exe- - cuted in sequence when the server is first started. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -q Prevent the server sending various informational messages, - for example when window flags are altered. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -U Unlock the server. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mand and flags are specified, the new-session command is - assumed. - -QUICK START - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - Some of the default key bindings include: - - c Create new window. - d Detach current client. - l Move to last (previously selected) window in the current ses- - sion. - n Change to next window in the current session. - p Change to previous window in the current session. - t Display a large clock. - ? List current key bindings. - - A complete list may be obtained with the list-keys command (bound to '?' - by default). Key bindings may be changed with the bind-key and - unbind-key commands. - -HISTORY - tmux maintains a configurable history buffer for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command below). - -MODES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The others are: - - output mode - This is entered when a command which produces output, such as - list-keys, is executed from a key binding. - - scroll mode - This is entered with the scroll-mode command (bound to '=' by - default) and permits the window history buffer to be inspected. - - copy mode - This permits a section of a window or its history to be copied to - a paste buffer for later insertion into another window. This - mode is entered with the copy-mode command, bound to ['' by - default. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Start of line 0 or ^ C-a - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - End of line $ C-e - Cursor left h Left - Next page C-f Page down - Next word w M-f - Previous page C-u Page up - Previous word b M-b - Quit mode q Escape - Cursor right l Right - Start selection Space C-Space - Cursor up k Up - Paste buffer p C-y - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - -PANES AND LAYOUTS - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. - - Panes are numbered beginning from zero; in horizontal layouts zero is the - leftmost pane and in vertical the topmost. - - Panes may be arranged using several layouts. The layout may be cycled - with the next-layout command (bound to 'C-space' by default), the current - pane may be changed with the up-pane and down-pane commands and the - rotate-window and swap-pane commands may be used to swap panes without - changing the window layout. - - The following layouts are supported: - - active-only - Only the active pane is shown - all other panes are hidden. - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - manual Manual layout splits windows vertically (running across); only - with this layout may panes be resized using the resize-pane com- - mand. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. The - window list shows the index, name and (if any) flag of the windows - present in the current session in ascending numerical order. The flag is - one of the following symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session or target-window. These specify the client, session or - window which a command should affect. target-client is the name of the - pty(4) file to which the client is connected, for example /dev/ttyp1. - Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client, target-client, in which - case the session attached to the client is used. An fnmatch(3) pattern - may be used to match the session name. If a session is omitted when - required, tmux attempts to use the current session; if no current session - is available, the most recently created is chosen. If no client is spec- - ified, the current client is chosen, if possible, or an error is - reported. - - target-window specifies a window in the form session:index, for example - mysession:1. The session is in the same form as for target-session. - session, index or both may be omitted. If session is omitted, the same - rules as for target-session are followed; if index is not present, the - current window for the given session is used. When the argument does not - contain a colon, tmux first attempts to parse it as window index; if that - fails, an attempt is made to match a session or client name. - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Examples include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key D detach-client \; lock-server - - The following commands are available: - - attach-session [-d] [-t target-session] - (alias: attach) - Create a new client in the current terminal and attach it to a - session. If -d is specified, any other clients attached to the - session are detached. - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - bind-key [-r] key command [arguments] - (alias: bind) - Bind key key to command. Keys may be specified prefixed with - 'C-' or '^' for Ctrl keys, or 'M-' for Alt (meta) keys. The -r - flag indicates this key may repeat, see the repeat-time option. - - break-pane [-d] [-p pane-index] [-t target-window] - (alias: breakp) - Break the current pane off from its containing window to make it - the only pane in a new window. If -d is given, the new window - does not become the current window. - - choose-session [-t target-window] - Put a window into session choice mode, where the session for the - current client may be selected interactively from a list. This - command works only from inside tmux. - - choose-window [-t target-window] - Put a window into window choice mode, where the window for the - session attached to the current client may be selected interac- - tively from a list. This command works only from inside tmux. - - clear-history [-p pane-index] [-t target-window] - (alias: clearhist) - Remove and free the history for the specified pane. - - clock-mode [-t target-window] - Display a large clock. - - command-prompt [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command; any %% in the template will - be replaced by what is entered at the prompt. - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - copy-mode [-u] [-t target-window] - Enter copy mode. The -u option scrolls one page up. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - down-pane [-p pane-index] [-t target-window] - (alias: downp) - Move down a pane. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-pane [-p pane-index] [-t target-window] - (alias: killp) - Destroy the given pane. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-keys - (alias: lsk) - List all key bindings. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - lock-server - (alias: lock) - Lock the server until a password is entered. - - move-window [-d] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-session [-d] [-n window-name] [-s session-name] [command] - (alias: new) - Create a new session with name session-name. The new session is - attached to the current terminal unless -d is given. window-name - and command are the name of and command to execute in the initial - window. - - new-window [-d] [-n window-name] [-t target-window] [command] - (alias: neww) - Create a new window. If -d is given, the session does not make - the new window the current window. target-window represents the - window to be created. command is the command to execute. If - command is not specified, the default command is used. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - paste-buffer [-d] [-b buffer-index] [-t target-window] - (alias: pasteb) - Insert the contents of a paste buffer into the current window. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DU] [-p pane-index] [-t target-window] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default) or downward with -D. - The adjustment is given in lines (the default is 1). - - respawn-window [-k] [-t target-window] [command] - (alias: respawnw) - Reactive a window in which the command has exited (see the - remain-on-exit window option). If command is not given, the com- - mand used when the window was created is executed. The window - must be already inactive, unless -k is given, in which case any - existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - scroll-mode [-u] [-t target-window] - Enter scroll mode. The -u has the same meaning as in the - copy-mode command. - - select-layout [-t target-window] layout-name - (alias: selectl) - Choose a specific layout for a window. - - select-pane [-p pane-index] [-t target-window] - (alias: selectp) - Make pane pane-index the active pane in window target-window. - - select-prompt [-t target-client] - Open a prompt inside target-client allowing a window index to be - entered interactively. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - send-keys [-t target-window] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-window] - Send the prefix key to a window as if it was pressed. - - server-info - (alias: info) - Show server information and terminal details. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - set-option [-gu] [-t target-session] option value - (alias: set) - Set an option. If -g is specified, the option is set as a global - option. Global options apply to all sessions which don't have - the option explicitly set. If -g is not used, the option applies - only to target-session. The -u flag unsets an option, so a ses- - sion inherits the option from the global options - it is not pos- - sible to unset a global option. - - Possible options are: - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command command - Set the command used for new windows (if not specified - when the window is created) to command. The default is - an empty string, which instructs tmux to create a login - shell using the SHELL environment variable or, if it is - unset, the user's shell returned by getpwuid(3). - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is the current working directory when the server is - started. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the server after number seconds of inactivity. The - default is off (set to 0). This has no effect as a ses- - sion option; it must be set as a global option using -g. - - message-attr attributes - Set status line message attributes, where attributes is - either default or a comma-delimited list of one or more - of: bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white or default. - - message-fg colour - Set status line message foreground colour. - - prefix key - Set the current prefix key. - - repeat-time number - Allow multiple commands to be entered without pressing - the prefix-key again in the specified number milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys of the up-pane, - down-pane, resize-pane-up, and resize-pane-down commands. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code and the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. Defaults to emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character pairs: - - Character pair Replaced with - #(command) First line of command's output - #H Hostname of local host - #S Session name - #T Current window title - ## A literal '#' - - Where appropriate, these may be prefixed with a number to - specify the maximum length, for example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the date and time will be shown. As with - status-left, string will be passed to strftime(3), char- - acter pairs are replaced, and UTF-8 is dependent on the - status-utf8 option. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - set-password [-c] password - (alias: pass) - Set the server password. If the -c option is given, a pre- - encrypted password may be specified. By default, the password is - blank, thus any entered password will be accepted when unlocking - the server (see the lock-server command). To prevent variable - expansion when an encrypted password is read from a configuration - file, enclose it in single quotes ('). - - set-window-option [-gu] [-t target-window] option value - (alias: setw) - Set a window-specific option. The -g and -u flags work similarly - to the set-option command. - - Supported options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-width width - - main-pane-height height - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in scroll and copy - modes. Key bindings default to emacs. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - - show-options [-t target-session] option value - (alias: show) - Show the currently set options. If a target-session is speci- - fied, the options for that session are shown; otherwise, the - global options are listed. - - show-window-options [-t target-window] option value - (alias: showw) - List the current options for the given window. - - source-file path - (alias: source) - Execute commands from path. - - split-window [-d] [-l lines | -p percentage] [-t target-window] [command] - (alias: splitw) - Creates a new window by splitting it vertically. The -l and -p - options specify the size of the new window in lines, or as a per- - centage, respectively. All other options have the same meaning - as in the new-window command. - - A few notes with regard to panes: - 1. If attempting to split a window with less than eight lines, - an error will be shown. - 2. If the window is resized, as many panes are shown as can fit - without reducing them below four lines. - 3. The minimum pane size is four lines (including the separator - line). - 4. The panes are indexed from top (0) to bottom, with no num- - bers skipped. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c -target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - swap-pane [-dDU] [-p src-index] [-t target-window] [-q dst-index] - (alias: swapp) - Swap two panes within a window. If -U is used, the pane is - swapped with the pane above (before it numerically); -D swaps - with the pane below (the next numerically); or dst-index may be - give to swap with a specific pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - switch-client [-c target-client -t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - - unbind-key key - (alias: unbind) - Unbind the key bound to key. - - unlink-window [-t target-window] - (alias: unlinkw) - Unlink target-window. A window may be unlinked only if it is - linked to multiple sessions - windows may not be linked to no - sessions. - - up-pane [-p pane-index] [-t target-window] - (alias: upp) - Move up a pane. - -FILES - ~/.tmux.conf Default tmux configuration file. - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.0.txt b/manual/1.0.txt deleted file mode 100644 index 83260edd71..0000000000 --- a/manual/1.0.txt +++ /dev/null @@ -1,1244 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28dlqUuv] [-f file] [-L socket-name] [-S socket-path] - [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -d Force tmux to assume the terminal supports default colours. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -q Prevent the server sending various informational messages, - for example when window flags are altered. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -U Unlock the server. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - Some of the default key bindings are: - - c Create a new window. - d Detach the current client. - l Move to the previously selected window. - n Change to the next window. - p Change to the previous window. - & Kill the current window. - , Rename the current window. - ? List all key bindings. - - A complete list may be obtained with the list-keys command (bound to '?' - by default). Key bindings may be changed with the bind-key and - unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently created is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Examples include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key D detach-client \; lock-server - -CLIENTS AND SESSIONS - The following commands are available: - - attach-session [-d] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - new-session [-d] [-n window-name] [-s session-name] [command] - (alias: new) - Create a new session with name session-name. The new session is - attached to the current terminal unless -d is given. window-name - and command are the name of and command to execute in the initial - window. - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The others are: - - output mode - This is entered when a command which produces output, such as - list-keys, is executed from a key binding. - - scroll mode - This is entered with the scroll-mode command (bound to '=' by - default) and permits the window history buffer to be inspected. - - copy mode - This permits a section of a window or its history to be copied to - a paste buffer for later insertion into another window. This - mode is entered with the copy-mode command, bound to ['' by - default. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor up k Up - Delete entire line d C-u - Delete to end of line D C-k - End of line $ C-e - Goto line g g - Next page C-f Page down - Next word w M-f - Paste buffer p C-y - Previous page C-u Page up - Previous word b M-b - Quit mode q Escape - Search again n n - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Transpose chars C-t - - These key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the window-choose command) or in output mode; and vi-copy - and emacs-copy used in copy and scroll modes. The tables may be viewed - with the list-keys command and keys modified or removed with bind-key and - unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The mode commands are as follows: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - scroll-mode [-u] [-t target-pane] - Enter scroll mode. The -u has the same meaning as in the - copy-mode command. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - up-pane and down-pane commands and the rotate-window and swap-pane com- - mands may be used to swap panes without changing their position. Panes - are numbered beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'C-space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time and display-panes-colour session - options. While the indicator is on screen, a pane may be - selected with the '0' to '9' keys. - - down-pane [-t target-pane] - (alias: downp) - Move down a pane. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - kill-pane [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - move-window [-d] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-dk] [-n window-name] [-t target-window] [command] - (alias: neww) - Create a new window. If -d is given, the session does not make - the new window the current window. target-window represents the - window to be created; if the target already exists an error is - shown, unless the -k flag is used, in which case it is destroyed. - command is the command to execute. If command is not specified, - the default command is used. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-window [-k] [-t target-window] [command] - (alias: respawnw) - Reactive a window in which the command has exited (see the - remain-on-exit window option). If command is not given, the com- - mand used when the window was created is executed. The window - must be already inactive, unless -k is given, in which case any - existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last layout used (if any) is reapplied. - - select-pane [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - split-window [-dhv] [-l size | -p percentage] [-t target-window] - [command] - (alias: splitw) - Creates a new pane by splitting the active pane: -h does a hori- - zontal split and -v a vertical split; if neither is specified, -v - is assumed. The -l and -p options specify the size of the new - window in lines (for vertical split) or in cells (for horizontal - split), or as a percentage, respectively. All other options have - the same meaning as in the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - - up-pane [-t target-pane] - (alias: upp) - Move up a pane. - -KEY BINDINGS - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. Keys may be specified prefixed with - 'C-' or '^' for Ctrl keys, or 'M-' for Alt (meta) keys. - - By default (without -t) the primary key bindings are modified - (those normally activated with the prefix key); in this case, if - -n is specified, it is not necessary to use the prefix key, - command is bound to key alone. The -r flag indicates this key - may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are enclosed - in square brackets. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. - - unbind-key [-cn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are two types of option: session options - and window options. - - Each individual session may have a set of session options, and there is a - separate set of global session options. Sessions which do not have a - particular option configured inherit the value from the global session - options. Session options are set or unset with the set-option command - and may be listed with the show-options command. The available session - options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agu] [-t target-session] option value - (alias: set) - Set a session option. With -a, and if the option expects a - string, value is appended to the existing setting. If -g is - specified, the global session option is set. The -u flag unsets - an option, so a session inherits the option from the global - options - it is not possible to unset a global option. - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command command - Set the command used for new windows (if not specified - when the window is created) to command, which may be any - sh(1) command. The default is an empty string, which - instructs tmux to create a login shell using the value of - the default-shell option. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is the current working directory when the server is - started. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - display-panes-colour colour - Set the colour used for the display-panes command. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the server after number seconds of inactivity. The - default is off (set to 0). This has no effect as a ses- - sion option; it must be set as a global option using -g. - When passwords are entered incorrectly, tmux follows the - behaviour of login(1) and ignores further password - attempts for an increasing timeout. - - message-attr attributes - Set status line message attributes, where attributes is - either default or a comma-delimited list of one or more - of: bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - palette, or default. - - message-fg colour - Set status line message foreground colour. - - prefix key - Set the current prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. Defaults to emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(command) First line of command's output - #[attributes] Colour or attribute change - #H Hostname of local host - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(command) form executes 'command' as a shell command - and inserts the first line of its output. #[attributes] - allows a comma-separated list of attributes to be speci- - fied, these may be 'fg=colour' to set the foreground - colour, 'bg=colour' to set the background colour, or one - of the attributes described under the message-attr - option. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, these may be prefixed with a number to - specify the maximum length, for example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the date and time will be shown. As with - status-left, string will be passed to strftime(3), char- - acter pairs are replaced, and UTF-8 is dependent on the - status-utf8 option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY WINDOWID SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-width width - main-pane-height height - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in scroll, copy and - choice modes. Key bindings default to emacs. - - mode-mouse [on | off] - Mouse state in modes. If on, tmux will respond to mouse - clicks by moving the cursor in copy mode or selecting an - option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. - - show-options [-g] [-t target-session] - (alias: show) - Show the session options for target session, or the global ses- - sion options with -g. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged with - the session environment overriding any variable present in both. This is - the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. The - window list shows the index, name and (if any) flag of the windows - present in the current session in ascending numerical order. The flag is - one of the following symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command. If -p is given, prompts is - a comma-separated list of prompts which are displayed in order; - otherwise a single prompt is displayed, constructed from template - if it is present, or ':' if not. Before the command is executed, - the first occurrence of the string '%%' and all occurrences of - '%1' are replaced by the response to the first prompt, the second - '%%' and all '%2' are replaced with the response to the second - prompt, and so on for further prompts. Up to nine prompt - responses may be replaced ('%1' to '%9'). - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - display-message [-t target-client] [message] - (alias: display) - Display a message (see the status-left option below) in the sta- - tus line. - - select-prompt [-t target-client] - Open a prompt inside target-client allowing a window index to be - entered interactively. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-t target-window] - (alias: pasteb) - Insert the contents of a paste buffer into the current window. - With -d, also delete the paste buffer from the stack. When out- - put, any linefeed (LF) characters in the paste buffer are - replaced with carriage returns (CR). This translation may be - disabled with the -r flag. - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock the server until a password is entered. - - server-info - (alias: info) - Show server information and terminal details. - - set-password [-c] password - (alias: pass) - Set the server password. If the -c option is given, a pre- - encrypted password may be specified. By default, the password is - blank, thus any entered password will be accepted when unlocking - the server (see the lock-server command). To prevent variable - expansion when an encrypted password is read from a configuration - file, enclose it in single quotes ('). - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.1.txt b/manual/1.1.txt deleted file mode 100644 index ca93ff6708..0000000000 --- a/manual/1.1.txt +++ /dev/null @@ -1,1313 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquv] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -q Prevent the server sending various informational messages, - for example when window flags are altered. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - Some of the default key bindings are: - - c Create a new window. - d Detach the current client. - l Move to the previously selected window. - n Change to the next window. - p Change to the previous window. - & Kill the current window. - , Rename the current window. - ? List all key bindings. - - A complete list may be obtained with the list-keys command (bound to '?' - by default). Key bindings may be changed with the bind-key and - unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Examples include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - -CLIENTS AND SESSIONS - The following commands are available: - - attach-session [-d] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - lock-client [-t target-client] - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [command] - (alias: new) - Create a new session with name session-name. The new session is - attached to the current terminal unless -d is given. window-name - and command are the name of and command to execute in the initial - window. - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or command are invalid if -t is used. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The others are: - - output mode - This is entered when a command which produces output, such as - list-keys, is executed from a key binding. - - copy mode - This permits a section of a window or its history to be copied to - a paste buffer for later insertion into another window. This - mode is entered with the copy-mode command, bound to '[' by - default. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete to end of line D C-k - End of line $ C-e - Goto line : g - Half page down C-d M-Down - Half page up C-u M-Up - Next page C-f Page down - Next word w M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Quit mode q Escape - Scroll down C-Down or J C-Down - Scroll up C-Up or K C-Up - Search again n n - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Transpose chars C-t - - These key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the window-choose command) or in output mode; and vi-copy - and emacs-copy used in copy mode. The tables may be viewed with the - list-keys command and keys modified or removed with bind-key and - unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The mode commands are as follows: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - up-pane and down-pane commands and the rotate-window and swap-pane com- - mands may be used to swap panes without changing their position. Panes - are numbered beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'C-space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time and display-panes-colour session - options. While the indicator is on screen, a pane may be - selected with the '0' to '9' keys. - - down-pane [-t target-pane] - (alias: downp) - Change the active pane to the next pane (higher index). - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-t target-window] - (alias: lsp) - List the panes in the current window or in target-window. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - move-window [-d] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-dk] [-n window-name] [-t target-window] [command] - (alias: neww) - Create a new window. If -d is given, the session does not make - the new window the current window. target-window represents the - window to be created; if the target already exists an error is - shown, unless the -k flag is used, in which case it is destroyed. - command is the command to execute. If command is not specified, - the default command is used. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before command is executed. If no - command is given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output' - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-window [-k] [-t target-window] [command] - (alias: respawnw) - Reactive a window in which the command has exited (see the - remain-on-exit window option). If command is not given, the com- - mand used when the window was created is executed. The window - must be already inactive, unless -k is given, in which case any - existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last layout used (if any) is reapplied. - - select-pane [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - split-window [-dhv] [-l size | -p percentage] [-t target-window] - [command] - (alias: splitw) - Creates a new pane by splitting the active pane: -h does a hori- - zontal split and -v a vertical split; if neither is specified, -v - is assumed. The -l and -p options specify the size of the new - window in lines (for vertical split) or in cells (for horizontal - split), or as a percentage, respectively. All other options have - the same meaning as in the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - - up-pane [-t target-pane] - (alias: upp) - Change the active pane to the previous pane (lower index). - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: BSpace, - BTab, DC (Delete), End, Enter, Escape, F1 to F20, Home, IC (Insert), - NPage (Page Up), PPage (Page Down), Space, and Tab. Note that to bind - the '"' or ''' keys, quotation marks are necessary, for example: - - bind-key '"' split-window - bind-key "'" select-prompt - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are enclosed - in square brackets. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. If multi- - ple prefix keys are configured, only the first is sent. - - unbind-key [-cn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are two types of option: session options - and window options. - - Each individual session may have a set of session options, and there is a - separate set of global session options. Sessions which do not have a - particular option configured inherit the value from the global session - options. Session options are set or unset with the set-option command - and may be listed with the show-options command. The available session - options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agu] [-t target-session] option value - (alias: set) - Set a session option. With -a, and if the option expects a - string, value is appended to the existing setting. If -g is - specified, the global session option is set. The -u flag unsets - an option, so a session inherits the option from the global - options - it is not possible to unset a global option. - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command command - Set the command used for new windows (if not specified - when the window is created) to command, which may be any - sh(1) command. The default is an empty string, which - instructs tmux to create a login shell using the value of - the default-shell option. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is the current working directory when the server is - started. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - display-panes-colour colour - Set the colour used for the display-panes command. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either default or a comma-delimited list of one or more - of: bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - palette, or default. - - message-fg colour - Set status line message foreground colour. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - prefix keys - Set the keys accepted as a prefix key. keys is a comma- - separated list of key names, each of which individually - behave as the prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. Defaults to emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(command) First line of command's output - #[attributes] Colour or attribute change - #H Hostname of local host - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(command) form executes 'command' as a shell command - and inserts the first line of its output. Note that - shell commands are only executed once at the interval - specified by the status-interval option: if the status - line is redrawn in the meantime, the previous result is - used. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the date and time will be shown. As with - status-left, string will be passed to strftime(3), char- - acter pairs are replaced, and UTF-8 is dependent on the - status-utf8 option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY WINDOWID SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-width width - main-pane-height height - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. Key bindings default to emacs. - - mode-mouse [on | off] - Mouse state in modes. If on, tmux will respond to mouse - clicks by moving the cursor in copy mode or selecting an - option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window, except for panes that are not in output - mode. - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. - - show-options [-g] [-t target-session] - (alias: show) - Show the session options for target session, or the global ses- - sion options with -g. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged with - the session environment overriding any variable present in both. This is - the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. The - window list shows the index, name and (if any) flag of the windows - present in the current session in ascending numerical order. The flag is - one of the following symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command. If -p is given, prompts is - a comma-separated list of prompts which are displayed in order; - otherwise a single prompt is displayed, constructed from template - if it is present, or ':' if not. Before the command is executed, - the first occurrence of the string '%%' and all occurrences of - '%1' are replaced by the response to the first prompt, the second - '%%' and all '%2' are replaced with the response to the second - prompt, and so on for further prompts. Up to nine prompt - responses may be replaced ('%1' to '%9'). - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - display-message [-t target-client] [message] - (alias: display) - Display a message (see the status-left option below) in the sta- - tus line. - - select-prompt [-t target-client] - Open a prompt inside target-client allowing a window index to be - entered interactively. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-t target-window] - (alias: pasteb) - Insert the contents of a paste buffer into the current window. - With -d, also delete the paste buffer from the stack. When out- - put, any linefeed (LF) characters in the paste buffer are - replaced with carriage returns (CR). This translation may be - disabled with the -r flag. - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell command - (alias: run) - Execute command in the background without creating a window. - After the command finishes, any output to stdout is displayed in - output mode. If command doesn't return success, the exit status - is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.2.txt b/manual/1.2.txt deleted file mode 100644 index c76e1623b5..0000000000 --- a/manual/1.2.txt +++ /dev/null @@ -1,1473 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquv] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - Some of the default key bindings are: - - c Create a new window. - d Detach the current client. - l Move to the previously selected window. - n Change to the next window. - p Change to the previous window. - & Kill the current window. - , Rename the current window. - ? List all key bindings. - - A complete list may be obtained with the list-keys command (bound to '?' - by default). Key bindings may be changed with the bind-key and - unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. The special character '!' uses the last - (previously current) window, or '+' and '-' are the next window or the - previous window by number. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. One of the strings top, bottom, - left, right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one of more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client command have any - effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - lock-client [-t target-client] - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The others are: - - output mode - This is entered when a command which produces output, such as - list-keys, is executed from a key binding. - - copy mode - This permits a section of a window or its history to be copied to - a paste buffer for later insertion into another window. This - mode is entered with the copy-mode command, bound to '[' by - default. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators window option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command) or in output mode; and vi-copy - and emacs-copy used in copy mode. The tables may be viewed with the - list-keys command and keys modified or removed with bind-key and - unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The mode commands are as follows: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - up-pane and down-pane commands and the rotate-window and swap-pane com- - mands may be used to swap panes without changing their position. Panes - are numbered beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - capture-pane [-b buffer-index] [-t target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - down-pane [-t target-pane] - (alias: downp) - Change the active pane to the next pane (higher index). - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-t target-window] - (alias: lsp) - List the panes in the current window or in target-window. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - move-window [-d] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-dk] [-n window-name] [-t target-window] [shell-command] - (alias: neww) - Create a new window. If -d is given, the session does not make - the new window the current window. target-window represents the - window to be created; if the target already exists an error is - shown, unless the -k flag is used, in which case it is destroyed. - shell-command is the command to execute. If shell-command is not - specified, the value of the default-command option is used. - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. If no - shell-command is given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output' - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last layout used (if any) is reapplied. - - select-pane [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - split-window [-dhv] [-l size | -p percentage] [-t target-pane] - [shell-command] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - - up-pane [-t target-pane] - (alias: upp) - Change the active pane to the previous pane (lower index). - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage (Page Up), PPage (Page Down), Space, and - Tab. Note that to bind the '"' or ''' keys, quotation marks are neces- - sary, for example: - - bind-key '"' split-window - bind-key "'" select-prompt - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are marked - with '(no prefix)'. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. If multi- - ple prefix keys are configured, only the first is sent. - - unbind-key [-cn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - Available window options are listed under set-window-option. - - Available server options are: - - escape-time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - quiet Enable or disable the display of various informational - messages (see also the -q command line flag). - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is the current working directory when the server is - started. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either default or a comma-delimited list of one or more - of: bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - palette, or default. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - pane-border-fg colour - - pane-border-bg colour - Set the pane border colour for panes aside from the - active pane. - - pane-active-border-fg colour - - pane-active-border-bg colour - Set the pane border colour for the currently active pane. - - prefix keys - Set the keys accepted as a prefix key. keys is a comma- - separated list of key names, each of which individually - behave as the prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. Defaults to emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #F Current window flag - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY WINDOWID SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-width width - main-pane-height height - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. Key bindings default to emacs. - - mode-mouse [on | off] - Mouse state in modes. If on, tmux will respond to mouse - clicks by moving the cursor in copy mode or selecting an - option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window, except for panes that are not in output - mode. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities to be - issued to preserve the existing window content on start - and restore it on exit. - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - word-separators string - Sets the window's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - show-options [-gsw] [-t target-session | target-window] - (alias: show) - Show the window options with -w (equivalent to - show-window-options), the server options with -s, otherwise the - session options for target session. Global session or window - options are listed if -g is used. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged with - the session environment overriding any variable present in both. This is - the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command. If -p is given, prompts is - a comma-separated list of prompts which are displayed in order; - otherwise a single prompt is displayed, constructed from template - if it is present, or ':' if not. Before the command is executed, - the first occurrence of the string '%%' and all occurrences of - '%1' are replaced by the response to the first prompt, the second - '%%' and all '%2' are replaced with the response to the second - prompt, and so on for further prompts. Up to nine prompt - responses may be replaced ('%1' to '%9'). - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - display-message [-p] [-t target-client] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is as for status-left, with the exception - that #() are not handled. - - select-prompt [-t target-client] - Open a prompt inside target-client allowing a window index to be - entered interactively. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-t target-window] - (alias: pasteb) - Insert the contents of a paste buffer into the current window. - With -d, also delete the paste buffer from the stack. When out- - put, any linefeed (LF) characters in the paste buffer are - replaced with carriage returns (CR). This translation may be - disabled with the -r flag. - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - output mode. If the command doesn't return success, the exit - status is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.3.txt b/manual/1.3.txt deleted file mode 100644 index 7397d6b191..0000000000 --- a/manual/1.3.txt +++ /dev/null @@ -1,1585 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquv] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. The special character '!' uses the last - (previously current) window, or '+' and '-' are the next window or the - previous window by number. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one of more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client command have any - effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump backward F F - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators window option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - capture-pane [-b buffer-index] [-t target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-t target-window] - (alias: lsp) - List the panes in the current window or in target-window. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - move-window [-dk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-adk] [-n window-name] [-t target-window] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left command. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. - - select-pane [-DLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - split-window [-dhv] [-l size | -p percentage] [-t target-pane] - [shell-command] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage (Page Up), PPage (Page Down), Space, and - Tab. Note that to bind the '"' or ''' keys, quotation marks are neces- - sary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are marked - with '(no prefix)'. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. If multi- - ple prefix keys are configured, only the first is sent. - - unbind-key [-cn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - Available window options are listed under set-window-option. - - Available server options are: - - detach-on-destroy - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - escape-time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - quiet Enable or disable the display of various informational - messages (see also the -q command line flag). - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is empty, which means to use the working directory of the - shell from which the server was started if it is avail- - able or the user's home if not. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - palette, or default. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - pane-border-fg colour - - pane-border-bg colour - Set the pane border colour for panes aside from the - active pane. - - pane-active-border-fg colour - - pane-active-border-bg colour - Set the pane border colour for the currently active pane. - - prefix keys - Set the keys accepted as a prefix key. keys is a comma- - separated list of key names, each of which individually - behave as the prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. Defaults to emacs. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #F Current window flag - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - The window title (#T) is the title set by the program - running within the window using the OSC title setting - sequence, for example: - - $ printf '\033]2;My Title\033\\' - - When a window is first created, its title is the host- - name. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY WINDOWID SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-width width - main-pane-height height - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. Key bindings default to emacs. - - mode-mouse [on | off] - Mouse state in modes. If on, the mouse may be used to - copy a selection by dragging in copy mode, or to select - an option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities to be - issued to preserve the existing window content on start - and restore it on exit. - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-alert-attr attributes - Set status line attributes for windows which have an - alert (bell, activity or content). - - window-status-alert-bg colour - Set status line background colour for windows with an - alert. - - window-status-alert-fg colour - Set status line foreground colour for windows with an - alert. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - word-separators string - Sets the window's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - show-options [-gsw] [-t target-session | target-window] - (alias: show) - Show the window options with -w (equivalent to - show-window-options), the server options with -s, otherwise the - session options for target session. Global session or window - options are listed if -g is used. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged with - the session environment overriding any variable present in both. This is - the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command. If -p is given, prompts is - a comma-separated list of prompts which are displayed in order; - otherwise a single prompt is displayed, constructed from template - if it is present, or ':' if not. Before the command is executed, - the first occurrence of the string '%%' and all occurrences of - '%1' are replaced by the response to the first prompt, the second - '%%' and all '%2' are replaced with the response to the second - prompt, and so on for further prompts. Up to nine prompt - responses may be replaced ('%1' to '%9'). - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - display-message [-p] [-t target-client] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is as for status-left, with the exception - that #() are not handled. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. This command works only from inside tmux. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - copy mode. If the command doesn't return success, the exit sta- - tus is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.4.txt b/manual/1.4.txt deleted file mode 100644 index 534902a01e..0000000000 --- a/manual/1.4.txt +++ /dev/null @@ -1,1633 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquvV] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -L socket-name - tmux stores the server socket in a directory under /tmp; - the default socket is named default. This option allows a - different socket name to be specified, allowing several - independent tmux servers to be run. Unlike -S a full path - is not necessary: the sockets are all created in the same - directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - -V Report the tmux version. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - ; Move to the previously active pane. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - L Switch the attached client back to the last session. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. The special character '!' uses the last - (previously current) window, or '+' and '-' are the next window or the - previous window by number. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one or more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client command have any - effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - detach-client [-t target-client] - (alias: detach) - Detach the current client if bound to a key, or the specified - client with -t. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients - (alias: lsc) - List all clients attached to the server. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-c target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-lnp] [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. If -l, -n or -p is used, the client is moved to - the last, next or previous session respectively. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump backward F F - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators window option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - capture-pane [-b buffer-index] [-t target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-pane [-t target-window] - (alias: lastp) - Select the last (previously selected) pane. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-t target-window] - (alias: lsp) - List the panes in the current window or in target-window. - - list-windows [-t target-session] - (alias: lsw) - List windows in the current session or in target-session. - - move-window [-dk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-adk] [-n window-name] [-t target-window] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left command. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. - - select-pane [-DLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. - - select-window [-t target-window] - (alias: selectw) - Select the window at target-window. - - split-window [-dhv] [-l size | -p percentage] [-t target-pane] - [shell-command] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage (Page Up), PPage (Page Down), Space, and - Tab. Note that to bind the '"' or ''' keys, quotation marks are neces- - sary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are marked - with '(no prefix)'. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. If multi- - ple prefix keys are configured, only the first is sent. - - unbind-key [-acn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. If -a is - present, all key bindings are removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - Available window options are listed under set-window-option. - - Available server options are: - - escape-time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - exit-unattached - If enabled, the server will exit when there are no - attached clients, rather than when there are no attached - sessions. - - quiet Enable or disable the display of various informational - messages (see also the -q command line flag). - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - buffer-limit number - Set the number of buffers kept for each session; as new - buffers are added to the top of the stack, old ones are - removed from the bottom if necessary to maintain this - maximum length. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is empty, which means to use the working directory of the - shell from which the server was started if it is avail- - able or the user's home if not. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - destroy-unattached - If enabled and the session is no longer attached to any - clients, it is destroyed. - - detach-on-destroy - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - palette, or default. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - pane-active-border-bg colour - - pane-active-border-fg colour - Set the pane border colour for the currently active pane. - - pane-border-bg colour - - pane-border-fg colour - Set the pane border colour for panes aside from the - active pane. - - prefix keys - Set the keys accepted as a prefix key. keys is a comma- - separated list of key names, each of which individually - behave as the prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. The default is emacs, - unless the VISUAL or EDITOR environment variables are set - and contain the string 'vi'. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #F Current window flag - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - The window title (#T) is the title set by the program - running within the window using the OSC title setting - sequence, for example: - - $ printf '\033]2;My Title\033\\' - - When a window is first created, its title is the host- - name. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAU- - THORITY". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - visual-silence [on | off] - If monitor-silence is enabled, prints a message after the - interval has expired on a given window. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities to be - issued to preserve the existing window content on start - and restore it on exit. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-height height - main-pane-width width - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. As with the status-keys option, the default is - emacs, unless VISUAL or EDITOR contains 'vi'. - - mode-mouse [on | off] - Mouse state in modes. If on, the mouse may be used to - copy a selection by dragging in copy mode, or to select - an option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - monitor-silence [interval] - Monitor for silence (no activity) in the window within - interval seconds. Windows that have been silent for the - interval are highlighted in the status line. An interval - of zero disables the monitoring. - - other-pane-height height - Set the height of the other panes (not the main pane) in - the main-horizontal layout. If this option is set to 0 - (the default), it will have no effect. If both the - main-pane-height and other-pane-height options are set, - the main pane will grow taller to make the other panes - the specified height, but will never shrink to do so. - - other-pane-width width - Like other-pane-height, but set the width of other panes - in the main-vertical layout. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-alert-attr attributes - Set status line attributes for windows which have an - alert (bell, activity or content). - - window-status-alert-bg colour - Set status line background colour for windows with an - alert. - - window-status-alert-fg colour - Set status line foreground colour for windows with an - alert. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - word-separators string - Sets the window's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - show-options [-gsw] [-t target-session | target-window] - (alias: show) - Show the window options with -w (equivalent to - show-window-options), the server options with -s, otherwise the - session options for target session. Global session or window - options are listed if -g is used. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged. If a - variable exists in both, the value from the session environment is used. - The result is the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - ~ The window has been silent for the monitor-silence - interval. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. If template is - specified, it is used as the command. If -p is given, prompts is - a comma-separated list of prompts which are displayed in order; - otherwise a single prompt is displayed, constructed from template - if it is present, or ':' if not. Before the command is executed, - the first occurrence of the string '%%' and all occurrences of - '%1' are replaced by the response to the first prompt, the second - '%%' and all '%2' are replaced with the response to the second - prompt, and so on for further prompts. Up to nine prompt - responses may be replaced ('%1' to '%9'). - - confirm-before [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. This command - works only from inside tmux. - - display-message [-p] [-t target-client] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is as for status-left, with the exception - that #() are not handled. - -BUFFERS - tmux maintains a stack of paste buffers for each session. Up to the - value of the buffer-limit option are kept; when a new buffer is added, - the buffer at the bottom of the stack is removed. Buffers may be added - using copy-mode or the set-buffer command, and pasted into a window using - the paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. This command works only from inside tmux. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - copy-buffer [-a src-index] [-b dst-index] [-s src-session] [-t - dst-session] - (alias: copyb) - Copy a session paste buffer to another session. If no sessions - are specified, the current one is used instead. - - delete-buffer [-b buffer-index] [-t target-session] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-t target-session] - (alias: lsb) - List the buffers in the given session. - - load-buffer [-b buffer-index] [-t target-session] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). - - save-buffer [-a] [-b buffer-index] [-t target-session] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] [-t target-session] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] [-t target-session] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - copy mode. If the command doesn't return success, the exit sta- - tus is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.5.txt b/manual/1.5.txt deleted file mode 100644 index 6e96fa9ae9..0000000000 --- a/manual/1.5.txt +++ /dev/null @@ -1,1741 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquvV] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -L socket-name - tmux stores the server socket in a directory under /tmp (or - TMPDIR if set); the default socket is named default. This - option allows a different socket name to be specified, - allowing several independent tmux servers to be run. - Unlike -S a full path is not necessary: the sockets are all - created in the same directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - -V Report the tmux version. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - $ Rename the current session. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - ; Move to the previously active pane. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - L Switch the attached client back to the last session. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. The special character '!' uses the last - (previously current) window, or '+' and '-' are the next window or the - previous window by number. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - tmux also gives each pane created in a server an identifier consisting of - a '%' and a number, starting from zero. A pane's identifier is unique - for the life of the tmux server and is passed to the child process of the - pane in the TMUX_PANE environment variable. It may be used alone to tar- - get a pane or the window containing it. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right. A literal semi- - colon may be included by escaping it with a backslash (for example, when - specifying a command sequence to bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one or more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client command have any - effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - The target-session rules for attach-session are slightly - adjusted: if tmux needs to select the most recently used session, - it will prefer the most recently used unattached session. - - detach-client [-P] [-s target-session] [-t target-client] - (alias: detach) - Detach the current client if bound to a key, the client specified - with -t, or all clients currently attached to to the session - specified by -s. If -P is given, send SIGHUP to the parent - process of the client, typically causing it to exit. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients [-t target-session] - (alias: lsc) - List all clients attached to the server. If target-session is - specified, list only clients connected to that session. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions - (alias: ls) - List all sessions managed by the server. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [-x width] [-y height] [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. If -d is used, -x and - -y specify the size of the initial window (80 by 24 if not - given). - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-t target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-lnp] [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. If -l, -n or -p is used, the client is moved to - the last, next or previous session respectively. - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete/Copy to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump backward F F - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators window option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - capture-pane [-b buffer-index] [-E end-line] [-S start-line] [-t - target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - -S and -E specify the starting and ending line numbers, zero is - the first line of the visible pane and negative numbers are lines - in the history. The default is to capture only the visible con- - tents of the pane. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-pane [-t target-window] - (alias: lastp) - Select the last (previously selected) pane. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-as] [-t target] - (alias: lsp) - If -a is given, target is ignored and all panes on the server are - listed. If -s is given, target is a session (or the current ses- - sion). If neither is given, target is a window (or the current - window). - - list-windows [-a] [-t target-session] - (alias: lsw) - If -a is given, list all windows on the server. Otherwise, list - windows in the current session or in target-session. - - move-window [-dk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-adkP] [-n window-name] [-t target-window] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - The -P option prints the location of the new window after it has - been created. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left option. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-pane [-k] [-t target-pane] [shell-command] - (alias: respawnp) - Reactivate a pane in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the pane was created is executed. The pane - must be already inactive, unless -k is given, in which case any - existing command is killed. - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-np] [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. -n and - -p are equivalent to the next-layout and previous-layout com- - mands. - - select-pane [-lDLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. -l - is the same as using the last-pane command. - - select-window [-lnp] [-t target-window] - (alias: selectw) - Select the window at target-window. -l, -n and -p are equivalent - to the last-window, next-window and previous-window commands. - - split-window [-dhvP] [-l size | -p percentage] [-t target-pane] - [shell-command] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage (Page Up), PPage (Page Down), Space, and - Tab. Note that to bind the '"' or ''' keys, quotation marks are neces- - sary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are marked - with '(no prefix)'. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. - - send-prefix [-t target-pane] - Send the prefix key to a window as if it was pressed. If multi- - ple prefix keys are configured, only the first is sent. - - unbind-key [-acn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. If -a is - present, all key bindings are removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - Available window options are listed under set-window-option. - - Available server options are: - - buffer-limit number - Set the number of buffers; as new buffers are added to - the top of the stack, old ones are removed from the bot- - tom if necessary to maintain this maximum length. - - set-clipboard [on | off] - Attempt to set the terminal clipboard content using the - \e]52;...\007 xterm(1) escape sequences. This option is - on by default if there is an Ms entry in the terminfo(5) - description for the client terminal. Note that this fea- - ture needs to be enabled in xterm(1) by setting the - resource: - - disallowedWindowOps: 20,21,SetXprop - - Or changing this property from the xterm(1) interactive - menu when required. - - escape-time time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - exit-unattached [on | off] - If enabled, the server will exit when there are no - attached clients. - - quiet [on | off] - Enable or disable the display of various informational - messages (see also the -q command line flag). - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - bell-on-alert [on | off] - If on, ring the terminal bell when an activity, content - or silence alert occurs. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-path path - Set the default working directory for processes created - from keys, or interactively from the prompt. The default - is empty, which means to use the working directory of the - shell from which the server was started if it is avail- - able or the user's home if not. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - destroy-unattached [on | off] - If enabled and the session is no longer attached to any - clients, it is destroyed. - - detach-on-destroy [on | off] - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, colour0 to colour255 from the 256-colour - set, default, or a hexadecimal RGB string such as - '#ffffff', which chooses the closest match from the - default 256-colour set. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-resize-pane [on | off] - If on, tmux captures the mouse and allows panes to be - resized by dragging on their borders. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - mouse-select-window [on | off] - If on, clicking the mouse on a window name in the status - line will select that window. - - pane-active-border-bg colour - - pane-active-border-fg colour - Set the pane border colour for the currently active pane. - - pane-border-bg colour - - pane-border-fg colour - Set the pane border colour for panes aside from the - active pane. - - prefix keys - Set the keys accepted as a prefix key. keys is a comma- - separated list of key names, each of which individually - behave as the prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - mouse-utf8 [on | off] - If enabled, request mouse input as UTF-8 on UTF-8 termi- - nals. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the window title using the \e]2;...\007 - xterm code if the terminal appears to be an xterm. This - option is off by default. Note that elinks will only - attempt to set the window title if the STY environment - variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. The default is emacs, - unless the VISUAL or EDITOR environment variables are set - and contain the string 'vi'. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #h Hostname of local host without - the domain name - #F Current window flag - #I Current window index - #P Current pane index - #S Session name - #T Current window title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - The window title (#T) is the title set by the program - running within the window using the OSC title setting - sequence, for example: - - $ printf '\033]2;My Title\033\\' - - When a window is first created, its title is the host- - name. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256,xterm*:XT" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAU- - THORITY". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - visual-silence [on | off] - If monitor-silence is enabled, prints a message after the - interval has expired on a given window. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities. The - alternate screen feature preserves the contents of the - window when an interactive application starts and - restores it on exit, so that any output visible before - the application starts reappears unchanged after it - exits. The default is on. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window. It may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-height height - main-pane-width width - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. As with the status-keys option, the default is - emacs, unless VISUAL or EDITOR contains 'vi'. - - mode-mouse [on | off] - Mouse state in modes. If on, the mouse may be used to - enter copy mode and copy a selection by dragging, to - enter copy mode and scroll with the mouse wheel, or to - select an option in choice mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - monitor-silence [interval] - Monitor for silence (no activity) in the window within - interval seconds. Windows that have been silent for the - interval are highlighted in the status line. An interval - of zero disables the monitoring. - - other-pane-height height - Set the height of the other panes (not the main pane) in - the main-horizontal layout. If this option is set to 0 - (the default), it will have no effect. If both the - main-pane-height and other-pane-height options are set, - the main pane will grow taller to make the other panes - the specified height, but will never shrink to do so. - - other-pane-width width - Like other-pane-height, but set the width of other panes - in the main-vertical layout. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-alert-attr attributes - Set status line attributes for windows which have an - alert (bell, activity or content). - - window-status-alert-bg colour - Set status line background colour for windows with an - alert. - - window-status-alert-fg colour - Set status line foreground colour for windows with an - alert. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - word-separators string - Sets the window's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - show-options [-gsw] [-t target-session | target-window] - (alias: show) - Show the window options with -w (equivalent to - show-window-options), the server options with -s, otherwise the - session options for target session. Global session or window - options are listed if -g is used. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged. If a - variable exists in both, the value from the session environment is used. - The result is the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the current window title in double quotes; and the time and date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - ~ The window has been silent for the monitor-silence - interval. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-I inputs] [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. - - If template is specified, it is used as the command. If present, - -I is a comma-separated list of the initial text for each prompt. - If -p is given, prompts is a comma-separated list of prompts - which are displayed in order; otherwise a single prompt is dis- - played, constructed from template if it is present, or ':' if - not. - - Both inputs and prompts may contain the special character - sequences supported by the status-left option. - - Before the command is executed, the first occurrence of the - string '%%' and all occurrences of '%1' are replaced by the - response to the first prompt, the second '%%' and all '%2' are - replaced with the response to the second prompt, and so on for - further prompts. Up to nine prompt responses may be replaced - ('%1' to '%9'). - - confirm-before [-p prompt] [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. If -p is given, - prompt is the prompt to display; otherwise a prompt is con- - structed from command. It may contain the special character - sequences supported by the status-left option. - - This command works only from inside tmux. - - display-message [-p] [-c target-client] [-t target-pane] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is as for status-left, with the exception - that #() are not handled; information is taken from target-pane - if -t is given, otherwise the active pane for the session - attached to target-client. - -BUFFERS - tmux maintains a stack of paste buffers. Up to the value of the - buffer-limit option are kept; when a new buffer is added, the buffer at - the bottom of the stack is removed. Buffers may be added using copy-mode - or the set-buffer command, and pasted into a window using the - paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. This command works only from inside tmux. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - delete-buffer [-b buffer-index] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers - (alias: lsb) - List the global buffers. - - load-buffer [-b buffer-index] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). - - save-buffer [-a] [-b buffer-index] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command - (alias: if) - Execute command if shell-command returns success. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - copy mode. If the command doesn't return success, the exit sta- - tus is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -TERMINFO EXTENSIONS - tmux understands some extensions to terminfo(5): - - Cc, Cr Set the cursor colour. The first takes a single string argument - and is used to set the colour; the second takes no arguments and - restores the default cursor colour. If set, a sequence such as - this may be used to change the cursor colour from inside tmux: - - $ printf '\033]12;red\033\\' - - Cs, Csr - Change the cursor style. If set, a sequence such as this may be - used to change the cursor to an underline: - - $ printf '\033[4 q' - - If Csr is set, it will be used to reset the cursor style instead - of Cs. - - Ms This sequence can be used by tmux to store the current buffer in - the host terminal's selection (clipboard). See the set-clipboard - option above and the xterm(1) man page. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.6.txt b/manual/1.6.txt deleted file mode 100644 index b3ecbd3985..0000000000 --- a/manual/1.6.txt +++ /dev/null @@ -1,1891 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquvV] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -L socket-name - tmux stores the server socket in a directory under /tmp (or - TMPDIR if set); the default socket is named default. This - option allows a different socket name to be specified, - allowing several independent tmux servers to be run. - Unlike -S a full path is not necessary: the sockets are all - created in the same directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - -V Report the tmux version. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - $ Rename the current session. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - ; Move to the previously active pane. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - L Switch the attached client back to the last session. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as an exact window - name, such as mysession:mywindow; then as an fnmatch(3) pattern or the - start of a window name, such as mysession:mywin* or mysession:mywin. An - empty window name specifies the next unused index if appropriate (for - example the new-window and link-window commands) otherwise the current - window in session is chosen. The special character '!' uses the last - (previously current) window, or '+' and '-' are the next window or the - previous window by number. When the argument does not contain a colon, - tmux first attempts to parse it as window; if that fails, an attempt is - made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - tmux also gives each pane created in a server an identifier consisting of - a '%' and a number, starting from zero. A pane's identifier is unique - for the life of the tmux server and is passed to the child process of the - pane in the TMUX_PANE environment variable. It may be used alone to tar- - get a pane or the window containing it. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right and lines ending - with a backslash continue on to the next line. A literal semicolon may - be included by escaping it with a backslash (for example, when specifying - a command sequence to bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key R source-file ~/.tmux.conf \; \ - display-message "source-file done" - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one or more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client or switch-client - commands have any effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - The target-session rules for attach-session are slightly - adjusted: if tmux needs to select the most recently used session, - it will prefer the most recently used unattached session. - - detach-client [-P] [-s target-session] [-t target-client] - (alias: detach) - Detach the current client if bound to a key, the client specified - with -t, or all clients currently attached to the session speci- - fied by -s. If -P is given, send SIGHUP to the parent process of - the client, typically causing it to exit. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session [-t target-session] - Destroy the given session, closing any windows linked to it and - no other sessions, and detaching all clients attached to it. - - list-clients [-F format] [-t target-session] - (alias: lsc) - List all clients attached to the server. For the meaning of the - -F flag, see the FORMATS section. If target-session is speci- - fied, list only clients connected to that session. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions [-F format] - (alias: ls) - List all sessions managed by the server. For the meaning of the - -F flag, see the FORMATS section. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [-x width] [-y height] [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. If -d is used, -x and - -y specify the size of the initial window (80 by 24 if not - given). - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-S] [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. If -S is specified, only update the - client's status bar. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-t target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-lnpr] [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. If -l, -n or -p is used, the client is moved to - the last, next or previous session respectively. -r toggles - whether a client is read-only (see the attach-session command). - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete/Copy to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump to forward t - Jump backward F F - Jump to backward T - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators session option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - When copying the selection, the repeat count indicates the buffer index - to replace, if used. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-d] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. - - capture-pane [-b buffer-index] [-E end-line] [-S start-line] [-t - target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - -S and -E specify the starting and ending line numbers, zero is - the first line of the visible pane and negative numbers are lines - in the history. The default is to capture only the visible con- - tents of the pane. - - choose-client [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. This command works only from inside - tmux. - - choose-session [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. This command works only from inside tmux. - - choose-window [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. This command works only from - inside tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). If only one win- - dow is matched, it'll be automatically selected, otherwise a - choice list is shown. This command only works from inside tmux. - - join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. - - last-pane [-t target-window] - (alias: lastp) - Select the last (previously selected) pane. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-as] [-F format] [-t target] - (alias: lsp) - If -a is given, target is ignored and all panes on the server are - listed. If -s is given, target is a session (or the current ses- - sion). If neither is given, target is a window (or the current - window). For the meaning of the -F flag, see the FORMATS sec- - tion. - - list-windows [-a] [-F format] [-t target-session] - (alias: lsw) - If -a is given, list all windows on the server. Otherwise, list - windows in the current session or in target-session. For the - meaning of the -F flag, see the FORMATS section. - - move-window [-dk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. - - new-window [-adkP] [-n window-name] [-t target-window] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - The -P option prints the location of the new window after it has - been created. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with a bell, activity or content alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left option. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with a bell, activity or content alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-pane [-k] [-t target-pane] [shell-command] - (alias: respawnp) - Reactivate a pane in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the pane was created is executed. The pane - must be already inactive, unless -k is given, in which case any - existing command is killed. - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-np] [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. -n and - -p are equivalent to the next-layout and previous-layout com- - mands. - - select-pane [-lDLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. -l - is the same as using the last-pane command. - - select-window [-lnp] [-t target-window] - (alias: selectw) - Select the window at target-window. -l, -n and -p are equivalent - to the last-window, next-window and previous-window commands. - - split-window [-dhvP] [-l size | -p percentage] [-t target-pane] - [shell-command] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage/PageDown/PgDn, PPage/PageUp/PgUp, Space, - and Tab. Note that to bind the '"' or ''' keys, quotation marks are nec- - essary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - Keys bound without the prefix key (see bind-key -n) are marked - with '(no prefix)'. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys -R [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. All - arguments are sent sequentially from first to last. The -R flag - causes the terminal state to be reset. - - send-prefix [-2] [-t target-pane] - Send the prefix key, or with -2 the secondary prefix key, to a - window as if it was pressed. - - unbind-key [-acn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. If -a is - present, all key bindings are removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - Available window options are listed under set-window-option. - - Available server options are: - - buffer-limit number - Set the number of buffers; as new buffers are added to - the top of the stack, old ones are removed from the bot- - tom if necessary to maintain this maximum length. - - escape-time time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - exit-unattached [on | off] - If enabled, the server will exit when there are no - attached clients. - - quiet [on | off] - Enable or disable the display of various informational - messages (see also the -q command line flag). - - set-clipboard [on | off] - Attempt to set the terminal clipboard content using the - \e]52;...\007 xterm(1) escape sequences. This option is - on by default if there is an Ms entry in the terminfo(5) - description for the client terminal. Note that this fea- - ture needs to be enabled in xterm(1) by setting the - resource: - - disallowedWindowOps: 20,21,SetXprop - - Or changing this property from the xterm(1) interactive - menu when required. - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - bell-on-alert [on | off] - If on, ring the terminal bell when an activity, content - or silence alert occurs. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-path path - Set the default working directory for new panes. If - empty (the default), the working directory is determined - from the process running in the active pane, from the - command line environment or from the working directory - where the session was created. If path is "$HOME" or - "~", the value of the HOME environment variable is used. - If path is ".", the working directory when tmux was - started is used. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - destroy-unattached [on | off] - If enabled and the session is no longer attached to any - clients, it is destroyed. - - detach-on-destroy [on | off] - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, aixterm bright variants (if supported: - brightred, brightgreen, and so on), colour0 to colour255 - from the 256-colour set, default, or a hexadecimal RGB - string such as '#ffffff', which chooses the closest match - from the default 256-colour set. - - message-command-attr attributes - Set status line message attributes when in command mode. - - message-command-bg colour - Set status line message background colour when in command - mode. - - message-command-fg colour - Set status line message foreground colour when in command - mode. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-resize-pane [on | off] - If on, tmux captures the mouse and allows panes to be - resized by dragging on their borders. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - mouse-select-window [on | off] - If on, clicking the mouse on a window name in the status - line will select that window. - - mouse-utf8 [on | off] - If enabled, request mouse input as UTF-8 on UTF-8 termi- - nals. - - pane-active-border-bg colour - - pane-active-border-fg colour - Set the pane border colour for the currently active pane. - - pane-border-bg colour - - pane-border-fg colour - Set the pane border colour for panes aside from the - active pane. - - prefix key - Set the key accepted as a prefix key. - - prefix2 key - Set a secondary key accepted as a prefix key. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the client terminal title using the tsl - and fsl terminfo(5) entries if they exist. tmux automat- - ically sets these to the \e]2;...\007 sequence if the - terminal appears to be an xterm. This option is off by - default. Note that elinks will only attempt to set the - window title if the STY environment variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. The default is emacs, - unless the VISUAL or EDITOR environment variables are set - and contain the string 'vi'. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #h Hostname of local host without - the domain name - #F Current window flag - #I Current window index - #P Current pane index - #S Session name - #T Current pane title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - For details on how the names and titles can be set see - the NAMES AND TITLES section. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256,xterm*:XT" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAU- - THORITY". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - visual-silence [on | off] - If monitor-silence is enabled, prints a message after the - interval has expired on a given window. - - word-separators string - Sets the session's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - set-window-option [-agu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g and -u flags work similarly to - the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - allow-rename [on | off] - Allow programs to change the window name using a terminal - escape sequence (\033k...\033\\). The default is on. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities. The - alternate screen feature preserves the contents of the - window when an interactive application starts and - restores it on exit, so that any output visible before - the application starts reappears unchanged after it - exits. The default is on. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window, or with a terminal escape sequence. It - may be switched off globally with: - - set-window-option -g automatic-rename off - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-height height - main-pane-width width - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. As with the status-keys option, the default is - emacs, unless VISUAL or EDITOR contains 'vi'. - - mode-mouse [on | off | copy-mode] - Mouse state in modes. If on, the mouse may be used to - enter copy mode and copy a selection by dragging, to - enter copy mode and scroll with the mouse wheel, or to - select an option in choice mode. If set to copy-mode, - the mouse behaves as set to on, but cannot be used to - enter copy mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - monitor-silence [interval] - Monitor for silence (no activity) in the window within - interval seconds. Windows that have been silent for the - interval are highlighted in the status line. An interval - of zero disables the monitoring. - - other-pane-height height - Set the height of the other panes (not the main pane) in - the main-horizontal layout. If this option is set to 0 - (the default), it will have no effect. If both the - main-pane-height and other-pane-height options are set, - the main pane will grow taller to make the other panes - the specified height, but will never shrink to do so. - - other-pane-width width - Like other-pane-height, but set the width of other panes - in the main-vertical layout. - - pane-base-index index - Like base-index, but set the starting index for pane num- - bers. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-bell-attr attributes - Set status line attributes for windows which have a bell - alert. - - window-status-bell-bg colour - Set status line background colour for windows with a bell - alert. - - window-status-bell-fg colour - Set status line foreground colour for windows with a bell - alert. - - window-status-content-attr attributes - Set status line attributes for windows which have a con- - tent alert. - - window-status-content-bg colour - Set status line background colour for windows with a con- - tent alert. - - window-status-content-fg colour - Set status line foreground colour for windows with a con- - tent alert. - - window-status-activity-attr attributes - Set status line attributes for windows which have an - activity (or silence) alert. - - window-status-activity-bg colour - Set status line background colour for windows with an - activity alert. - - window-status-activity-fg colour - Set status line foreground colour for windows with an - activity alert. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - show-options [-gsw] [-t target-session | target-window] - (alias: show) - Show the window options with -w (equivalent to - show-window-options), the server options with -s, otherwise the - session options for target session. Global session or window - options are listed if -g is used. - - show-window-options [-g] [-t target-window] - (alias: showw) - List the window options for target-window, or the global window - options if -g is used. - -FORMATS - The list-clients, list-sessions, list-windows and list-panes commands - accept the -F flag with a format argument. This is a string which con- - trols the output format of the command. Special character sequences are - replaced as documented under the status-left option and an additional - long form is accepted. Replacement variables are enclosed in '#{' and - '}', for example '#{session_name}' is equivalent to '#S'. Conditionals - are also accepted by prefixing with '?' and separating two alternatives - with a comma; if the specified variable exists and is not zero, the first - alternative is chosen, otherwise the second is used. For example - '#{?session_attached,attached,not attached}' will include the string - 'attached' if the session is attached and the string 'not attached' if it - is unattached. - - The following variables are available, where appropriate: - - Variable name Replaced with - client_activity Integer time client last had activity - client_activity_string String time client last had activity - client_created Integer time client created - client_created_string String time client created - client_cwd Working directory of client - client_height Height of client - client_readonly 1 if client is readonly - client_termname Terminal name of client - client_tty Pseudo terminal of client - client_utf8 1 if client supports utf8 - client_width Width of client - host Hostname of local host - line Line number in the list - pane_active 1 if active pane - pane_dead 1 if pane is dead - pane_height Height of pane - pane_id Unique pane id - pane_pid PID of first process in pane - pane_start_command Command pane started with - pane_start_path Path pane started with - pane_title Title of pane - pane_tty Pseudo terminal of pane - pane_width Width of pane - session_attached 1 if session attached - session_created Integer time session created - session_created_string String time session created - session_group Number of session group - session_grouped 1 if session in a group - session_height Height of session - session_name Name of session - session_width Width of session - session_windows Number of windows in session - window_active 1 if window active - window_flags Window flags - window_height Height of window - window_index Index of window - window_layout Window layout description - window_name Name of window - window_width Width of window - -NAMES AND TITLES - tmux distinguishes between names and titles. Windows and sessions have - names, which may be used to specify them in targets and are displayed in - the status line and various lists: the name is the tmux identifier for a - window or session. Only panes have titles. A pane's title is typically - set by the program running inside the pane and is not modified by tmux. - It is the same mechanism used to set for example the xterm(1) window - title in an X(7) window manager. Windows themselves do not have titles - - a window's title is the title of its active pane. tmux itself may set - the title of the terminal in which the client is running, see the - set-titles option. - - A session's name is set with the new-session and rename-session commands. - A window's name is set with one of: - - 1. A command argument (such as -n for new-window or new-session). - - 2. An escape sequence: - - $ printf '\033kWINDOW_NAME\033\\' - - 3. Automatic renaming, which sets the name to the active command in - the window's active pane. See the automatic-rename option. - - When a pane is first created, its title is the hostname. A pane's title - can be set via the OSC title setting sequence, for example: - - $ printf '\033]2;My Title\033\\' - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged. If a - variable exists in both, the value from the session environment is used. - The result is the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. Variables removed from the environment are pre- - fixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the title of the active pane in double quotes; and the time and - date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - ~ The window has been silent for the monitor-silence - interval. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-I inputs] [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. - - If template is specified, it is used as the command. If present, - -I is a comma-separated list of the initial text for each prompt. - If -p is given, prompts is a comma-separated list of prompts - which are displayed in order; otherwise a single prompt is dis- - played, constructed from template if it is present, or ':' if - not. - - Both inputs and prompts may contain the special character - sequences supported by the status-left option. - - Before the command is executed, the first occurrence of the - string '%%' and all occurrences of '%1' are replaced by the - response to the first prompt, the second '%%' and all '%2' are - replaced with the response to the second prompt, and so on for - further prompts. Up to nine prompt responses may be replaced - ('%1' to '%9'). - - confirm-before [-p prompt] [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. If -p is given, - prompt is the prompt to display; otherwise a prompt is con- - structed from command. It may contain the special character - sequences supported by the status-left option. - - This command works only from inside tmux. - - display-message [-p] [-c target-client] [-t target-pane] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is as for status-left, with the exception - that #() are not handled; information is taken from target-pane - if -t is given, otherwise the active pane for the session - attached to target-client. - -BUFFERS - tmux maintains a stack of paste buffers. Up to the value of the - buffer-limit option are kept; when a new buffer is added, the buffer at - the bottom of the stack is removed. Buffers may be added using copy-mode - or the set-buffer command, and pasted into a window using the - paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. This command works only from inside tmux. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - delete-buffer [-b buffer-index] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers - (alias: lsb) - List the global buffers. - - load-buffer [-b buffer-index] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). - - save-buffer [-a] [-b buffer-index] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command [command] - (alias: if) - Execute the first command if shell-command returns success or the - second command otherwise. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - copy mode. If the command doesn't return success, the exit sta- - tus is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -TERMINFO EXTENSIONS - tmux understands some extensions to terminfo(5): - - Cc, Cr Set the cursor colour. The first takes a single string argument - and is used to set the colour; the second takes no arguments and - restores the default cursor colour. If set, a sequence such as - this may be used to change the cursor colour from inside tmux: - - $ printf '\033]12;red\033\\' - - Cs, Csr - Change the cursor style. If set, a sequence such as this may be - used to change the cursor to an underline: - - $ printf '\033[4 q' - - If Csr is set, it will be used to reset the cursor style instead - of Cs. - - Ms This sequence can be used by tmux to store the current buffer in - the host terminal's selection (clipboard). See the set-clipboard - option above and the xterm(1) man page. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.7.txt b/manual/1.7.txt deleted file mode 100644 index 1a7164201b..0000000000 --- a/manual/1.7.txt +++ /dev/null @@ -1,2010 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lquvV] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. The configuration file is a - set of tmux commands which are executed in sequence when - the server is first started. - - If a command in the configuration file fails, tmux will - report an error and exit without executing further com- - mands. - - -L socket-name - tmux stores the server socket in a directory under /tmp (or - TMPDIR if set); the default socket is named default. This - option allows a different socket name to be specified, - allowing several independent tmux servers to be run. - Unlike -S a full path is not necessary: the sockets are all - created in the same directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - -V Report the tmux version. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - $ Rename the current session. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - ; Move to the previously active pane. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - L Switch the attached client back to the last session. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is either the name of a session (as listed by the - list-sessions command) or the name of a client with the same syntax as - target-client, in which case the session attached to the client is used. - When looking for the session name, tmux initially searches for an exact - match; if none is found, the session names are checked for any for which - target-session is a prefix or for which it matches as an fnmatch(3) pat- - tern. If a single match is found, it is used as the target session; mul- - tiple matches produce an error. If a session is omitted, the current - session is used if available; if no current session is available, the - most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as a window ID, such - as @1; as an exact window name, such as mysession:mywindow; then as an - fnmatch(3) pattern or the start of a window name, such as myses- - sion:mywin* or mysession:mywin. An empty window name specifies the next - unused index if appropriate (for example the new-window and link-window - commands) otherwise the current window in session is chosen. The special - character '!' uses the last (previously current) window, or '+' and '-' - are the next window or the previous window by number. When the argument - does not contain a colon, tmux first attempts to parse it as window; if - that fails, an attempt is made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - tmux also gives each pane created in a server an identifier consisting of - a '%' and a number, starting from zero. A pane's identifier is unique - for the life of the tmux server and is passed to the child process of the - pane in the TMUX_PANE environment variable. It may be used alone to tar- - get a pane or the window containing it. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right and lines ending - with a backslash continue on to the next line, except when escaped by - another backslash. A literal semicolon may be included by escaping it - with a backslash (for example, when specifying a command sequence to - bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key R source-file ~/.tmux.conf \; \ - display-message "source-file done" - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one or more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client or switch-client - commands have any effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - The target-session rules for attach-session are slightly - adjusted: if tmux needs to select the most recently used session, - it will prefer the most recently used unattached session. - - detach-client [-P] [-a] [-s target-session] [-t target-client] - (alias: detach) - Detach the current client if bound to a key, the client specified - with -t, or all clients currently attached to the session speci- - fied by -s. The -a option kills all but the client given with - -t. If -P is given, send SIGHUP to the parent process of the - client, typically causing it to exit. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session - [-a] [-t target-session] Destroy the given session, closing any - windows linked to it and no other sessions, and detaching all - clients attached to it. If -a is given, all sessions but the - specified one is killed. - - list-clients [-F format] [-t target-session] - (alias: lsc) - List all clients attached to the server. For the meaning of the - -F flag, see the FORMATS section. If target-session is speci- - fied, list only clients connected to that session. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions [-F format] - (alias: ls) - List all sessions managed by the server. For the meaning of the - -F flag, see the FORMATS section. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-d] [-n window-name] [-s session-name] [-t target-session] - [-x width] [-y height] [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. If -d is used, -x and - -y specify the size of the initial window (80 by 24 if not - given). - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - refresh-client [-S] [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. If -S is specified, only update the - client's status bar. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-t target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-lnpr] [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. If -l, -n or -p is used, the client is moved to - the last, next or previous session respectively. -r toggles - whether a client is read-only (see the attach-session command). - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete/Copy to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump to forward t - Jump backward F F - Jump to backward T - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose chars C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators session option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - When copying the selection, the repeat count indicates the buffer index - to replace, if used. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-dP] [-F format] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. The -P option prints information - about the new window after it has been created. By default, it - uses the format '#{session_name}:#{window_index}' but a different - format may be specified with -F. - - capture-pane [-b buffer-index] [-E end-line] [-S start-line] [-t - target-pane] - (alias: capturep) - Capture the contents of a pane to the specified buffer, or a new - buffer if none is specified. - - -S and -E specify the starting and ending line numbers, zero is - the first line of the visible pane and negative numbers are lines - in the history. The default is to capture only the visible con- - tents of the pane. - - choose-client [-F format] [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. For the meaning of the -F flag, see the - FORMATS section. This command works only from inside tmux. - - choose-list [-l items] [-t target-window] [template] - Put a window into list choice mode, allowing items to be - selected. items can be a comma-separated list to display more - than one item. If an item has spaces, that entry must be quoted. - After an item is chosen, '%%' is replaced by the chosen item in - the template and the result is executed as a command. If - template is not given, "run-shell '%%'" is used. items also - accepts format specifiers. For the meaning of this see the - FORMATS section. This command works only from inside tmux. - - choose-session [-F format] [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. For the meaning of the -F flag, see the FORMATS sec- - tion. This command works only from inside tmux. - - choose-tree [-s] [-w] [-b session-template] [-c window-template] [-S - format] [-W format] [-t target-window] - Put a window into tree choice mode, where either sessions or win- - dows may be selected interactively from a list. By default, win- - dows belonging to a session are indented to show their relation- - ship to a session. - - Note that the choose-window and choose-session commands are wrap- - pers around choose-tree. - - If -s is given, will show sessions. If -w is given, will show - windows. If -b is given, will override the default session com- - mand. Note that '%%' can be used, and will be replaced with the - session name. The default option if not specified is "switch- - client -t '%%'". If -c is given, will override the default win- - dow command. Note that '%%' can be used, and will be replaced - with the session name and window index. This command will run - session-template before it. If -S is given will display the - specified format instead of the default session format. If -W is - given will display the specified format instead of the default - window format. For the meaning of the -s and -w options, see the - FORMATS section. This command only works from inside tmux. - - choose-window [-F format] [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. For the meaning of the -F flag, - see the FORMATS section. This command works only from inside - tmux. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-CNT] [-F format] [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). The flags control - matching behavior: -C matches only visible window contents, -N - matches only the window name and -T matches only the window - title. The default is -CNT. If only one window is matched, - it'll be automatically selected, otherwise a choice list is - shown. For the meaning of the -F flag, see the FORMATS section. - This command only works from inside tmux. - - join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. The -b option causes src-pane to - be joined to left of or above dst-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-a] [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. The -a option kills - all but the window given with -t. - - last-pane [-t target-window] - (alias: lastp) - Select the last (previously selected) pane. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-as] [-F format] [-t target] - (alias: lsp) - If -a is given, target is ignored and all panes on the server are - listed. If -s is given, target is a session (or the current ses- - sion). If neither is given, target is a window (or the current - window). For the meaning of the -F flag, see the FORMATS sec- - tion. - - list-windows [-a] [-F format] [-t target-session] - (alias: lsw) - If -a is given, list all windows on the server. Otherwise, list - windows in the current session or in target-session. For the - meaning of the -F flag, see the FORMATS section. - - move-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: movep) - Like join-pane, but src-pane and dst-pane may belong to the same - window. - - move-window [-rdk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. With -r, all windows in the session are - renumbered in sequential order, respecting the base-index option. - - new-window [-adkP] [-c start-directory] [-n window-name] [-t - target-window] [-F format] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. -c specifies the - working directory in which the new window is created. It may - have an absolute path or one of the following values (or a subdi- - rectory): - - Empty string Current pane's directory - ~ User's home directory - - Where session was started - . Where server was started - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - The -P option prints information about the new window after it - has been created. By default, it uses the format - '#{session_name}:#{window_index}' but a different format may be - specified with -F. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with an alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left option. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with an alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRU] [-t target-pane] [adjustment] - (alias: resizep) - Resize a pane, upward with -U (the default), downward with -D, to - the left with -L and to the right with -R. The adjustment is - given in lines or cells (the default is 1). - - respawn-pane [-k] [-t target-pane] [shell-command] - (alias: respawnp) - Reactivate a pane in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the pane was created is executed. The pane - must be already inactive, unless -k is given, in which case any - existing command is killed. - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-npUu] [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. -n and - -p are equivalent to the next-layout and previous-layout com- - mands. - - -U and -u step forward and back through previous layouts, up to - the maximum set by the layout-history-limit option. - - select-pane [-lDLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. -l - is the same as using the last-pane command. - - select-window [-lnp] [-t target-window] - (alias: selectw) - Select the window at target-window. -l, -n and -p are equivalent - to the last-window, next-window and previous-window commands. - - split-window [-dhvP] [-c start-directory] [-l size | -p percentage] [-t - target-pane] [shell-command] [-F format] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage/PageDown/PgDn, PPage/PageUp/PgUp, Space, - and Tab. Note that to bind the '"' or ''' keys, quotation marks are nec- - essary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-lR] [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. The - -l flag disables key name lookup and sends the keys literally. - All arguments are sent sequentially from first to last. The -R - flag causes the terminal state to be reset. - - send-prefix [-2] [-t target-pane] - Send the prefix key, or with -2 the secondary prefix key, to a - window as if it was pressed. - - unbind-key [-acn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. If -a is - present, all key bindings are removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - Commands which set options are as follows: - - set-option [-agqsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - The -q flag suppresses the informational message (as if the quiet - server option was set). - - Available window options are listed under set-window-option. - - value depends on the option and may be a number, a string, or a - flag (on, off, or omitted to toggle). - - Available server options are: - - buffer-limit number - Set the number of buffers; as new buffers are added to - the top of the stack, old ones are removed from the bot- - tom if necessary to maintain this maximum length. - - escape-time time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - exit-unattached [on | off] - If enabled, the server will exit when there are no - attached clients. - - quiet [on | off] - Enable or disable the display of various informational - messages (see also the -q command line flag). - - set-clipboard [on | off] - Attempt to set the terminal clipboard content using the - \e]52;...\007 xterm(1) escape sequences. This option is - on by default if there is an Ms entry in the terminfo(5) - description for the client terminal. Note that this fea- - ture needs to be enabled in xterm(1) by setting the - resource: - - disallowedWindowOps: 20,21,SetXprop - - Or changing this property from the xterm(1) interactive - menu when required. - - Available session options are: - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bell in windows other than the current - window are ignored. - - bell-on-alert [on | off] - If on, ring the terminal bell when an alert occurs. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-path path - Set the default working directory for new panes. If - empty (the default), the working directory is determined - from the process running in the active pane, from the - command line environment or from the working directory - where the session was created. Otherwise the same - options are available as for the -c flag to new-window. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - destroy-unattached [on | off] - If enabled and the session is no longer attached to any - clients, it is destroyed. - - detach-on-destroy [on | off] - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, aixterm bright variants (if supported: - brightred, brightgreen, and so on), colour0 to colour255 - from the 256-colour set, default, or a hexadecimal RGB - string such as '#ffffff', which chooses the closest match - from the default 256-colour set. - - message-command-attr attributes - Set status line message attributes when in command mode. - - message-command-bg colour - Set status line message background colour when in command - mode. - - message-command-fg colour - Set status line message foreground colour when in command - mode. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-resize-pane [on | off] - If on, tmux captures the mouse and allows panes to be - resized by dragging on their borders. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - mouse-select-window [on | off] - If on, clicking the mouse on a window name in the status - line will select that window. - - mouse-utf8 [on | off] - If enabled, request mouse input as UTF-8 on UTF-8 termi- - nals. - - pane-active-border-bg colour - - pane-active-border-fg colour - Set the pane border colour for the currently active pane. - - pane-border-bg colour - - pane-border-fg colour - Set the pane border colour for panes aside from the - active pane. - - prefix key - Set the key accepted as a prefix key. - - prefix2 key - Set a secondary key accepted as a prefix key. - - renumber-windows [on | off] - If on, when a window is closed in a session, automati- - cally renumber the other windows in numerical order. - This respects the base-index option if it has been set. - If off, do not renumber the windows. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the client terminal title using the tsl - and fsl terminfo(5) entries if they exist. tmux automat- - ically sets these to the \e]2;...\007 sequence if the - terminal appears to be an xterm. This option is off by - default. Note that elinks will only attempt to set the - window title if the STY environment variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. The default is emacs, - unless the VISUAL or EDITOR environment variables are set - and contain the string 'vi'. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #h Hostname of local host without - the domain name - #F Current window flag - #I Current window index - #D Current pane unique identifier - #P Current pane index - #S Session name - #T Current pane title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - For details on how the names and titles can be set see - the NAMES AND TITLES section. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-position [top | bottom] - Set the position of the status line. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256,xterm*:XT" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAU- - THORITY". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - visual-silence [on | off] - If monitor-silence is enabled, prints a message after the - interval has expired on a given window. - - word-separators string - Sets the session's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - set-window-option [-agqu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g, -q and -u flags work similarly - to the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - allow-rename [on | off] - Allow programs to change the window name using a terminal - escape sequence (\033k...\033\\). The default is on. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities. The - alternate screen feature preserves the contents of the - window when an interactive application starts and - restores it on exit, so that any output visible before - the application starts reappears unchanged after it - exits. The default is on. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window, or with a terminal escape sequence. It - may be switched off globally with: - - set-window-option -g automatic-rename off - - c0-change-interval interval - c0-change-trigger trigger - These two options configure a simple form of rate limit- - ing for a pane. If tmux sees more than trigger C0 - sequences that modify the screen (for example, carriage - returns, linefeeds or backspaces) in one millisecond, it - will stop updating the pane immediately and instead - redraw it entirely every interval milliseconds. This - helps to prevent fast output (such as yes(1) overwhelming - the terminal). The default is a trigger of 250 and an - interval of 100. A trigger of zero disables the rate - limiting. - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - layout-history-limit limit - Set the number of previous layouts stored for recovery - with select-layout -U and -u. - - main-pane-height height - main-pane-width width - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. As with the status-keys option, the default is - emacs, unless VISUAL or EDITOR contains 'vi'. - - mode-mouse [on | off | copy-mode] - Mouse state in modes. If on, the mouse may be used to - enter copy mode and copy a selection by dragging, to - enter copy mode and scroll with the mouse wheel, or to - select an option in choice mode. If set to copy-mode, - the mouse behaves as set to on, but cannot be used to - enter copy mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - monitor-silence [interval] - Monitor for silence (no activity) in the window within - interval seconds. Windows that have been silent for the - interval are highlighted in the status line. An interval - of zero disables the monitoring. - - other-pane-height height - Set the height of the other panes (not the main pane) in - the main-horizontal layout. If this option is set to 0 - (the default), it will have no effect. If both the - main-pane-height and other-pane-height options are set, - the main pane will grow taller to make the other panes - the specified height, but will never shrink to do so. - - other-pane-width width - Like other-pane-height, but set the width of other panes - in the main-vertical layout. - - pane-base-index index - Like base-index, but set the starting index for pane num- - bers. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-bell-attr attributes - Set status line attributes for windows which have a bell - alert. - - window-status-bell-bg colour - Set status line background colour for windows with a bell - alert. - - window-status-bell-fg colour - Set status line foreground colour for windows with a bell - alert. - - window-status-content-attr attributes - Set status line attributes for windows which have a con- - tent alert. - - window-status-content-bg colour - Set status line background colour for windows with a con- - tent alert. - - window-status-content-fg colour - Set status line foreground colour for windows with a con- - tent alert. - - window-status-activity-attr attributes - Set status line attributes for windows which have an - activity (or silence) alert. - - window-status-activity-bg colour - Set status line background colour for windows with an - activity alert. - - window-status-activity-fg colour - Set status line foreground colour for windows with an - activity alert. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-separator string - Sets the separator drawn between windows in the status - line. The default is a single space character. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - wrap-search [on | off] - If this option is set, searches will wrap around the end - of the pane contents. The default is on. - - show-options [-gsw] [-t target-session | target-window] [option] - (alias: show) - Show the window options (or a single window option if given) with - -w (equivalent to show-window-options), the server options with - -s, otherwise the session options for target session. Global - session or window options are listed if -g is used. - - show-window-options [-g] [-t target-window] [option] - (alias: showw) - List the window options or a single option for target-window, or - the global window options if -g is used. - -FORMATS - Certain commands accept the -F flag with a format argument. This is a - string which controls the output format of the command. Special charac- - ter sequences are replaced as documented under the status-left option and - an additional long form is accepted. Replacement variables are enclosed - in '#{' and '}', for example '#{session_name}' is equivalent to '#S'. - Conditionals are also accepted by prefixing with '?' and separating two - alternatives with a comma; if the specified variable exists and is not - zero, the first alternative is chosen, otherwise the second is used. For - example '#{?session_attached,attached,not attached}' will include the - string 'attached' if the session is attached and the string 'not - attached' if it is unattached. - - The following variables are available, where appropriate: - - Variable name Replaced with - buffer_sample First 50 characters from the specified - buffer - buffer_size Size of the specified buffer in bytes - client_activity Integer time client last had activity - client_activity_string String time client last had activity - client_created Integer time client created - client_created_string String time client created - client_cwd Working directory of client - client_height Height of client - client_readonly 1 if client is readonly - client_termname Terminal name of client - client_tty Pseudo terminal of client - client_utf8 1 if client supports utf8 - client_width Width of client - host Hostname of local host - history_bytes Number of bytes in window history - history_limit Maximum window history lines - history_size Size of history in bytes - line Line number in the list - pane_active 1 if active pane - pane_current_path Current path if available - pane_dead 1 if pane is dead - pane_height Height of pane - pane_id Unique pane ID - pane_index Index of pane - pane_pid PID of first process in pane - pane_start_command Command pane started with - pane_start_path Path pane started with - pane_title Title of pane - pane_tty Pseudo terminal of pane - pane_width Width of pane - session_attached 1 if session attached - session_created Integer time session created - session_created_string String time session created - session_group Number of session group - session_grouped 1 if session in a group - session_height Height of session - session_name Name of session - session_width Width of session - session_windows Number of windows in session - window_active 1 if window active - window_find_matches Matched data from the find-window command - if available - window_flags Window flags - window_height Height of window - window_id Unique window ID - window_index Index of window - window_layout Window layout description - window_name Name of window - window_panes Number of panes in window - window_width Width of window - -NAMES AND TITLES - tmux distinguishes between names and titles. Windows and sessions have - names, which may be used to specify them in targets and are displayed in - the status line and various lists: the name is the tmux identifier for a - window or session. Only panes have titles. A pane's title is typically - set by the program running inside the pane and is not modified by tmux. - It is the same mechanism used to set for example the xterm(1) window - title in an X(7) window manager. Windows themselves do not have titles - - a window's title is the title of its active pane. tmux itself may set - the title of the terminal in which the client is running, see the - set-titles option. - - A session's name is set with the new-session and rename-session commands. - A window's name is set with one of: - - 1. A command argument (such as -n for new-window or new-session). - - 2. An escape sequence: - - $ printf '\033kWINDOW_NAME\033\\' - - 3. Automatic renaming, which sets the name to the active command in - the window's active pane. See the automatic-rename option. - - When a pane is first created, its title is the hostname. A pane's title - can be set via the OSC title setting sequence, for example: - - $ printf '\033]2;My Title\033\\' - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged. If a - variable exists in both, the value from the session environment is used. - The result is the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] [variable] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. If variable is omitted, all variables are shown. - Variables removed from the environment are prefixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the title of the active pane in double quotes; and the time and - date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - ~ The window has been silent for the monitor-silence - interval. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-I inputs] [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. - - If template is specified, it is used as the command. If present, - -I is a comma-separated list of the initial text for each prompt. - If -p is given, prompts is a comma-separated list of prompts - which are displayed in order; otherwise a single prompt is dis- - played, constructed from template if it is present, or ':' if - not. - - Both inputs and prompts may contain the special character - sequences supported by the status-left option. - - Before the command is executed, the first occurrence of the - string '%%' and all occurrences of '%1' are replaced by the - response to the first prompt, the second '%%' and all '%2' are - replaced with the response to the second prompt, and so on for - further prompts. Up to nine prompt responses may be replaced - ('%1' to '%9'). - - confirm-before [-p prompt] [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. If -p is given, - prompt is the prompt to display; otherwise a prompt is con- - structed from command. It may contain the special character - sequences supported by the status-left option. - - This command works only from inside tmux. - - display-message [-p] [-c target-client] [-t target-pane] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is described in the FORMATS section; infor- - mation is taken from target-pane if -t is given, otherwise the - active pane for the session attached to target-client. - -BUFFERS - tmux maintains a stack of paste buffers. Up to the value of the - buffer-limit option are kept; when a new buffer is added, the buffer at - the bottom of the stack is removed. Buffers may be added using copy-mode - or the set-buffer command, and pasted into a window using the - paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-F format] [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. For the meaning of the -F flag, see the FORMATS - section. This command works only from inside tmux. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - delete-buffer [-b buffer-index] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-F format] - (alias: lsb) - List the global buffers. For the meaning of the -F flag, see the - FORMATS section. - - load-buffer [-b buffer-index] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dpr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). If -p is speci- - fied, paste bracket control codes are inserted around the buffer - if the application has requested bracketed paste mode. - - save-buffer [-a] [-b buffer-index] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell shell-command command [command] - (alias: if) - Execute the first command if shell-command returns success or the - second command otherwise. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. After it finishes, any output to stdout is displayed in - copy mode. If the command doesn't return success, the exit sta- - tus is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - -TERMINFO EXTENSIONS - tmux understands some extensions to terminfo(5): - - Cc, Cr Set the cursor colour. The first takes a single string argument - and is used to set the colour; the second takes no arguments and - restores the default cursor colour. If set, a sequence such as - this may be used to change the cursor colour from inside tmux: - - $ printf '\033]12;red\033\\' - - Cs, Csr - Change the cursor style. If set, a sequence such as this may be - used to change the cursor to an underline: - - $ printf '\033[4 q' - - If Csr is set, it will be used to reset the cursor style instead - of Cs. - - Ms This sequence can be used by tmux to store the current buffer in - the host terminal's selection (clipboard). See the set-clipboard - option above and the xterm(1) man page. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/1.8.txt b/manual/1.8.txt deleted file mode 100644 index f8c7f065f2..0000000000 --- a/manual/1.8.txt +++ /dev/null @@ -1,2178 +0,0 @@ -TMUX(1) BSD General Commands Manual TMUX(1) - -NAME - tmux -- terminal multiplexer - -SYNOPSIS - tmux [-28lCquvV] [-c shell-command] [-f file] [-L socket-name] - [-S socket-path] [command [flags]] - -DESCRIPTION - tmux is a terminal multiplexer: it enables a number of terminals to be - created, accessed, and controlled from a single screen. tmux may be - detached from a screen and continue running in the background, then later - reattached. - - When tmux is started it creates a new session with a single window and - displays it on screen. A status line at the bottom of the screen shows - information on the current session and is used to enter interactive com- - mands. - - A session is a single collection of pseudo terminals under the management - of tmux. Each session has one or more windows linked to it. A window - occupies the entire screen and may be split into rectangular panes, each - of which is a separate pseudo terminal (the pty(4) manual page documents - the technical details of pseudo terminals). Any number of tmux instances - may connect to the same session, and any number of windows may be present - in the same session. Once all sessions are killed, tmux exits. - - Each session is persistent and will survive accidental disconnection - (such as ssh(1) connection timeout) or intentional detaching (with the - 'C-b d' key strokes). tmux may be reattached using: - - $ tmux attach - - In tmux, a session is displayed on screen by a client and all sessions - are managed by a single server. The server and each client are separate - processes which communicate through a socket in /tmp. - - The options are as follows: - - -2 Force tmux to assume the terminal supports 256 colours. - - -8 Like -2, but indicates that the terminal supports 88 - colours. - - -C Start in control mode. Given twice (-CC) disables echo. - - -c shell-command - Execute shell-command using the default shell. If neces- - sary, the tmux server will be started to retrieve the - default-shell option. This option is for compatibility - with sh(1) when tmux is used as a login shell. - - -f file Specify an alternative configuration file. By default, - tmux loads the system configuration file from - /etc/tmux.conf, if present, then looks for a user configu- - ration file at ~/.tmux.conf. - - The configuration file is a set of tmux commands which are - executed in sequence when the server is first started. - tmux loads configuration files once when the server process - has started. The source-file command may be used to load a - file later. - - tmux shows any error messages from commands in configura- - tion files in the first session created, and continues to - process the rest of the configuration file. - - -L socket-name - tmux stores the server socket in a directory under /tmp (or - TMPDIR if set); the default socket is named default. This - option allows a different socket name to be specified, - allowing several independent tmux servers to be run. - Unlike -S a full path is not necessary: the sockets are all - created in the same directory. - - If the socket is accidentally removed, the SIGUSR1 signal - may be sent to the tmux server process to recreate it. - - -l Behave as a login shell. This flag currently has no effect - and is for compatibility with other shells when using tmux - as a login shell. - - -q Set the quiet server option to prevent the server sending - various informational messages. - - -S socket-path - Specify a full alternative path to the server socket. If - -S is specified, the default socket directory is not used - and any -L flag is ignored. - - -u tmux attempts to guess if the terminal is likely to support - UTF-8 by checking the first of the LC_ALL, LC_CTYPE and - LANG environment variables to be set for the string - "UTF-8". This is not always correct: the -u flag explic- - itly informs tmux that UTF-8 is supported. - - If the server is started from a client passed -u or where - UTF-8 is detected, the utf8 and status-utf8 options are - enabled in the global window and session options respec- - tively. - - -v Request verbose logging. This option may be specified mul- - tiple times for increasing verbosity. Log messages will be - saved into tmux-client-PID.log and tmux-server-PID.log - files in the current directory, where PID is the PID of the - server or client process. - - -V Report the tmux version. - - command [flags] - This specifies one of a set of commands used to control - tmux, as described in the following sections. If no com- - mands are specified, the new-session command is assumed. - -KEY BINDINGS - tmux may be controlled from an attached client by using a key combination - of a prefix key, 'C-b' (Ctrl-b) by default, followed by a command key. - - The default command key bindings are: - - C-b Send the prefix key (C-b) through to the application. - C-o Rotate the panes in the current window forwards. - C-z Suspend the tmux client. - ! Break the current pane out of the window. - " Split the current pane into two, top and bottom. - # List all paste buffers. - $ Rename the current session. - % Split the current pane into two, left and right. - & Kill the current window. - ' Prompt for a window index to select. - , Rename the current window. - - Delete the most recently copied buffer of text. - . Prompt for an index to move the current window. - 0 to 9 Select windows 0 to 9. - : Enter the tmux command prompt. - ; Move to the previously active pane. - = Choose which buffer to paste interactively from a list. - ? List all key bindings. - D Choose a client to detach. - [ Enter copy mode to copy text or view the history. - ] Paste the most recently copied buffer of text. - c Create a new window. - d Detach the current client. - f Prompt to search for text in open windows. - i Display some information about the current window. - l Move to the previously selected window. - n Change to the next window. - o Select the next pane in the current window. - p Change to the previous window. - q Briefly display pane indexes. - r Force redraw of the attached client. - s Select a new session for the attached client interac- - tively. - L Switch the attached client back to the last session. - t Show the time. - w Choose the current window interactively. - x Kill the current pane. - { Swap the current pane with the previous pane. - } Swap the current pane with the next pane. - ~ Show previous messages from tmux, if any. - Page Up Enter copy mode and scroll one page up. - Up, Down - Left, Right - Change to the pane above, below, to the left, or to the - right of the current pane. - M-1 to M-5 Arrange panes in one of the five preset layouts: even- - horizontal, even-vertical, main-horizontal, main-verti- - cal, or tiled. - M-n Move to the next window with a bell or activity marker. - M-o Rotate the panes in the current window backwards. - M-p Move to the previous window with a bell or activity - marker. - C-Up, C-Down - C-Left, C-Right - Resize the current pane in steps of one cell. - M-Up, M-Down - M-Left, M-Right - Resize the current pane in steps of five cells. - - Key bindings may be changed with the bind-key and unbind-key commands. - -COMMANDS - This section contains a list of the commands supported by tmux. Most - commands accept the optional -t argument with one of target-client, - target-session target-window, or target-pane. These specify the client, - session, window or pane which a command should affect. target-client is - the name of the pty(4) file to which the client is connected, for example - either of /dev/ttyp1 or ttyp1 for the client attached to /dev/ttyp1. If - no client is specified, the current client is chosen, if possible, or an - error is reported. Clients may be listed with the list-clients command. - - target-session is the session id prefixed with a $, the name of a session - (as listed by the list-sessions command), or the name of a client with - the same syntax as target-client, in which case the session attached to - the client is used. When looking for the session name, tmux initially - searches for an exact match; if none is found, the session names are - checked for any for which target-session is a prefix or for which it - matches as an fnmatch(3) pattern. If a single match is found, it is used - as the target session; multiple matches produce an error. If a session - is omitted, the current session is used if available; if no current ses- - sion is available, the most recently used is chosen. - - target-window specifies a window in the form session:window. session - follows the same rules as for target-session, and window is looked for in - order: as a window index, for example mysession:1; as a window ID, such - as @1; as an exact window name, such as mysession:mywindow; then as an - fnmatch(3) pattern or the start of a window name, such as myses- - sion:mywin* or mysession:mywin. An empty window name specifies the next - unused index if appropriate (for example the new-window and link-window - commands) otherwise the current window in session is chosen. The special - character '!' uses the last (previously current) window, '^' selects the - highest numbered window, '$' selects the lowest numbered window, and '+' - and '-' select the next window or the previous window by number. When - the argument does not contain a colon, tmux first attempts to parse it as - window; if that fails, an attempt is made to match a session. - - target-pane takes a similar form to target-window but with the optional - addition of a period followed by a pane index, for example: myses- - sion:mywindow.1. If the pane index is omitted, the currently active pane - in the specified window is used. If neither a colon nor period appears, - tmux first attempts to use the argument as a pane index; if that fails, - it is looked up as for target-window. A '+' or '-' indicate the next or - previous pane index, respectively. One of the strings top, bottom, left, - right, top-left, top-right, bottom-left or bottom-right may be used - instead of a pane index. - - The special characters '+' and '-' may be followed by an offset, for - example: - - select-window -t:+2 - - When dealing with a session that doesn't contain sequential window - indexes, they will be correctly skipped. - - tmux also gives each pane created in a server an identifier consisting of - a '%' and a number, starting from zero. A pane's identifier is unique - for the life of the tmux server and is passed to the child process of the - pane in the TMUX_PANE environment variable. It may be used alone to tar- - get a pane or the window containing it. - - shell-command arguments are sh(1) commands. These must be passed as a - single item, which typically means quoting them, for example: - - new-window 'vi /etc/passwd' - - command [arguments] refers to a tmux command, passed with the command and - arguments separately, for example: - - bind-key F1 set-window-option force-width 81 - - Or if using sh(1): - - $ tmux bind-key F1 set-window-option force-width 81 - - Multiple commands may be specified together as part of a command - sequence. Each command should be separated by spaces and a semicolon; - commands are executed sequentially from left to right and lines ending - with a backslash continue on to the next line, except when escaped by - another backslash. A literal semicolon may be included by escaping it - with a backslash (for example, when specifying a command sequence to - bind-key). - - Example tmux commands include: - - refresh-client -t/dev/ttyp2 - - rename-session -tfirst newname - - set-window-option -t:0 monitor-activity on - - new-window ; split-window -d - - bind-key R source-file ~/.tmux.conf \; \ - display-message "source-file done" - - Or from sh(1): - - $ tmux kill-window -t :1 - - $ tmux new-window \; split-window -d - - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -CLIENTS AND SESSIONS - The tmux server manages clients, sessions, windows and panes. Clients - are attached to sessions to interact with them, either when they are cre- - ated with the new-session command, or later with the attach-session com- - mand. Each session has one or more windows linked into it. Windows may - be linked to multiple sessions and are made up of one or more panes, each - of which contains a pseudo terminal. Commands for creating, linking and - otherwise manipulating windows are covered in the WINDOWS AND PANES sec- - tion. - - The following commands are available to manage clients and sessions: - - attach-session [-dr] [-t target-session] - (alias: attach) - If run from outside tmux, create a new client in the current ter- - minal and attach it to target-session. If used from inside, - switch the current client. If -d is specified, any other clients - attached to the session are detached. -r signifies the client is - read-only (only keys bound to the detach-client or switch-client - commands have any effect) - - If no server is started, attach-session will attempt to start it; - this will fail unless sessions are created in the configuration - file. - - The target-session rules for attach-session are slightly - adjusted: if tmux needs to select the most recently used session, - it will prefer the most recently used unattached session. - - detach-client [-P] [-a] [-s target-session] [-t target-client] - (alias: detach) - Detach the current client if bound to a key, the client specified - with -t, or all clients currently attached to the session speci- - fied by -s. The -a option kills all but the client given with - -t. If -P is given, send SIGHUP to the parent process of the - client, typically causing it to exit. - - has-session [-t target-session] - (alias: has) - Report an error and exit with 1 if the specified session does not - exist. If it does exist, exit with 0. - - kill-server - Kill the tmux server and clients and destroy all sessions. - - kill-session - [-a] [-t target-session] Destroy the given session, closing any - windows linked to it and no other sessions, and detaching all - clients attached to it. If -a is given, all sessions but the - specified one is killed. - - list-clients [-F format] [-t target-session] - (alias: lsc) - List all clients attached to the server. For the meaning of the - -F flag, see the FORMATS section. If target-session is speci- - fied, list only clients connected to that session. - - list-commands - (alias: lscm) - List the syntax of all commands supported by tmux. - - list-sessions [-F format] - (alias: ls) - List all sessions managed by the server. For the meaning of the - -F flag, see the FORMATS section. - - lock-client [-t target-client] - (alias: lockc) - Lock target-client, see the lock-server command. - - lock-session [-t target-session] - (alias: locks) - Lock all clients attached to target-session. - - new-session [-AdDP] [-F format] [-n window-name] [-s session-name] [-t - target-session] [-x width] [-y height] [shell-command] - (alias: new) - Create a new session with name session-name. - - The new session is attached to the current terminal unless -d is - given. window-name and shell-command are the name of and shell - command to execute in the initial window. If -d is used, -x and - -y specify the size of the initial window (80 by 24 if not - given). - - If run from a terminal, any termios(4) special characters are - saved and used for new windows in the new session. - - The -A flag makes new-session behave like attach-session if - session-name already exists; in the case, -D behaves like -d to - attach-session. - - If -t is given, the new session is grouped with target-session. - This means they share the same set of windows - all windows from - target-session are linked to the new session and any subsequent - new windows or windows being closed are applied to both sessions. - The current and previous window and any session options remain - independent and either session may be killed without affecting - the other. Giving -n or shell-command are invalid if -t is used. - - The -P option prints information about the new session after it - has been created. By default, it uses the format - '#{session_name}:' but a different format may be specified with - -F. - - refresh-client [-S] [-t target-client] - (alias: refresh) - Refresh the current client if bound to a key, or a single client - if one is given with -t. If -S is specified, only update the - client's status bar. - - rename-session [-t target-session] new-name - (alias: rename) - Rename the session to new-name. - - show-messages [-t target-client] - (alias: showmsgs) - Any messages displayed on the status line are saved in a per- - client message log, up to a maximum of the limit set by the - message-limit session option for the session attached to that - client. This command displays the log for target-client. - - source-file path - (alias: source) - Execute commands from path. - - start-server - (alias: start) - Start the tmux server, if not already running, without creating - any sessions. - - suspend-client [-t target-client] - (alias: suspendc) - Suspend a client by sending SIGTSTP (tty stop). - - switch-client [-lnpr] [-c target-client] [-t target-session] - (alias: switchc) - Switch the current session for client target-client to - target-session. If -l, -n or -p is used, the client is moved to - the last, next or previous session respectively. -r toggles - whether a client is read-only (see the attach-session command). - -WINDOWS AND PANES - A tmux window may be in one of several modes. The default permits direct - access to the terminal attached to the window. The other is copy mode, - which permits a section of a window or its history to be copied to a - paste buffer for later insertion into another window. This mode is - entered with the copy-mode command, bound to '[' by default. It is also - entered when a command that produces output, such as list-keys, is exe- - cuted from a key binding. - - The keys available depend on whether emacs or vi mode is selected (see - the mode-keys option). The following keys are supported as appropriate - for the mode: - - Function vi emacs - Back to indentation ^ M-m - Bottom of history G M-< - Clear selection Escape C-g - Copy selection Enter M-w - Cursor down j Down - Cursor left h Left - Cursor right l Right - Cursor to bottom line L - Cursor to middle line M M-r - Cursor to top line H M-R - Cursor up k Up - Delete entire line d C-u - Delete/Copy to end of line D C-k - End of line $ C-e - Go to line : g - Half page down C-d M-Down - Half page up C-u M-Up - Jump forward f f - Jump to forward t - Jump backward F F - Jump to backward T - Jump again ; ; - Jump again in reverse , , - Next page C-f Page down - Next space W - Next space, end of word E - Next word w - Next word end e M-f - Paste buffer p C-y - Previous page C-b Page up - Previous word b M-b - Previous space B - Quit mode q Escape - Rectangle toggle v R - Scroll down C-Down or C-e C-Down - Scroll up C-Up or C-y C-Up - Search again n n - Search again in reverse N N - Search backward ? C-r - Search forward / C-s - Start of line 0 C-a - Start selection Space C-Space - Top of history g M-> - Transpose characters C-t - - The next and previous word keys use space and the '-', '_' and '@' char- - acters as word delimiters by default, but this can be adjusted by setting - the word-separators session option. Next word moves to the start of the - next word, next word end to the end of the next word and previous word to - the start of the previous word. The three next and previous space keys - work similarly but use a space alone as the word separator. - - The jump commands enable quick movement within a line. For instance, - typing 'f' followed by '/' will move the cursor to the next '/' character - on the current line. A ';' will then jump to the next occurrence. - - Commands in copy mode may be prefaced by an optional repeat count. With - vi key bindings, a prefix is entered using the number keys; with emacs, - the Alt (meta) key and a number begins prefix entry. For example, to - move the cursor forward by ten words, use 'M-1 0 M-f' in emacs mode, and - '10w' in vi. - - When copying the selection, the repeat count indicates the buffer index - to replace, if used. - - Mode key bindings are defined in a set of named tables: vi-edit and - emacs-edit for keys used when line editing at the command prompt; - vi-choice and emacs-choice for keys used when choosing from lists (such - as produced by the choose-window command); and vi-copy and emacs-copy - used in copy mode. The tables may be viewed with the list-keys command - and keys modified or removed with bind-key and unbind-key. One command - accepts an argument, copy-pipe, which copies the selection and pipes it - to a command. For example the following will bind 'C-q' to copy the - selection into /tmp as well as the paste buffer: - - bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out" - - The paste buffer key pastes the first line from the top paste buffer on - the stack. - - The synopsis for the copy-mode command is: - - copy-mode [-u] [-t target-pane] - Enter copy mode. The -u option scrolls one page up. - - Each window displayed by tmux may be split into one or more panes; each - pane takes up a certain area of the display and is a separate terminal. - A window may be split into panes using the split-window command. Windows - may be split horizontally (with the -h flag) or vertically. Panes may be - resized with the resize-pane command (bound to 'C-up', 'C-down' 'C-left' - and 'C-right' by default), the current pane may be changed with the - select-pane command and the rotate-window and swap-pane commands may be - used to swap panes without changing their position. Panes are numbered - beginning from zero in the order they are created. - - A number of preset layouts are available. These may be selected with the - select-layout command or cycled with next-layout (bound to 'Space' by - default); once a layout is chosen, panes within it may be moved and - resized as normal. - - The following layouts are supported: - - even-horizontal - Panes are spread out evenly from left to right across the window. - - even-vertical - Panes are spread evenly from top to bottom. - - main-horizontal - A large (main) pane is shown at the top of the window and the - remaining panes are spread from left to right in the leftover - space at the bottom. Use the main-pane-height window option to - specify the height of the top pane. - - main-vertical - Similar to main-horizontal but the large pane is placed on the - left and the others spread from top to bottom along the right. - See the main-pane-width window option. - - tiled Panes are spread out as evenly as possible over the window in - both rows and columns. - - In addition, select-layout may be used to apply a previously used layout - - the list-windows command displays the layout of each window in a form - suitable for use with select-layout. For example: - - $ tmux list-windows - 0: ksh [159x48] - layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - - tmux automatically adjusts the size of the layout for the current window - size. Note that a layout cannot be applied to a window with more panes - than that from which the layout was originally defined. - - Commands related to windows and panes are as follows: - - break-pane [-dP] [-F format] [-t target-pane] - (alias: breakp) - Break target-pane off from its containing window to make it the - only pane in a new window. If -d is given, the new window does - not become the current window. The -P option prints information - about the new window after it has been created. By default, it - uses the format '#{session_name}:#{window_index}' but a different - format may be specified with -F. - - capture-pane [-aepPq] [-b buffer-index] [-E end-line] [-S start-line] [-t - target-pane] - (alias: capturep) - Capture the contents of a pane. If -p is given, the output goes - to stdout, otherwise to the buffer specified with -b or a new - buffer if omitted. If -a is given, the alternate screen is used, - and the history is not accessible. If no alternate screen - exists, an error will be returned unless -q is given. If -e is - given, the output includes escape sequences for text and back- - ground attributes. -C also escapes non-printable characters as - octal \xxx. -J joins wrapped lines and preserves trailing spaces - at each line's end. -P captures only any output that the pane - has received that is the beginning of an as-yet incomplete escape - sequence. - - -S and -E specify the starting and ending line numbers, zero is - the first line of the visible pane and negative numbers are lines - in the history. The default is to capture only the visible con- - tents of the pane. - - choose-client [-F format] [-t target-window] [template] - Put a window into client choice mode, allowing a client to be - selected interactively from a list. After a client is chosen, - '%%' is replaced by the client pty(4) path in template and the - result executed as a command. If template is not given, "detach- - client -t '%%'" is used. For the meaning of the -F flag, see the - FORMATS section. This command works only if at least one client - is attached. - - choose-list [-l items] [-t target-window] [template] - Put a window into list choice mode, allowing items to be - selected. items can be a comma-separated list to display more - than one item. If an item has spaces, that entry must be quoted. - After an item is chosen, '%%' is replaced by the chosen item in - the template and the result is executed as a command. If - template is not given, "run-shell '%%'" is used. items also - accepts format specifiers. For the meaning of this see the - FORMATS section. This command works only if at least one client - is attached. - - choose-session [-F format] [-t target-window] [template] - Put a window into session choice mode, where a session may be - selected interactively from a list. When one is chosen, '%%' is - replaced by the session name in template and the result executed - as a command. If template is not given, "switch-client -t '%%'" - is used. For the meaning of the -F flag, see the FORMATS sec- - tion. This command works only if at least one client is - attached. - - choose-tree [-suw] [-b session-template] [-c window-template] [-S format] - [-W format] [-t target-window] - Put a window into tree choice mode, where either sessions or win- - dows may be selected interactively from a list. By default, win- - dows belonging to a session are indented to show their relation- - ship to a session. - - Note that the choose-window and choose-session commands are wrap- - pers around choose-tree. - - If -s is given, will show sessions. If -w is given, will show - windows. - - By default, the tree is collapsed and sessions must be expanded - to windows with the right arrow key. The -u option will start - with all sessions expanded instead. - - If -b is given, will override the default session command. Note - that '%%' can be used and will be replaced with the session name. - The default option if not specified is "switch-client -t '%%'". - If -c is given, will override the default window command. Like - -b, '%%' can be used and will be replaced with the session name - and window index. When a window is chosen from the list, the - session command is run before the window command. - - If -S is given will display the specified format instead of the - default session format. If -W is given will display the speci- - fied format instead of the default window format. For the mean- - ing of the -s and -w options, see the FORMATS section. - - This command works only if at least one client is attached. - - choose-window [-F format] [-t target-window] [template] - Put a window into window choice mode, where a window may be cho- - sen interactively from a list. After a window is selected, '%%' - is replaced by the session name and window index in template and - the result executed as a command. If template is not given, - "select-window -t '%%'" is used. For the meaning of the -F flag, - see the FORMATS section. This command works only if at least one - client is attached. - - display-panes [-t target-client] - (alias: displayp) - Display a visible indicator of each pane shown by target-client. - See the display-panes-time, display-panes-colour, and - display-panes-active-colour session options. While the indicator - is on screen, a pane may be selected with the '0' to '9' keys. - - find-window [-CNT] [-F format] [-t target-window] match-string - (alias: findw) - Search for the fnmatch(3) pattern match-string in window names, - titles, and visible content (but not history). The flags control - matching behavior: -C matches only visible window contents, -N - matches only the window name and -T matches only the window - title. The default is -CNT. If only one window is matched, - it'll be automatically selected, otherwise a choice list is - shown. For the meaning of the -F flag, see the FORMATS section. - This command works only if at least one client is attached. - - join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: joinp) - Like split-window, but instead of splitting dst-pane and creating - a new pane, split it and move src-pane into the space. This can - be used to reverse break-pane. The -b option causes src-pane to - be joined to left of or above dst-pane. - - kill-pane [-a] [-t target-pane] - (alias: killp) - Destroy the given pane. If no panes remain in the containing - window, it is also destroyed. The -a option kills all but the - pane given with -t. - - kill-window [-a] [-t target-window] - (alias: killw) - Kill the current window or the window at target-window, removing - it from any sessions to which it is linked. The -a option kills - all but the window given with -t. - - last-pane [-t target-window] - (alias: lastp) - Select the last (previously selected) pane. - - last-window [-t target-session] - (alias: last) - Select the last (previously selected) window. If no - target-session is specified, select the last window of the cur- - rent session. - - link-window [-dk] [-s src-window] [-t dst-window] - (alias: linkw) - Link the window at src-window to the specified dst-window. If - dst-window is specified and no such window exists, the src-window - is linked there. If -k is given and dst-window exists, it is - killed, otherwise an error is generated. If -d is given, the - newly linked window is not selected. - - list-panes [-as] [-F format] [-t target] - (alias: lsp) - If -a is given, target is ignored and all panes on the server are - listed. If -s is given, target is a session (or the current ses- - sion). If neither is given, target is a window (or the current - window). For the meaning of the -F flag, see the FORMATS sec- - tion. - - list-windows [-a] [-F format] [-t target-session] - (alias: lsw) - If -a is given, list all windows on the server. Otherwise, list - windows in the current session or in target-session. For the - meaning of the -F flag, see the FORMATS section. - - move-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (alias: movep) - Like join-pane, but src-pane and dst-pane may belong to the same - window. - - move-window [-rdk] [-s src-window] [-t dst-window] - (alias: movew) - This is similar to link-window, except the window at src-window - is moved to dst-window. With -r, all windows in the session are - renumbered in sequential order, respecting the base-index option. - - new-window [-adkP] [-c start-directory] [-F format] [-n window-name] [-t - target-window] [shell-command] - (alias: neww) - Create a new window. With -a, the new window is inserted at the - next index up from the specified target-window, moving windows up - if necessary, otherwise target-window is the new window location. - - If -d is given, the session does not make the new window the cur- - rent window. target-window represents the window to be created; - if the target already exists an error is shown, unless the -k - flag is used, in which case it is destroyed. shell-command is - the command to execute. If shell-command is not specified, the - value of the default-command option is used. -c specifies the - working directory in which the new window is created. It may - have an absolute path or one of the following values (or a subdi- - rectory): - - Empty string Current pane's directory - ~ User's home directory - - Where session was started - . Where server was started - - When the shell command completes, the window closes. See the - remain-on-exit option to change this behaviour. - - The TERM environment variable must be set to ``screen'' for all - programs running inside tmux. New windows will automatically - have ``TERM=screen'' added to their environment, but care must be - taken not to reset this in shell start-up files. - - The -P option prints information about the new window after it - has been created. By default, it uses the format - '#{session_name}:#{window_index}' but a different format may be - specified with -F. - - next-layout [-t target-window] - (alias: nextl) - Move a window to the next layout and rearrange the panes to fit. - - next-window [-a] [-t target-session] - (alias: next) - Move to the next window in the session. If -a is used, move to - the next window with an alert. - - pipe-pane [-o] [-t target-pane] [shell-command] - (alias: pipep) - Pipe any output sent by the program in target-pane to a shell - command. A pane may only be piped to one command at a time, any - existing pipe is closed before shell-command is executed. The - shell-command string may contain the special character sequences - supported by the status-left option. If no shell-command is - given, the current pipe (if any) is closed. - - The -o option only opens a new pipe if no previous pipe exists, - allowing a pipe to be toggled with a single key, for example: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - previous-layout [-t target-window] - (alias: prevl) - Move to the previous layout in the session. - - previous-window [-a] [-t target-session] - (alias: prev) - Move to the previous window in the session. With -a, move to the - previous window with an alert. - - rename-window [-t target-window] new-name - (alias: renamew) - Rename the current window, or the window at target-window if - specified, to new-name. - - resize-pane [-DLRUZ] [-t target-pane] [-x width] [-y height] [adjustment] - (alias: resizep) - Resize a pane, up, down, left or right by adjustment with -U, -D, - -L or -R, or to an absolute size with -x or -y. The adjustment - is given in lines or cells (the default is 1). - - With -Z, the active pane is toggled between zoomed (occupying the - whole of the window) and unzoomed (its normal position in the - layout). - - respawn-pane [-k] [-t target-pane] [shell-command] - (alias: respawnp) - Reactivate a pane in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the pane was created is executed. The pane - must be already inactive, unless -k is given, in which case any - existing command is killed. - - respawn-window [-k] [-t target-window] [shell-command] - (alias: respawnw) - Reactivate a window in which the command has exited (see the - remain-on-exit window option). If shell-command is not given, - the command used when the window was created is executed. The - window must be already inactive, unless -k is given, in which - case any existing command is killed. - - rotate-window [-DU] [-t target-window] - (alias: rotatew) - Rotate the positions of the panes within a window, either upward - (numerically lower) with -U or downward (numerically higher). - - select-layout [-np] [-t target-window] [layout-name] - (alias: selectl) - Choose a specific layout for a window. If layout-name is not - given, the last preset layout used (if any) is reapplied. -n and - -p are equivalent to the next-layout and previous-layout com- - mands. - - select-pane [-lDLRU] [-t target-pane] - (alias: selectp) - Make pane target-pane the active pane in window target-window. - If one of -D, -L, -R, or -U is used, respectively the pane below, - to the left, to the right, or above the target pane is used. -l - is the same as using the last-pane command. - - select-window [-lnpT] [-t target-window] - (alias: selectw) - Select the window at target-window. -l, -n and -p are equivalent - to the last-window, next-window and previous-window commands. If - -T is given and the selected window is already the current win- - dow, the command behaves like last-window. - - split-window [-dhvP] [-c start-directory] [-l size | -p percentage] [-t - target-pane] [shell-command] [-F format] - (alias: splitw) - Create a new pane by splitting target-pane: -h does a horizontal - split and -v a vertical split; if neither is specified, -v is - assumed. The -l and -p options specify the size of the new pane - in lines (for vertical split) or in cells (for horizontal split), - or as a percentage, respectively. All other options have the - same meaning as for the new-window command. - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (alias: swapp) - Swap two panes. If -U is used and no source pane is specified - with -s, dst-pane is swapped with the previous pane (before it - numerically); -D swaps with the next pane (after it numerically). - -d instructs tmux not to change the active pane. - - swap-window [-d] [-s src-window] [-t dst-window] - (alias: swapw) - This is similar to link-window, except the source and destination - windows are swapped. It is an error if no window exists at - src-window. - - unlink-window [-k] [-t target-window] - (alias: unlinkw) - Unlink target-window. Unless -k is given, a window may be - unlinked only if it is linked to multiple sessions - windows may - not be linked to no sessions; if -k is specified and the window - is linked to only one session, it is unlinked and destroyed. - -KEY BINDINGS - tmux allows a command to be bound to most keys, with or without a prefix - key. When specifying keys, most represent themselves (for example 'A' to - 'Z'). Ctrl keys may be prefixed with 'C-' or '^', and Alt (meta) with - 'M-'. In addition, the following special key names are accepted: Up, - Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to - F20, Home, IC (Insert), NPage/PageDown/PgDn, PPage/PageUp/PgUp, Space, - and Tab. Note that to bind the '"' or ''' keys, quotation marks are nec- - essary, for example: - - bind-key '"' split-window - bind-key "'" new-window - - Commands related to key bindings are as follows: - - bind-key [-cnr] [-t key-table] key command [arguments] - (alias: bind) - Bind key key to command. By default (without -t) the primary key - bindings are modified (those normally activated with the prefix - key); in this case, if -n is specified, it is not necessary to - use the prefix key, command is bound to key alone. The -r flag - indicates this key may repeat, see the repeat-time option. - - If -t is present, key is bound in key-table: the binding for com- - mand mode with -c or for normal mode without. To view the - default bindings and possible commands, see the list-keys com- - mand. - - list-keys [-t key-table] - (alias: lsk) - List all key bindings. Without -t the primary key bindings - - those executed when preceded by the prefix key - are printed. - - With -t, the key bindings in key-table are listed; this may be - one of: vi-edit, emacs-edit, vi-choice, emacs-choice, vi-copy or - emacs-copy. - - send-keys [-lR] [-t target-pane] key ... - (alias: send) - Send a key or keys to a window. Each argument key is the name of - the key (such as 'C-a' or 'npage' ) to send; if the string is not - recognised as a key, it is sent as a series of characters. The - -l flag disables key name lookup and sends the keys literally. - All arguments are sent sequentially from first to last. The -R - flag causes the terminal state to be reset. - - send-prefix [-2] [-t target-pane] - Send the prefix key, or with -2 the secondary prefix key, to a - window as if it was pressed. - - unbind-key [-acn] [-t key-table] key - (alias: unbind) - Unbind the command bound to key. Without -t the primary key - bindings are modified; in this case, if -n is specified, the com- - mand bound to key without a prefix (if any) is removed. If -a is - present, all key bindings are removed. - - If -t is present, key in key-table is unbound: the binding for - command mode with -c or for normal mode without. - -OPTIONS - The appearance and behaviour of tmux may be modified by changing the - value of various options. There are three types of option: server - options, session options and window options. - - The tmux server has a set of global options which do not apply to any - particular window or session. These are altered with the set-option -s - command, or displayed with the show-options -s command. - - In addition, each individual session may have a set of session options, - and there is a separate set of global session options. Sessions which do - not have a particular option configured inherit the value from the global - session options. Session options are set or unset with the set-option - command and may be listed with the show-options command. The available - server and session options are listed under the set-option command. - - Similarly, a set of window options is attached to each window, and there - is a set of global window options from which any unset options are inher- - ited. Window options are altered with the set-window-option command and - can be listed with the show-window-options command. All window options - are documented with the set-window-option command. - - tmux also supports user options which are prefixed with a '@'. User - options may have any name, so long as they are prefixed with '@', and be - set to any string. For example - - $ tmux setw -q @foo "abc123" - $ tmux showw -v @foo - abc123 - - Commands which set options are as follows: - - set-option [-agoqsuw] [-t target-session | target-window] option value - (alias: set) - Set a window option with -w (equivalent to the set-window-option - command), a server option with -s, otherwise a session option. - - If -g is specified, the global session or window option is set. - With -a, and if the option expects a string, value is appended to - the existing setting. The -u flag unsets an option, so a session - inherits the option from the global options. It is not possible - to unset a global option. - - The -o flag prevents setting an option that is already set. - - The -q flag suppresses the informational message (as if the quiet - server option was set). - - Available window options are listed under set-window-option. - - value depends on the option and may be a number, a string, or a - flag (on, off, or omitted to toggle). - - Available server options are: - - buffer-limit number - Set the number of buffers; as new buffers are added to - the top of the stack, old ones are removed from the bot- - tom if necessary to maintain this maximum length. - - escape-time time - Set the time in milliseconds for which tmux waits after - an escape is input to determine if it is part of a func- - tion or meta key sequences. The default is 500 millisec- - onds. - - exit-unattached [on | off] - If enabled, the server will exit when there are no - attached clients. - - quiet [on | off] - Enable or disable the display of various informational - messages (see also the -q command line flag). - - set-clipboard [on | off] - Attempt to set the terminal clipboard content using the - \e]52;...\007 xterm(1) escape sequences. This option is - on by default if there is an Ms entry in the terminfo(5) - description for the client terminal. Note that this fea- - ture needs to be enabled in xterm(1) by setting the - resource: - - disallowedWindowOps: 20,21,SetXprop - - Or changing this property from the xterm(1) interactive - menu when required. - - Available session options are: - - assume-paste-time milliseconds - If keys are entered faster than one in milliseconds, they - are assumed to have been pasted rather than typed and - tmux key bindings are not processed. The default is one - millisecond and zero disables. - - base-index index - Set the base index from which an unused index should be - searched when a new window is created. The default is - zero. - - bell-action [any | none | current] - Set action on window bell. any means a bell in any win- - dow linked to a session causes a bell in the current win- - dow of that session, none means all bells are ignored and - current means only bells in windows other than the cur- - rent window are ignored. - - bell-on-alert [on | off] - If on, ring the terminal bell when an alert occurs. - - default-command shell-command - Set the command used for new windows (if not specified - when the window is created) to shell-command, which may - be any sh(1) command. The default is an empty string, - which instructs tmux to create a login shell using the - value of the default-shell option. - - default-path path - Set the default working directory for new panes. If - empty (the default), the working directory is determined - from the process running in the active pane, from the - command line environment or from the working directory - where the session was created. Otherwise the same - options are available as for the -c flag to new-window. - - default-shell path - Specify the default shell. This is used as the login - shell for new windows when the default-command option is - set to empty, and must be the full path of the exe- - cutable. When started tmux tries to set a default value - from the first suitable of the SHELL environment vari- - able, the shell returned by getpwuid(3), or /bin/sh. - This option should be configured when tmux is used as a - login shell. - - default-terminal terminal - Set the default terminal for new windows created in this - session - the default value of the TERM environment vari- - able. For tmux to work correctly, this must be set to - 'screen' or a derivative of it. - - destroy-unattached [on | off] - If enabled and the session is no longer attached to any - clients, it is destroyed. - - detach-on-destroy [on | off] - If on (the default), the client is detached when the ses- - sion it is attached to is destroyed. If off, the client - is switched to the most recently active of the remaining - sessions. - - display-panes-active-colour colour - Set the colour used by the display-panes command to show - the indicator for the active pane. - - display-panes-colour colour - Set the colour used by the display-panes command to show - the indicators for inactive panes. - - display-panes-time time - Set the time in milliseconds for which the indicators - shown by the display-panes command appear. - - display-time time - Set the amount of time for which status line messages and - other on-screen indicators are displayed. time is in - milliseconds. - - history-limit lines - Set the maximum number of lines held in window history. - This setting applies only to new windows - existing win- - dow histories are not resized and retain the limit at the - point they were created. - - lock-after-time number - Lock the session (like the lock-session command) after - number seconds of inactivity, or the entire server (all - sessions) if the lock-server option is set. The default - is not to lock (set to 0). - - lock-command shell-command - Command to run when locking each client. The default is - to run lock(1) with -np. - - lock-server [on | off] - If this option is on (the default), instead of each ses- - sion locking individually as each has been idle for - lock-after-time, the entire server will lock after all - sessions would have locked. This has no effect as a ses- - sion option; it must be set as a global option. - - message-attr attributes - Set status line message attributes, where attributes is - either none or a comma-delimited list of one or more of: - bright (or bold), dim, underscore, blink, reverse, - hidden, or italics. - - message-bg colour - Set status line message background colour, where colour - is one of: black, red, green, yellow, blue, magenta, - cyan, white, aixterm bright variants (if supported: - brightred, brightgreen, and so on), colour0 to colour255 - from the 256-colour set, default, or a hexadecimal RGB - string such as '#ffffff', which chooses the closest match - from the default 256-colour set. - - message-command-attr attributes - Set status line message attributes when in command mode. - - message-command-bg colour - Set status line message background colour when in command - mode. - - message-command-fg colour - Set status line message foreground colour when in command - mode. - - message-fg colour - Set status line message foreground colour. - - message-limit number - Set the number of error or information messages to save - in the message log for each client. The default is 20. - - mouse-resize-pane [on | off] - If on, tmux captures the mouse and allows panes to be - resized by dragging on their borders. - - mouse-select-pane [on | off] - If on, tmux captures the mouse and when a window is split - into multiple panes the mouse may be used to select the - current pane. The mouse click is also passed through to - the application as normal. - - mouse-select-window [on | off] - If on, clicking the mouse on a window name in the status - line will select that window. - - mouse-utf8 [on | off] - If enabled, request mouse input as UTF-8 on UTF-8 termi- - nals. - - pane-active-border-bg colour - - pane-active-border-fg colour - Set the pane border colour for the currently active pane. - - pane-border-bg colour - - pane-border-fg colour - Set the pane border colour for panes aside from the - active pane. - - prefix key - Set the key accepted as a prefix key. - - prefix2 key - Set a secondary key accepted as a prefix key. - - renumber-windows [on | off] - If on, when a window is closed in a session, automati- - cally renumber the other windows in numerical order. - This respects the base-index option if it has been set. - If off, do not renumber the windows. - - repeat-time time - Allow multiple commands to be entered without pressing - the prefix-key again in the specified time milliseconds - (the default is 500). Whether a key repeats may be set - when it is bound using the -r flag to bind-key. Repeat - is enabled for the default keys bound to the resize-pane - command. - - set-remain-on-exit [on | off] - Set the remain-on-exit window option for any windows - first created in this session. When this option is true, - windows in which the running program has exited do not - close, instead remaining open but inactivate. Use the - respawn-window command to reactivate such a window, or - the kill-window command to destroy it. - - set-titles [on | off] - Attempt to set the client terminal title using the tsl - and fsl terminfo(5) entries if they exist. tmux automat- - ically sets these to the \e]2;...\007 sequence if the - terminal appears to be an xterm. This option is off by - default. Note that elinks will only attempt to set the - window title if the STY environment variable is set. - - set-titles-string string - String used to set the window title if set-titles is on. - Character sequences are replaced as for the status-left - option. - - status [on | off] - Show or hide the status line. - - status-attr attributes - Set status line attributes. - - status-bg colour - Set status line background colour. - - status-fg colour - Set status line foreground colour. - - status-interval interval - Update the status bar every interval seconds. By - default, updates will occur every 15 seconds. A setting - of zero disables redrawing at interval. - - status-justify [left | centre | right] - Set the position of the window list component of the sta- - tus line: left, centre or right justified. - - status-keys [vi | emacs] - Use vi or emacs-style key bindings in the status line, - for example at the command prompt. The default is emacs, - unless the VISUAL or EDITOR environment variables are set - and contain the string 'vi'. - - status-left string - Display string to the left of the status bar. string - will be passed through strftime(3) before being used. By - default, the session name is shown. string may contain - any of the following special character sequences: - - Character pair Replaced with - #(shell-command) First line of the command's - output - #[attributes] Colour or attribute change - #H Hostname of local host - #h Hostname of local host without - the domain name - #F Current window flag - #I Current window index - #D Current pane unique identifier - #P Current pane index - #S Session name - #T Current pane title - #W Current window name - ## A literal '#' - - The #(shell-command) form executes 'shell-command' and - inserts the first line of its output. Note that shell - commands are only executed once at the interval specified - by the status-interval option: if the status line is - redrawn in the meantime, the previous result is used. - Shell commands are executed with the tmux global environ- - ment set (see the ENVIRONMENT section). - - For details on how the names and titles can be set see - the NAMES AND TITLES section. - - #[attributes] allows a comma-separated list of attributes - to be specified, these may be 'fg=colour' to set the - foreground colour, 'bg=colour' to set the background - colour, the name of one of the attributes (listed under - the message-attr option) to turn an attribute on, or an - attribute prefixed with 'no' to turn one off, for example - nobright. Examples are: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - - Where appropriate, special character sequences may be - prefixed with a number to specify the maximum length, for - example '#24T'. - - By default, UTF-8 in string is not interpreted, to enable - UTF-8, use the status-utf8 option. - - status-left-attr attributes - Set the attribute of the left part of the status line. - - status-left-bg colour - Set the background colour of the left part of the status - line. - - status-left-fg colour - Set the foreground colour of the left part of the status - line. - - status-left-length length - Set the maximum length of the left component of the sta- - tus bar. The default is 10. - - status-position [top | bottom] - Set the position of the status line. - - status-right string - Display string to the right of the status bar. By - default, the current window title in double quotes, the - date and the time are shown. As with status-left, string - will be passed to strftime(3), character pairs are - replaced, and UTF-8 is dependent on the status-utf8 - option. - - status-right-attr attributes - Set the attribute of the right part of the status line. - - status-right-bg colour - Set the background colour of the right part of the status - line. - - status-right-fg colour - Set the foreground colour of the right part of the status - line. - - status-right-length length - Set the maximum length of the right component of the sta- - tus bar. The default is 40. - - status-utf8 [on | off] - Instruct tmux to treat top-bit-set characters in the - status-left and status-right strings as UTF-8; notably, - this is important for wide characters. This option - defaults to off. - - terminal-overrides string - Contains a list of entries which override terminal - descriptions read using terminfo(5). string is a comma- - separated list of items each a colon-separated string - made up of a terminal type pattern (matched using - fnmatch(3)) and a set of name=value entries. - - For example, to set the 'clear' terminfo(5) entry to - '\e[H\e[2J' for all terminal types and the 'dch1' entry - to '\e[P' for the 'rxvt' terminal type, the option could - be set to the string: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - - The terminal entry value is passed through strunvis(3) - before interpretation. The default value forcibly cor- - rects the 'colors' entry for terminals which support 88 - or 256 colours: - - "*88col*:colors=88,*256col*:colors=256,xterm*:XT" - - update-environment variables - Set a space-separated string containing a list of envi- - ronment variables to be copied into the session environ- - ment when a new session is created or an existing session - is attached. Any variables that do not exist in the - source environment are set to be removed from the session - environment (as if -r was given to the set-environment - command). The default is "DISPLAY SSH_ASKPASS - SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAU- - THORITY". - - visual-activity [on | off] - If on, display a status line message when activity occurs - in a window for which the monitor-activity window option - is enabled. - - visual-bell [on | off] - If this option is on, a message is shown on a bell - instead of it being passed through to the terminal (which - normally makes a sound). Also see the bell-action - option. - - visual-content [on | off] - Like visual-activity, display a message when content is - present in a window for which the monitor-content window - option is enabled. - - visual-silence [on | off] - If monitor-silence is enabled, prints a message after the - interval has expired on a given window. - - word-separators string - Sets the session's conception of what characters are con- - sidered word separators, for the purposes of the next and - previous word commands in copy mode. The default is - ' -_@'. - - set-window-option [-agqu] [-t target-window] option value - (alias: setw) - Set a window option. The -a, -g, -q and -u flags work similarly - to the set-option command. - - Supported window options are: - - aggressive-resize [on | off] - Aggressively resize the chosen window. This means that - tmux will resize the window to the size of the smallest - session for which it is the current window, rather than - the smallest session to which it is attached. The window - may resize when the current window is changed on another - sessions; this option is good for full-screen programs - which support SIGWINCH and poor for interactive programs - such as shells. - - allow-rename [on | off] - Allow programs to change the window name using a terminal - escape sequence (\033k...\033\\). The default is on. - - alternate-screen [on | off] - This option configures whether programs running inside - tmux may use the terminal alternate screen feature, which - allows the smcup and rmcup terminfo(5) capabilities. The - alternate screen feature preserves the contents of the - window when an interactive application starts and - restores it on exit, so that any output visible before - the application starts reappears unchanged after it - exits. The default is on. - - automatic-rename [on | off] - Control automatic window renaming. When this setting is - enabled, tmux will attempt - on supported platforms - to - rename the window to reflect the command currently run- - ning in it. This flag is automatically disabled for an - individual window when a name is specified at creation - with new-window or new-session, or later with - rename-window, or with a terminal escape sequence. It - may be switched off globally with: - - set-window-option -g automatic-rename off - - c0-change-interval interval - c0-change-trigger trigger - These two options configure a simple form of rate limit- - ing for a pane. If tmux sees more than trigger C0 - sequences that modify the screen (for example, carriage - returns, linefeeds or backspaces) in one millisecond, it - will stop updating the pane immediately and instead - redraw it entirely every interval milliseconds. This - helps to prevent fast output (such as yes(1) overwhelming - the terminal). The default is a trigger of 250 and an - interval of 100. A trigger of zero disables the rate - limiting. - - clock-mode-colour colour - Set clock colour. - - clock-mode-style [12 | 24] - Set clock hour format. - - force-height height - force-width width - Prevent tmux from resizing a window to greater than width - or height. A value of zero restores the default unlim- - ited setting. - - main-pane-height height - main-pane-width width - Set the width or height of the main (left or top) pane in - the main-horizontal or main-vertical layouts. - - mode-attr attributes - Set window modes attributes. - - mode-bg colour - Set window modes background colour. - - mode-fg colour - Set window modes foreground colour. - - mode-keys [vi | emacs] - Use vi or emacs-style key bindings in copy and choice - modes. As with the status-keys option, the default is - emacs, unless VISUAL or EDITOR contains 'vi'. - - mode-mouse [on | off | copy-mode] - Mouse state in modes. If on, the mouse may be used to - enter copy mode and copy a selection by dragging, to - enter copy mode and scroll with the mouse wheel, or to - select an option in choice mode. If set to copy-mode, - the mouse behaves as set to on, but cannot be used to - enter copy mode. - - monitor-activity [on | off] - Monitor for activity in the window. Windows with activ- - ity are highlighted in the status line. - - monitor-content match-string - Monitor content in the window. When fnmatch(3) pattern - match-string appears in the window, it is highlighted in - the status line. - - monitor-silence [interval] - Monitor for silence (no activity) in the window within - interval seconds. Windows that have been silent for the - interval are highlighted in the status line. An interval - of zero disables the monitoring. - - other-pane-height height - Set the height of the other panes (not the main pane) in - the main-horizontal layout. If this option is set to 0 - (the default), it will have no effect. If both the - main-pane-height and other-pane-height options are set, - the main pane will grow taller to make the other panes - the specified height, but will never shrink to do so. - - other-pane-width width - Like other-pane-height, but set the width of other panes - in the main-vertical layout. - - pane-base-index index - Like base-index, but set the starting index for pane num- - bers. - - remain-on-exit [on | off] - A window with this flag set is not destroyed when the - program running in it exits. The window may be reacti- - vated with the respawn-window command. - - synchronize-panes [on | off] - Duplicate input to any pane to all other panes in the - same window (only for panes that are not in any special - mode). - - utf8 [on | off] - Instructs tmux to expect UTF-8 sequences to appear in - this window. - - window-status-bell-attr attributes - Set status line attributes for windows which have a bell - alert. - - window-status-bell-bg colour - Set status line background colour for windows with a bell - alert. - - window-status-bell-fg colour - Set status line foreground colour for windows with a bell - alert. - - window-status-content-attr attributes - Set status line attributes for windows which have a con- - tent alert. - - window-status-content-bg colour - Set status line background colour for windows with a con- - tent alert. - - window-status-content-fg colour - Set status line foreground colour for windows with a con- - tent alert. - - window-status-activity-attr attributes - Set status line attributes for windows which have an - activity (or silence) alert. - - window-status-activity-bg colour - Set status line background colour for windows with an - activity alert. - - window-status-activity-fg colour - Set status line foreground colour for windows with an - activity alert. - - window-status-attr attributes - Set status line attributes for a single window. - - window-status-bg colour - Set status line background colour for a single window. - - window-status-current-attr attributes - Set status line attributes for the currently active win- - dow. - - window-status-current-bg colour - Set status line background colour for the currently - active window. - - window-status-current-fg colour - Set status line foreground colour for the currently - active window. - - window-status-current-format string - Like window-status-format, but is the format used when - the window is the current window. - - window-status-last-attr attributes - Set status line attributes for the last active window. - - window-status-last-bg colour - Set status line background colour for the last active - window. - - window-status-last-fg colour - Set status line foreground colour for the last active - window. - - window-status-fg colour - Set status line foreground colour for a single window. - - window-status-format string - Set the format in which the window is displayed in the - status line window list. See the status-left option for - details of special character sequences available. The - default is '#I:#W#F'. - - window-status-separator string - Sets the separator drawn between windows in the status - line. The default is a single space character. - - xterm-keys [on | off] - If this option is set, tmux will generate xterm(1) -style - function key sequences; these have a number included to - indicate modifiers such as Shift, Alt or Ctrl. The - default is off. - - wrap-search [on | off] - If this option is set, searches will wrap around the end - of the pane contents. The default is on. - - show-options [-gqsvw] [-t target-session | target-window] [option] - (alias: show) - Show the window options (or a single window option if given) with - -w (equivalent to show-window-options), the server options with - -s, otherwise the session options for target session. Global - session or window options are listed if -g is used. -v shows - only the option value, not the name. If -q is set, no error will - be returned if option is unset. - - show-window-options [-gv] [-t target-window] [option] - (alias: showw) - List the window options or a single option for target-window, or - the global window options if -g is used. -v shows only the - option value, not the name. - -FORMATS - Certain commands accept the -F flag with a format argument. This is a - string which controls the output format of the command. Special charac- - ter sequences are replaced as documented under the status-left option and - an additional long form is accepted. Replacement variables are enclosed - in '#{' and '}', for example '#{session_name}' is equivalent to '#S'. - Conditionals are also accepted by prefixing with '?' and separating two - alternatives with a comma; if the specified variable exists and is not - zero, the first alternative is chosen, otherwise the second is used. For - example '#{?session_attached,attached,not attached}' will include the - string 'attached' if the session is attached and the string 'not - attached' if it is unattached. - - The following variables are available, where appropriate: - - Variable name Replaced with - alternate_on If pane is in alternate screen - alternate_saved_x Saved cursor X in alternate screen - alternate_saved_y Saved cursor Y in alternate screen - buffer_sample First 50 characters from the specified - buffer - buffer_size Size of the specified buffer in bytes - client_activity Integer time client last had activity - client_activity_string String time client last had activity - client_created Integer time client created - client_created_string String time client created - client_cwd Working directory of client - client_height Height of client - client_last_session Name of the client's last session - client_prefix 1 if prefix key has been pressed - client_readonly 1 if client is readonly - client_session Name of the client's session - client_termname Terminal name of client - client_tty Pseudo terminal of client - client_utf8 1 if client supports utf8 - client_width Width of client - cursor_flag Pane cursor flag - cursor_x Cursor X position in pane - cursor_y Cursor Y position in pane - history_bytes Number of bytes in window history - history_limit Maximum window history lines - history_size Size of history in bytes - host Hostname of local host - insert_flag Pane insert flag - keypad_cursor_flag Pane keypad cursor flag - keypad_flag Pane keypad flag - line Line number in the list - mouse_any_flag Pane mouse any flag - mouse_button_flag Pane mouse button flag - mouse_standard_flag Pane mouse standard flag - mouse_utf8_flag Pane mouse UTF-8 flag - pane_active 1 if active pane - pane_current_command Current command if available - pane_current_path Current path if available - pane_dead 1 if pane is dead - pane_height Height of pane - pane_id Unique pane ID - pane_in_mode If pane is in a mode - pane_index Index of pane - pane_pid PID of first process in pane - pane_start_command Command pane started with - pane_start_path Path pane started with - pane_tabs Pane tab positions - pane_title Title of pane - pane_tty Pseudo terminal of pane - pane_width Width of pane - saved_cursor_x Saved cursor X in pane - saved_cursor_y Saved cursor Y in pane - scroll_region_lower Bottom of scroll region in pane - scroll_region_upper Top of scroll region in pane - session_attached 1 if session attached - session_created Integer time session created - session_created_string String time session created - session_group Number of session group - session_grouped 1 if session in a group - session_height Height of session - session_id Unique session ID - session_name Name of session - session_width Width of session - session_windows Number of windows in session - window_active 1 if window active - window_find_matches Matched data from the find-window command - if available - window_flags Window flags - window_height Height of window - window_id Unique window ID - window_index Index of window - window_layout Window layout description - window_name Name of window - window_panes Number of panes in window - window_width Width of window - wrap_flag Pane wrap flag - -NAMES AND TITLES - tmux distinguishes between names and titles. Windows and sessions have - names, which may be used to specify them in targets and are displayed in - the status line and various lists: the name is the tmux identifier for a - window or session. Only panes have titles. A pane's title is typically - set by the program running inside the pane and is not modified by tmux. - It is the same mechanism used to set for example the xterm(1) window - title in an X(7) window manager. Windows themselves do not have titles - - a window's title is the title of its active pane. tmux itself may set - the title of the terminal in which the client is running, see the - set-titles option. - - A session's name is set with the new-session and rename-session commands. - A window's name is set with one of: - - 1. A command argument (such as -n for new-window or new-session). - - 2. An escape sequence: - - $ printf '\033kWINDOW_NAME\033\\' - - 3. Automatic renaming, which sets the name to the active command in - the window's active pane. See the automatic-rename option. - - When a pane is first created, its title is the hostname. A pane's title - can be set via the OSC title setting sequence, for example: - - $ printf '\033]2;My Title\033\\' - -ENVIRONMENT - When the server is started, tmux copies the environment into the global - environment; in addition, each session has a session environment. When a - window is created, the session and global environments are merged. If a - variable exists in both, the value from the session environment is used. - The result is the initial environment passed to the new process. - - The update-environment session option may be used to update the session - environment from the client when a new session is created or an old reat- - tached. tmux also initialises the TMUX variable with some internal - information to allow commands to be executed from inside, and the TERM - variable with the correct terminal setting of 'screen'. - - Commands to alter and view the environment are: - - set-environment [-gru] [-t target-session] name [value] - (alias: setenv) - Set or unset an environment variable. If -g is used, the change - is made in the global environment; otherwise, it is applied to - the session environment for target-session. The -u flag unsets a - variable. -r indicates the variable is to be removed from the - environment before starting a new process. - - show-environment [-g] [-t target-session] [variable] - (alias: showenv) - Display the environment for target-session or the global environ- - ment with -g. If variable is omitted, all variables are shown. - Variables removed from the environment are prefixed with '-'. - -STATUS LINE - tmux includes an optional status line which is displayed in the bottom - line of each terminal. By default, the status line is enabled (it may be - disabled with the status session option) and contains, from left-to- - right: the name of the current session in square brackets; the window - list; the title of the active pane in double quotes; and the time and - date. - - The status line is made of three parts: configurable left and right sec- - tions (which may contain dynamic content such as the time or output from - a shell command, see the status-left, status-left-length, status-right, - and status-right-length options below), and a central window list. By - default, the window list shows the index, name and (if any) flag of the - windows present in the current session in ascending numerical order. It - may be customised with the window-status-format and - window-status-current-format options. The flag is one of the following - symbols appended to the window name: - - Symbol Meaning - * Denotes the current window. - - Marks the last window (previously selected). - # Window is monitored and activity has been detected. - ! A bell has occurred in the window. - + Window is monitored for content and it has appeared. - ~ The window has been silent for the monitor-silence - interval. - Z The window's active pane is zoomed. - - The # symbol relates to the monitor-activity and + to the monitor-content - window options. The window name is printed in inverted colours if an - alert (bell, activity or content) is present. - - The colour and attributes of the status line may be configured, the - entire status line using the status-attr, status-fg and status-bg session - options and individual windows using the window-status-attr, - window-status-fg and window-status-bg window options. - - The status line is automatically refreshed at interval if it has changed, - the interval may be controlled with the status-interval session option. - - Commands related to the status line are as follows: - - command-prompt [-I inputs] [-p prompts] [-t target-client] [template] - Open the command prompt in a client. This may be used from - inside tmux to execute commands interactively. - - If template is specified, it is used as the command. If present, - -I is a comma-separated list of the initial text for each prompt. - If -p is given, prompts is a comma-separated list of prompts - which are displayed in order; otherwise a single prompt is dis- - played, constructed from template if it is present, or ':' if - not. - - Both inputs and prompts may contain the special character - sequences supported by the status-left option. - - Before the command is executed, the first occurrence of the - string '%%' and all occurrences of '%1' are replaced by the - response to the first prompt, the second '%%' and all '%2' are - replaced with the response to the second prompt, and so on for - further prompts. Up to nine prompt responses may be replaced - ('%1' to '%9'). - - confirm-before [-p prompt] [-t target-client] command - (alias: confirm) - Ask for confirmation before executing command. If -p is given, - prompt is the prompt to display; otherwise a prompt is con- - structed from command. It may contain the special character - sequences supported by the status-left option. - - This command works only from inside tmux. - - display-message [-p] [-c target-client] [-t target-pane] [message] - (alias: display) - Display a message. If -p is given, the output is printed to std- - out, otherwise it is displayed in the target-client status line. - The format of message is described in the FORMATS section; infor- - mation is taken from target-pane if -t is given, otherwise the - active pane for the session attached to target-client. - -BUFFERS - tmux maintains a stack of paste buffers. Up to the value of the - buffer-limit option are kept; when a new buffer is added, the buffer at - the bottom of the stack is removed. Buffers may be added using copy-mode - or the set-buffer command, and pasted into a window using the - paste-buffer command. - - A configurable history buffer is also maintained for each window. By - default, up to 2000 lines are kept; this can be altered with the - history-limit option (see the set-option command above). - - The buffer commands are as follows: - - choose-buffer [-F format] [-t target-window] [template] - Put a window into buffer choice mode, where a buffer may be cho- - sen interactively from a list. After a buffer is selected, '%%' - is replaced by the buffer index in template and the result exe- - cuted as a command. If template is not given, "paste-buffer -b - '%%'" is used. For the meaning of the -F flag, see the FORMATS - section. This command works only if at least one client is - attached. - - clear-history [-t target-pane] - (alias: clearhist) - Remove and free the history for the specified pane. - - delete-buffer [-b buffer-index] - (alias: deleteb) - Delete the buffer at buffer-index, or the top buffer if not spec- - ified. - - list-buffers [-F format] - (alias: lsb) - List the global buffers. For the meaning of the -F flag, see the - FORMATS section. - - load-buffer [-b buffer-index] path - (alias: loadb) - Load the contents of the specified paste buffer from path. - - paste-buffer [-dpr] [-b buffer-index] [-s separator] [-t target-pane] - (alias: pasteb) - Insert the contents of a paste buffer into the specified pane. - If not specified, paste into the current one. With -d, also - delete the paste buffer from the stack. When output, any line- - feed (LF) characters in the paste buffer are replaced with a sep- - arator, by default carriage return (CR). A custom separator may - be specified using the -s flag. The -r flag means to do no - replacement (equivalent to a separator of LF). If -p is speci- - fied, paste bracket control codes are inserted around the buffer - if the application has requested bracketed paste mode. - - save-buffer [-a] [-b buffer-index] path - (alias: saveb) - Save the contents of the specified paste buffer to path. The -a - option appends to rather than overwriting the file. - - set-buffer [-b buffer-index] data - (alias: setb) - Set the contents of the specified buffer to data. - - show-buffer [-b buffer-index] - (alias: showb) - Display the contents of the specified buffer. - -MISCELLANEOUS - Miscellaneous commands are as follows: - - clock-mode [-t target-pane] - Display a large clock. - - if-shell [-b] [-t target-pane] shell-command command [command] - (alias: if) - Execute the first command if shell-command returns success or the - second command otherwise. Before being executed, shell-command - is expanded using the rules specified in the FORMATS section, - including those relevant to target-pane. With -b, shell-command - is run in the background. - - lock-server - (alias: lock) - Lock each client individually by running the command specified by - the lock-command option. - - run-shell -b [-t target-pane] shell-command - (alias: run) - Execute shell-command in the background without creating a win- - dow. Before being executed, shell-command is expanded using the - rules specified in the FORMATS section. With -b, the command is - run in the background. After it finishes, any output to stdout - is displayed in copy mode (in the pane specified by -t or the - current pane if omitted). If the command doesn't return success, - the exit status is also displayed. - - server-info - (alias: info) - Show server information and terminal details. - - wait-for -LSU channel - (alias: wait) - When used without options, prevents the client from exiting until - woken using wait-for -S with the same channel. When -L is used, - the channel is locked and any clients that try to lock the same - channel are made to wait until the channel is unlocked with - wait-for -U. This command only works from outside tmux. - -TERMINFO EXTENSIONS - tmux understands some extensions to terminfo(5): - - Cc, Cr Set the cursor colour. The first takes a single string argument - and is used to set the colour; the second takes no arguments and - restores the default cursor colour. If set, a sequence such as - this may be used to change the cursor colour from inside tmux: - - $ printf '\033]12;red\033\\' - - Cs, Csr - Change the cursor style. If set, a sequence such as this may be - used to change the cursor to an underline: - - $ printf '\033[4 q' - - If Csr is set, it will be used to reset the cursor style instead - of Cs. - - Ms This sequence can be used by tmux to store the current buffer in - the host terminal's selection (clipboard). See the set-clipboard - option above and the xterm(1) man page. - -CONTROL MODE - tmux offers a textual interface called control mode. This allows appli- - cations to communicate with tmux using a simple text-only protocol. - - In control mode, a client sends tmux commands or command sequences termi- - nated by newlines on standard input. Each command will produce one block - of output on standard output. An output block consists of a %begin line - followed by the output (which may be empty). The output block ends with - a %end or %error. %begin and matching %end or %error have two arguments: - an integer time (as seconds from epoch) and command number. For example: - - %begin 1363006971 2 - 0: ksh* (1 panes) [80x24] [layout b25f,80x24,0,0,2] @2 (active) - %end 1363006971 2 - - In control mode, tmux outputs notifications. A notification will never - occur inside an output block. - - The following notifications are defined: - - %exit [reason] - The tmux client is exiting immediately, either because it is not - attached to any session or an error occurred. If present, reason - describes why the client exited. - - %layout-change window-id window-layout - The layout of a window with ID window-id changed. The new layout - is window-layout. - - %output pane-id value - A window pane produced output. value escapes non-printable char- - acters and backslash as octal \xxx. - - %session-changed session-id name - The client is now attached to the session with ID session-id, - which is named name. - - %session-renamed name - The current session was renamed to name. - - %sessions-changed - A session was created or destroyed. - - %unlinked-window-add window-id - The window with ID window-id was created but is not linked to the - current session. - - %window-add window-id - The window with ID window-id was linked to the current session. - - %window-close window-id - The window with ID window-id closed. - - %window-renamed window-id name - The window with ID window-id was renamed to name. - -FILES - ~/.tmux.conf Default tmux configuration file. - /etc/tmux.conf System-wide configuration file. - -EXAMPLES - To create a new tmux session running vi(1): - - $ tmux new-session vi - - Most commands have a shorter form, known as an alias. For new-session, - this is new: - - $ tmux new vi - - Alternatively, the shortest unambiguous form of a command is accepted. - If there are several options, they are listed: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - - Within an active session, a new window may be created by typing 'C-b c' - (Ctrl followed by the 'b' key followed by the 'c' key). - - Windows may be navigated with: 'C-b 0' (to select window 0), 'C-b 1' (to - select window 1), and so on; 'C-b n' to select the next window; and 'C-b - p' to select the previous window. - - A session may be detached using 'C-b d' (or by an external event such as - ssh(1) disconnection) and reattached with: - - $ tmux attach-session - - Typing 'C-b ?' lists the current key bindings in the current window; up - and down may be used to navigate the list or 'q' to exit from it. - - Commands to be run when the tmux server is started may be placed in the - ~/.tmux.conf configuration file. Common examples include: - - Changing the default prefix key: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - - Turning the status line off, or changing its colour: - - set-option -g status off - set-option -g status-bg blue - - Setting other options, such as the default command, or locking after 30 - minutes of inactivity: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - - Creating new key bindings: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -SEE ALSO - pty(4) - -AUTHORS - Nicholas Marriott - -BSD October 19, 2013 BSD diff --git a/manual/NOTES.md b/manual/NOTES.md deleted file mode 100644 index d28a673f8d..0000000000 --- a/manual/NOTES.md +++ /dev/null @@ -1,81 +0,0 @@ -# Compatibility notes - -## master - -src: - -## 1.8 - -src: - -## 1.7 - -src: - -## 1.6 - -src: - -### new-window - -src: - - -```c -if (args_has(args, 'P')) - ctx->print(ctx, "%s:%u", s->name, wl->idx); -return (0); -``` - -### split-window - -src: - - -```c -if (args_has(args, 'P')) { - if (window_pane_index(new_wp, &paneidx) != 0) - fatalx("index not found"); - ctx->print(ctx, "%s:%u.%u", s->name, wl->idx, paneidx); -} -return (0); -``` - -### list-sessions - -src: - - -```c -template = "#{session_name}: #{session_windows} windows " - "(created #{session_created_string}) [#{session_width}x" - "#{session_height}]#{?session_grouped, (group ,}" - "#{session_group}#{?session_grouped,),}" - "#{?session_attached, (attached),}"; -``` - -### list-windows - -src: - - -```c -template = "#{session_name}:#{window_index}: " - "#{window_name} " - "[#{window_width}x#{window_height}] " - "[layout #{window_layout}]" - "#{?window_active, (active),}"; -``` - -### list-panes - -src: - - -```c -template = "#{session_name}:#{window_index}.#{pane_index}: " - "[#{pane_width}x#{pane_height}] [history " - "#{history_size}/#{history_limit}, " - "#{history_bytes} bytes] #{pane_id}" - "#{?pane_active, (active),}#{?pane_dead, (dead),}"; -``` diff --git a/manual/README.md b/manual/README.md deleted file mode 100644 index c7788c0f8b..0000000000 --- a/manual/README.md +++ /dev/null @@ -1,26 +0,0 @@ -For studying the differences between prior tmux versions to check -compatibility with legacy versions. - -Get source: - -```bash -$ git clone https://github.com/tmux/tmux -$ cd tmux -``` - -Converted with: - -```bash -$ git checkout -$ ./configure -$ make -$ groff -t -e -mandoc -Tascii tmux.1 | col -bx > manpage.txt -``` - -repeat for versions. - -Create a git-diff style diff of version manuals: - -```bash -$ diff -u 1.6 1.8 > 1_6__1_8.diff -``` From 4711a9a9d9f76d4b95ab64f4893734890bf34953 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 16 Jun 2021 14:56:56 -0500 Subject: [PATCH 0801/2998] docs(CHANGES): Make notice of new manual/ location --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 838671bf4b..6ea47889f4 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ ## current - _Insert changes/features/fixes for next release here_ +- Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals ## tmuxp 1.9.1 (2021-06-16) - libtmux: Update to 0.10.1+ to include `Window.select_window()` fix From 65551632a9fb35b53e1a03327ebe047b30e9ca74 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Jun 2021 08:35:19 -0500 Subject: [PATCH 0802/2998] click: Relax requirement to allow 8.0 See also: #649 --- poetry.lock | 23 +++++++++++++++-------- pyproject.toml | 2 +- requirements/base.txt | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4d8d91521c..43cc549495 100644 --- a/poetry.lock +++ b/poetry.lock @@ -149,8 +149,15 @@ category = "main" description = "Composable command line interface toolkit" name = "click" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "7.1.2" +python-versions = ">=3.6" +version = "8.0.1" + +[package.dependencies] +colorama = "*" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" [[package]] category = "dev" @@ -254,7 +261,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.2.0" [[package]] -category = "dev" +category = "main" description = "Read metadata from Python packages" name = "importlib-metadata" optional = false @@ -917,7 +924,7 @@ python-versions = "*" version = "1.4.3" [[package]] -category = "dev" +category = "main" description = "Backported and Experimental Type Hints for Python 3.5+" marker = "python_version >= \"3.6.2\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "typing-extensions" @@ -947,7 +954,7 @@ python-versions = "*" version = "0.5.1" [[package]] -category = "dev" +category = "main" description = "Backport of pathlib-compatible object wrapper for zip files" name = "zipp" optional = false @@ -967,7 +974,7 @@ lint = [] test = [] [metadata] -content-hash = "e4211e626fa323273adddab361fc864b657689b3897154f1d2545a59764dd11a" +content-hash = "7ce90c3eac440ea5342287a0bc2e3df4e38dd9563b4233a7a48df76649cf19a4" lock-version = "1.0" python-versions = "^3.6" @@ -1068,8 +1075,8 @@ chardet = [ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, ] codecov = [ {file = "codecov-2.1.11-py2.py3-none-any.whl", hash = "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8"}, diff --git a/pyproject.toml b/pyproject.toml index 53a4049247..df919604bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] python = "^3.6" -click = "^7" +click = ">7,<8.1" kaptan = ">=0.5.10" libtmux = "~0.10.1" colorama = ">=0.3.9" diff --git a/requirements/base.txt b/requirements/base.txt index f7216b774d..4b713f19b0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 libtmux>=0.10.1,<0.11 -click>=7,<8 +click>=7,<8.1 colorama>=0.3.9 From 5364a2aad34c1c89e5ed4ea3d7471257bbcc6fe4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Jun 2021 09:42:10 -0500 Subject: [PATCH 0803/2998] tag v1.9.2: Allow click 8.0.x --- CHANGES | 3 +++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 6ea47889f4..acae4fe3b0 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,9 @@ ## current - _Insert changes/features/fixes for next release here_ + +## tmuxp 1.9.2 (2021-06-17) +- #686: Allow click 8.0.x - Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals ## tmuxp 1.9.1 (2021-06-16) diff --git a/pyproject.toml b/pyproject.toml index df919604bf..30f49e8c43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.9.1" +version = "1.9.2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 45cba6a39b..5cce9f4ae9 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.9.1' +__version__ = '1.9.2' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 65e6bee85b94b23c0a429242cbf168eb24b9fc57 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Jun 2021 10:24:51 -0500 Subject: [PATCH 0804/2998] docs: Move WATCH_FILES down --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 92bc4524fd..b5de078873 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,8 +1,8 @@ # Makefile for Sphinx documentation # -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]\(rst\|md\)\$\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null SHELL := /bin/bash HTTP_PORT = 8031 +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]\(rst\|md\)\$\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null # You can set these variables from the command line. SPHINXOPTS = From 6b52a2c76e6eda147a06d5bf41ffeeb8279dfc33 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Jun 2021 07:33:58 -0500 Subject: [PATCH 0805/2998] docs: Fix about tmux pages --- docs/about_tmux.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index be25479667..c2fc4ec98a 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -33,7 +33,7 @@ the text dimension. Inside tmux you can: ### Text-based window manager -```{eval_rst} +```{eval-rst} =================== ====================== =============================== **tmux** **"Desktop"-Speak** **Plain English** ------------------- ---------------------- ------------------------------- @@ -303,7 +303,7 @@ $ tmux new-session [-s session-name] Sessions can be _renamed after creation_. -```{eval_rst} +```{eval-rst} =============== ========================================================= Command .. code-block:: bash @@ -325,7 +325,7 @@ $ tmux new-window [-n window-name] Windows can be _renamed after creation_. -```{eval_rst} +```{eval-rst} =============== ========================================================== Command .. code-block:: bash @@ -337,7 +337,7 @@ Short cut ``Prefix`` + ``,`` ### Creating new windows -```{eval_rst} +```{eval-rst} =============== ========================================================= Command .. code-block:: bash @@ -383,7 +383,7 @@ $ tmux last-window ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -418,7 +418,7 @@ $ tmux swap-window [-t dst-window] ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -434,7 +434,7 @@ $ tmux move-pane [-t dst-pane] ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -460,7 +460,7 @@ $ tmux next-window ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -488,7 +488,7 @@ $ tmux kill-window [-t target-window] ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -504,7 +504,7 @@ $ tmux kill-pane [-t target-pane] ``` -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -522,7 +522,7 @@ $ tmux split-window [-c start-directory] Tmux windows can be split into multiple panes. -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- @@ -610,7 +610,7 @@ set -g status-interval 1 ::: -```{eval_rst} +```{eval-rst} =================== ==================================================== Short cut Action ------------------- ---------------------------------------------------- From b9f35df7b31dade40f64fdf34ef674b0e72c69ab Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Jun 2021 07:52:30 -0500 Subject: [PATCH 0806/2998] docs(about_tmux): Reconvert to mix of pandoc + rst2myst --- docs/about_tmux.md | 640 +++++++++++++++++++-------------------------- 1 file changed, 263 insertions(+), 377 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index c2fc4ec98a..0dbaa63d30 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -10,19 +10,19 @@ ISC-licensed terminal multiplexer. ::: -tmux is geared for developers and admins who interact regularly with -CLI (text-only interfaces) +tmux is geared for developers and admins who interact regularly with CLI +(text-only interfaces) In the world of computers, there are 2 realms: -1. The text realm -2. The graphical realm +1. The text realm +2. The graphical realm tmux resides in the text realm. This is about fixed-width fonts and that old fashioned black terminal. -tmux is to the console what a desktop is to gui apps. It's a world inside -the text dimension. Inside tmux you can: +tmux is to the console what a desktop is to gui apps. It's a world +inside the text dimension. Inside tmux you can: - multitask inside the terminal, run multiple applications. - have multiple command lines (pane) in the same window @@ -33,39 +33,30 @@ the text dimension. Inside tmux you can: ### Text-based window manager -```{eval-rst} -=================== ====================== =============================== -**tmux** **"Desktop"-Speak** **Plain English** -------------------- ---------------------- ------------------------------- -Multiplexer Multi-tasking Multiple applications - simultaneously. -Session Desktop Applications are visible here -Window Virtual Desktop or A desktop that stores it own - applications screen -Pane Application Performs operations -=================== ====================== =============================== -``` - -```{eval-rst} -.. aafig:: - :textual: - - +----------------------------------------------------------------+ - | +--------+--------+ +-----------------+ +-----------------+ | - | | pane | pane | | pane | | pane | | - | | | | | | | | | - | | | | | | | | | - | +--------+--------+ | | +-----------------+ | - | | pane | pane | | | | pane | | - | | | | | | | | | - | | | | | | | | | - | +--------+--------+ +-----------------+ +-----------------+ | - | | window | | window | | window | | - | \--------+--------/ \-----------------/ \-----------------/ | - +----------------------------------------------------------------+ - | session | - \----------------------------------------------------------------/ -``` +| **tmux** | **"Desktop"-Speak** | **Plain English** | +| ----------- | ------------------------------- | ------------------------------------- | +| Multiplexer | Multi-tasking | Multiple applications simultaneously. | +| Session | Desktop | Applications are visible here | +| Window | Virtual Desktop or applications | A desktop that stores it own screen | +| Pane | Application | Performs operations | + +:::{aafig} ++----------------------------------------------------------------+ +| +--------+--------+ +-----------------+ +-----------------+ | +| | pane | pane | | pane | | pane | | +| | | | | | | | | +| | | | | | | | | +| +--------+--------+ | | +-----------------+ | +| | pane | pane | | | | pane | | +| | | | | | | | | +| | | | | | | | | +| +--------+--------+ +-----------------+ +-----------------+ | +| | window | | window | | window | | +| \--------+--------/ \-----------------/ \-----------------/ | ++----------------------------------------------------------------+ +| session | +\----------------------------------------------------------------/ +::: - 1 {term}`Server`. @@ -83,131 +74,121 @@ Pane Application Performs operations ### CLI Power Tool -Multiple applications or terminals to run on the same screen by splitting -up 1 terminal into multiple. +Multiple applications or terminals to run on the same screen by +splitting up 1 terminal into multiple. One screen can be used to edit a file, and another may be used to `$ tail -F` a logfile. -```{eval-rst} -.. aafig:: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - | | | - | | | - | | | - | | | - +--------+--------+ -``` +:::{aafig} ++--------+--------+ +| $ bash | $ bash | +| | | +| | | +| | | +| | | +| | | +| | | ++--------+--------+ +::: -```{eval-rst} -.. aafig:: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - +--------+--------+ - | $ vim | $ bash | - | | | - | | | - +--------+--------+ -``` +:::{aafig} ++--------+--------+ +| $ bash | $ bash | +| | | +| | | ++--------+--------+ +| $ vim | $ bash | +| | | +| | | ++--------+--------+ +::: tmux supports as manys terminals as you want. -```{eval-rst} -.. aafig:: - :textual: - - +---------+---------+ - | $ bash | $ bash | - | | | - | | | /-----------------\ - +---------+---------+ --> |'switch-window 2'| - | $ bash | $ bash | \-----------------/ - | | | | - | | | | - +---------+---------+ | - | '1:sys* 2:vim' | | - +-------------------+ | - /------------------------/ - | - v - +---------+---------+ - | $ vim | - | | - | | - +-------------------+ - | $ bash | $ bash | - | | | - | | | - +-------------------+ - | '1:sys 2:vim*' | - +-------------------+ -``` +:::{aafig} ++---------+---------+ +| $ bash | $ bash | +| | | +| | | /-----------------\ ++---------+---------+ --> |'switch-window 2'| +| $ bash | $ bash | \-----------------/ +| | | | +| | | | ++---------+---------+ | +| '1:sys* 2:vim' | | ++-------------------+ | +/------------------------/ +| +v ++---------+---------+ +| $ vim | +| | +| | ++-------------------+ +| $ bash | $ bash | +| | | +| | | ++-------------------+ +| '1:sys 2:vim*' | ++-------------------+ +::: You can switch between the windows you create. ### Resume everything later -You can leave tmux and all applications running (detach), log out, make a -sandwich, and re-(attach), all applications are still running! - -```{eval-rst} -.. aafig:: - :textual: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | /------------\ - +--------+--------+ --> | detach | - | $ vim | $ bash | | 'Ctrl-b b' | - | | | \------------/ - | | | | - +--------+--------+ | - /------------------/ - | - v - +-----------------------+ - | $ [screen detached] | - | | - | | - | | - | | - | | - | | - +-----------------------+ - v - | - v - +-----------------------+ - | $ [screen detached] | - | $ tmux attach | - | | /------------\ - | | --> | attaching | - | | \------------/ - | | | - | | | - +-----------------------+ | - | - /---------------------------/ - | - v - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - +--------+--------+ - | $ vim | $ bash | - | | | - | | | - +--------+--------+ -``` +You can leave tmux and all applications running (detach), log out, make +a sandwich, and re-(attach), all applications are still running! + +:::{aafig} ++--------+--------+ +| $ bash | $ bash | +| | | +| | | /------------\ ++--------+--------+ --> | detach | +| $ vim | $ bash | | 'Ctrl-b b' | +| | | \------------/ +| | | | ++--------+--------+ | +/------------------/ +| +v ++-----------------------+ +| $ [screen detached] | +| | +| | +| | +| | +| | +| | ++-----------------------+ +v +| +v ++-----------------------+ +| $ [screen detached] | +| $ tmux attach | +| | /------------\ +| | --> | attaching | +| | \------------/ +| | | +| | | ++-----------------------+ | +| +/---------------------------/ +| +v ++--------+--------+ +| $ bash | $ bash | +| | | +| | | ++--------+--------+ +| $ vim | $ bash | +| | | +| | | ++--------+--------+ +::: ### Manage workflow @@ -215,46 +196,38 @@ sandwich, and re-(attach), all applications are still running! - Programmers like to have an editor open with a CLI nearby. Applications running on a remote server can be launched inside of a tmux -session, detached, and reattached next timeyour ["train of thought"]["train of thought"] and -work. +session, detached, and reattached next timeyour ["train of +thought"](http://en.wikipedia.org/wiki/Train_of_thought) and work. Multitasking. Preserving the thinking you have. -["train of thought"]: http://en.wikipedia.org/wiki/Train_of_thought - ## Installing tmux tmux is packaged on most Linux and BSD systems. For the freshest results on how to get tmux installed on your system, -"How to install tmux on " will do, as directions change and are -slightly different between distributions. +"How to install tmux on \" will do, as directions change and +are slightly different between distributions. This documentation is written for version **1.8**. It's important that you have the latest stable release of tmux. The latest stable version is -viewable on the [tmux homepage][tmux homepage]. - -**Mac OS X** users may install that latest stable version of tmux through -[MacPorts][macports], [fink][fink] or [Homebrew][homebrew] (aka brew). +viewable on the [tmux homepage](http://tmux.sourceforge.net/). -If **compiling from source**, the dependencies are [libevent][libevent] and -[ncurses][ncurses]. +**Mac OS X** users may install that latest stable version of tmux +through [MacPorts](http://www.macports.org/), +[fink](http://fink.thetis.ig42.org/) or [Homebrew](http://www.brew.sh) +(aka brew). -[tmux homepage]: http://tmux.sourceforge.net/ -[libevent]: http://www.monkey.org/~provos/libevent/ -[ncurses]: http://invisible-island.net/ncurses/ -[macports]: http://www.macports.org/ -[fink]: http://fink.thetis.ig42.org/ -[homebrew]: http://www.brew.sh +If **compiling from source**, the dependencies are +[libevent](http://www.monkey.org/~provos/libevent/) and +[ncurses](http://invisible-island.net/ncurses/). ## Using tmux ### Start a new session -```{code-block} bash - +```bash $ tmux - ``` That's all it takes to launch yourself into a tmux session. @@ -286,8 +259,8 @@ First, you press the _prefix_ key. This is `C-b` by default. Release. Then pause. For less than second. Then type what's next. -`C-b o` means: Press `Ctrl` and `b` at the same time. Release, -Then press `o`. +`C-b o` means: Press `Ctrl` and `b` at the same time. Release, Then +press `o`. **Remember, prefix + short cut!** `C` is `Ctrl` key. @@ -295,10 +268,8 @@ Then press `o`. Sessions can be _named upon creation_. -```{code-block} bash - +```bash $ tmux new-session [-s session-name] - ``` Sessions can be _renamed after creation_. @@ -317,10 +288,8 @@ Short cut ``Prefix`` + ``$`` Windows can be _named upon creation_. -```{code-block} bash - +```bash $ tmux new-window [-n window-name] - ``` Windows can be _renamed after creation_. @@ -353,183 +322,124 @@ Short cut ``Prefix`` + ``c`` By number -```{code-block} bash - +```bash $ tmux select-window - ``` Next -```{code-block} bash - +```bash $ tmux next-window - ``` Previous -```{code-block} bash - +```bash $ tmux previous-window - ``` Last-window -```{code-block} bash - +```bash $ tmux last-window - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``n`` Change to the next window. -``p`` Change to the previous window. -``w`` Choose the current window interactively. -``0 to 9`` Select windows 0 to 9. - -``M-n`` Move to the next window with a bell or activity - marker. -``M-p`` Move to the previous window with a bell or activity - marker. - -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ----------------------------------------------------------- | +| `n` | Change to the next window. | +| `p` | Change to the previous window. | +| `w` | Choose the current window interactively. | +| `0 to 9` | Select windows 0 to 9. | +| `M-n` | Move to the next window with a bell or activity marker. | +| `M-p` | Move to the previous window with a bell or activity marker. | ### Move windows Move window -```{code-block} bash - +```bash $ tmux move-window [-t dst-window] - ``` Swap the window -```{code-block} bash - +```bash $ tmux swap-window [-t dst-window] - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``.`` Prompt for an index to move the current window. -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ----------------------------------------------- | +| `.` | Prompt for an index to move the current window. | ### Move panes -```{code-block} bash - +```bash $ tmux move-pane [-t dst-pane] - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``C-o`` Rotate the panes in the current window forwards. -``{`` Swap the current pane with the previous pane. -``}`` Swap the current pane with the next pane. -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ------------------------------------------------ | +| `C-o` | Rotate the panes in the current window forwards. | +| `{` | Swap the current pane with the previous pane. | +| `}` | Swap the current pane with the next pane. | ### Traverse panes Shortcut to move between panes. -```{code-block} bash - +```bash $ tmux last-window - ``` -```{code-block} bash - +```bash $ tmux next-window - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``Up, Down`` Change to the pane above, below, to the left, or to -``Left, Right`` the right of the current pane. -=================== ==================================================== -``` +| Short cut | Action | +| ------------- | --------------------------------------------------- | +| `Up, Down` | Change to the pane above, below, to the left, or to | +| `Left, Right` | the right of the current pane. | -Recipe: tmux conf to `hjkl` commands, add this to your -`~/.tmux.conf`: +Recipe: tmux conf to `hjkl` commands, add this to your `~/.tmux.conf`: -``` -# hjkl pane traversal -bind h select-pane -L -bind j select-pane -D -bind k select-pane -U -bind l select-pane -R -``` + # hjkl pane traversal + bind h select-pane -L + bind j select-pane -D + bind k select-pane -U + bind l select-pane -R ### Kill window -```{code-block} bash - +```bash $ tmux kill-window [-t target-window] - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``&`` Kill the current window. -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ------------------------ | +| `&` | Kill the current window. | ### Kill pane -```{code-block} bash - +```bash $ tmux kill-pane [-t target-pane] - ``` -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``x`` Kill the current pane. -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ---------------------- | +| `x` | Kill the current pane. | ### Splitting windows into panes -```{code-block} bash - +```bash $ tmux split-window [-c start-directory] - ``` Tmux windows can be split into multiple panes. -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``%`` Split the current pane into two, left and right. -``"`` Split the current pane into two, top and bottom. -=================== ==================================================== -``` +| Short cut | Action | +| --------- | ------------------------------------------------ | +| `%` | Split the current pane into two, left and right. | +| `"` | Split the current pane into two, top and bottom. | ## Configuring tmux @@ -539,31 +449,25 @@ Depending on your tmux version, there is different options available. ### Vi-style copy and paste -```{code-block} sh - +```sh # Vi copypaste mode set-window-option -g mode-keys vi bind-key -t vi-copy 'v' begin-selection bind-key -t vi-copy 'y' copy-selection - ``` ### Aggressive resizing for clients -```{code-block} sh - +```sh setw -g aggressive-resize on - ``` ### Reload config `` + `r`. -```{code-block} sh - +```sh bind r source-file ~/.tmux.conf \; display-message "Config reloaded." - ``` ### Status lines @@ -575,29 +479,24 @@ You can use [tmux-mem-cpu-load][tmux-mem-cpu-load] to get stats (requires compil [basic-cpu-and-memory.tmux][basic-cpu-and-memory.tmux]. You can pipe in a bash command to a tmux status line like: -```{code-block} sh - +```sh $(shell-command) - ``` -So if `/usr/local/bin/tmux-mem-cpu-load` outputs stats to -`stdout`, then `$(tmux-mem-cpu-load)` is going to output the first -line to the status line. The interval is determined by the -`status-interval`: +So if `/usr/local/bin/tmux-mem-cpu-load` outputs stats to `stdout`, then +`$(tmux-mem-cpu-load)` is going to output the first line to the status +line. The interval is determined by the `status-interval`: -``` -set -g status-interval 1 -``` + set -g status-interval 1 [tmux-mem-cpu-load]: https://github.com/thewtex/tmux-mem-cpu-load [basic-cpu-and-memory.tmux]: https://github.com/zaiste/tmuxified/blob/master/scripts/basic-cpu-and-memory.tmux ### Examples -- - works with tmux 1.5+. Supports - screen's `ctrl-a` {ref}`Prefix key`. Support for system cpu, memory, - uptime stats. +- - works with tmux 1.5+. + Supports screen's `ctrl-a` `Prefix key`. Support for system cpu, + memory, uptime stats. - Add yours, edit this page on github. ## Reference @@ -610,80 +509,67 @@ set -g status-interval 1 ::: -```{eval-rst} -=================== ==================================================== -Short cut Action -------------------- ---------------------------------------------------- -``C-b`` Send the prefix key (C-b) through to the - application. -``C-o`` Rotate the panes in the current window forwards. -``C-z`` Suspend the tmux client. -``!`` Break the current pane out of the window. -``"`` Split the current pane into two, top and bottom. -``#`` List all paste buffers. -``$`` Rename the current session. -``%`` Split the current pane into two, left and right. -``&`` Kill the current window. -``'`` Prompt for a window index to select. -``,`` Rename the current window. -``-`` Delete the most recently copied buffer of text. -``.`` Prompt for an index to move the current window. -``0 to 9`` Select windows 0 to 9. -``:`` Enter the tmux command prompt. -``;`` Move to the previously active pane. -``=`` Choose which buffer to paste interactively from a - list. -``?`` List all key bindings. -``D`` Choose a client to detach. -``[`` Enter copy mode to copy text or view the history. -``]`` Paste the most recently copied buffer of text. -``c`` Create a new window. -``d`` Detach the current client. -``f`` Prompt to search for text in open windows. -``i`` Display some information about the current window. -``l`` Move to the previously selected window. -``n`` Change to the next window. -``o`` Select the next pane in the current window. -``p`` Change to the previous window. -``q`` Briefly display pane indexes. -``r`` Force redraw of the attached client. -``s`` Select a new session for the attached client - interactively. -``L`` Switch the attached client back to the last session. -``t`` Show the time. -``w`` Choose the current window interactively. -``x`` Kill the current pane. -``{`` Swap the current pane with the previous pane. -``}`` Swap the current pane with the next pane. -``~`` Show previous messages from tmux, if any. -``Page Up`` Enter copy mode and scroll one page up. -``Up, Down`` Change to the pane above, below, to the left, or to -``Left, Right`` the right of the current pane. -``M-1 to M-5`` Arrange panes in one of the five preset layouts: - even-horizontal, even-vertical, main-horizontal, - main-vertical, or tiled. -``M-n`` Move to the next window with a bell or activity - marker. -``M-o`` Rotate the panes in the current window backwards. -``M-p`` Move to the previous window with a bell or activity - marker. -``C-Up, C-Down`` Resize the current pane in steps of one cell. -``C-Left, C-Right`` -``M-Up, M-Down`` Resize the current pane in steps of five cells. -``M-Left, M-Right`` -=================== ==================================================== -``` - -Source: tmux manpage [^id2]. +| Short cut | Action | +| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `C-b` | Send the prefix key (C-b) through to the application. | +| `C-o` | Rotate the panes in the current window forwards. | +| `C-z` | Suspend the tmux client. | +| `!` | Break the current pane out of the window. | +| `"` | Split the current pane into two, top and bottom. | +| `#` | List all paste buffers. | +| `$` | Rename the current session. | +| `%` | Split the current pane into two, left and right. | +| `&` | Kill the current window. | +| `'` | Prompt for a window index to select. | +| `,` | Rename the current window. | +| `-` | Delete the most recently copied buffer of text. | +| `.` | Prompt for an index to move the current window. | +| `0 to 9` | Select windows 0 to 9. | +| `:` | Enter the tmux command prompt. | +| `;` | Move to the previously active pane. | +| `=` | Choose which buffer to paste interactively from a list. | +| `?` | List all key bindings. | +| `D` | Choose a client to detach. | +| `[` | Enter copy mode to copy text or view the history. | +| `]` | Paste the most recently copied buffer of text. | +| `c` | Create a new window. | +| `d` | Detach the current client. | +| `f` | Prompt to search for text in open windows. | +| `i` | Display some information about the current window. | +| `l` | Move to the previously selected window. | +| `n` | Change to the next window. | +| `o` | Select the next pane in the current window. | +| `p` | Change to the previous window. | +| `q` | Briefly display pane indexes. | +| `r` | Force redraw of the attached client. | +| `s` | Select a new session for the attached client interactively. | +| `L` | Switch the attached client back to the last session. | +| `t` | Show the time. | +| `w` | Choose the current window interactively. | +| `x` | Kill the current pane. | +| `{` | Swap the current pane with the previous pane. | +| `}` | Swap the current pane with the next pane. | +| `~` | Show previous messages from tmux, if any. | +| `Page Up` | Enter copy mode and scroll one page up. | +| `Up, Down` | Change to the pane above, below, to the left, or to | +| `Left, Right` | the right of the current pane. | +| `M-1 to M-5` | Arrange panes in one of the five preset layouts: even-horizontal, even-vertical, main-horizontal, main-vertical, or tiled. | +| `M-n` | Move to the next window with a bell or activity marker. | +| `M-o` | Rotate the panes in the current window backwards. | +| `M-p` | Move to the previous window with a bell or activity marker. | +| `C-Up, C-Down` `C-Left, C-Right` | Resize the current pane in steps of one cell. | +| `M-Up, M-Down` `M-Left, M-Right` | Resize the current pane in steps of five cells. | + +Source: tmux manpage[1]. To get the text documentation of a `.1` manual file: -```{code-block} bash - +```bash $ nroff -mdoc tmux.1|less - ``` +For more information on how to export and differentiate tmux between versions, see https://github.com/tmux-python/tmux-manuals. + [^id2]: [creative commons by-nc-nd 3.0 us]: http://creativecommons.org/licenses/by-nc-nd/3.0/us/ From 519bf45d5df44ec101e4605e15292380f7c0e829 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Jun 2021 07:57:40 -0500 Subject: [PATCH 0807/2998] Index tweaks --- docs/index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index cc6be27282..439004a44b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ ## tmux session manager ```{include} ../README.md - +:end-before: Date: Sat, 3 Jul 2021 13:13:59 -0500 Subject: [PATCH 0808/2998] Update poetry to 1.1 (#689) Update poetry 1.1 including 1.1.7's lockfile fix and install-poetry.py. See also: - https://python-poetry.org/blog/announcing-poetry-1.1.0/ - https://github.com/python-poetry/poetry/releases/tag/1.1.7 - https://github.com/tmux-python/libtmux/pull/324 --- .github/workflows/publish-docs.yml | 11 +- .github/workflows/tests.yml | 9 +- .tool-versions | 1 + CHANGES | 3 + poetry.lock | 766 ++++++++++++++--------------- 5 files changed, 377 insertions(+), 413 deletions(-) create mode 100644 .tool-versions diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 8590b19354..a2f1ed85bc 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -52,10 +52,13 @@ jobs: - name: Install poetry if: env.PUBLISH == 'true' run: | - curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py - python get-poetry.py -y --version 1.0.10 - echo "PATH=$HOME/.poetry/bin:$PATH" >> $GITHUB_ENV - rm get-poetry.py + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/install-poetry.py + python install-poetry.py -y --version 1.1.7 + echo "PATH=${HOME}/.poetry/bin:${PATH}" >> $GITHUB_ENV + rm install-poetry.py + + - name: Add ~/.local/bin to PATH + run: echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Get poetry cache paths from config if: env.PUBLISH == 'true' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 534b8c67ef..c4bacd682e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,10 +27,13 @@ jobs: - name: Install poetry run: | - curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py - python get-poetry.py -y --version 1.0.10 + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/install-poetry.py + python install-poetry.py -y --version 1.1.7 echo "PATH=${HOME}/.poetry/bin:${PATH}" >> $GITHUB_ENV - rm get-poetry.py + rm install-poetry.py + + - name: Add ~/.local/bin to PATH + run: echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Get poetry cache paths from config run: | diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000000..aea9ad298f --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +poetry 1.1.7 diff --git a/CHANGES b/CHANGES index acae4fe3b0..d5cbf09a0b 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,9 @@ ## current - _Insert changes/features/fixes for next release here_ +- #689: Update poetry to 1.1 + - CI: Use poetry 1.1.7 and `install-poetry.py` installer + - Relock poetry.lock at 1.1 (w/ 1.1.7's fix) ## tmuxp 1.9.2 (2021-06-17) - #686: Allow click 8.0.x diff --git a/poetry.lock b/poetry.lock index 43cc549495..dd26b45f62 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,101 +1,89 @@ [[package]] -category = "dev" -description = "ASCII art to image converter" name = "aafigure" +version = "0.6" +description = "ASCII art to image converter" +category = "dev" optional = false python-versions = "*" -version = "0.6" [[package]] -category = "dev" -description = "A configurable sidebar-enabled Sphinx theme" name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" optional = false python-versions = "*" -version = "0.7.12" [[package]] -category = "dev" -description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" +version = "0.1.0" +description = "Cleverly-named alabaster sub-theme for git-pull projects" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.1.0" [package.dependencies] alabaster = "<0.8" [[package]] -category = "dev" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = "*" -version = "1.4.4" [[package]] -category = "dev" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" [[package]] -category = "dev" -description = "Classes Without Boilerplate" name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "21.2.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] -category = "dev" -description = "Internationalization utilities" name = "babel" +version = "2.9.1" +description = "Internationalization utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.9.1" [package.dependencies] pytz = ">=2015.7" [[package]] -category = "dev" -description = "The uncompromising code formatter." -marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "black" +version = "21.6b0" +description = "The uncompromising code formatter." +category = "dev" optional = false python-versions = ">=3.6.2" -version = "21.6b0" [package.dependencies] appdirs = "*" click = ">=7.1.2" +dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} mypy-extensions = ">=0.4.3" pathspec = ">=0.8.1,<1" regex = ">=2020.1.8" toml = ">=0.10.1" - -[package.dependencies.dataclasses] -python = "<3.7" -version = ">=0.6" - -[package.dependencies.typed-ast] -python = "<3.8" -version = ">=1.4.2" - -[package.dependencies.typing-extensions] -python = "<3.8" -version = ">=3.7.4" +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -104,12 +92,12 @@ python2 = ["typed-ast (>=1.4.2)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] -category = "dev" -description = "An easy safelist-based HTML-sanitizing tool." name = "bleach" +version = "3.3.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.3.0" [package.dependencies] packaging = "*" @@ -117,208 +105,196 @@ six = ">=1.9.0" webencodings = "*" [[package]] -category = "dev" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" +version = "2021.5.30" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" optional = false python-versions = "*" -version = "2021.5.30" [[package]] -category = "dev" -description = "Foreign Function Interface for Python calling C code." -marker = "sys_platform == \"linux\"" name = "cffi" +version = "1.14.5" +description = "Foreign Function Interface for Python calling C code." +category = "dev" optional = false python-versions = "*" -version = "1.14.5" [package.dependencies] pycparser = "*" [[package]] -category = "dev" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "4.0.0" [[package]] -category = "main" -description = "Composable command line interface toolkit" name = "click" +version = "8.0.1" +description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.6" -version = "8.0.1" [package.dependencies] -colorama = "*" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] -category = "dev" -description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" +version = "2.1.11" +description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.11" [package.dependencies] coverage = "*" requests = ">=2.7.9" [[package]] -category = "main" -description = "Cross-platform colored terminal text." name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.4" [[package]] -category = "dev" -description = "Code coverage measurement for Python" name = "coverage" +version = "5.5" +description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.5" [package.extras] toml = ["toml"] [[package]] -category = "dev" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -marker = "sys_platform == \"linux\"" name = "cryptography" +version = "3.4.7" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" optional = false python-versions = ">=3.6" -version = "3.4.7" [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] +test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] -category = "dev" -description = "A backport of the dataclasses module for Python 3.6" -marker = "python_version >= \"3.6.2\" and python_version < \"3.7\"" name = "dataclasses" +version = "0.8" +description = "A backport of the dataclasses module for Python 3.6" +category = "dev" optional = false python-versions = ">=3.6, <3.7" -version = "0.8" [[package]] -category = "dev" -description = "Docutils -- Python Documentation Utilities" name = "docutils" +version = "0.17.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.1" [[package]] -category = "dev" -description = "the modular source code checker: pep8 pyflakes and co" name = "flake8" +version = "3.9.2" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "3.9.2" [package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.7.0,<2.8.0" pyflakes = ">=2.3.0,<2.4.0" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - [[package]] -category = "dev" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" [[package]] -category = "dev" -description = "Getting image size from png/jpeg/jpeg2000/gif file" name = "imagesize" +version = "1.2.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [[package]] -category = "main" -description = "Read metadata from Python packages" name = "importlib-metadata" +version = "4.6.0" +description = "Read metadata from Python packages" +category = "main" optional = false python-versions = ">=3.6" -version = "4.5.0" [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" -[package.dependencies.typing-extensions] -python = "<3.8" -version = ">=3.6.4" - [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] -category = "dev" -description = "iniconfig: brain-dead simple config-ini parsing" name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = "*" -version = "1.1.1" [[package]] -category = "dev" -description = "A Python utility / library to sort Python imports." name = "isort" +version = "5.8.0" +description = "A Python utility / library to sort Python imports." +category = "dev" optional = false python-versions = ">=3.6,<4.0" -version = "5.8.0" [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] [[package]] -category = "dev" -description = "Low-level, pure Python DBus protocol wrapper." -marker = "sys_platform == \"linux\"" name = "jeepney" +version = "0.6.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" optional = false python-versions = ">=3.6" -version = "0.6.0" [package.extras] test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] [[package]] -category = "dev" -description = "A very fast and expressive template engine." name = "jinja2" +version = "3.0.1" +description = "A very fast and expressive template engine." +category = "dev" optional = false python-versions = ">=3.6" -version = "3.0.1" [package.dependencies] MarkupSafe = ">=2.0" @@ -327,113 +303,109 @@ MarkupSafe = ">=2.0" i18n = ["Babel (>=2.7)"] [[package]] -category = "main" -description = "Configuration manager" name = "kaptan" +version = "0.5.12" +description = "Configuration manager" +category = "main" optional = false python-versions = "*" -version = "0.5.12" [package.dependencies] PyYAML = ">=3.13,<6" [[package]] -category = "dev" -description = "Store and access your passwords safely." name = "keyring" +version = "23.0.1" +description = "Store and access your passwords safely." +category = "dev" optional = false python-versions = ">=3.6" -version = "23.0.1" [package.dependencies] -SecretStorage = ">=3.2" importlib-metadata = ">=3.6" -jeepney = ">=0.4.2" -pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] -category = "main" -description = "scripting library / orm for tmux" name = "libtmux" +version = "0.10.1" +description = "scripting library / orm for tmux" +category = "main" optional = false python-versions = "*" -version = "0.10.1" [[package]] -category = "dev" -description = "Python port of markdown-it. Markdown parsing, done right!" name = "markdown-it-py" +version = "1.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" optional = false python-versions = "~=3.6" -version = "1.1.0" [package.dependencies] attrs = ">=19,<22" - -[package.dependencies.typing-extensions] -python = "<3.8" -version = ">=3.7.4" +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] -code_style = ["pre-commit (2.6)"] +code_style = ["pre-commit (==2.6)"] compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] [[package]] -category = "dev" -description = "Safely add untrusted strings to HTML/XML markup." name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = false python-versions = ">=3.6" -version = "2.0.1" [[package]] -category = "dev" -description = "McCabe checker, plugin for flake8" name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" -version = "0.6.1" [[package]] -category = "dev" -description = "Collection of plugins for markdown-it-py" name = "mdit-py-plugins" +version = "0.2.8" +description = "Collection of plugins for markdown-it-py" +category = "dev" optional = false python-versions = "~=3.6" -version = "0.2.8" [package.dependencies] markdown-it-py = ">=1.0,<2.0" [package.extras] -code_style = ["pre-commit (2.6)"] -rtd = ["myst-parser (0.14.0a3)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +code_style = ["pre-commit (==2.6)"] +rtd = ["myst-parser (==0.14.0a3)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] -category = "dev" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" optional = false python-versions = "*" -version = "0.4.3" [[package]] -category = "dev" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." name = "myst-parser" +version = "0.15.1" +description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +category = "dev" optional = false python-versions = ">=3.6" -version = "0.15.0" [package.dependencies] docutils = ">=0.15,<0.18" @@ -446,145 +418,138 @@ sphinx = ">=3,<5" [package.extras] code_style = ["pre-commit (>=2.12,<3.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)"] +rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)", "sphinxext-rediraffe (>=0.2,<1.0)", "sphinxcontrib.mermaid (>=0.6.3,<0.7.0)", "sphinxext-opengraph (>=0.4.2,<0.5.0)"] testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] -category = "dev" -description = "Core utilities for Python packages" name = "packaging" +version = "21.0" +description = "Core utilities for Python packages" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.9" +python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2" [[package]] -category = "dev" -description = "Utility library for gitignore style pattern matching of file paths." -marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.8.1" [[package]] -category = "dev" -description = "Python Imaging Library (Fork)" name = "pillow" +version = "8.3.0" +description = "Python Imaging Library (Fork)" +category = "dev" optional = false python-versions = ">=3.6" -version = "8.2.0" [[package]] -category = "dev" -description = "Query metadatdata from sdists / bdists / installed packages." name = "pkginfo" +version = "1.7.0" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" optional = false python-versions = "*" -version = "1.7.0" [package.extras] testing = ["nose", "coverage"] [[package]] -category = "dev" -description = "plugin and hook calling mechanisms for python" name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] [[package]] -category = "dev" -description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.10.0" [[package]] -category = "dev" -description = "Python style guide checker" name = "pycodestyle" +version = "2.7.0" +description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.7.0" [[package]] -category = "dev" -description = "C parser in Python" -marker = "sys_platform == \"linux\"" name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" [[package]] -category = "dev" -description = "passive checker of Python programs" name = "pyflakes" +version = "2.3.1" +description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.3.1" [[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." name = "pygments" +version = "2.9.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.5" -version = "2.9.0" [[package]] -category = "dev" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" [[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" name = "pytest" +version = "6.2.4" +description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.6" -version = "6.2.4" [package.dependencies] -atomicwrites = ">=1.0" +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" -colorama = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<1.0.0a1" py = ">=1.8.2" toml = "*" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] -category = "dev" -description = "Pytest plugin for measuring coverage." name = "pytest-cov" +version = "2.12.1" +description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.12.1" [package.dependencies] coverage = ">=5.2.1" @@ -595,12 +560,12 @@ toml = "*" testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] [[package]] -category = "dev" -description = "Thin-wrapper around the mock package for easier use with pytest" name = "pytest-mock" +version = "3.6.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" optional = false python-versions = ">=3.6" -version = "3.6.1" [package.dependencies] pytest = ">=5.0" @@ -609,75 +574,72 @@ pytest = ">=5.0" dev = ["pre-commit", "tox", "pytest-asyncio"] [[package]] -category = "dev" -description = "pytest plugin to re-run tests to eliminate flaky failures" name = "pytest-rerunfailures" +version = "10.1" +description = "pytest plugin to re-run tests to eliminate flaky failures" +category = "dev" optional = false python-versions = ">=3.6" -version = "10.0" [package.dependencies] pytest = ">=5.3" -setuptools = ">=40.0" [[package]] -category = "dev" -description = "World timezone definitions, modern and historical" name = "pytz" +version = "2021.1" +description = "World timezone definitions, modern and historical" +category = "dev" optional = false python-versions = "*" -version = "2021.1" [[package]] -category = "dev" -description = "" -marker = "sys_platform == \"win32\"" name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" optional = false python-versions = "*" -version = "0.2.0" [[package]] -category = "main" -description = "YAML parser and emitter for Python" name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -version = "5.4.1" [[package]] -category = "dev" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" name = "readme-renderer" +version = "29.0" +description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" +category = "dev" optional = false python-versions = "*" -version = "29.0" [package.dependencies] -Pygments = ">=2.5.1" bleach = ">=2.1.0" docutils = ">=0.13.1" +Pygments = ">=2.5.1" six = "*" [package.extras] md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] -category = "dev" -description = "Alternative regular expression module, to replace re." -marker = "python_version >= \"3.6.2\" and python_version < \"4.0.0\"" name = "regex" +version = "2021.7.1" +description = "Alternative regular expression module, to replace re." +category = "dev" optional = false python-versions = "*" -version = "2021.4.4" [[package]] -category = "dev" -description = "Python HTTP for Humans." name = "requests" +version = "2.25.1" +description = "Python HTTP for Humans." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.25.1" [package.dependencies] certifi = ">=2017.4.17" @@ -687,78 +649,76 @@ urllib3 = ">=1.21.1,<1.27" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] [[package]] -category = "dev" -description = "A utility belt for advanced users of python-requests" name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" optional = false python-versions = "*" -version = "0.9.1" [package.dependencies] requests = ">=2.0.1,<3.0.0" [[package]] -category = "dev" -description = "Validating URI References per RFC 3986" name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "dev" optional = false python-versions = "*" -version = "1.5.0" [package.extras] idna2008 = ["idna"] [[package]] -category = "dev" -description = "Python bindings to FreeDesktop.org Secret Service API" -marker = "sys_platform == \"linux\"" name = "secretstorage" +version = "3.3.1" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" optional = false python-versions = ">=3.6" -version = "3.3.1" [package.dependencies] cryptography = ">=2.0" jeepney = ">=0.6" [[package]] -category = "dev" -description = "Python 2 and 3 compatibility utilities" name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.16.0" [[package]] -category = "dev" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." name = "snowballstemmer" +version = "2.1.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" optional = false python-versions = "*" -version = "2.1.0" [[package]] -category = "dev" -description = "Python documentation generator" name = "sphinx" +version = "4.0.2" +description = "Python documentation generator" +category = "dev" optional = false python-versions = ">=3.6" -version = "4.0.2" [package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" -colorama = ">=0.3.5" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} docutils = ">=0.14,<0.18" imagesize = "*" +Jinja2 = ">=2.3" packaging = "*" +Pygments = ">=2.0" requests = ">=2.5.0" -setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -773,12 +733,12 @@ lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] -category = "dev" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" name = "sphinx-autodoc-typehints" +version = "1.12.0" +description = "Type hints (PEP 484) support for the Sphinx autodoc extension" +category = "dev" optional = false python-versions = ">=3.6" -version = "1.12.0" [package.dependencies] Sphinx = ">=3.0" @@ -788,107 +748,107 @@ test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "S type_comments = ["typed-ast (>=1.4.0)"] [[package]] -category = "dev" -description = "A Sphinx extension for linking to your project's issue tracker" name = "sphinx-issues" +version = "1.2.0" +description = "A Sphinx extension for linking to your project's issue tracker" +category = "dev" optional = false python-versions = "*" -version = "1.2.0" [package.dependencies] sphinx = "*" [package.extras] -dev = ["pytest", "flake8 (3.6.0)", "pre-commit (1.13.0)", "tox", "mock", "flake8-bugbear (18.8.0)"] -lint = ["flake8 (3.6.0)", "pre-commit (1.13.0)", "flake8-bugbear (18.8.0)"] +dev = ["pytest", "flake8 (==3.6.0)", "pre-commit (==1.13.0)", "tox", "mock", "flake8-bugbear (==18.8.0)"] +lint = ["flake8 (==3.6.0)", "pre-commit (==1.13.0)", "flake8-bugbear (==18.8.0)"] tests = ["pytest", "mock"] [[package]] -category = "dev" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" optional = false python-versions = ">=3.6" -version = "2.0.0" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest", "html5lib"] [[package]] -category = "dev" -description = "A sphinx extension which renders display math in HTML via JavaScript" name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.1" [package.extras] test = ["pytest", "flake8", "mypy"] [[package]] -category = "dev" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.3" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.1.5" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [[package]] -category = "dev" -description = "Python Library for Tom's Obvious, Minimal Language" name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.10.2" [[package]] -category = "dev" -description = "Fast, Extensible Progress Meter" name = "tqdm" +version = "4.61.1" +description = "Fast, Extensible Progress Meter" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.61.1" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] @@ -896,12 +856,12 @@ notebook = ["ipywidgets (>=6)"] telegram = ["requests"] [[package]] -category = "dev" -description = "Collection of utilities for publishing packages on PyPI" name = "twine" +version = "3.4.1" +description = "Collection of utilities for publishing packages on PyPI" +category = "dev" optional = false python-versions = ">=3.6" -version = "3.4.1" [package.dependencies] colorama = ">=0.4.3" @@ -915,55 +875,53 @@ rfc3986 = ">=1.4.0" tqdm = ">=4.14" [[package]] -category = "dev" -description = "a fork of Python 2 and 3 ast modules with type comment support" -marker = "python_version >= \"3.6.2\" and python_version < \"3.8\"" name = "typed-ast" +version = "1.4.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" optional = false python-versions = "*" -version = "1.4.3" [[package]] -category = "main" -description = "Backported and Experimental Type Hints for Python 3.5+" -marker = "python_version >= \"3.6.2\" and python_version < \"3.8\" or python_version < \"3.8\"" name = "typing-extensions" +version = "3.10.0.0" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" optional = false python-versions = "*" -version = "3.10.0.0" [[package]] -category = "dev" -description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" +version = "1.26.6" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.26.5" [package.extras] brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] -category = "dev" -description = "Character encoding aliases for legacy web content" name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" optional = false python-versions = "*" -version = "0.5.1" [[package]] -category = "main" -description = "Backport of pathlib-compatible object wrapper for zip files" name = "zipp" +version = "3.5.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.6" -version = "3.4.1" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] coverage = [] @@ -974,9 +932,9 @@ lint = [] test = [] [metadata] -content-hash = "7ce90c3eac440ea5342287a0bc2e3df4e38dd9563b4233a7a48df76649cf19a4" -lock-version = "1.0" +lock-version = "1.1" python-versions = "^3.6" +content-hash = "7ce90c3eac440ea5342287a0bc2e3df4e38dd9563b4233a7a48df76649cf19a4" [metadata.files] aafigure = [ @@ -1176,8 +1134,8 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, - {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, + {file = "importlib_metadata-4.6.0-py3-none-any.whl", hash = "sha256:c6513572926a96458f8c8f725bf0e00108fba0c9583ade9bd15b869c9d726e33"}, + {file = "importlib_metadata-4.6.0.tar.gz", hash = "sha256:4a5611fea3768d3d967c447ab4e93f567d95db92225b43b7b238dbfb855d70bb"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1259,52 +1217,52 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] myst-parser = [ - {file = "myst-parser-0.15.0.tar.gz", hash = "sha256:3bddfbc8d8afb8dfbd4a6d4b626633585f2ef3480f2ac17eb0e771f96dd743ba"}, - {file = "myst_parser-0.15.0-py3-none-any.whl", hash = "sha256:dd9d5ab06bc7cd047f672785b44f2d172988e63452ef67dbefe0a9a38e6a4a41"}, + {file = "myst-parser-0.15.1.tar.gz", hash = "sha256:7c3c78a36c4bc30ce6a67933ebd800a880c8d81f1688fad5c2ebd82cddbc1603"}, + {file = "myst_parser-0.15.1-py3-none-any.whl", hash = "sha256:e8baa9959dac0bcf0f3ea5fc32a1a28792959471d8a8094e3ed5ee0de9733ade"}, ] packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] pillow = [ - {file = "Pillow-8.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:dc38f57d8f20f06dd7c3161c59ca2c86893632623f33a42d592f097b00f720a9"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b"}, - {file = "Pillow-8.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c5236606e8570542ed424849f7852a0ff0bce2c4c8d0ba05cc202a5a9c97dee9"}, - {file = "Pillow-8.2.0-cp36-cp36m-win32.whl", hash = "sha256:12e5e7471f9b637762453da74e390e56cc43e486a88289995c1f4c1dc0bfe727"}, - {file = "Pillow-8.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5afe6b237a0b81bd54b53f835a153770802f164c5570bab5e005aad693dab87f"}, - {file = "Pillow-8.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:cb7a09e173903541fa888ba010c345893cd9fc1b5891aaf060f6ca77b6a3722d"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0d19d70ee7c2ba97631bae1e7d4725cdb2ecf238178096e8c82ee481e189168a"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:083781abd261bdabf090ad07bb69f8f5599943ddb539d64497ed021b2a67e5a9"}, - {file = "Pillow-8.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c6b39294464b03457f9064e98c124e09008b35a62e3189d3513e5148611c9388"}, - {file = "Pillow-8.2.0-cp37-cp37m-win32.whl", hash = "sha256:01425106e4e8cee195a411f729cff2a7d61813b0b11737c12bd5991f5f14bcd5"}, - {file = "Pillow-8.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b570f84a6161cf8865c4e08adf629441f56e32f180f7aa4ccbd2e0a5a02cba2"}, - {file = "Pillow-8.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:031a6c88c77d08aab84fecc05c3cde8414cd6f8406f4d2b16fed1e97634cc8a4"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178"}, - {file = "Pillow-8.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:624b977355cde8b065f6d51b98497d6cd5fbdd4f36405f7a8790e3376125e2bb"}, - {file = "Pillow-8.2.0-cp38-cp38-win32.whl", hash = "sha256:5cbf3e3b1014dddc45496e8cf38b9f099c95a326275885199f427825c6522232"}, - {file = "Pillow-8.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:463822e2f0d81459e113372a168f2ff59723e78528f91f0bd25680ac185cf797"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5"}, - {file = "Pillow-8.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b91c36492a4bbb1ee855b7d16fe51379e5f96b85692dc8210831fbb24c43e484"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d68cb92c408261f806b15923834203f024110a2e2872ecb0bd2a110f89d3c602"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f217c3954ce5fd88303fc0c317af55d5e0204106d86dea17eb8205700d47dec2"}, - {file = "Pillow-8.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5b70110acb39f3aff6b74cf09bb4169b167e2660dabc304c1e25b6555fa781ef"}, - {file = "Pillow-8.2.0-cp39-cp39-win32.whl", hash = "sha256:a7d5e9fad90eff8f6f6106d3b98b553a88b6f976e51fce287192a5d2d5363713"}, - {file = "Pillow-8.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:238c197fc275b475e87c1453b05b467d2d02c2915fdfdd4af126145ff2e4610c"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0e04d61f0064b545b989126197930807c86bcbd4534d39168f4aa5fda39bb8f9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_i686.whl", hash = "sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9"}, - {file = "Pillow-8.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c03c07ed32c5324939b19e36ae5f75c660c81461e312a41aea30acdd46f93a7c"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:4d98abdd6b1e3bf1a1cbb14c3895226816e666749ac040c4e2554231068c639b"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_i686.whl", hash = "sha256:aac00e4bc94d1b7813fe882c28990c1bc2f9d0e1aa765a5f2b516e8a6a16a9e4"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:22fd0f42ad15dfdde6c581347eaa4adb9a6fc4b865f90b23378aa7914895e120"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win32.whl", hash = "sha256:e98eca29a05913e82177b3ba3d198b1728e164869c613d76d0de4bde6768a50e"}, - {file = "Pillow-8.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291"}, - {file = "Pillow-8.2.0.tar.gz", hash = "sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"}, + {file = "Pillow-8.3.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:333313bcc53a8a7359e98d5458dfe37bfa301da2fd0e0dc41f585ae0cede9181"}, + {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bccd0d604d814e9494f3bf3f077a23835580ed1743c5175581882e7dd1f178c3"}, + {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7beda44f177ee602aa27e0a297da1657d9572679522c8fb8b336b734653516e"}, + {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94db5ea640330de0945b41dc77fb4847b4ab6e87149126c71b36b112e8400898"}, + {file = "Pillow-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:856fcbc3201a6cabf0478daa0c0a1a8a175af7e5173e2084ddb91cc707a09dd1"}, + {file = "Pillow-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34ce3d993cb4ca840b1e31165b38cb19c64f64f822a8bc5565bde084baff3bdb"}, + {file = "Pillow-8.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:778a819c2d194e08d39d67ddb15ef0d32eba17bf7d0c2773e97bd221b2613a3e"}, + {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b42ea77f4e7374a67e1f27aaa9c62627dff681f67890e5b8f0c1e21b1500d9d2"}, + {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53f6e4b73b3899015ac4aa95d99da0f48ea18a6d7c8db672e8bead3fb9570ef5"}, + {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fb91deb5121b6dde88599bcb3db3fdad9cf33ff3d4ccc5329ee1fe9655a2f7ff"}, + {file = "Pillow-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:8f65d2a98f198e904dbe89ecb10862d5f0511367d823689039e17c4d011de11e"}, + {file = "Pillow-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:25f6564df21d15bcac142b4ed92b6c02e53557539f535f31c1f3bcc985484753"}, + {file = "Pillow-8.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:c2d78c8230bda5fc9f6b1d457c7f8f3432f4fe85bed86f80ba3ed73d59775a88"}, + {file = "Pillow-8.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:950e873ceefbd283cbe7bc5b648b832d1dcf89eeded6726ebec42bc7d67966c0"}, + {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1037288a22cc8ec9d2918a24ded733a1cc4342fd7f21d15d37e6bbe5fb4a7306"}, + {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:063d17a02a0170c2f880fbd373b2738b089c6adcbd1f7418667bc9e97524c11b"}, + {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:561339ed7c324bbcb29b5e4f4705c97df950785394b3ac181f5bf6a08088a672"}, + {file = "Pillow-8.3.0-cp38-cp38-win32.whl", hash = "sha256:331f8321418682386e4f0d0e6369f732053f95abddd2af4e1b1ef74a9537ef37"}, + {file = "Pillow-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:eccaefbd646022b5313ca4b0c5f1ae6e0d3a52ef66de64970ecf3f9b2a1be751"}, + {file = "Pillow-8.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:6f7517a220aca8b822e25b08b0df9546701a606a328da5bc057e5f32a3f9b07c"}, + {file = "Pillow-8.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc8e926d6ffa65d0dddb871b7afe117f17bc045951e66afde60eb0eba923db9e"}, + {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519b3b24dedc81876d893475bade1b92c4ce7c24b9b82224f0bd8daae682e039"}, + {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:72858a27dd7bd1c40f91c4f85db3b9f121c8412fd66573121febb00d074d0530"}, + {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3251557c53c1ed0c345559afc02d2b0a0aa5788042e161366ed90b27bc322d3d"}, + {file = "Pillow-8.3.0-cp39-cp39-win32.whl", hash = "sha256:ce90aad0a3dc0f13a9ff0ab1f43bcbea436089b83c3fadbe37c6f1733b938bf1"}, + {file = "Pillow-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:490c9236ef4762733b6c2e1f1fcb37793cb9c57d860aa84d6994c990461882e5"}, + {file = "Pillow-8.3.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aef0838f28328523e9e5f2c1852dd96fb85768deb0eb8f908c54dad0f44d2f6f"}, + {file = "Pillow-8.3.0-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:713b762892efa8cd5d8dac24d16ac2d2dbf981963ed1b3297e79755f03f8cbb8"}, + {file = "Pillow-8.3.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cec702974f162026bf8de47f6f4b7ce9584a63c50002b38f195ee797165fea77"}, + {file = "Pillow-8.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ef8119ce44f90d2f8ac7c58f7da480ada5151f217dc8da03681b73fc91dec3"}, + {file = "Pillow-8.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc25d59ecf23ea19571065306806a29c43c67f830f0e8a121303916ba257f484"}, + {file = "Pillow-8.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28f184c0a65be098af412f78b0b6f3bbafd1614e1dc896e810d8357342a794b7"}, + {file = "Pillow-8.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c3529fb98a40f89269175442c5ff4ef81d22e91b2bdcbd33833a350709b5130c"}, + {file = "Pillow-8.3.0.tar.gz", hash = "sha256:803606e206f3e366eea46b1e7ab4dac74cfac770d04de9c35319814e11e47c46"}, ] pkginfo = [ {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, @@ -1351,8 +1309,8 @@ pytest-mock = [ {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-rerunfailures = [ - {file = "pytest-rerunfailures-10.0.tar.gz", hash = "sha256:3906e611f962e3bdf15501e8a24ad2d12a703eff7d2030ea88acf68ad8d6b391"}, - {file = "pytest_rerunfailures-10.0-py3-none-any.whl", hash = "sha256:fb5f276df942944da80f3c7a84507ac4f92cc3f462fe6bd4bbcbef94de22db8b"}, + {file = "pytest-rerunfailures-10.1.tar.gz", hash = "sha256:7617c06de13ee6dd2df9add7e275bfb2bcebbaaf3e450f5937cd0200df824273"}, + {file = "pytest_rerunfailures-10.1-py3-none-any.whl", hash = "sha256:53db94acf7499c75c5257c79d8a1dc22c3db4bc8d32ec3a713ea91eda3f98359"}, ] pytz = [ {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, @@ -1398,47 +1356,43 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, - {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, - {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, - {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, - {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, - {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, - {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, - {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, - {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, - {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, - {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, - {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, - {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, + {file = "regex-2021.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:494d0172774dc0beeea984b94c95389143db029575f7ca908edd74469321ea99"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:8cf6728f89b071bd3ab37cb8a0e306f4de897553a0ed07442015ee65fbf53d62"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1806370b2bef4d4193eebe8ee59a9fd7547836a34917b7badbe6561a8594d9cb"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d0cf2651a8804f6325747c7e55e3be0f90ee2848e25d6b817aa2728d263f9abb"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:268fe9dd1deb4a30c8593cabd63f7a241dfdc5bd9dd0233906c718db22cdd49a"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:7743798dfb573d006f1143d745bf17efad39775a5190b347da5d83079646be56"}, + {file = "regex-2021.7.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0e46c1191b2eb293a6912269ed08b4512e7e241bbf591f97e527492e04c77e93"}, + {file = "regex-2021.7.1-cp36-cp36m-win32.whl", hash = "sha256:b1dbeef938281f240347d50f28ae53c4b046a23389cd1fc4acec5ea0eae646a1"}, + {file = "regex-2021.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6c72ebb72e64e9bd195cb35a9b9bbfb955fd953b295255b8ae3e4ad4a146b615"}, + {file = "regex-2021.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf819c5b77ff44accc9a24e31f1f7ceaaf6c960816913ed3ef8443b9d20d81b6"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e80d2851109e56420b71f9702ad1646e2f0364528adbf6af85527bc61e49f394"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a1b6a3f600d6aff97e3f28c34192c9ed93fee293bd96ef327b64adb51a74b2f6"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ed77b97896312bc2deafe137ca2626e8b63808f5bedb944f73665c68093688a7"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a548bb51c4476332ce4139df8e637386730f79a92652a907d12c696b6252b64d"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:210c359e6ee5b83f7d8c529ba3c75ba405481d50f35a420609b0db827e2e3bb5"}, + {file = "regex-2021.7.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1d386402ae7f3c9b107ae5863f7ecccb0167762c82a687ae6526b040feaa5ac6"}, + {file = "regex-2021.7.1-cp37-cp37m-win32.whl", hash = "sha256:5049d00dbb78f9d166d1c704e93934d42cce0570842bb1a61695123d6b01de09"}, + {file = "regex-2021.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:361be4d311ac995a8c7ad577025a3ae3a538531b1f2cf32efd8b7e5d33a13e5a"}, + {file = "regex-2021.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f32f47fb22c988c0b35756024b61d156e5c4011cb8004aa53d93b03323c45657"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b024ee43ee6b310fad5acaee23e6485b21468718cb792a9d1693eecacc3f0b7e"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b092754c06852e8a8b022004aff56c24b06310189186805800d09313c37ce1f8"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a8a5826d8a1b64e2ff9af488cc179e1a4d0f144d11ce486a9f34ea38ccedf4ef"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:444723ebaeb7fa8125f29c01a31101a3854ac3de293e317944022ae5effa53a4"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:fdad3122b69cdabdb3da4c2a4107875913ac78dab0117fc73f988ad589c66b66"}, + {file = "regex-2021.7.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4b1999ef60c45357598935c12508abf56edbbb9c380df6f336de38a6c3a294ae"}, + {file = "regex-2021.7.1-cp38-cp38-win32.whl", hash = "sha256:e07e92935040c67f49571779d115ecb3e727016d42fb36ee0d8757db4ca12ee0"}, + {file = "regex-2021.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6b8b629f93246e507287ee07e26744beaffb4c56ed520576deac8b615bd76012"}, + {file = "regex-2021.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56bef6b414949e2c9acf96cb5d78de8b529c7b99752619494e78dc76f99fd005"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:78a2a885345a2d60b5e68099e877757d5ed12e46ba1e87507175f14f80892af3"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3f7a92e60930f8fca2623d9e326c173b7cf2c8b7e4fdcf984b75a1d2fb08114d"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4fc86b729ab88fe8ac3ec92287df253c64aa71560d76da5acd8a2e245839c629"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:59845101de68fd5d3a1145df9ea022e85ecd1b49300ea68307ad4302320f6f61"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ce269e903b00d1ab4746793e9c50a57eec5d5388681abef074d7b9a65748fca5"}, + {file = "regex-2021.7.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c11f2fca544b5e30a0e813023196a63b1cb9869106ef9a26e9dae28bce3e4e26"}, + {file = "regex-2021.7.1-cp39-cp39-win32.whl", hash = "sha256:1ccbd41dbee3a31e18938096510b7d4ee53aa9fce2ee3dcc8ec82ae264f6acfd"}, + {file = "regex-2021.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:18040755606b0c21281493ec309214bd61e41a170509e5014f41d6a5a586e161"}, + {file = "regex-2021.7.1.tar.gz", hash = "sha256:849802379a660206277675aa5a5c327f5c910c690649535863ddf329b0ba8c87"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, @@ -1550,14 +1504,14 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ - {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, - {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, + {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, + {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, ] From 185eb4d631e2ea47eafa290df5fd3c6c7053bb10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 14 Jul 2021 09:10:54 -0500 Subject: [PATCH 0809/2998] docs: Note yaml multiline commands --- docs/examples.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 8e39428138..83b0c67c57 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -387,6 +387,36 @@ pane during creation. ``` + +## Multi-line commands + +You can use YAML's multiline syntax to easily split multiple +commands into the same shell command: https://stackoverflow.com/a/21699210 + +```{code-block} yaml + +session_name: my project +shell_command_before: +- > + [ -d `.venv/bin/activate` ] && + source .venv/bin/activate && + reset +- sleep 1 +windows: +- window_name: first window + layout: main-horizontal + focus: true + panes: + - focus: True + - blank + - > + poetry run ./manage.py migrate && + npm -C js run start + - poetry run ./manage.py runserver + options: + main-pane-height: 35 +``` + ## Bootstrap project before launch You can use `before_script` to run a script before the tmux session From 3aebfc8294b2134fb1a74c136667c81ac4930683 Mon Sep 17 00:00:00 2001 From: GHPS Date: Thu, 15 Jul 2021 23:52:06 +0200 Subject: [PATCH 0810/2998] Support -h help option to add user friendliness (and follow the de-facto standard) --- tmuxp/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 72699f8f8c..e332c204b0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -749,7 +749,7 @@ def load_workspace( return _setup_plugins(builder) -@click.group(context_settings={'obj': {}}) +@click.group(context_settings={'obj': {}, 'help_option_names':['-h', '--help']}) @click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') @click.option( '--log-level', From 7adbadc21ddffc23836896739729edcbf8adb75e Mon Sep 17 00:00:00 2001 From: GHPS Date: Thu, 15 Jul 2021 23:55:00 +0200 Subject: [PATCH 0811/2998] Tests for help CLI options (--help and -h) --- tests/test_cli.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_cli.py b/tests/test_cli.py index 8a06b723f7..17d69cbcdd 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -761,6 +761,18 @@ def test_import(cli_args, monkeypatch): assert 'tmuxinator' in result.output assert 'teamocil' in result.output +@pytest.mark.parametrize( + "cli_args", + [ + (['--help']), + (['-h']), + ], +) +def test_help(cli_args, monkeypatch): + runner = CliRunner() + + result = runner.invoke(cli.cli, cli_args) + assert 'Usage: cli [OPTIONS] COMMAND [ARGS]...' in result.output @pytest.mark.parametrize( "cli_args,inputs", From fc2e45049f26251bc58b10c914429687c8f9aff9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 18 Jul 2021 10:49:59 -0500 Subject: [PATCH 0812/2998] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index d5cbf09a0b..e6d8940cf7 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ ## current - _Insert changes/features/fixes for next release here_ +- #700: Add `-h` / `--help` option, thanks @GHPS - #689: Update poetry to 1.1 - CI: Use poetry 1.1.7 and `install-poetry.py` installer - Relock poetry.lock at 1.1 (w/ 1.1.7's fix) From d75d9ad8117f70b2a49562842b9325101e388370 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 18 Jul 2021 10:51:54 -0500 Subject: [PATCH 0813/2998] Update dependencies --- poetry.lock | 336 ++++++++++++++++++++++++++-------------------------- 1 file changed, 169 insertions(+), 167 deletions(-) diff --git a/poetry.lock b/poetry.lock index dd26b45f62..28fdab27b0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -93,7 +93,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.0" +version = "3.3.1" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false @@ -114,7 +114,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.5" +version = "1.14.6" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -124,12 +124,15 @@ python-versions = "*" pycparser = "*" [[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" +name = "charset-normalizer" +version = "2.0.3" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] [[package]] name = "click" @@ -225,11 +228,11 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "idna" -version = "2.10" +version = "3.2" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" [[package]] name = "imagesize" @@ -241,7 +244,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.6.0" +version = "4.6.1" description = "Read metadata from Python packages" category = "main" optional = false @@ -279,7 +282,7 @@ colors = ["colorama (>=0.4.3,<0.5.0)"] [[package]] name = "jeepney" -version = "0.6.0" +version = "0.7.0" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false @@ -287,6 +290,7 @@ python-versions = ">=3.6" [package.extras] test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +trio = ["trio", "async-generator"] [[package]] name = "jinja2" @@ -434,15 +438,15 @@ pyparsing = ">=2.0.2" [[package]] name = "pathspec" -version = "0.8.1" +version = "0.9.0" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pillow" -version = "8.3.0" +version = "8.3.1" description = "Python Imaging Library (Fork)" category = "dev" optional = false @@ -450,7 +454,7 @@ python-versions = ">=3.6" [[package]] name = "pkginfo" -version = "1.7.0" +version = "1.7.1" description = "Query metadatdata from sdists / bdists / installed packages." category = "dev" optional = false @@ -627,7 +631,7 @@ md = ["cmarkgfm (>=0.5.0,<0.6.0)"] [[package]] name = "regex" -version = "2021.7.1" +version = "2021.7.6" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -635,21 +639,21 @@ python-versions = "*" [[package]] name = "requests" -version = "2.25.1" +version = "2.26.0" description = "Python HTTP for Humans." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "requests-toolbelt" @@ -703,7 +707,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.0.2" +version = "4.1.1" description = "Python documentation generator" category = "dev" optional = false @@ -722,14 +726,14 @@ requests = ">=2.5.0" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] @@ -844,12 +848,15 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tqdm" -version = "4.61.1" +version = "4.61.2" description = "Fast, Extensible Progress Meter" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] @@ -970,67 +977,58 @@ black = [ {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] bleach = [ - {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, - {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, + {file = "bleach-3.3.1-py2.py3-none-any.whl", hash = "sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78"}, + {file = "bleach-3.3.1.tar.gz", hash = "sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa"}, ] certifi = [ {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, + {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, ] click = [ {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, @@ -1126,16 +1124,16 @@ flake8 = [ {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, ] imagesize = [ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.0-py3-none-any.whl", hash = "sha256:c6513572926a96458f8c8f725bf0e00108fba0c9583ade9bd15b869c9d726e33"}, - {file = "importlib_metadata-4.6.0.tar.gz", hash = "sha256:4a5611fea3768d3d967c447ab4e93f567d95db92225b43b7b238dbfb855d70bb"}, + {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, + {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1146,8 +1144,8 @@ isort = [ {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jeepney = [ - {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, - {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, + {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, + {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, ] jinja2 = [ {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, @@ -1225,48 +1223,48 @@ packaging = [ {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, ] pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pillow = [ - {file = "Pillow-8.3.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:333313bcc53a8a7359e98d5458dfe37bfa301da2fd0e0dc41f585ae0cede9181"}, - {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bccd0d604d814e9494f3bf3f077a23835580ed1743c5175581882e7dd1f178c3"}, - {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7beda44f177ee602aa27e0a297da1657d9572679522c8fb8b336b734653516e"}, - {file = "Pillow-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94db5ea640330de0945b41dc77fb4847b4ab6e87149126c71b36b112e8400898"}, - {file = "Pillow-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:856fcbc3201a6cabf0478daa0c0a1a8a175af7e5173e2084ddb91cc707a09dd1"}, - {file = "Pillow-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34ce3d993cb4ca840b1e31165b38cb19c64f64f822a8bc5565bde084baff3bdb"}, - {file = "Pillow-8.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:778a819c2d194e08d39d67ddb15ef0d32eba17bf7d0c2773e97bd221b2613a3e"}, - {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b42ea77f4e7374a67e1f27aaa9c62627dff681f67890e5b8f0c1e21b1500d9d2"}, - {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53f6e4b73b3899015ac4aa95d99da0f48ea18a6d7c8db672e8bead3fb9570ef5"}, - {file = "Pillow-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fb91deb5121b6dde88599bcb3db3fdad9cf33ff3d4ccc5329ee1fe9655a2f7ff"}, - {file = "Pillow-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:8f65d2a98f198e904dbe89ecb10862d5f0511367d823689039e17c4d011de11e"}, - {file = "Pillow-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:25f6564df21d15bcac142b4ed92b6c02e53557539f535f31c1f3bcc985484753"}, - {file = "Pillow-8.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:c2d78c8230bda5fc9f6b1d457c7f8f3432f4fe85bed86f80ba3ed73d59775a88"}, - {file = "Pillow-8.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:950e873ceefbd283cbe7bc5b648b832d1dcf89eeded6726ebec42bc7d67966c0"}, - {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1037288a22cc8ec9d2918a24ded733a1cc4342fd7f21d15d37e6bbe5fb4a7306"}, - {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:063d17a02a0170c2f880fbd373b2738b089c6adcbd1f7418667bc9e97524c11b"}, - {file = "Pillow-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:561339ed7c324bbcb29b5e4f4705c97df950785394b3ac181f5bf6a08088a672"}, - {file = "Pillow-8.3.0-cp38-cp38-win32.whl", hash = "sha256:331f8321418682386e4f0d0e6369f732053f95abddd2af4e1b1ef74a9537ef37"}, - {file = "Pillow-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:eccaefbd646022b5313ca4b0c5f1ae6e0d3a52ef66de64970ecf3f9b2a1be751"}, - {file = "Pillow-8.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:6f7517a220aca8b822e25b08b0df9546701a606a328da5bc057e5f32a3f9b07c"}, - {file = "Pillow-8.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc8e926d6ffa65d0dddb871b7afe117f17bc045951e66afde60eb0eba923db9e"}, - {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519b3b24dedc81876d893475bade1b92c4ce7c24b9b82224f0bd8daae682e039"}, - {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:72858a27dd7bd1c40f91c4f85db3b9f121c8412fd66573121febb00d074d0530"}, - {file = "Pillow-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3251557c53c1ed0c345559afc02d2b0a0aa5788042e161366ed90b27bc322d3d"}, - {file = "Pillow-8.3.0-cp39-cp39-win32.whl", hash = "sha256:ce90aad0a3dc0f13a9ff0ab1f43bcbea436089b83c3fadbe37c6f1733b938bf1"}, - {file = "Pillow-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:490c9236ef4762733b6c2e1f1fcb37793cb9c57d860aa84d6994c990461882e5"}, - {file = "Pillow-8.3.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aef0838f28328523e9e5f2c1852dd96fb85768deb0eb8f908c54dad0f44d2f6f"}, - {file = "Pillow-8.3.0-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:713b762892efa8cd5d8dac24d16ac2d2dbf981963ed1b3297e79755f03f8cbb8"}, - {file = "Pillow-8.3.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cec702974f162026bf8de47f6f4b7ce9584a63c50002b38f195ee797165fea77"}, - {file = "Pillow-8.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ef8119ce44f90d2f8ac7c58f7da480ada5151f217dc8da03681b73fc91dec3"}, - {file = "Pillow-8.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc25d59ecf23ea19571065306806a29c43c67f830f0e8a121303916ba257f484"}, - {file = "Pillow-8.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28f184c0a65be098af412f78b0b6f3bbafd1614e1dc896e810d8357342a794b7"}, - {file = "Pillow-8.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c3529fb98a40f89269175442c5ff4ef81d22e91b2bdcbd33833a350709b5130c"}, - {file = "Pillow-8.3.0.tar.gz", hash = "sha256:803606e206f3e366eea46b1e7ab4dac74cfac770d04de9c35319814e11e47c46"}, + {file = "Pillow-8.3.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd"}, + {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723"}, + {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04"}, + {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37"}, + {file = "Pillow-8.3.1-cp36-cp36m-win32.whl", hash = "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229"}, + {file = "Pillow-8.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de"}, + {file = "Pillow-8.3.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"}, + {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab"}, + {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf"}, + {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0"}, + {file = "Pillow-8.3.1-cp37-cp37m-win32.whl", hash = "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba"}, + {file = "Pillow-8.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500"}, + {file = "Pillow-8.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4"}, + {file = "Pillow-8.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e"}, + {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79"}, + {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae"}, + {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844"}, + {file = "Pillow-8.3.1-cp38-cp38-win32.whl", hash = "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367"}, + {file = "Pillow-8.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8"}, + {file = "Pillow-8.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e"}, + {file = "Pillow-8.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856"}, + {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82"}, + {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc"}, + {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83"}, + {file = "Pillow-8.3.1-cp39-cp39-win32.whl", hash = "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d"}, + {file = "Pillow-8.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8"}, + {file = "Pillow-8.3.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf"}, + {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63"}, + {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636"}, + {file = "Pillow-8.3.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d"}, + {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77"}, + {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8"}, + {file = "Pillow-8.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4"}, + {file = "Pillow-8.3.1.tar.gz", hash = "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792"}, ] pkginfo = [ - {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, - {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, + {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, + {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -1356,47 +1354,51 @@ readme-renderer = [ {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, ] regex = [ - {file = "regex-2021.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:494d0172774dc0beeea984b94c95389143db029575f7ca908edd74469321ea99"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:8cf6728f89b071bd3ab37cb8a0e306f4de897553a0ed07442015ee65fbf53d62"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1806370b2bef4d4193eebe8ee59a9fd7547836a34917b7badbe6561a8594d9cb"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d0cf2651a8804f6325747c7e55e3be0f90ee2848e25d6b817aa2728d263f9abb"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:268fe9dd1deb4a30c8593cabd63f7a241dfdc5bd9dd0233906c718db22cdd49a"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:7743798dfb573d006f1143d745bf17efad39775a5190b347da5d83079646be56"}, - {file = "regex-2021.7.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0e46c1191b2eb293a6912269ed08b4512e7e241bbf591f97e527492e04c77e93"}, - {file = "regex-2021.7.1-cp36-cp36m-win32.whl", hash = "sha256:b1dbeef938281f240347d50f28ae53c4b046a23389cd1fc4acec5ea0eae646a1"}, - {file = "regex-2021.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6c72ebb72e64e9bd195cb35a9b9bbfb955fd953b295255b8ae3e4ad4a146b615"}, - {file = "regex-2021.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf819c5b77ff44accc9a24e31f1f7ceaaf6c960816913ed3ef8443b9d20d81b6"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e80d2851109e56420b71f9702ad1646e2f0364528adbf6af85527bc61e49f394"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a1b6a3f600d6aff97e3f28c34192c9ed93fee293bd96ef327b64adb51a74b2f6"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ed77b97896312bc2deafe137ca2626e8b63808f5bedb944f73665c68093688a7"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a548bb51c4476332ce4139df8e637386730f79a92652a907d12c696b6252b64d"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:210c359e6ee5b83f7d8c529ba3c75ba405481d50f35a420609b0db827e2e3bb5"}, - {file = "regex-2021.7.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1d386402ae7f3c9b107ae5863f7ecccb0167762c82a687ae6526b040feaa5ac6"}, - {file = "regex-2021.7.1-cp37-cp37m-win32.whl", hash = "sha256:5049d00dbb78f9d166d1c704e93934d42cce0570842bb1a61695123d6b01de09"}, - {file = "regex-2021.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:361be4d311ac995a8c7ad577025a3ae3a538531b1f2cf32efd8b7e5d33a13e5a"}, - {file = "regex-2021.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f32f47fb22c988c0b35756024b61d156e5c4011cb8004aa53d93b03323c45657"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b024ee43ee6b310fad5acaee23e6485b21468718cb792a9d1693eecacc3f0b7e"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b092754c06852e8a8b022004aff56c24b06310189186805800d09313c37ce1f8"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a8a5826d8a1b64e2ff9af488cc179e1a4d0f144d11ce486a9f34ea38ccedf4ef"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:444723ebaeb7fa8125f29c01a31101a3854ac3de293e317944022ae5effa53a4"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:fdad3122b69cdabdb3da4c2a4107875913ac78dab0117fc73f988ad589c66b66"}, - {file = "regex-2021.7.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4b1999ef60c45357598935c12508abf56edbbb9c380df6f336de38a6c3a294ae"}, - {file = "regex-2021.7.1-cp38-cp38-win32.whl", hash = "sha256:e07e92935040c67f49571779d115ecb3e727016d42fb36ee0d8757db4ca12ee0"}, - {file = "regex-2021.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6b8b629f93246e507287ee07e26744beaffb4c56ed520576deac8b615bd76012"}, - {file = "regex-2021.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56bef6b414949e2c9acf96cb5d78de8b529c7b99752619494e78dc76f99fd005"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:78a2a885345a2d60b5e68099e877757d5ed12e46ba1e87507175f14f80892af3"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3f7a92e60930f8fca2623d9e326c173b7cf2c8b7e4fdcf984b75a1d2fb08114d"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4fc86b729ab88fe8ac3ec92287df253c64aa71560d76da5acd8a2e245839c629"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:59845101de68fd5d3a1145df9ea022e85ecd1b49300ea68307ad4302320f6f61"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ce269e903b00d1ab4746793e9c50a57eec5d5388681abef074d7b9a65748fca5"}, - {file = "regex-2021.7.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c11f2fca544b5e30a0e813023196a63b1cb9869106ef9a26e9dae28bce3e4e26"}, - {file = "regex-2021.7.1-cp39-cp39-win32.whl", hash = "sha256:1ccbd41dbee3a31e18938096510b7d4ee53aa9fce2ee3dcc8ec82ae264f6acfd"}, - {file = "regex-2021.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:18040755606b0c21281493ec309214bd61e41a170509e5014f41d6a5a586e161"}, - {file = "regex-2021.7.1.tar.gz", hash = "sha256:849802379a660206277675aa5a5c327f5c910c690649535863ddf329b0ba8c87"}, + {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, + {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, + {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, + {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, + {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, + {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, + {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, + {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, + {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, + {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, + {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, + {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, + {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, + {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, + {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, + {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, + {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, ] requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -1419,8 +1421,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, - {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"}, + {file = "Sphinx-4.1.1-py3-none-any.whl", hash = "sha256:3d513088236eef51e5b0adb78b0492eb22cc3b8ccdb0b36dd021173b365d4454"}, + {file = "Sphinx-4.1.1.tar.gz", hash = "sha256:23c846a1841af998cb736218539bb86d16f5eb95f5760b1966abcd2d584e62b8"}, ] sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, @@ -1459,8 +1461,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.61.1-py2.py3-none-any.whl", hash = "sha256:aa0c29f03f298951ac6318f7c8ce584e48fa22ec26396e6411e43d038243bdb2"}, - {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"}, + {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, + {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, ] twine = [ {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, From ebc43c3e61db8e53238355c1d45be2182925bd00 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 Oct 2021 10:53:33 -0500 Subject: [PATCH 0814/2998] Remove dependabot --- .github/dependabot.yml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 491deae0af..0000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: 2 -updates: -- package-ecosystem: pip - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 From dc263d3719aafa756f9fbb742f8c3b85edaece54 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 Oct 2021 10:54:11 -0500 Subject: [PATCH 0815/2998] ci: Fix cache --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c4bacd682e..f95f8b787a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -50,8 +50,8 @@ jobs: with: path: | .venv - {{ env.poetry_cache_dir }} - {{ env.poetry_virtualenvs_path }} + ${{ env.poetry_cache_dir }} + ${{ env.poetry_virtualenvs_path }} key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} - name: Ensure cache is healthy From 06cb8b6eed4a1b1582f6bf8e9ea7fa14332fc60f Mon Sep 17 00:00:00 2001 From: inkch Date: Thu, 15 Jul 2021 01:22:42 +0900 Subject: [PATCH 0816/2998] Fix typo: tmxup -> tmuxp --- README.md | 2 +- docs/cli.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd3bd738db..d9fb55f406 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ $ tmuxp load mysession ./another/project/ Name a session: ```bash -$ tmxup load -s session_name ./mysession.yaml +$ tmuxp load -s session_name ./mysession.yaml ``` [simple](http://tmuxp.git-pull.com/examples.html#short-hand-inline) and diff --git a/docs/cli.md b/docs/cli.md index f9bf3444b3..5c4ccf7fe5 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -212,7 +212,7 @@ are created, the last session is named from the terminal. ```{code-block} bash -$ tmxup load -s ... +$ tmuxp load -s ... ``` From f6973444b9665a7253a41a210da25598557d375c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 06:47:47 -0500 Subject: [PATCH 0817/2998] CHANGES: Note typo fix --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index e6d8940cf7..be48b2f58e 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ - #689: Update poetry to 1.1 - CI: Use poetry 1.1.7 and `install-poetry.py` installer - Relock poetry.lock at 1.1 (w/ 1.1.7's fix) +- #696: Typo fix, thanks @inkch ## tmuxp 1.9.2 (2021-06-17) - #686: Allow click 8.0.x From b8c6886aadb3d4c9b5585b267617ba393f9e8d1e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Sep 2021 18:36:44 -0500 Subject: [PATCH 0818/2998] Update packages --- poetry.lock | 636 ++++++++++++++++++++++++++++------------------------ 1 file changed, 343 insertions(+), 293 deletions(-) diff --git a/poetry.lock b/poetry.lock index 28fdab27b0..628a85d9d8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -93,11 +93,11 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "3.3.1" +version = "4.1.0" description = "An easy safelist-based HTML-sanitizing tool." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] packaging = "*" @@ -106,7 +106,7 @@ webencodings = "*" [[package]] name = "certifi" -version = "2021.5.30" +version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -114,7 +114,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.6" +version = "1.15.0" description = "Foreign Function Interface for Python calling C code." category = "dev" optional = false @@ -125,7 +125,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.3" +version = "2.0.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -136,7 +136,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.1" +version = "8.0.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -148,7 +148,7 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "codecov" -version = "2.1.11" +version = "2.1.12" description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" category = "dev" optional = false @@ -168,18 +168,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "5.5" +version = "6.1" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.6" + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "extra == \"toml\""} [package.extras] -toml = ["toml"] +toml = ["tomli"] [[package]] name = "cryptography" -version = "3.4.7" +version = "35.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -192,9 +195,9 @@ cffi = ">=1.12" docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "dataclasses" @@ -214,21 +217,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "flake8" -version = "3.9.2" +version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "idna" -version = "3.2" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -244,7 +247,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "4.2.0" description = "Read metadata from Python packages" category = "main" optional = false @@ -256,8 +259,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -282,19 +284,19 @@ colors = ["colorama (>=0.4.3,<0.5.0)"] [[package]] name = "jeepney" -version = "0.7.0" +version = "0.7.1" description = "Low-level, pure Python DBus protocol wrapper." category = "dev" optional = false python-versions = ">=3.6" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.1" +version = "3.0.2" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -319,7 +321,7 @@ PyYAML = ">=3.13,<6" [[package]] name = "keyring" -version = "23.0.1" +version = "23.2.1" description = "Store and access your passwords safely." category = "dev" optional = false @@ -405,7 +407,7 @@ python-versions = "*" [[package]] name = "myst-parser" -version = "0.15.1" +version = "0.15.2" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." category = "dev" optional = false @@ -417,7 +419,7 @@ jinja2 = "*" markdown-it-py = ">=1.0.0,<2.0.0" mdit-py-plugins = ">=0.2.8,<0.3.0" pyyaml = "*" -sphinx = ">=3,<5" +sphinx = ">=3.1,<5" [package.extras] code_style = ["pre-commit (>=2.12,<3.0)"] @@ -427,14 +429,14 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "packaging" -version = "21.0" +version = "21.2" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3" [[package]] name = "pathspec" @@ -446,7 +448,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pillow" -version = "8.3.1" +version = "8.4.0" description = "Python Imaging Library (Fork)" category = "dev" optional = false @@ -465,17 +467,18 @@ testing = ["nose", "coverage"] [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -487,11 +490,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.8.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycparser" @@ -503,7 +506,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.4.0" description = "passive checker of Python programs" category = "dev" optional = false @@ -511,7 +514,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -527,7 +530,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.4" +version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -540,7 +543,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" @@ -549,16 +552,15 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-cov" -version = "2.12.1" +version = "3.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -coverage = ">=5.2.1" +coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" -toml = "*" [package.extras] testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] @@ -579,18 +581,18 @@ dev = ["pre-commit", "tox", "pytest-asyncio"] [[package]] name = "pytest-rerunfailures" -version = "10.1" +version = "10.2" description = "pytest plugin to re-run tests to eliminate flaky failures" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">= 3.6" [package.dependencies] pytest = ">=5.3" [[package]] name = "pytz" -version = "2021.1" +version = "2021.3" description = "World timezone definitions, modern and historical" category = "dev" optional = false @@ -614,7 +616,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "readme-renderer" -version = "29.0" +version = "30.0" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" category = "dev" optional = false @@ -624,14 +626,13 @@ python-versions = "*" bleach = ">=2.1.0" docutils = ">=0.13.1" Pygments = ">=2.5.1" -six = "*" [package.extras] -md = ["cmarkgfm (>=0.5.0,<0.6.0)"] +md = ["cmarkgfm (>=0.5.0,<0.7.0)"] [[package]] name = "regex" -version = "2021.7.6" +version = "2021.10.23" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -707,7 +708,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.1.1" +version = "4.2.0" description = "Python documentation generator" category = "dev" optional = false @@ -846,9 +847,17 @@ category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "tomli" +version = "1.2.2" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "tqdm" -version = "4.61.2" +version = "4.62.3" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -864,7 +873,7 @@ telegram = ["requests"] [[package]] name = "twine" -version = "3.4.1" +version = "3.4.2" description = "Collection of utilities for publishing packages on PyPI" category = "dev" optional = false @@ -891,7 +900,7 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "3.10.0.0" +version = "3.10.0.2" description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false @@ -899,7 +908,7 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false @@ -920,7 +929,7 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.5.0" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false @@ -977,139 +986,139 @@ black = [ {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] bleach = [ - {file = "bleach-3.3.1-py2.py3-none-any.whl", hash = "sha256:ae976d7174bba988c0b632def82fdc94235756edfb14e6558a9c5be555c9fb78"}, - {file = "bleach-3.3.1.tar.gz", hash = "sha256:306483a5a9795474160ad57fce3ddd1b50551e981eed8e15a582d34cef28aafa"}, + {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, + {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, ] certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, - {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, + {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, + {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, ] click = [ - {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, - {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, ] codecov = [ - {file = "codecov-2.1.11-py2.py3-none-any.whl", hash = "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8"}, - {file = "codecov-2.1.11-py3.8.egg", hash = "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef"}, - {file = "codecov-2.1.11.tar.gz", hash = "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b"}, + {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, + {file = "codecov-2.1.12-py3.8.egg", hash = "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635"}, + {file = "codecov-2.1.12.tar.gz", hash = "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, + {file = "coverage-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a518d13a3cd905d89891123d765e15e61538849e2be0ee5f85ad2bdb3fd91cc9"}, + {file = "coverage-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef73a4e074fb0b470eb64a552d460394630ccaab73b8a7b2f523514f7df2b805"}, + {file = "coverage-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cd585d280e1199290e8e0dca6b297e021cfbcade6759ad56146257a53b90c5b0"}, + {file = "coverage-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f6f14b05b5c0456eb6ab82b6acd937b8118eca14ec621bd1729ca33f251d9ea4"}, + {file = "coverage-6.1-cp310-cp310-win32.whl", hash = "sha256:42f65145acfbbac227b862fe509d0353861d70c455f91a14ace52fe378cdc085"}, + {file = "coverage-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:49f3434739e443771171e4d6c0e7df12cc83d7f00beb7b5d6b3a655a873c51ab"}, + {file = "coverage-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9d01b0d67ab782efa3c940a8ea1fc3ccb7ca0fc24a187b6d772bf6a45e0efb2f"}, + {file = "coverage-6.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32334063e661da80ebc1a720b829228e918d1f24b947afebbe84edcff157c39"}, + {file = "coverage-6.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45ca96310fda694eb9ae1cdee0355cf66d2acc828678513b331172061289c17a"}, + {file = "coverage-6.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c0d8e633cec3ac7a32f676e8b777a56f0ba4a954aecb0634301fdb85c40a845"}, + {file = "coverage-6.1-cp36-cp36m-win32.whl", hash = "sha256:0c471fdc5b9db0229fb2477ac445a886c7a6d86029534e29f0dc65f517c8e704"}, + {file = "coverage-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:422ab4cf66a7ed0c119ce8db64c99c6667eda53acaa63a4c178dbac4100f57b6"}, + {file = "coverage-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6130f0f95461fc46884ce73269fc72028e139359a0583a12f7510a45a081faa3"}, + {file = "coverage-6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71a8baf10a755c35b7015d524279ebec9b801bc46c821e344914be0ad6c73bfc"}, + {file = "coverage-6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:be883832d1ddc827c742928f86b861b99ee38ae17cd3833172959d18ff437b6a"}, + {file = "coverage-6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0ff19756ee78fe2377eb5126a196fe84643f149f840ea7d74b4c08686f5484e4"}, + {file = "coverage-6.1-cp37-cp37m-win32.whl", hash = "sha256:8476aa688efcc4521264f12e6e74c2587cd4623429c8f5aab613e0b46de41283"}, + {file = "coverage-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:58e84430bf1b2904b96bcee9ba7f736fb7efb84f5bd7c7b5b3df54db12476360"}, + {file = "coverage-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2987506781355303506660cb1917b0dcd02a76f7873db604a415aadb2193bd96"}, + {file = "coverage-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f122138bfc6d45bc1c770a9987ce28c89e874638e423d25dff5d40e66fc02878"}, + {file = "coverage-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:749eaf8cf5d03695359ff08ea8d01ac42381069baf42d991a36ba30cc34da87a"}, + {file = "coverage-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b10b845dbb809056c8c96c02a4d1644084fcb7c3d405d1262eb6dfaab89650b1"}, + {file = "coverage-6.1-cp38-cp38-win32.whl", hash = "sha256:dd0e050a0dc5101dbf1e8f87d7362d65404f8b29d25f22eda0418bb7b31c6954"}, + {file = "coverage-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:0fb10cafd85a931837be9d18420c80d16cbb13d1d9a78d78dee932af2dd55135"}, + {file = "coverage-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ac1d0cacaf12168d53bfcd390b69b9548919c6a5829cb1fd2f28f122ce5c83c"}, + {file = "coverage-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f5383bb5912817e05d1f411279b34d8bde518fe8dce6f3f53a8731dca4f133e"}, + {file = "coverage-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9d4560814fc741f571eb99996e6ef0ba4cd70a8e3c2d98a526c1a2ce13a7e982"}, + {file = "coverage-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eca26715688fdb7ec73d316d89687ac9bf4cdd7df0ceb8b22a3a2928bf8e7ece"}, + {file = "coverage-6.1-cp39-cp39-win32.whl", hash = "sha256:870f8ea4bbc79bdd0dbcf7367f89ee4cfd3f278063a0e16bd78baa05c0541fc9"}, + {file = "coverage-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:68dce32c064d8597f91d5d12a7a91a92ce0a37d1a024108d25834bd0ea905e11"}, + {file = "coverage-6.1-pp36-none-any.whl", hash = "sha256:dc5aec152c59f8db9c723e2f3c98d64b1ead814f0a9c2c4e0b998f0ae7338c30"}, + {file = "coverage-6.1-pp37-none-any.whl", hash = "sha256:34e1f49e25336840857c1c1593764342316d0b1ce5a8d74c314d4883468f9dfe"}, + {file = "coverage-6.1-pp38-none-any.whl", hash = "sha256:fc333e8971e8be0a310e4398426ec2b643a3466092643ade1500bdf72a789e83"}, + {file = "coverage-6.1.tar.gz", hash = "sha256:ddc4e200767bdf76182a634fba47343e223492b74d33edc5cf680a50e14f6d09"}, ] cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, + {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"}, + {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"}, + {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"}, + {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"}, + {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"}, + {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"}, + {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, + {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, ] dataclasses = [ {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, @@ -1120,20 +1129,20 @@ docutils = [ {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] imagesize = [ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1144,19 +1153,19 @@ isort = [ {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jeepney = [ - {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, - {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, + {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, ] kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, - {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, + {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, + {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, ] libtmux = [ {file = "libtmux-0.10.1-py3-none-any.whl", hash = "sha256:db307412e58214e0ca2db32ecdbe2649ae8f38c6540279624367681dcdbe3014"}, @@ -1167,12 +1176,28 @@ markdown-it-py = [ {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -1181,14 +1206,27 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1198,6 +1236,12 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1215,104 +1259,111 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] myst-parser = [ - {file = "myst-parser-0.15.1.tar.gz", hash = "sha256:7c3c78a36c4bc30ce6a67933ebd800a880c8d81f1688fad5c2ebd82cddbc1603"}, - {file = "myst_parser-0.15.1-py3-none-any.whl", hash = "sha256:e8baa9959dac0bcf0f3ea5fc32a1a28792959471d8a8094e3ed5ee0de9733ade"}, + {file = "myst-parser-0.15.2.tar.gz", hash = "sha256:f7f3b2d62db7655cde658eb5d62b2ec2a4631308137bd8d10f296a40d57bbbeb"}, + {file = "myst_parser-0.15.2-py3-none-any.whl", hash = "sha256:40124b6f27a4c42ac7f06b385e23a9dcd03d84801e9c7130b59b3729a554b1f9"}, ] packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, + {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, + {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pillow = [ - {file = "Pillow-8.3.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd"}, - {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723"}, - {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04"}, - {file = "Pillow-8.3.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37"}, - {file = "Pillow-8.3.1-cp36-cp36m-win32.whl", hash = "sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229"}, - {file = "Pillow-8.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de"}, - {file = "Pillow-8.3.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"}, - {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab"}, - {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf"}, - {file = "Pillow-8.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0"}, - {file = "Pillow-8.3.1-cp37-cp37m-win32.whl", hash = "sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba"}, - {file = "Pillow-8.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500"}, - {file = "Pillow-8.3.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4"}, - {file = "Pillow-8.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e"}, - {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79"}, - {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae"}, - {file = "Pillow-8.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844"}, - {file = "Pillow-8.3.1-cp38-cp38-win32.whl", hash = "sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367"}, - {file = "Pillow-8.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8"}, - {file = "Pillow-8.3.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e"}, - {file = "Pillow-8.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856"}, - {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82"}, - {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc"}, - {file = "Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83"}, - {file = "Pillow-8.3.1-cp39-cp39-win32.whl", hash = "sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d"}, - {file = "Pillow-8.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8"}, - {file = "Pillow-8.3.1-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf"}, - {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63"}, - {file = "Pillow-8.3.1-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636"}, - {file = "Pillow-8.3.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d"}, - {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77"}, - {file = "Pillow-8.3.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8"}, - {file = "Pillow-8.3.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4"}, - {file = "Pillow-8.3.1.tar.gz", hash = "sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, + {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, + {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, + {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, + {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, + {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, + {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, + {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, + {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, + {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, + {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, + {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, + {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, + {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, ] pkginfo = [ {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] pycparser = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] pytest-cov = [ - {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, - {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] pytest-mock = [ {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, ] pytest-rerunfailures = [ - {file = "pytest-rerunfailures-10.1.tar.gz", hash = "sha256:7617c06de13ee6dd2df9add7e275bfb2bcebbaaf3e450f5937cd0200df824273"}, - {file = "pytest_rerunfailures-10.1-py3-none-any.whl", hash = "sha256:53db94acf7499c75c5257c79d8a1dc22c3db4bc8d32ec3a713ea91eda3f98359"}, + {file = "pytest-rerunfailures-10.2.tar.gz", hash = "sha256:9e1e1bad51e07642c5bbab809fc1d4ec8eebcb7de86f90f1a26e6ef9de446697"}, + {file = "pytest_rerunfailures-10.2-py3-none-any.whl", hash = "sha256:d31d8e828dfd39363ad99cd390187bf506c7a433a89f15c3126c7d16ab723fe2"}, ] pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1350,51 +1401,46 @@ pyyaml = [ {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] readme-renderer = [ - {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, - {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, + {file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"}, + {file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"}, ] regex = [ - {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, - {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, - {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, - {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, - {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, - {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, - {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, - {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, - {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, - {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, - {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, - {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, - {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, - {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, - {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, - {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, - {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, + {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"}, + {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"}, + {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"}, + {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"}, + {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"}, + {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"}, + {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"}, + {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"}, + {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"}, + {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"}, + {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"}, + {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"}, + {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"}, + {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"}, + {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"}, + {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, @@ -1421,8 +1467,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, ] sphinx = [ - {file = "Sphinx-4.1.1-py3-none-any.whl", hash = "sha256:3d513088236eef51e5b0adb78b0492eb22cc3b8ccdb0b36dd021173b365d4454"}, - {file = "Sphinx-4.1.1.tar.gz", hash = "sha256:23c846a1841af998cb736218539bb86d16f5eb95f5760b1966abcd2d584e62b8"}, + {file = "Sphinx-4.2.0-py3-none-any.whl", hash = "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"}, + {file = "Sphinx-4.2.0.tar.gz", hash = "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6"}, ] sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, @@ -1460,13 +1506,17 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] +tomli = [ + {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, + {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, +] tqdm = [ - {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, - {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, + {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, + {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, ] twine = [ - {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, - {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, + {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, + {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, ] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, @@ -1501,19 +1551,19 @@ typed-ast = [ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, ] From 96b6901f79149ff8c4e4e4fd9f235d320edbef47 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 06:45:16 -0500 Subject: [PATCH 0819/2998] ci: Lock python at 3.9 (lower than 3.10) to avoid poetry / dataclasses bug See also: - https://github.com/tmux-python/libtmux/pull/339 - https://github.com/python-poetry/poetry/issues/1413 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f95f8b787a..adb32a13fb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.x' ] + python-version: [ '3.9' ] tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', '3.2a', 'master' ] steps: - uses: actions/checkout@v1 From 90bec267f922b74f98483f876d587bb72b677ba9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 06:49:25 -0500 Subject: [PATCH 0820/2998] black: Update to 21.9b0 --- poetry.lock | 48 ++++++++++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index 628a85d9d8..246d18f9d4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -25,14 +25,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] alabaster = "<0.8" -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -68,26 +60,30 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.6b0" +version = "21.9b0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -appdirs = "*" click = ">=7.1.2" dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" regex = ">=2020.1.8" -toml = ">=0.10.1" +tomli = ">=0.2.6,<2.0.0" typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] python2 = ["typed-ast (>=1.4.2)"] uvloop = ["uvloop (>=0.15.2)"] @@ -465,6 +461,18 @@ python-versions = "*" [package.extras] testing = ["nose", "coverage"] +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + [[package]] name = "pluggy" version = "1.0.0" @@ -950,7 +958,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "7ce90c3eac440ea5342287a0bc2e3df4e38dd9563b4233a7a48df76649cf19a4" +content-hash = "18d15c70db360dab7c9faaa2c595d17262eb7e1a8df10e7636107fa23b0f1155" [metadata.files] aafigure = [ @@ -965,10 +973,6 @@ alagitpull = [ {file = "alagitpull-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b9ed87ee410c6fa40a63a91d2f25919a10e20c6d39e080356b067f3ff6f379b"}, {file = "alagitpull-0.1.0.tar.gz", hash = "sha256:f6076f81a738c3291b598d8016b248edf5adf25d1d348c2599eff92c1eedaed9"}, ] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -982,8 +986,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, - {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, + {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, + {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -1317,6 +1321,10 @@ pkginfo = [ {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, ] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, diff --git a/pyproject.toml b/pyproject.toml index 30f49e8c43..bf9b74d600 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ codecov = "*" coverage = "*" ### Format ### -black = {version="==21.6b0", python="^3.6.2"} +black = {version="==21.9b0", python="^3.6.2"} isort = "*" ### Lint ### From 79163d31e3500646a3473729e6d4064391462808 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 13:30:58 -0500 Subject: [PATCH 0821/2998] ci(docs): Fix poetry issue (lock python 3.9) --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index a2f1ed85bc..52759df3c6 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.x' ] + python-version: [ '3.9' ] steps: - uses: actions/checkout@v1 - name: Configure git From 4b78983e6f82dca36612be6af303ddf2a66d5e5c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 14:13:40 -0500 Subject: [PATCH 0822/2998] libtmux: 0.10.1 -> 0.10.2 (#720) See also: - https://github.com/tmux-python/libtmux/blob/v0.10.2/CHANGES - https://github.com/tmux-python/libtmux/tree/v0.10.2 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- requirements/base.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 246d18f9d4..d9274a7a49 100644 --- a/poetry.lock +++ b/poetry.lock @@ -335,7 +335,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "libtmux" -version = "0.10.1" +version = "0.10.2" description = "scripting library / orm for tmux" category = "main" optional = false @@ -958,7 +958,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "18d15c70db360dab7c9faaa2c595d17262eb7e1a8df10e7636107fa23b0f1155" +content-hash = "98b6c694f089b4b35b8a97c6d9e2c3d7b2dea77e3e2712f0d0e3a3e162d99942" [metadata.files] aafigure = [ @@ -1172,8 +1172,8 @@ keyring = [ {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, ] libtmux = [ - {file = "libtmux-0.10.1-py3-none-any.whl", hash = "sha256:db307412e58214e0ca2db32ecdbe2649ae8f38c6540279624367681dcdbe3014"}, - {file = "libtmux-0.10.1.tar.gz", hash = "sha256:c8bc81499616ba899538704e419463a1c83ba7ca21e53b1efc6abbe98eb26b61"}, + {file = "libtmux-0.10.2-py2.py3-none-any.whl", hash = "sha256:bad47d65f9e948b50697d9ca244bba4b52e5daf13bbc8052d2b017768c893050"}, + {file = "libtmux-0.10.2.tar.gz", hash = "sha256:a0e958b85ec14cdaabecfa738a0dd51846f05e5c5e9d6749a2bf5160b9f7e1d2"}, ] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, diff --git a/pyproject.toml b/pyproject.toml index bf9b74d600..618b31668d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.6" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.10.1" +libtmux = "~0.10.2" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] diff --git a/requirements/base.txt b/requirements/base.txt index 4b713f19b0..6defac5d37 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ kaptan>=0.5.10 -libtmux>=0.10.1,<0.11 +libtmux>=0.10.2,<0.11 click>=7,<8.1 colorama>=0.3.9 From d20e6532c9c178f051c5c1406f34017edce242ca Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 Oct 2021 14:15:18 -0500 Subject: [PATCH 0823/2998] Tag v1.9.3 --- CHANGES | 2 ++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index be48b2f58e..0d778d8a74 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ ## current - _Insert changes/features/fixes for next release here_ + +## tmuxp 1.9.3 (2021-10-30) - #700: Add `-h` / `--help` option, thanks @GHPS - #689: Update poetry to 1.1 - CI: Use poetry 1.1.7 and `install-poetry.py` installer diff --git a/pyproject.toml b/pyproject.toml index 618b31668d..f29c426076 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.9.2" +version = "1.9.3" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 5cce9f4ae9..739b410c5f 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.9.2' +__version__ = '1.9.3' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From bed8e37f21152f994400b3e697baadef300b42fc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 6 Jan 2022 06:58:06 -0600 Subject: [PATCH 0824/2998] Setup project_urls: Add changelog link --- setup.py | 1 + tmuxp/__about__.py | 1 + 2 files changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 419f20e706..6ed4fdbe59 100644 --- a/setup.py +++ b/setup.py @@ -26,6 +26,7 @@ version=about['__version__'], url=about['__github__'], project_urls={ + 'Changes': about['__changes__'], 'Documentation': about['__docs__'], 'Code': about['__github__'], 'Issue tracker': about['__tracker__'], diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 739b410c5f..24fae2a2be 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -7,6 +7,7 @@ __github__ = 'https://github.com/tmux-python/tmuxp' __docs__ = 'https://tmuxp.git-pull.com' __tracker__ = 'https://github.com/tmux-python/tmuxp/issues' +__changes__ = 'https://github.com/tmux-python/tmuxp/blob/master/CHANGES' __pypi__ = 'https://pypi.org/project/tmuxp/' __license__ = 'MIT' __copyright__ = 'Copyright 2013- Tony Narlock' From d41753e34e72f4194fabd00280471c945149c6d6 Mon Sep 17 00:00:00 2001 From: Gleb Date: Sat, 8 Jan 2022 15:45:19 +0300 Subject: [PATCH 0825/2998] Add cli command 'edit'. (#707) --- tmuxp/cli.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index e332c204b0..7de245e76a 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -9,6 +9,7 @@ import os import platform import sys +from subprocess import call import click import kaptan @@ -1209,6 +1210,15 @@ def command_convert(confirmed, config): print('New config saved to <%s>.' % newfile) +@cli.command(name='edit', short_help='Run $EDITOR on config.') +@click.argument('config', type=ConfigPath(exists=True), nargs=1) +def command_edit_config(config): + config = scan_config(config) + + sys_editor = os.environ.get('EDITOR', 'vim') + call([sys_editor, config]) + + @cli.command( name='ls', short_help='List configured sessions in {}.'.format(get_config_dir()) ) From d0e86c09d42ec992722583dfccf1ca4937855d8e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 06:59:51 -0600 Subject: [PATCH 0826/2998] CHANGES: Update for #707 --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index 0d778d8a74..5e288e59e3 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,14 @@ - _Insert changes/features/fixes for next release here_ +#### What's new + +- `tmuxp edit` for configuration changes (#707, @GlebPoljakov) + + Inside of configuration directory: `tmuxp edit yourconfig` + + Inside a project: `tmuxp edit .` + ## tmuxp 1.9.3 (2021-10-30) - #700: Add `-h` / `--help` option, thanks @GHPS - #689: Update poetry to 1.1 From d20163b96c52ae5f190276f95c48fc4a0224ae25 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:01:11 -0600 Subject: [PATCH 0827/2998] chore(setup.py): Add python 3.10 to classifiers --- pyproject.toml | 1 + setup.py | 1 + 2 files changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index f29c426076..94350461e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells" diff --git a/setup.py b/setup.py index 6ed4fdbe59..2e5067ca6e 100644 --- a/setup.py +++ b/setup.py @@ -57,6 +57,7 @@ "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells", From 58ecfca3edc7982534252549d950336d51a0ea03 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:01:37 -0600 Subject: [PATCH 0828/2998] ci: Test on python 3.10 --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index adb32a13fb..8616ba6fb0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.9' ] + python-version: [ '3.10' ] tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', '3.2a', 'master' ] steps: - uses: actions/checkout@v1 From 32bab469430ab24cb386f83f48c9883fb97c87a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:01:58 -0600 Subject: [PATCH 0829/2998] Docs: build on 3.10 --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 52759df3c6..e280197d00 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.9' ] + python-version: [ '3.10' ] steps: - uses: actions/checkout@v1 - name: Configure git From 377114a30ab6382dbb90b114676585c6f528ae9a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:03:55 -0600 Subject: [PATCH 0830/2998] ci: poetry 1.1.7 -> 1.1.12 and use new installer --- .github/workflows/publish-docs.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- .tool-versions | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index e280197d00..ad8a9eb431 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -52,8 +52,8 @@ jobs: - name: Install poetry if: env.PUBLISH == 'true' run: | - curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/install-poetry.py - python install-poetry.py -y --version 1.1.7 + curl -O -sSL https://install.python-poetry.org/install-poetry.py + python install-poetry.py -y --version 1.1.12 echo "PATH=${HOME}/.poetry/bin:${PATH}" >> $GITHUB_ENV rm install-poetry.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8616ba6fb0..036a46a809 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,8 +27,8 @@ jobs: - name: Install poetry run: | - curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/install-poetry.py - python install-poetry.py -y --version 1.1.7 + curl -O -sSL https://install.python-poetry.org/install-poetry.py + python install-poetry.py -y --version 1.1.12 echo "PATH=${HOME}/.poetry/bin:${PATH}" >> $GITHUB_ENV rm install-poetry.py diff --git a/.tool-versions b/.tool-versions index aea9ad298f..11b8e22ca2 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -poetry 1.1.7 +poetry 1.1.12 From b3267bac330aa2e180daee5b357c89eb8590d87f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:06:19 -0600 Subject: [PATCH 0831/2998] chore (pyproject): Add Changes URL to release --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 94350461e8..508acf479b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ readme = "README.md" "Bug Tracker" = "https://github.com/tmux-python/tmuxp/issues" Documentation = "https://tmuxp.git-pull.com" Repository = "https://github.com/tmux-python/tmuxp" +Changes = "https://github.com/tmux-python/tmuxp/blob/master/CHANGES" [tool.poetry.scripts] tmuxp = 'tmuxp:cli.cli' From ac71a1d3d15c156be0b52f6c4a6848825d682f89 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:07:47 -0600 Subject: [PATCH 0832/2998] Update black: 21.9b0 -> 21.12b0 --- poetry.lock | 61 ++++++-------------------------------------------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 55 deletions(-) diff --git a/poetry.lock b/poetry.lock index d9274a7a49..e80ef4e1d9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -60,7 +60,7 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.9b0" +version = "21.12b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -72,9 +72,8 @@ dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" -regex = ">=2020.1.8" tomli = ">=0.2.6,<2.0.0" -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = [ {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, @@ -82,9 +81,9 @@ typing-extensions = [ [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -638,14 +637,6 @@ Pygments = ">=2.5.1" [package.extras] md = ["cmarkgfm (>=0.5.0,<0.7.0)"] -[[package]] -name = "regex" -version = "2021.10.23" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "requests" version = "2.26.0" @@ -958,7 +949,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "98b6c694f089b4b35b8a97c6d9e2c3d7b2dea77e3e2712f0d0e3a3e162d99942" +content-hash = "066090ba2528ddf33c4ea6c35b5a5d3026f92a96525d167b6dbfe6458b9df9d2" [metadata.files] aafigure = [ @@ -986,8 +977,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, + {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -1412,44 +1403,6 @@ readme-renderer = [ {file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"}, {file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"}, ] -regex = [ - {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"}, - {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"}, - {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"}, - {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"}, - {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"}, - {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"}, - {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"}, - {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"}, - {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"}, - {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"}, - {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"}, - {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"}, - {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"}, - {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"}, - {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"}, - {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"}, - {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"}, - {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"}, - {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"}, - {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"}, - {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"}, - {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"}, - {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"}, - {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"}, - {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"}, - {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"}, - {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"}, - {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"}, - {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"}, - {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"}, - {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"}, - {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"}, - {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"}, - {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"}, - {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"}, - {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"}, -] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, diff --git a/pyproject.toml b/pyproject.toml index 508acf479b..b7d293985d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ codecov = "*" coverage = "*" ### Format ### -black = {version="==21.9b0", python="^3.6.2"} +black = {version="==21.12b0", python="^3.6.2"} isort = "*" ### Lint ### From 3b2b8fba11253c7bb194ba8346d76a087081590c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:10:04 -0600 Subject: [PATCH 0833/2998] Remove sphinx-issues: unused since we use markdown now --- docs/conf.py | 1 - poetry.lock | 22 +--------------------- pyproject.toml | 3 +-- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ebd532c8d5..144afc654f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,7 +29,6 @@ 'sphinx.ext.linkcode', 'aafig', 'alagitpull', - 'sphinx_issues', 'myst_parser', ] diff --git a/poetry.lock b/poetry.lock index e80ef4e1d9..0dcfdef636 100644 --- a/poetry.lock +++ b/poetry.lock @@ -751,22 +751,6 @@ Sphinx = ">=3.0" test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"] type_comments = ["typed-ast (>=1.4.0)"] -[[package]] -name = "sphinx-issues" -version = "1.2.0" -description = "A Sphinx extension for linking to your project's issue tracker" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -sphinx = "*" - -[package.extras] -dev = ["pytest", "flake8 (==3.6.0)", "pre-commit (==1.13.0)", "tox", "mock", "flake8-bugbear (==18.8.0)"] -lint = ["flake8 (==3.6.0)", "pre-commit (==1.13.0)", "flake8-bugbear (==18.8.0)"] -tests = ["pytest", "mock"] - [[package]] name = "sphinxcontrib-applehelp" version = "1.0.2" @@ -949,7 +933,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "066090ba2528ddf33c4ea6c35b5a5d3026f92a96525d167b6dbfe6458b9df9d2" +content-hash = "b5df7ff7946ac554f1c575e348f0ce3397d31c2343468c2fcb94a10a57badfe6" [metadata.files] aafigure = [ @@ -1435,10 +1419,6 @@ sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, {file = "sphinx_autodoc_typehints-1.12.0-py3-none-any.whl", hash = "sha256:5e81776ec422dd168d688ab60f034fccfafbcd94329e9537712c93003bddc04a"}, ] -sphinx-issues = [ - {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, - {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, -] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, diff --git a/pyproject.toml b/pyproject.toml index b7d293985d..8d6ffd6f6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,6 @@ colorama = ">=0.3.9" ### Docs ### sphinx = "*" alagitpull = "~0.1.0" -sphinx-issues = "^1.2.0" aafigure = ">=0.6" pillow = "*" sphinx-autodoc-typehints = "^1.12.0" @@ -75,7 +74,7 @@ flake8 = "*" twine = "*" [tool.poetry.extras] -docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] +docs = ["sphinx", "myst_parser", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] From 47927bb89df4e3bc00302764c83176b0647de061 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:14:03 -0600 Subject: [PATCH 0834/2998] Add pre-commit-config.yaml for black, isort, flake8 --- .pre-commit-config.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..992c746b2c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +repos: +- repo: https://github.com/ambv/black + rev: 21.12b0 + hooks: + - id: black + language_version: python3.10 +- repo: https://github.com/pycqa/isort + rev: 5.10.1 + hooks: + - id: isort + name: isort (python) +- repo: https://gitlab.com/pycqa/flake8 + rev: 4.0.1 + hooks: + - id: flake8 From 6562cd56c0c45e93f1200bced269ceeb97f639dc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 8 Jan 2022 13:15:17 +0000 Subject: [PATCH 0835/2998] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_cli.py | 2 ++ tmuxp/cli.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 17d69cbcdd..40dc72fab1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -761,6 +761,7 @@ def test_import(cli_args, monkeypatch): assert 'tmuxinator' in result.output assert 'teamocil' in result.output + @pytest.mark.parametrize( "cli_args", [ @@ -774,6 +775,7 @@ def test_help(cli_args, monkeypatch): result = runner.invoke(cli.cli, cli_args) assert 'Usage: cli [OPTIONS] COMMAND [ARGS]...' in result.output + @pytest.mark.parametrize( "cli_args,inputs", [ diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 7de245e76a..811086698d 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -750,7 +750,7 @@ def load_workspace( return _setup_plugins(builder) -@click.group(context_settings={'obj': {}, 'help_option_names':['-h', '--help']}) +@click.group(context_settings={'obj': {}, 'help_option_names': ['-h', '--help']}) @click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') @click.option( '--log-level', From bf29390fd62c5cf00c61ac6412e119831d4f5a40 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:17:46 -0600 Subject: [PATCH 0836/2998] chore: Drop python 3.6 support (deprecated / EOL December 2021) --- README.md | 2 +- pyproject.toml | 5 ++--- setup.py | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d9fb55f406..fa54b7aca2 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ See donation options at . # Project details - tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 -- python support: >= 3.6, pypy, pypy3 +- python support: >= 3.7, pypy, pypy3 - Source: - Docs: - API: diff --git a/pyproject.toml b/pyproject.toml index 8d6ffd6f6a..c1f0d574ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ classifiers = [ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", @@ -38,7 +37,7 @@ Changes = "https://github.com/tmux-python/tmuxp/blob/master/CHANGES" tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] -python = "^3.6" +python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" libtmux = "~0.10.2" @@ -64,7 +63,7 @@ codecov = "*" coverage = "*" ### Format ### -black = {version="==21.12b0", python="^3.6.2"} +black = {version="==21.12b0"} isort = "*" ### Lint ### diff --git a/setup.py b/setup.py index 2e5067ca6e..5ce56232fe 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,6 @@ "Environment :: Web Environment", "Intended Audience :: Developers", "Programming Language :: Python", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", From 89ae43614e8f7d0b3505692caa196f80faf79f1b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:18:49 -0600 Subject: [PATCH 0837/2998] Run Markdown formatters --- CHANGES | 4 ++++ docs/examples.md | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 5e288e59e3..d945fea808 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Inside a project: `tmuxp edit .` ## tmuxp 1.9.3 (2021-10-30) + - #700: Add `-h` / `--help` option, thanks @GHPS - #689: Update poetry to 1.1 - CI: Use poetry 1.1.7 and `install-poetry.py` installer @@ -20,15 +21,18 @@ - #696: Typo fix, thanks @inkch ## tmuxp 1.9.2 (2021-06-17) + - #686: Allow click 8.0.x - Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals ## tmuxp 1.9.1 (2021-06-16) + - libtmux: Update to 0.10.1+ to include `Window.select_window()` fix https://github.com/tmux-python/libtmux/pull/271 ## tmuxp 1.9.0 (2021-06-16) + - libtmux: Update to 0.10.x ## tmuxp 1.8.2 (2021-06-15) diff --git a/docs/examples.md b/docs/examples.md index 83b0c67c57..c4b7e7a467 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -387,7 +387,6 @@ pane during creation. ``` - ## Multi-line commands You can use YAML's multiline syntax to easily split multiple @@ -396,7 +395,7 @@ commands into the same shell command: https://stackoverflow.com/a/21699210 ```{code-block} yaml session_name: my project -shell_command_before: +shell_command_before: - > [ -d `.venv/bin/activate` ] && source .venv/bin/activate && From b612ff51b6f11aa31962bd3a1c839b3bb41feefb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 07:29:22 -0600 Subject: [PATCH 0838/2998] CHANGES: Updates for #726 --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index d945fea808..3df48ab62e 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,16 @@ Inside a project: `tmuxp edit .` +### Removed support +- Python 3.6 support has been removed (#726) + +### Development + +- We are trying `.pre-commit-config.yaml` in pull requests to automate + black, isort and flake8 for those who forget (#726) +- Poetry update 1.1.7 -> 1.1.12 and use new installer URL (#726) +- Black updated 21.9b0 -> 21.12b0 (#726) + ## tmuxp 1.9.3 (2021-10-30) - #700: Add `-h` / `--help` option, thanks @GHPS From 7c78653a2011f2b35afe513d6871cb0a8c6cd727 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 09:08:52 -0600 Subject: [PATCH 0839/2998] chore: myst-parser 0.15.0 -> 0.16.1 See also: https://github.com/executablebooks/MyST-Parser/blob/v0.16.1/CHANGELOG.md --- poetry.lock | 37 ++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0dcfdef636..c4dfb6a58b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -68,7 +68,6 @@ python-versions = ">=3.6.2" [package.dependencies] click = ">=7.1.2" -dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0,<1" platformdirs = ">=2" @@ -194,14 +193,6 @@ sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] -[[package]] -name = "dataclasses" -version = "0.8" -description = "A backport of the dataclasses module for Python 3.6" -category = "dev" -optional = false -python-versions = ">=3.6, <3.7" - [[package]] name = "docutils" version = "0.17.1" @@ -378,18 +369,18 @@ python-versions = "*" [[package]] name = "mdit-py-plugins" -version = "0.2.8" +version = "0.3.0" description = "Collection of plugins for markdown-it-py" category = "dev" optional = false python-versions = "~=3.6" [package.dependencies] -markdown-it-py = ">=1.0,<2.0" +markdown-it-py = ">=1.0.0,<3.0.0" [package.extras] code_style = ["pre-commit (==2.6)"] -rtd = ["myst-parser (==0.14.0a3)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] @@ -402,7 +393,7 @@ python-versions = "*" [[package]] name = "myst-parser" -version = "0.15.2" +version = "0.16.1" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." category = "dev" optional = false @@ -411,8 +402,8 @@ python-versions = ">=3.6" [package.dependencies] docutils = ">=0.15,<0.18" jinja2 = "*" -markdown-it-py = ">=1.0.0,<2.0.0" -mdit-py-plugins = ">=0.2.8,<0.3.0" +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = ">=0.3.0,<0.4.0" pyyaml = "*" sphinx = ">=3.1,<5" @@ -932,8 +923,8 @@ test = [] [metadata] lock-version = "1.1" -python-versions = "^3.6" -content-hash = "b5df7ff7946ac554f1c575e348f0ce3397d31c2343468c2fcb94a10a57badfe6" +python-versions = "^3.7" +content-hash = "59b849a949f196c446234c9bfa095a32ae9bc47be5b42715048d00f615c62b9b" [metadata.files] aafigure = [ @@ -1099,10 +1090,6 @@ cryptography = [ {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, ] -dataclasses = [ - {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, - {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, -] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, @@ -1230,16 +1217,16 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mdit-py-plugins = [ - {file = "mdit-py-plugins-0.2.8.tar.gz", hash = "sha256:5991cef645502e80a5388ec4fc20885d2313d4871e8b8e320ca2de14ac0c015f"}, - {file = "mdit_py_plugins-0.2.8-py3-none-any.whl", hash = "sha256:1833bf738e038e35d89cb3a07eb0d227ed647ce7dd357579b65343740c6d249c"}, + {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, + {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] myst-parser = [ - {file = "myst-parser-0.15.2.tar.gz", hash = "sha256:f7f3b2d62db7655cde658eb5d62b2ec2a4631308137bd8d10f296a40d57bbbeb"}, - {file = "myst_parser-0.15.2-py3-none-any.whl", hash = "sha256:40124b6f27a4c42ac7f06b385e23a9dcd03d84801e9c7130b59b3729a554b1f9"}, + {file = "myst-parser-0.16.1.tar.gz", hash = "sha256:a6473b9735c8c74959b49b36550725464f4aecc4481340c9a5f9153829191f83"}, + {file = "myst_parser-0.16.1-py3-none-any.whl", hash = "sha256:617a90ceda2162ebf81cd13ad17d879bd4f49e7fb5c4f177bb905272555a2268"}, ] packaging = [ {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, diff --git a/pyproject.toml b/pyproject.toml index c1f0d574ac..741b5cc698 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,7 +50,7 @@ alagitpull = "~0.1.0" aafigure = ">=0.6" pillow = "*" sphinx-autodoc-typehints = "^1.12.0" -myst_parser = "^0.15.0" +myst_parser = "~0.16.1" ### Testing ### pytest = "*" From eb18bd247079b1051ae0a9f803c484ea7df24549 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 10:17:57 -0600 Subject: [PATCH 0840/2998] pyproject: Simplify black version --- poetry.lock | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index c4dfb6a58b..00f48b55c0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -924,7 +924,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "59b849a949f196c446234c9bfa095a32ae9bc47be5b42715048d00f615c62b9b" +content-hash = "954308c75784203188b8e63fdcbaeda869b575798c5cb40051727f6e954c5c95" [metadata.files] aafigure = [ diff --git a/pyproject.toml b/pyproject.toml index 741b5cc698..8c47519b5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ codecov = "*" coverage = "*" ### Format ### -black = {version="==21.12b0"} +black = "==21.12b0" isort = "*" ### Lint ### From a8cb052edb858cac322a302572f496802d3550a8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 10:31:05 -0600 Subject: [PATCH 0841/2998] sphinx-autodoc-typehints: 1.12.0 -> 1.14.1 See also: https://github.com/tox-dev/sphinx-autodoc-typehints/blob/1.14.1/CHANGELOG.md --- poetry.lock | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 00f48b55c0..3b8ff138a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -729,17 +729,17 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] name = "sphinx-autodoc-typehints" -version = "1.12.0" +version = "1.14.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -Sphinx = ">=3.0" +Sphinx = ">=4" [package.extras] -test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"] +testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] type_comments = ["typed-ast (>=1.4.0)"] [[package]] @@ -924,7 +924,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "954308c75784203188b8e63fdcbaeda869b575798c5cb40051727f6e954c5c95" +content-hash = "baa3869c19e455ad8ceaf3689505011e8ce72d19da95b4a0251f63d614756080" [metadata.files] aafigure = [ @@ -1403,8 +1403,8 @@ sphinx = [ {file = "Sphinx-4.2.0.tar.gz", hash = "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6"}, ] sphinx-autodoc-typehints = [ - {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, - {file = "sphinx_autodoc_typehints-1.12.0-py3-none-any.whl", hash = "sha256:5e81776ec422dd168d688ab60f034fccfafbcd94329e9537712c93003bddc04a"}, + {file = "sphinx_autodoc_typehints-1.14.1-py3-none-any.whl", hash = "sha256:8b3b7da797fa007f7f39c518879a1bdae3a7dab96e170f4cb5a4b96390238369"}, + {file = "sphinx_autodoc_typehints-1.14.1.tar.gz", hash = "sha256:875de815a1ba609a4c0ebc620faecd8eb57183ba1f4cc6f8abba1790c140e960"}, ] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, diff --git a/pyproject.toml b/pyproject.toml index 8c47519b5c..fc817d162f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ sphinx = "*" alagitpull = "~0.1.0" aafigure = ">=0.6" pillow = "*" -sphinx-autodoc-typehints = "^1.12.0" +sphinx-autodoc-typehints = "~1.14.1" myst_parser = "~0.16.1" ### Testing ### From 6cc64341b8aa6294199dd3ad7afba16e3ac41df2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 10:33:14 -0600 Subject: [PATCH 0842/2998] docs: Bring back sphinx-issues until we deprecate the role Revert "Remove sphinx-issues: unused since we use markdown now" This reverts commit 3b2b8fba11253c7bb194ba8346d76a087081590c. --- docs/conf.py | 1 + poetry.lock | 22 +++++++++++++++++++++- pyproject.toml | 3 ++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 144afc654f..ebd532c8d5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ 'sphinx.ext.linkcode', 'aafig', 'alagitpull', + 'sphinx_issues', 'myst_parser', ] diff --git a/poetry.lock b/poetry.lock index 3b8ff138a5..0c41282a9e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -742,6 +742,22 @@ Sphinx = ">=4" testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] type_comments = ["typed-ast (>=1.4.0)"] +[[package]] +name = "sphinx-issues" +version = "1.2.0" +description = "A Sphinx extension for linking to your project's issue tracker" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = "*" + +[package.extras] +dev = ["pytest", "flake8 (==3.6.0)", "pre-commit (==1.13.0)", "tox", "mock", "flake8-bugbear (==18.8.0)"] +lint = ["flake8 (==3.6.0)", "pre-commit (==1.13.0)", "flake8-bugbear (==18.8.0)"] +tests = ["pytest", "mock"] + [[package]] name = "sphinxcontrib-applehelp" version = "1.0.2" @@ -924,7 +940,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "baa3869c19e455ad8ceaf3689505011e8ce72d19da95b4a0251f63d614756080" +content-hash = "68393ebe3eefa642fa0e8aba2087602539f17fc193df3f3faba9cce6b12d5998" [metadata.files] aafigure = [ @@ -1406,6 +1422,10 @@ sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.14.1-py3-none-any.whl", hash = "sha256:8b3b7da797fa007f7f39c518879a1bdae3a7dab96e170f4cb5a4b96390238369"}, {file = "sphinx_autodoc_typehints-1.14.1.tar.gz", hash = "sha256:875de815a1ba609a4c0ebc620faecd8eb57183ba1f4cc6f8abba1790c140e960"}, ] +sphinx-issues = [ + {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, + {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, +] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, diff --git a/pyproject.toml b/pyproject.toml index fc817d162f..588b73ebf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ colorama = ">=0.3.9" ### Docs ### sphinx = "*" alagitpull = "~0.1.0" +sphinx-issues = "^1.2.0" aafigure = ">=0.6" pillow = "*" sphinx-autodoc-typehints = "~1.14.1" @@ -73,7 +74,7 @@ flake8 = "*" twine = "*" [tool.poetry.extras] -docs = ["sphinx", "myst_parser", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] +docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] From 62c8e7c8fcd2f4d39ff469b7f88110495cff3086 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Jan 2022 15:40:10 -0600 Subject: [PATCH 0843/2998] pyproject(poetry): Include same files as MANIFEST.in --- pyproject.toml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 588b73ebf2..bee7bdffee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,15 @@ classifiers = [ keywords = ["tmux", "session manager", "terminal", "ncurses"] homepage = "http://github.com/tmux-python/tmuxp/" readme = "README.md" +packages = [ + { include = "tmuxp" } +] +include = [ + "CHANGES", ".tmuxp.yaml", + { path = "tests", format = "sdist" }, + { path = "examples", format = "sdist" }, + { path = "docs", format = "sdist" }, +] [tool.poetry.urls] "Bug Tracker" = "https://github.com/tmux-python/tmuxp/issues" From e311b35b02013f0d612be3a324042b62485af810 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 14:02:02 -0600 Subject: [PATCH 0844/2998] pyproject: Fix tool.poetry.include --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index bee7bdffee..4e9f11dfab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,8 @@ packages = [ { include = "tmuxp" } ] include = [ - "CHANGES", ".tmuxp.yaml", + { path = "CHANGES", format = "sdist" }, + { path = ".tmuxp.yaml", format = "sdist" }, { path = "tests", format = "sdist" }, { path = "examples", format = "sdist" }, { path = "docs", format = "sdist" }, From c45de067a0f5e31f2dfd12b2de11cd94c063098f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 19:11:31 +0000 Subject: [PATCH 0845/2998] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - https://github.com/ambv/black → https://github.com/psf/black - https://gitlab.com/pycqa/flake8 → https://github.com/PyCQA/flake8 --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 992c746b2c..66e50ce16d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ repos: -- repo: https://github.com/ambv/black +- repo: https://github.com/psf/black rev: 21.12b0 hooks: - id: black @@ -9,7 +9,7 @@ repos: hooks: - id: isort name: isort (python) -- repo: https://gitlab.com/pycqa/flake8 +- repo: https://github.com/PyCQA/flake8 rev: 4.0.1 hooks: - id: flake8 From 7b1ff21c036dbf820a7baae54307be86ffcbb4f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 20:57:55 -0600 Subject: [PATCH 0846/2998] Remove setup.py file --- setup.py | 64 -------------------------------------------------------- 1 file changed, 64 deletions(-) delete mode 100644 setup.py diff --git a/setup.py b/setup.py deleted file mode 100644 index 5ce56232fe..0000000000 --- a/setup.py +++ /dev/null @@ -1,64 +0,0 @@ -"""tmuxp lives at .""" -import sys - -from setuptools import setup - -about = {} -with open("tmuxp/__about__.py") as fp: - exec(fp.read(), about) - -with open('requirements/base.txt') as f: - install_reqs = [line for line in f.read().split('\n') if line] - -with open('requirements/test.txt') as f: - tests_reqs = [line for line in f.read().split('\n') if line] - -if sys.version_info[0] > 2: - readme = open('README.md', encoding='utf-8').read() -else: - readme = open('README.md').read() - -history = open('CHANGES').read().replace('.. :changelog:', '') - - -setup( - name=about['__title__'], - version=about['__version__'], - url=about['__github__'], - project_urls={ - 'Changes': about['__changes__'], - 'Documentation': about['__docs__'], - 'Code': about['__github__'], - 'Issue tracker': about['__tracker__'], - }, - download_url=about['__pypi__'], - license=about['__license__'], - author=about['__author__'], - author_email=about['__email__'], - description=about['__description__'], - long_description=readme, - long_description_content_type="text/markdown", - packages=['tmuxp'], - include_package_data=True, - install_requires=install_reqs, - tests_require=tests_reqs, - zip_safe=False, - keywords=about['__title__'], - entry_points=dict(console_scripts=['tmuxp=tmuxp:cli.cli']), - classifiers=[ - "Development Status :: 5 - Production/Stable", - "License :: OSI Approved :: MIT License", - "Operating System :: POSIX", - "Operating System :: MacOS :: MacOS X", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "Programming Language :: Python", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Utilities", - "Topic :: System :: Shells", - ], -) From 2cd7a1e46325546c8f97f4d3a524daf643b8e338 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 20:58:46 -0600 Subject: [PATCH 0847/2998] build(deps): remove twine `poetry build` will do this for us --- poetry.lock | 334 +------------------------------------------------ pyproject.toml | 4 - 2 files changed, 1 insertion(+), 337 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0c41282a9e..d6110a4eb8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -85,19 +85,6 @@ jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "bleach" -version = "4.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -packaging = "*" -six = ">=1.9.0" -webencodings = "*" - [[package]] name = "certifi" version = "2021.10.8" @@ -106,17 +93,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "cffi" -version = "1.15.0" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - [[package]] name = "charset-normalizer" version = "2.0.7" @@ -174,25 +150,6 @@ tomli = {version = "*", optional = true, markers = "extra == \"toml\""} [package.extras] toml = ["tomli"] -[[package]] -name = "cryptography" -version = "35.0.0" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] - [[package]] name = "docutils" version = "0.17.1" @@ -268,18 +225,6 @@ pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] -[[package]] -name = "jeepney" -version = "0.7.1" -description = "Low-level, pure Python DBus protocol wrapper." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] - [[package]] name = "jinja2" version = "3.0.2" @@ -305,24 +250,6 @@ python-versions = "*" [package.dependencies] PyYAML = ">=3.13,<6" -[[package]] -name = "keyring" -version = "23.2.1" -description = "Store and access your passwords safely." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = ">=3.6" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] - [[package]] name = "libtmux" version = "0.10.2" @@ -440,17 +367,6 @@ category = "dev" optional = false python-versions = ">=3.6" -[[package]] -name = "pkginfo" -version = "1.7.1" -description = "Query metadatdata from sdists / bdists / installed packages." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -testing = ["nose", "coverage"] - [[package]] name = "platformdirs" version = "2.4.0" @@ -494,14 +410,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -[[package]] -name = "pycparser" -version = "2.20" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "pyflakes" version = "2.4.0" @@ -596,14 +504,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "5.4.1" @@ -612,22 +512,6 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -[[package]] -name = "readme-renderer" -version = "30.0" -description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -bleach = ">=2.1.0" -docutils = ">=0.13.1" -Pygments = ">=2.5.1" - -[package.extras] -md = ["cmarkgfm (>=0.5.0,<0.7.0)"] - [[package]] name = "requests" version = "2.26.0" @@ -646,48 +530,6 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] -[[package]] -name = "requests-toolbelt" -version = "0.9.1" -description = "A utility belt for advanced users of python-requests" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "secretstorage" -version = "3.3.1" -description = "Python bindings to FreeDesktop.org Secret Service API" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "snowballstemmer" version = "2.1.0" @@ -845,41 +687,6 @@ category = "dev" optional = false python-versions = ">=3.6" -[[package]] -name = "tqdm" -version = "4.62.3" -description = "Fast, Extensible Progress Meter" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -telegram = ["requests"] - -[[package]] -name = "twine" -version = "3.4.2" -description = "Collection of utilities for publishing packages on PyPI" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -colorama = ">=0.4.3" -importlib-metadata = ">=3.6" -keyring = ">=15.1" -pkginfo = ">=1.4.2" -readme-renderer = ">=21.0" -requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -rfc3986 = ">=1.4.0" -tqdm = ">=4.14" - [[package]] name = "typed-ast" version = "1.4.3" @@ -909,14 +716,6 @@ brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "zipp" version = "3.6.0" @@ -931,7 +730,6 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [extras] coverage = [] -deploy = [] docs = [] format = [] lint = [] @@ -940,7 +738,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "68393ebe3eefa642fa0e8aba2087602539f17fc193df3f3faba9cce6b12d5998" +content-hash = "545e6a1691fd12d1b0affbf7c408f8701516045554fa092d17c4f167b414f9a2" [metadata.files] aafigure = [ @@ -971,66 +769,10 @@ black = [ {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, ] -bleach = [ - {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, - {file = "bleach-4.1.0.tar.gz", hash = "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da"}, -] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] charset-normalizer = [ {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, @@ -1084,28 +826,6 @@ coverage = [ {file = "coverage-6.1-pp38-none-any.whl", hash = "sha256:fc333e8971e8be0a310e4398426ec2b643a3466092643ade1500bdf72a789e83"}, {file = "coverage-6.1.tar.gz", hash = "sha256:ddc4e200767bdf76182a634fba47343e223492b74d33edc5cf680a50e14f6d09"}, ] -cryptography = [ - {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, - {file = "cryptography-35.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:ced40344e811d6abba00295ced98c01aecf0c2de39481792d87af4fa58b7b4d6"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:54b2605e5475944e2213258e0ab8696f4f357a31371e538ef21e8d61c843c28d"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7b7ceeff114c31f285528ba8b390d3e9cfa2da17b56f11d366769a807f17cbaa"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d69645f535f4b2c722cfb07a8eab916265545b3475fdb34e0be2f4ee8b0b15e"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2d0e0acc20ede0f06ef7aa58546eee96d2592c00f450c9acb89c5879b61992"}, - {file = "cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:07bb7fbfb5de0980590ddfc7f13081520def06dc9ed214000ad4372fb4e3c7f6"}, - {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7eba2cebca600a7806b893cb1d541a6e910afa87e97acf2021a22b32da1df52d"}, - {file = "cryptography-35.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:18d90f4711bf63e2fb21e8c8e51ed8189438e6b35a6d996201ebd98a26abbbe6"}, - {file = "cryptography-35.0.0-cp36-abi3-win32.whl", hash = "sha256:c10c797ac89c746e488d2ee92bd4abd593615694ee17b2500578b63cad6b93a8"}, - {file = "cryptography-35.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:7075b304cd567694dc692ffc9747f3e9cb393cc4aa4fb7b9f3abd6f5c4e43588"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a688ebcd08250eab5bb5bca318cc05a8c66de5e4171a65ca51db6bd753ff8953"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99915d6ab265c22873f1b4d6ea5ef462ef797b4140be4c9d8b179915e0985c6"}, - {file = "cryptography-35.0.0-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:928185a6d1ccdb816e883f56ebe92e975a262d31cc536429041921f8cb5a62fd"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ebeddd119f526bcf323a89f853afb12e225902a24d29b55fe18dd6fcb2838a76"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22a38e96118a4ce3b97509443feace1d1011d0571fae81fc3ad35f25ba3ea999"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb80e8a1f91e4b7ef8b33041591e6d89b2b8e122d787e87eeb2b08da71bb16ad"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:abb5a361d2585bb95012a19ed9b2c8f412c5d723a9836418fab7aaa0243e67d2"}, - {file = "cryptography-35.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1ed82abf16df40a60942a8c211251ae72858b25b7421ce2497c2eb7a1cee817c"}, - {file = "cryptography-35.0.0.tar.gz", hash = "sha256:9933f28f70d0517686bd7de36166dda42094eac49415459d9bdf5e7df3e0086d"}, -] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, @@ -1134,10 +854,6 @@ isort = [ {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] -jeepney = [ - {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, - {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, -] jinja2 = [ {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, @@ -1145,10 +861,6 @@ jinja2 = [ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] -keyring = [ - {file = "keyring-23.2.1-py3-none-any.whl", hash = "sha256:bd2145a237ed70c8ce72978b497619ddfcae640b6dcf494402d5143e37755c6e"}, - {file = "keyring-23.2.1.tar.gz", hash = "sha256:6334aee6073db2fb1f30892697b1730105b5e9a77ce7e61fca6b435225493efe"}, -] libtmux = [ {file = "libtmux-0.10.2-py2.py3-none-any.whl", hash = "sha256:bad47d65f9e948b50697d9ca244bba4b52e5daf13bbc8052d2b017768c893050"}, {file = "libtmux-0.10.2.tar.gz", hash = "sha256:a0e958b85ec14cdaabecfa738a0dd51846f05e5c5e9d6749a2bf5160b9f7e1d2"}, @@ -1295,10 +1007,6 @@ pillow = [ {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, ] -pkginfo = [ - {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, - {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, -] platformdirs = [ {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, @@ -1315,10 +1023,6 @@ pycodestyle = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, @@ -1351,10 +1055,6 @@ pytz = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1386,30 +1086,10 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] -readme-renderer = [ - {file = "readme_renderer-30.0-py2.py3-none-any.whl", hash = "sha256:3286806450d9961d6e3b5f8a59f77e61503799aca5155c8d8d40359b4e1e1adc"}, - {file = "readme_renderer-30.0.tar.gz", hash = "sha256:8299700d7a910c304072a7601eafada6712a5b011a20139417e1b1e9f04645d8"}, -] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -rfc3986 = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] snowballstemmer = [ {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, @@ -1458,14 +1138,6 @@ tomli = [ {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, ] -tqdm = [ - {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, - {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, -] -twine = [ - {file = "twine-3.4.2-py3-none-any.whl", hash = "sha256:087328e9bb405e7ce18527a2dca4042a84c7918658f951110b38bc135acab218"}, - {file = "twine-3.4.2.tar.gz", hash = "sha256:4caec0f1ed78dc4c9b83ad537e453d03ce485725f2aea57f1bb3fdde78dae936"}, -] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, @@ -1507,10 +1179,6 @@ urllib3 = [ {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] zipp = [ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, diff --git a/pyproject.toml b/pyproject.toml index 4e9f11dfab..9a9dd54619 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,13 +80,9 @@ isort = "*" ### Lint ### flake8 = "*" -### Deploy ### -twine = "*" - [tool.poetry.extras] docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] -deploy = ["twine"] From bc03e06f2c2aaf618227aa65f05e89a416900ceb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:03:39 -0600 Subject: [PATCH 0848/2998] build(poetry): Add build-system --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 9a9dd54619..6c0fae2d0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,3 +86,7 @@ test = ["pytest", "pytest-rerunfailures", "pytest-mock"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] + +[build-system] +requires = ["poetry_core>=1.0.0"] +build-backend = "poetry.core.masonry.api" From c35cd61ba6cc9000506179240a0aa842982063b2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:06:46 -0600 Subject: [PATCH 0849/2998] test(tox): Update to support newer tox releases and tox-poetry-installer --- tox.ini | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tox.ini b/tox.ini index cf419f3250..fde499fb2e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,21 @@ [tox] -envlist = py27, py33, py34, py35, py36 +isolated_build = True +envlist = py37, py38, py39, py310 +skip_missing_interpreters = true [testenv] -commands = make test [] +extras = + test + docs +allowlist_externals = + make + poetry +require_poetry = true +install_dev_deps = true +locked_deps = + pytest + pytest-cov +commands = + make test test='{posargs}' +setenv = + PYTHONPATH = {toxinidir} From 4a28a208aa12bd6bbc4ed35714fc71ff1bc015a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:07:11 -0600 Subject: [PATCH 0850/2998] build(tox): Add tox and tox-poetry-installer --- poetry.lock | 642 +++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 4 +- 2 files changed, 631 insertions(+), 15 deletions(-) diff --git a/poetry.lock b/poetry.lock index d6110a4eb8..ef005e73ee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -85,6 +85,36 @@ jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "cachecontrol" +version = "0.12.10" +description = "httplib2 caching for requests" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + [[package]] name = "certifi" version = "2021.10.8" @@ -93,6 +123,17 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + [[package]] name = "charset-normalizer" version = "2.0.7" @@ -104,6 +145,17 @@ python-versions = ">=3.5.0" [package.extras] unicode_backport = ["unicodedata2"] +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + [[package]] name = "click" version = "8.0.3" @@ -116,6 +168,19 @@ python-versions = ">=3.6" colorama = {version = "*", markers = "platform_system == \"Windows\""} importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + [[package]] name = "codecov" version = "2.1.12" @@ -150,6 +215,41 @@ tomli = {version = "*", optional = true, markers = "extra == \"toml\""} [package.extras] toml = ["tomli"] +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "36.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.4" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "docutils" version = "0.17.1" @@ -158,6 +258,18 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "filelock" +version = "3.4.2" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] + [[package]] name = "flake8" version = "4.0.1" @@ -172,6 +284,24 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + [[package]] name = "idna" version = "3.3" @@ -190,19 +320,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.2.0" +version = "1.7.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.6" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -225,6 +354,18 @@ pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +[[package]] +name = "jeepney" +version = "0.7.1" +description = "Low-level, pure Python DBus protocol wrapper." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + [[package]] name = "jinja2" version = "3.0.2" @@ -250,6 +391,24 @@ python-versions = "*" [package.dependencies] PyYAML = ">=3.13,<6" +[[package]] +name = "keyring" +version = "21.8.0" +description = "Store and access your passwords safely." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] + [[package]] name = "libtmux" version = "0.10.2" @@ -258,6 +417,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "markdown-it-py" version = "1.1.0" @@ -310,6 +477,14 @@ code_style = ["pre-commit (==2.6)"] rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +[[package]] +name = "msgpack" +version = "1.0.3" +description = "MessagePack (de)serializer." +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "mypy-extensions" version = "0.4.3" @@ -342,14 +517,22 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "packaging" -version = "21.2" +version = "20.9" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] -pyparsing = ">=2.0.2,<3" +pyparsing = ">=2.0.2" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pathspec" @@ -359,6 +542,17 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pillow" version = "8.4.0" @@ -367,6 +561,17 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "pkginfo" +version = "1.8.2" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +testing = ["coverage", "nose"] + [[package]] name = "platformdirs" version = "2.4.0" @@ -394,6 +599,52 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "poetry" +version = "1.1.12" +description = "Python dependency management and packaging made easy." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} +keyring = {version = ">=21.2.0,<22.0.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.7" +description = "Poetry PEP 517 Build Backend" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "py" version = "1.10.0" @@ -410,6 +661,14 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pyflakes" version = "2.4.0" @@ -426,6 +685,14 @@ category = "dev" optional = false python-versions = ">=3.5" +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "pyparsing" version = "2.4.7" @@ -504,6 +771,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "pyyaml" version = "5.4.1" @@ -530,6 +805,45 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.1" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "shellingham" +version = "1.4.0" +description = "Tool to Detect Surrounding Shell" +category = "dev" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + [[package]] name = "snowballstemmer" version = "2.1.0" @@ -687,6 +1001,53 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "tomlkit" +version = "0.8.0" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "tox" +version = "3.24.5" +description = "tox is a generic virtualenv management and test command line tool" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} +filelock = ">=3.0.0" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +packaging = ">=14" +pluggy = ">=0.12.0" +py = ">=1.4.17" +six = ">=1.14.0" +toml = ">=0.9.4" +virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" + +[package.extras] +docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] +testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "psutil (>=5.6.1)", "pathlib2 (>=2.3.3)"] + +[[package]] +name = "tox-poetry-installer" +version = "0.8.3" +description = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile" +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0.0" + +[package.dependencies] +poetry = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"poetry\""} +poetry-core = ">=1.0.0,<2.0.0" +tox = ">=3.8.0,<4.0.0" + +[package.extras] +poetry = ["poetry (>=1.0.0,<2.0.0)"] + [[package]] name = "typed-ast" version = "1.4.3" @@ -699,7 +1060,7 @@ python-versions = "*" name = "typing-extensions" version = "3.10.0.2" description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -716,6 +1077,33 @@ brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "virtualenv" +version = "20.13.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" +six = ">=1.9.0,<2" + +[package.extras] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "zipp" version = "3.6.0" @@ -738,7 +1126,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "545e6a1691fd12d1b0affbf7c408f8701516045554fa092d17c4f167b414f9a2" +content-hash = "a02a72853636535b93c09b5689b0bb6ddb909affeb34c54fdab770b6e918b112" [metadata.files] aafigure = [ @@ -769,18 +1157,86 @@ black = [ {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, ] +cachecontrol = [ + {file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"}, + {file = "CacheControl-0.12.10.tar.gz", hash = "sha256:d8aca75b82eec92d84b5d6eb8c8f66ea16f09d2adb09dbca27fe2d5fc8d3732d"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] charset-normalizer = [ {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, ] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] click = [ {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, ] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] codecov = [ {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, {file = "codecov-2.1.12-py3.8.egg", hash = "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635"}, @@ -826,14 +1282,52 @@ coverage = [ {file = "coverage-6.1-pp38-none-any.whl", hash = "sha256:fc333e8971e8be0a310e4398426ec2b643a3466092643ade1500bdf72a789e83"}, {file = "coverage-6.1.tar.gz", hash = "sha256:ddc4e200767bdf76182a634fba47343e223492b74d33edc5cf680a50e14f6d09"}, ] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b"}, + {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:2d87cdcb378d3cfed944dac30596da1968f88fb96d7fc34fdae30a99054b2e31"}, + {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74d6c7e80609c0f4c2434b97b80c7f8fdfaa072ca4baab7e239a15d6d70ed73a"}, + {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:6c0c021f35b421ebf5976abf2daacc47e235f8b6082d3396a2fe3ccd537ab173"}, + {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59a9d55027a8b88fd9fd2826c4392bd487d74bf628bb9d39beecc62a644c12"}, + {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a817b961b46894c5ca8a66b599c745b9a3d9f822725221f0e0fe49dc043a3a3"}, + {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:94ae132f0e40fe48f310bba63f477f14a43116f05ddb69d6fa31e93f05848ae2"}, + {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7be0eec337359c155df191d6ae00a5e8bbb63933883f4f5dffc439dac5348c3f"}, + {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e0344c14c9cb89e76eb6a060e67980c9e35b3f36691e15e1b7a9e58a0a6c6dc3"}, + {file = "cryptography-36.0.1-cp36-abi3-win32.whl", hash = "sha256:4caa4b893d8fad33cf1964d3e51842cd78ba87401ab1d2e44556826df849a8ca"}, + {file = "cryptography-36.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:391432971a66cfaf94b21c24ab465a4cc3e8bf4a939c1ca5c3e3a6e0abebdbcf"}, + {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb5829d027ff82aa872d76158919045a7c1e91fbf241aec32cb07956e9ebd3c9"}, + {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc15b1c22e55c4d5566e3ca4db8689470a0ca2babef8e3a9ee057a8b82ce4b1"}, + {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:596f3cd67e1b950bc372c33f1a28a0692080625592ea6392987dba7f09f17a94"}, + {file = "cryptography-36.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:30ee1eb3ebe1644d1c3f183d115a8c04e4e603ed6ce8e394ed39eea4a98469ac"}, + {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec63da4e7e4a5f924b90af42eddf20b698a70e58d86a72d943857c4c6045b3ee"}, + {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca238ceb7ba0bdf6ce88c1b74a87bffcee5afbfa1e41e173b1ceb095b39add46"}, + {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:ca28641954f767f9822c24e927ad894d45d5a1e501767599647259cbf030b903"}, + {file = "cryptography-36.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:39bdf8e70eee6b1c7b289ec6e5d84d49a6bfa11f8b8646b5b3dfe41219153316"}, + {file = "cryptography-36.0.1.tar.gz", hash = "sha256:53e5c1dc3d7a953de055d77bef2ff607ceef7a2aac0353b5d630ab67f7423638"}, +] +distlib = [ + {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, + {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, +] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] +filelock = [ + {file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"}, + {file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"}, +] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -843,8 +1337,8 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -854,6 +1348,10 @@ isort = [ {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] +jeepney = [ + {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, + {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, +] jinja2 = [ {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, @@ -861,10 +1359,18 @@ jinja2 = [ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] +keyring = [ + {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, + {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, +] libtmux = [ {file = "libtmux-0.10.2-py2.py3-none-any.whl", hash = "sha256:bad47d65f9e948b50697d9ca244bba4b52e5daf13bbc8052d2b017768c893050"}, {file = "libtmux-0.10.2.tar.gz", hash = "sha256:a0e958b85ec14cdaabecfa738a0dd51846f05e5c5e9d6749a2bf5160b9f7e1d2"}, ] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] markdown-it-py = [ {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, @@ -948,6 +1454,42 @@ mdit-py-plugins = [ {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, ] +msgpack = [ + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, + {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, + {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, + {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, + {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, + {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, + {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, + {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, + {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, + {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, + {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, + {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, + {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, + {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, + {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, + {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, + {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, + {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, + {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, + {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, + {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, + {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, +] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -957,13 +1499,21 @@ myst-parser = [ {file = "myst_parser-0.16.1-py3-none-any.whl", hash = "sha256:617a90ceda2162ebf81cd13ad17d879bd4f49e7fb5c4f177bb905272555a2268"}, ] packaging = [ - {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, - {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] pillow = [ {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, @@ -1007,6 +1557,10 @@ pillow = [ {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, ] +pkginfo = [ + {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, + {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, +] platformdirs = [ {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, @@ -1015,6 +1569,18 @@ pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] +poetry = [ + {file = "poetry-1.1.12-py2.py3-none-any.whl", hash = "sha256:3d4dc5d4c7171fb251b32e49a98cecbe2795d5e681ecee2297e2b2d2ccd671fc"}, + {file = "poetry-1.1.12.tar.gz", hash = "sha256:5c66e2357fe37b552462a88b7d31bfa2ed8e84172208becd666933c776252567"}, +] +poetry-core = [ + {file = "poetry-core-1.0.7.tar.gz", hash = "sha256:98c11c755a16ef6c5673c22ca94a3802a7df4746a0853a70b6fae8b9f5cac206"}, + {file = "poetry_core-1.0.7-py2.py3-none-any.whl", hash = "sha256:4f8a7f5390d772f42c4c4c3f188e6424b802cb4b57466c6633a1b9ac36f18a43"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] py = [ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, @@ -1023,6 +1589,10 @@ pycodestyle = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, @@ -1031,6 +1601,10 @@ pygments = [ {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, @@ -1055,6 +1629,10 @@ pytz = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1090,6 +1668,22 @@ requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, + {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, +] +shellingham = [ + {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, + {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] snowballstemmer = [ {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, @@ -1138,6 +1732,18 @@ tomli = [ {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, ] +tomlkit = [ + {file = "tomlkit-0.8.0-py3-none-any.whl", hash = "sha256:b824e3466f1d475b2b5f1c392954c6cb7ea04d64354ff7300dc7c14257dc85db"}, + {file = "tomlkit-0.8.0.tar.gz", hash = "sha256:29e84a855712dfe0e88a48f6d05c21118dbafb283bb2eed614d46f80deb8e9a1"}, +] +tox = [ + {file = "tox-3.24.5-py2.py3-none-any.whl", hash = "sha256:be3362472a33094bce26727f5f771ca0facf6dafa217f65875314e9a6600c95c"}, + {file = "tox-3.24.5.tar.gz", hash = "sha256:67e0e32c90e278251fea45b696d0fef3879089ccbe979b0c556d35d5a70e2993"}, +] +tox-poetry-installer = [ + {file = "tox-poetry-installer-0.8.3.tar.gz", hash = "sha256:04b6c7d368b67ef3cc4409e275b26eef3564a6487259bd9cc671587f5aaf4b4f"}, + {file = "tox_poetry_installer-0.8.3-py3-none-any.whl", hash = "sha256:4cefad997ef5b8533811ceb5308b5cb6e6d6997af377c0b7d03b2dd43179c235"}, +] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, @@ -1179,6 +1785,14 @@ urllib3 = [ {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] +virtualenv = [ + {file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"}, + {file = "virtualenv-20.13.0.tar.gz", hash = "sha256:d8458cf8d59d0ea495ad9b34c2599487f8a7772d796f9910858376d1600dd2dd"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] zipp = [ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, diff --git a/pyproject.toml b/pyproject.toml index 6c0fae2d0a..e70c60d5ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,6 +68,8 @@ pytest = "*" pytest-rerunfailures = "*" pytest-mock = "*" pytest-cov = "*" +tox = {version = "^3.24.5", extras = ["test"]} +tox-poetry-installer = {extras = ["poetry"], version = "^0.8.3"} ### Coverage ### codecov = "*" @@ -82,7 +84,7 @@ flake8 = "*" [tool.poetry.extras] docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] -test = ["pytest", "pytest-rerunfailures", "pytest-mock"] +test = ["pytest", "pytest-rerunfailures", "pytest-mock", "tox", "tox-poetry-installer"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] From ddebf3c9f1f51eb24c924073bcca5adfe6335a2d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:15:11 -0600 Subject: [PATCH 0851/2998] docs(CHANGES): Update to reflect packaging changes --- CHANGES | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGES b/CHANGES index 3df48ab62e..c15f969bc5 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,21 @@ - _Insert changes/features/fixes for next release here_ +#### Packaging + +- `poetry build` used to package in place of `python setup.py build` (#729) + + Package maintainers: If you run into any issues at + [#625](https://github.com/tmux-python/tmuxp/issues/625). + + Additionally, `libtmux` has been pinned to a similar release at + [0.10.3](https://pypi.org/project/libtmux/0.10.3/) which has used the new + build process. + +- `poetry publish` instead of `twine upload dist/*` (#729) + + Similar to the above, reach out to the #625 issue if you bump into problems. + #### What's new - `tmuxp edit` for configuration changes (#707, @GlebPoljakov) @@ -13,6 +28,7 @@ Inside a project: `tmuxp edit .` ### Removed support + - Python 3.6 support has been removed (#726) ### Development From 11abdd02701cd12184a5e8da7b4d26e45a44d8bb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:16:16 -0600 Subject: [PATCH 0852/2998] build(pyproject): .tmuxp-before-script.sh --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index e70c60d5ff..38dd078173 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ packages = [ include = [ { path = "CHANGES", format = "sdist" }, { path = ".tmuxp.yaml", format = "sdist" }, + { path = ".tmuxp-before-script.sh", format = "sdist" }, { path = "tests", format = "sdist" }, { path = "examples", format = "sdist" }, { path = "docs", format = "sdist" }, From 9bce560b9511136907fe64d72bea2f40edb7f32a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:17:11 -0600 Subject: [PATCH 0853/2998] build(libtmux): Update 0.10.2 -> 0.10.3 (built with `poetry build`) libtmux 0.10.3 is the first version packaged with `poetry build` and published via `poetry publish` See also: - https://github.com/tmux-python/libtmux/blob/v0.10.3/CHANGES - https://libtmux.git-pull.com/history.html#libtmux-0-10-3-2022-01-10 --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index ef005e73ee..ac31b7d79f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -411,11 +411,11 @@ testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake [[package]] name = "libtmux" -version = "0.10.2" +version = "0.10.3" description = "scripting library / orm for tmux" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7,<4.0" [[package]] name = "lockfile" @@ -1126,7 +1126,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "a02a72853636535b93c09b5689b0bb6ddb909affeb34c54fdab770b6e918b112" +content-hash = "37cd5845ee3010348472d35eabf63e6711fbd6662b9f0a640a91d8f801a3f817" [metadata.files] aafigure = [ @@ -1364,8 +1364,8 @@ keyring = [ {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, ] libtmux = [ - {file = "libtmux-0.10.2-py2.py3-none-any.whl", hash = "sha256:bad47d65f9e948b50697d9ca244bba4b52e5daf13bbc8052d2b017768c893050"}, - {file = "libtmux-0.10.2.tar.gz", hash = "sha256:a0e958b85ec14cdaabecfa738a0dd51846f05e5c5e9d6749a2bf5160b9f7e1d2"}, + {file = "libtmux-0.10.3-py3-none-any.whl", hash = "sha256:ec20f1d9c265ceb2846ef98480c5279985f23eb43fe8f9eded79c03e9d7ae254"}, + {file = "libtmux-0.10.3.tar.gz", hash = "sha256:c7fbd837f0a9e4d33a157523e4ca6ef95e80256842e094ffd766c3dbd78d1957"}, ] lockfile = [ {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, diff --git a/pyproject.toml b/pyproject.toml index 38dd078173..d9d80d56be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.10.2" +libtmux = "~0.10.3" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From f785d744f8b9e9d411c17d36856be8b4763b18f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:31:33 -0600 Subject: [PATCH 0854/2998] build(deps): Update lockfile --- poetry.lock | 360 +++++++++++++++++++++++++++------------------------- 1 file changed, 185 insertions(+), 175 deletions(-) diff --git a/poetry.lock b/poetry.lock index ac31b7d79f..268ec22204 100644 --- a/poetry.lock +++ b/poetry.lock @@ -35,17 +35,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "21.2.0" +version = "21.4.0" description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] [[package]] name = "babel" @@ -136,7 +136,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.7" +version = "2.0.10" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -203,7 +203,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.1" +version = "6.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -312,7 +312,7 @@ python-versions = ">=3.5" [[package]] name = "imagesize" -version = "1.2.0" +version = "1.3.0" description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" optional = false @@ -343,16 +343,17 @@ python-versions = "*" [[package]] name = "isort" -version = "5.8.0" +version = "5.10.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6.1,<4.0" [package.extras] pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] [[package]] name = "jeepney" @@ -368,7 +369,7 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.2" +version = "3.0.3" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -427,7 +428,7 @@ python-versions = "*" [[package]] name = "markdown-it-py" -version = "1.1.0" +version = "2.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false @@ -435,15 +436,17 @@ python-versions = "~=3.6" [package.dependencies] attrs = ">=19,<22" +mdurl = ">=0.1,<1.0" typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] -testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,<4.0)", "pytest-cov", "pytest-regressions"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -477,6 +480,14 @@ code_style = ["pre-commit (==2.6)"] rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +[[package]] +name = "mdurl" +version = "0.1.0" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "msgpack" version = "1.0.3" @@ -555,11 +566,11 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "8.4.0" +version = "9.0.0" description = "Python Imaging Library (Fork)" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "pkginfo" @@ -574,11 +585,11 @@ testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.4.0" +version = "2.4.1" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] @@ -647,11 +658,11 @@ python-versions = "*" [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycodestyle" @@ -679,7 +690,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.10.0" +version = "2.11.2" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -695,11 +706,14 @@ python-versions = "*" [[package]] name = "pyparsing" -version = "2.4.7" +version = "3.0.6" description = "Python parsing module" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" @@ -789,7 +803,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "requests" -version = "2.26.0" +version = "2.27.1" description = "Python HTTP for Humans." category = "dev" optional = false @@ -846,7 +860,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "snowballstemmer" -version = "2.1.0" +version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." category = "dev" optional = false @@ -854,7 +868,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.2.0" +version = "4.3.2" description = "Python documentation generator" category = "dev" optional = false @@ -880,7 +894,7 @@ sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.920)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] @@ -995,7 +1009,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.2" +version = "1.2.3" description = "A lil' TOML parser" category = "dev" optional = false @@ -1050,23 +1064,23 @@ poetry = ["poetry (>=1.0.0,<2.0.0)"] [[package]] name = "typed-ast" -version = "1.4.3" +version = "1.5.1" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" +version = "4.0.1" +description = "Backported and Experimental Type Hints for Python 3.6+" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "urllib3" -version = "1.26.7" +version = "1.26.8" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false @@ -1106,15 +1120,15 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.6.0" +version = "3.7.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] coverage = [] @@ -1146,8 +1160,8 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] babel = [ {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, @@ -1222,8 +1236,8 @@ cffi = [ {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, - {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, + {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, + {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, ] cleo = [ {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, @@ -1247,40 +1261,53 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a518d13a3cd905d89891123d765e15e61538849e2be0ee5f85ad2bdb3fd91cc9"}, - {file = "coverage-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef73a4e074fb0b470eb64a552d460394630ccaab73b8a7b2f523514f7df2b805"}, - {file = "coverage-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cd585d280e1199290e8e0dca6b297e021cfbcade6759ad56146257a53b90c5b0"}, - {file = "coverage-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f6f14b05b5c0456eb6ab82b6acd937b8118eca14ec621bd1729ca33f251d9ea4"}, - {file = "coverage-6.1-cp310-cp310-win32.whl", hash = "sha256:42f65145acfbbac227b862fe509d0353861d70c455f91a14ace52fe378cdc085"}, - {file = "coverage-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:49f3434739e443771171e4d6c0e7df12cc83d7f00beb7b5d6b3a655a873c51ab"}, - {file = "coverage-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9d01b0d67ab782efa3c940a8ea1fc3ccb7ca0fc24a187b6d772bf6a45e0efb2f"}, - {file = "coverage-6.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32334063e661da80ebc1a720b829228e918d1f24b947afebbe84edcff157c39"}, - {file = "coverage-6.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45ca96310fda694eb9ae1cdee0355cf66d2acc828678513b331172061289c17a"}, - {file = "coverage-6.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c0d8e633cec3ac7a32f676e8b777a56f0ba4a954aecb0634301fdb85c40a845"}, - {file = "coverage-6.1-cp36-cp36m-win32.whl", hash = "sha256:0c471fdc5b9db0229fb2477ac445a886c7a6d86029534e29f0dc65f517c8e704"}, - {file = "coverage-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:422ab4cf66a7ed0c119ce8db64c99c6667eda53acaa63a4c178dbac4100f57b6"}, - {file = "coverage-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6130f0f95461fc46884ce73269fc72028e139359a0583a12f7510a45a081faa3"}, - {file = "coverage-6.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71a8baf10a755c35b7015d524279ebec9b801bc46c821e344914be0ad6c73bfc"}, - {file = "coverage-6.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:be883832d1ddc827c742928f86b861b99ee38ae17cd3833172959d18ff437b6a"}, - {file = "coverage-6.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0ff19756ee78fe2377eb5126a196fe84643f149f840ea7d74b4c08686f5484e4"}, - {file = "coverage-6.1-cp37-cp37m-win32.whl", hash = "sha256:8476aa688efcc4521264f12e6e74c2587cd4623429c8f5aab613e0b46de41283"}, - {file = "coverage-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:58e84430bf1b2904b96bcee9ba7f736fb7efb84f5bd7c7b5b3df54db12476360"}, - {file = "coverage-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2987506781355303506660cb1917b0dcd02a76f7873db604a415aadb2193bd96"}, - {file = "coverage-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f122138bfc6d45bc1c770a9987ce28c89e874638e423d25dff5d40e66fc02878"}, - {file = "coverage-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:749eaf8cf5d03695359ff08ea8d01ac42381069baf42d991a36ba30cc34da87a"}, - {file = "coverage-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b10b845dbb809056c8c96c02a4d1644084fcb7c3d405d1262eb6dfaab89650b1"}, - {file = "coverage-6.1-cp38-cp38-win32.whl", hash = "sha256:dd0e050a0dc5101dbf1e8f87d7362d65404f8b29d25f22eda0418bb7b31c6954"}, - {file = "coverage-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:0fb10cafd85a931837be9d18420c80d16cbb13d1d9a78d78dee932af2dd55135"}, - {file = "coverage-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ac1d0cacaf12168d53bfcd390b69b9548919c6a5829cb1fd2f28f122ce5c83c"}, - {file = "coverage-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f5383bb5912817e05d1f411279b34d8bde518fe8dce6f3f53a8731dca4f133e"}, - {file = "coverage-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9d4560814fc741f571eb99996e6ef0ba4cd70a8e3c2d98a526c1a2ce13a7e982"}, - {file = "coverage-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eca26715688fdb7ec73d316d89687ac9bf4cdd7df0ceb8b22a3a2928bf8e7ece"}, - {file = "coverage-6.1-cp39-cp39-win32.whl", hash = "sha256:870f8ea4bbc79bdd0dbcf7367f89ee4cfd3f278063a0e16bd78baa05c0541fc9"}, - {file = "coverage-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:68dce32c064d8597f91d5d12a7a91a92ce0a37d1a024108d25834bd0ea905e11"}, - {file = "coverage-6.1-pp36-none-any.whl", hash = "sha256:dc5aec152c59f8db9c723e2f3c98d64b1ead814f0a9c2c4e0b998f0ae7338c30"}, - {file = "coverage-6.1-pp37-none-any.whl", hash = "sha256:34e1f49e25336840857c1c1593764342316d0b1ce5a8d74c314d4883468f9dfe"}, - {file = "coverage-6.1-pp38-none-any.whl", hash = "sha256:fc333e8971e8be0a310e4398426ec2b643a3466092643ade1500bdf72a789e83"}, - {file = "coverage-6.1.tar.gz", hash = "sha256:ddc4e200767bdf76182a634fba47343e223492b74d33edc5cf680a50e14f6d09"}, + {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, + {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, + {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, + {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, + {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, + {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, + {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, + {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, + {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, + {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, + {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, + {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, + {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, + {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, + {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, + {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, + {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, + {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, + {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, + {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, ] crashtest = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, @@ -1333,8 +1360,8 @@ idna = [ {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, + {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, + {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, ] importlib-metadata = [ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, @@ -1345,16 +1372,16 @@ iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ - {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, - {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] jeepney = [ {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, - {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, ] kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, @@ -1372,8 +1399,8 @@ lockfile = [ {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, ] markdown-it-py = [ - {file = "markdown-it-py-1.1.0.tar.gz", hash = "sha256:36be6bb3ad987bfdb839f5ba78ddf094552ca38ccbd784ae4f74a4e1419fc6e3"}, - {file = "markdown_it_py-1.1.0-py3-none-any.whl", hash = "sha256:98080fc0bc34c4f2bcf0846a096a9429acbd9d5d8e67ed34026c03c61c464389"}, + {file = "markdown-it-py-2.0.0.tar.gz", hash = "sha256:c138a596f6c9988e0b5fa3299bc38ffa76c75076bc178e8dfac40a84343c7022"}, + {file = "markdown_it_py-2.0.0-py3-none-any.whl", hash = "sha256:15cc69c5b7c493ba8603722b710e39ce3fab2961994179fb4fa1c99b070d2059"}, ] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, @@ -1454,6 +1481,10 @@ mdit-py-plugins = [ {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, ] +mdurl = [ + {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, + {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, +] msgpack = [ {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, @@ -1515,55 +1546,46 @@ pexpect = [ {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pillow = [ - {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, - {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, - {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, - {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, - {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, - {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, - {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, - {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, - {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, - {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, - {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, - {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, - {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, - {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, - {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, - {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, - {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, - {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, - {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, + {file = "Pillow-9.0.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:113723312215b25c22df1fdf0e2da7a3b9c357a7d24a93ebbe80bfda4f37a8d4"}, + {file = "Pillow-9.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb47a548cea95b86494a26c89d153fd31122ed65255db5dcbc421a2d28eb3379"}, + {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31b265496e603985fad54d52d11970383e317d11e18e856971bdbb86af7242a4"}, + {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d154ed971a4cc04b93a6d5b47f37948d1f621f25de3e8fa0c26b2d44f24e3e8f"}, + {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fe92813d208ce8aa7d76da878bdc84b90809f79ccbad2a288e9bcbeac1d9bd"}, + {file = "Pillow-9.0.0-cp310-cp310-win32.whl", hash = "sha256:d5dcea1387331c905405b09cdbfb34611050cc52c865d71f2362f354faee1e9f"}, + {file = "Pillow-9.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:52abae4c96b5da630a8b4247de5428f593465291e5b239f3f843a911a3cf0105"}, + {file = "Pillow-9.0.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:72c3110228944019e5f27232296c5923398496b28be42535e3b2dc7297b6e8b6"}, + {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b6d21771da41497b81652d44191489296555b761684f82b7b544c49989110f"}, + {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72f649d93d4cc4d8cf79c91ebc25137c358718ad75f99e99e043325ea7d56100"}, + {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aaf07085c756f6cb1c692ee0d5a86c531703b6e8c9cae581b31b562c16b98ce"}, + {file = "Pillow-9.0.0-cp37-cp37m-win32.whl", hash = "sha256:03b27b197deb4ee400ed57d8d4e572d2d8d80f825b6634daf6e2c18c3c6ccfa6"}, + {file = "Pillow-9.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a09a9d4ec2b7887f7a088bbaacfd5c07160e746e3d47ec5e8050ae3b2a229e9f"}, + {file = "Pillow-9.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:490e52e99224858f154975db61c060686df8a6b3f0212a678e5d2e2ce24675c9"}, + {file = "Pillow-9.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:500d397ddf4bbf2ca42e198399ac13e7841956c72645513e8ddf243b31ad2128"}, + {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ebd8b9137630a7bbbff8c4b31e774ff05bbb90f7911d93ea2c9371e41039b52"}, + {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd0e5062f11cb3e730450a7d9f323f4051b532781026395c4323b8ad055523c4"}, + {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f3b4522148586d35e78313db4db0df4b759ddd7649ef70002b6c3767d0fdeb7"}, + {file = "Pillow-9.0.0-cp38-cp38-win32.whl", hash = "sha256:0b281fcadbb688607ea6ece7649c5d59d4bbd574e90db6cd030e9e85bde9fecc"}, + {file = "Pillow-9.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5050d681bcf5c9f2570b93bee5d3ec8ae4cf23158812f91ed57f7126df91762"}, + {file = "Pillow-9.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:c2067b3bb0781f14059b112c9da5a91c80a600a97915b4f48b37f197895dd925"}, + {file = "Pillow-9.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d16b6196fb7a54aff6b5e3ecd00f7c0bab1b56eee39214b2b223a9d938c50af"}, + {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98cb63ca63cb61f594511c06218ab4394bf80388b3d66cd61d0b1f63ee0ea69f"}, + {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc462d24500ba707e9cbdef436c16e5c8cbf29908278af053008d9f689f56dee"}, + {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3586e12d874ce2f1bc875a3ffba98732ebb12e18fb6d97be482bd62b56803281"}, + {file = "Pillow-9.0.0-cp39-cp39-win32.whl", hash = "sha256:68e06f8b2248f6dc8b899c3e7ecf02c9f413aab622f4d6190df53a78b93d97a5"}, + {file = "Pillow-9.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:6579f9ba84a3d4f1807c4aab4be06f373017fc65fff43498885ac50a9b47a553"}, + {file = "Pillow-9.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:47f5cf60bcb9fbc46011f75c9b45a8b5ad077ca352a78185bd3e7f1d294b98bb"}, + {file = "Pillow-9.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fd8053e1f8ff1844419842fd474fc359676b2e2a2b66b11cc59f4fa0a301315"}, + {file = "Pillow-9.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c5439bfb35a89cac50e81c751317faea647b9a3ec11c039900cd6915831064d"}, + {file = "Pillow-9.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95545137fc56ce8c10de646074d242001a112a92de169986abd8c88c27566a05"}, + {file = "Pillow-9.0.0.tar.gz", hash = "sha256:ee6e2963e92762923956fe5d3479b1fdc3b76c83f290aad131a2f98c3df0593e"}, ] pkginfo = [ {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, ] platformdirs = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, + {file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"}, + {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, @@ -1582,8 +1604,8 @@ ptyprocess = [ {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycodestyle = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, @@ -1598,16 +1620,16 @@ pyflakes = [ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ - {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, - {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, + {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, + {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, ] pylev = [ {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, @@ -1665,8 +1687,8 @@ pyyaml = [ {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, @@ -1685,12 +1707,12 @@ six = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] sphinx = [ - {file = "Sphinx-4.2.0-py3-none-any.whl", hash = "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"}, - {file = "Sphinx-4.2.0.tar.gz", hash = "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6"}, + {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, + {file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"}, ] sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.14.1-py3-none-any.whl", hash = "sha256:8b3b7da797fa007f7f39c518879a1bdae3a7dab96e170f4cb5a4b96390238369"}, @@ -1729,8 +1751,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, - {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, + {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, + {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, ] tomlkit = [ {file = "tomlkit-0.8.0-py3-none-any.whl", hash = "sha256:b824e3466f1d475b2b5f1c392954c6cb7ea04d64354ff7300dc7c14257dc85db"}, @@ -1745,45 +1767,33 @@ tox-poetry-installer = [ {file = "tox_poetry_installer-0.8.3-py3-none-any.whl", hash = "sha256:4cefad997ef5b8533811ceb5308b5cb6e6d6997af377c0b7d03b2dd43179c235"}, ] typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, + {file = "typed_ast-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212"}, + {file = "typed_ast-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631"}, + {file = "typed_ast-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb"}, + {file = "typed_ast-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08"}, + {file = "typed_ast-1.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e"}, + {file = "typed_ast-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695"}, + {file = "typed_ast-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30"}, + {file = "typed_ast-1.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f"}, + {file = "typed_ast-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471"}, + {file = "typed_ast-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb"}, + {file = "typed_ast-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb"}, + {file = "typed_ast-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af"}, + {file = "typed_ast-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d"}, + {file = "typed_ast-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a"}, + {file = "typed_ast-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32"}, + {file = "typed_ast-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4"}, + {file = "typed_ast-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d"}, + {file = "typed_ast-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775"}, + {file = "typed_ast-1.5.1.tar.gz", hash = "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, + {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, + {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, ] urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, + {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, + {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, ] virtualenv = [ {file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"}, @@ -1794,6 +1804,6 @@ webencodings = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] zipp = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, + {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, + {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, ] From 114b21489eb3078c9cbf3d66757dc8377b9a9599 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 21:32:13 -0600 Subject: [PATCH 0855/2998] build: Remove requirements.txt files per #729 --- MANIFEST.in | 1 - docs/requirements.txt | 1 - requirements/base.txt | 4 ---- requirements/dev.txt | 3 --- requirements/doc.txt | 7 ------- requirements/test.txt | 5 ----- 6 files changed, 21 deletions(-) delete mode 100644 docs/requirements.txt delete mode 100644 requirements/base.txt delete mode 100644 requirements/dev.txt delete mode 100644 requirements/doc.txt delete mode 100644 requirements/test.txt diff --git a/MANIFEST.in b/MANIFEST.in index 59830093c7..3ef459d5af 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,4 @@ include README.md LICENSE CHANGES pyproject.toml .tmuxp.yaml -include requirements/*.txt recursive-include docs *.md recursive-include tests *.py *.yaml *.json *.sh recursive-include examples *.yaml *.json diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 04b4dec7d9..0000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --r ../requirements/doc.txt diff --git a/requirements/base.txt b/requirements/base.txt deleted file mode 100644 index 6defac5d37..0000000000 --- a/requirements/base.txt +++ /dev/null @@ -1,4 +0,0 @@ -kaptan>=0.5.10 -libtmux>=0.10.2,<0.11 -click>=7,<8.1 -colorama>=0.3.9 diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index 1b6470493e..0000000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,3 +0,0 @@ -isort -flake8 -twine diff --git a/requirements/doc.txt b/requirements/doc.txt deleted file mode 100644 index d5f02629f7..0000000000 --- a/requirements/doc.txt +++ /dev/null @@ -1,7 +0,0 @@ --r ./base.txt -docutils>=0.14 -sphinx>=4.0.0 -alagitpull>=0.1.0 -sphinx_issues==1.2.0 -aafigure>=0.6 -doc8>=0.8.0 diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index ecaefb1b8b..0000000000 --- a/requirements/test.txt +++ /dev/null @@ -1,5 +0,0 @@ -pytest -pytest-rerunfailures -pytest-cov -coverage -codecov From aadb4399d95f066d3b5ab6d83dff58dcb5c9b2c8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 22:00:57 -0600 Subject: [PATCH 0856/2998] Tag v1.9.4 - the one packaged with poetry --- CHANGES | 2 ++ pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index c15f969bc5..35e1b571db 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ - _Insert changes/features/fixes for next release here_ +## tmuxp 1.9.4 (2022-01-10) + #### Packaging - `poetry build` used to package in place of `python setup.py build` (#729) diff --git a/pyproject.toml b/pyproject.toml index d9d80d56be..228a1ae7d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "tmuxp" -version = "1.9.3" +version = "1.9.4" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 24fae2a2be..284692e9b3 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = 'tmuxp' __package_name__ = 'tmuxp' -__version__ = '1.9.3' +__version__ = '1.9.4' __description__ = 'tmux session manager' __email__ = 'tony@git-pull.com' __author__ = 'Tony Narlock' From 4913143d7b6d8d81ed591236d0312ea159c66623 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Jan 2022 22:15:16 -0600 Subject: [PATCH 0857/2998] docs(CHANGES): Update copy --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 35e1b571db..d3dfa32267 100644 --- a/CHANGES +++ b/CHANGES @@ -10,8 +10,8 @@ - `poetry build` used to package in place of `python setup.py build` (#729) - Package maintainers: If you run into any issues at - [#625](https://github.com/tmux-python/tmuxp/issues/625). + Package maintainers: If you run into any issues check in at + [#625](https://github.com/tmux-python/tmuxp/issues/625) and file an issue. Additionally, `libtmux` has been pinned to a similar release at [0.10.3](https://pypi.org/project/libtmux/0.10.3/) which has used the new From c86036a19e740a48d9624c62177819b598f2f1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=98=82?= Date: Sat, 29 Jan 2022 20:20:40 +0800 Subject: [PATCH 0858/2998] fix: `to_filetype` not defined (#725) * Update tmuxp/cli.py * add some test: convert * style: tmuxp/cli.py: width too long (96 > 88) * Update tests/test_cli.py --- tests/test_cli.py | 38 +++++++++++++++++++++++++++++++++----- tmuxp/cli.py | 9 +++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 40dc72fab1..cf0ec046b4 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -728,15 +728,18 @@ def test_shell_plus( (['convert', '.']), (['convert', '.tmuxp.yaml']), (['convert', '.tmuxp.yaml', '-y']), + (['convert', '.tmuxp.yml']), + (['convert', '.tmuxp.yml', '-y']), ], ) def test_convert(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join('.tmuxp.yaml').write( - """ -session_name: hello - """ - ) + filename = cli_args[1] + if filename == '.': + filename = '.tmuxp.yaml' + file_ext = filename.rsplit('.', 1)[-1] + assert file_ext in ['yaml', 'yml'], file_ext + tmpdir.join(filename).write('\nsession_name: hello\n') tmpdir.join('.oh-my-zsh').ensure(dir=True) monkeypatch.setenv('HOME', str(tmpdir)) @@ -753,6 +756,31 @@ def test_convert(cli_args, tmpdir, monkeypatch): ) +@pytest.mark.parametrize( + "cli_args", + [ + (['convert', '.']), + (['convert', '.tmuxp.json']), + (['convert', '.tmuxp.json', '-y']), + ], +) +def test_convert_json(cli_args, tmpdir, monkeypatch): + # create dummy tmuxp yaml so we don't get yelled at + tmpdir.join('.tmuxp.json').write('{"session_name": "hello"}') + tmpdir.join('.oh-my-zsh').ensure(dir=True) + monkeypatch.setenv('HOME', str(tmpdir)) + + with tmpdir.as_cwd(): + runner = CliRunner() + + # If autoconfirm (-y) no need to prompt y + input_args = 'y\ny\n' if '-y' not in cli_args else '' + + runner.invoke(cli.cli, cli_args, input=input_args) + assert tmpdir.join('.tmuxp.yaml').check() + assert tmpdir.join('.tmuxp.yaml').open().read() == 'session_name: hello\n' + + @pytest.mark.parametrize("cli_args", [(['import'])]) def test_import(cli_args, monkeypatch): runner = CliRunner() diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 811086698d..201d72282e 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -1186,10 +1186,15 @@ def command_convert(confirmed, config): """Convert a tmuxp config between JSON and YAML.""" _, ext = os.path.splitext(config) - if 'json' in ext: + ext = ext.lower() + if ext == '.json': to_filetype = 'yaml' - elif 'yaml' in ext: + elif ext in ['.yaml', '.yml']: to_filetype = 'json' + else: + raise click.BadParameter( + 'Unknown filetype: %s (valid: [.json, .yaml, .yml])' % (ext,) + ) configparser = kaptan.Kaptan() configparser.import_config(config) From f78a6df008d47bb8dc840fa2b41566b60c25f9ce Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Jan 2022 06:21:56 -0600 Subject: [PATCH 0859/2998] docs(CHANGES): Update changes for merge of #725 --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index d3dfa32267..252d1fb71b 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ - _Insert changes/features/fixes for next release here_ +#### Bugs + +- #725: Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! + ## tmuxp 1.9.4 (2022-01-10) #### Packaging From f5524b7460fa1b563e98a58b4879e5bfefc0271d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Jan 2022 06:24:59 -0600 Subject: [PATCH 0860/2998] build(deps): Update poetry.lock --- poetry.lock | 160 ++++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 79 deletions(-) diff --git a/poetry.lock b/poetry.lock index 268ec22204..b1b0c1a9e0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -203,11 +203,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.2" +version = "6.3" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] tomli = {version = "*", optional = true, markers = "extra == \"toml\""} @@ -428,7 +428,7 @@ python-versions = "*" [[package]] name = "markdown-it-py" -version = "2.0.0" +version = "2.0.1" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false @@ -706,7 +706,7 @@ python-versions = "*" [[package]] name = "pyparsing" -version = "3.0.6" +version = "3.0.7" description = "Python parsing module" category = "dev" optional = false @@ -754,11 +754,11 @@ testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtuale [[package]] name = "pytest-mock" -version = "3.6.1" +version = "3.7.0" description = "Thin-wrapper around the mock package for easier use with pytest" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] pytest = ">=5.0" @@ -1064,7 +1064,7 @@ poetry = ["poetry (>=1.0.0,<2.0.0)"] [[package]] name = "typed-ast" -version = "1.5.1" +version = "1.5.2" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -1261,53 +1261,50 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, - {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, - {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, - {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, - {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, - {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, - {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, - {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, - {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, - {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, - {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, - {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, - {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, - {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, - {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, - {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, - {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, - {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, - {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, - {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, - {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, - {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, - {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, - {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, - {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, - {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, - {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, - {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, - {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, - {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, - {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, - {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, - {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, - {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, - {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, - {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, - {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, - {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, - {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, - {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, - {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, - {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, - {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, - {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, - {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, - {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, - {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, + {file = "coverage-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7"}, + {file = "coverage-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d"}, + {file = "coverage-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01"}, + {file = "coverage-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260"}, + {file = "coverage-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a"}, + {file = "coverage-6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d"}, + {file = "coverage-6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53"}, + {file = "coverage-6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5"}, + {file = "coverage-6.3-cp310-cp310-win32.whl", hash = "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e"}, + {file = "coverage-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2"}, + {file = "coverage-6.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30"}, + {file = "coverage-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92"}, + {file = "coverage-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d"}, + {file = "coverage-6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb"}, + {file = "coverage-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc"}, + {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7"}, + {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f"}, + {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253"}, + {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d"}, + {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318"}, + {file = "coverage-6.3-cp37-cp37m-win32.whl", hash = "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749"}, + {file = "coverage-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6"}, + {file = "coverage-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f"}, + {file = "coverage-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2"}, + {file = "coverage-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5"}, + {file = "coverage-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde"}, + {file = "coverage-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d"}, + {file = "coverage-6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c"}, + {file = "coverage-6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69"}, + {file = "coverage-6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6"}, + {file = "coverage-6.3-cp38-cp38-win32.whl", hash = "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89"}, + {file = "coverage-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6"}, + {file = "coverage-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606"}, + {file = "coverage-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196"}, + {file = "coverage-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c"}, + {file = "coverage-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76"}, + {file = "coverage-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48"}, + {file = "coverage-6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0"}, + {file = "coverage-6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7"}, + {file = "coverage-6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2"}, + {file = "coverage-6.3-cp39-cp39-win32.whl", hash = "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c"}, + {file = "coverage-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d"}, + {file = "coverage-6.3-pp36.pp37.pp38-none-any.whl", hash = "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab"}, + {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, ] crashtest = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, @@ -1399,8 +1396,8 @@ lockfile = [ {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, ] markdown-it-py = [ - {file = "markdown-it-py-2.0.0.tar.gz", hash = "sha256:c138a596f6c9988e0b5fa3299bc38ffa76c75076bc178e8dfac40a84343c7022"}, - {file = "markdown_it_py-2.0.0-py3-none-any.whl", hash = "sha256:15cc69c5b7c493ba8603722b710e39ce3fab2961994179fb4fa1c99b070d2059"}, + {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, + {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, ] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, @@ -1628,8 +1625,8 @@ pylev = [ {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, ] pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, + {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, + {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, @@ -1640,8 +1637,8 @@ pytest-cov = [ {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] pytest-mock = [ - {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, - {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, + {file = "pytest-mock-3.7.0.tar.gz", hash = "sha256:5112bd92cc9f186ee96e1a92efc84969ea494939c3aead39c50f421c4cc69534"}, + {file = "pytest_mock-3.7.0-py3-none-any.whl", hash = "sha256:6cff27cec936bf81dc5ee87f07132b807bcda51106b5ec4b90a04331cba76231"}, ] pytest-rerunfailures = [ {file = "pytest-rerunfailures-10.2.tar.gz", hash = "sha256:9e1e1bad51e07642c5bbab809fc1d4ec8eebcb7de86f90f1a26e6ef9de446697"}, @@ -1767,25 +1764,30 @@ tox-poetry-installer = [ {file = "tox_poetry_installer-0.8.3-py3-none-any.whl", hash = "sha256:4cefad997ef5b8533811ceb5308b5cb6e6d6997af377c0b7d03b2dd43179c235"}, ] typed-ast = [ - {file = "typed_ast-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212"}, - {file = "typed_ast-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631"}, - {file = "typed_ast-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb"}, - {file = "typed_ast-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08"}, - {file = "typed_ast-1.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e"}, - {file = "typed_ast-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695"}, - {file = "typed_ast-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30"}, - {file = "typed_ast-1.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f"}, - {file = "typed_ast-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471"}, - {file = "typed_ast-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb"}, - {file = "typed_ast-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb"}, - {file = "typed_ast-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af"}, - {file = "typed_ast-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d"}, - {file = "typed_ast-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a"}, - {file = "typed_ast-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32"}, - {file = "typed_ast-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4"}, - {file = "typed_ast-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d"}, - {file = "typed_ast-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775"}, - {file = "typed_ast-1.5.1.tar.gz", hash = "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5"}, + {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, + {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, + {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"}, + {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"}, + {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"}, + {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"}, + {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"}, + {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"}, + {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"}, + {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"}, + {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"}, + {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"}, + {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"}, + {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"}, + {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"}, + {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"}, + {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"}, + {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"}, + {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"}, + {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"}, + {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"}, + {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"}, + {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"}, + {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, ] typing-extensions = [ {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, From 7b8484400f1b3fc3367177ac80b260fb434e37ad Mon Sep 17 00:00:00 2001 From: Gerhard Hellmann Date: Sat, 29 Jan 2022 13:56:10 +0100 Subject: [PATCH 0861/2998] feature(workspace builder): Add `shell`-configuration to pane layer (#672) * Added the ability to specify `shell` per pane. Had to implement the special case for the first pane. In that case the shell for the window that is created has to be overridden. This also fixed a bug (in my opinion) that `window_shell` only affected the first pane, and none of the other panes in a window. The system unfortunatelly still bailes out, when the specified shell is not executable (e.g. doesn't even exist). The problem is an unhandeled exception when the information for the pane can't be extracted (as it never really started). Not sure how to catch that and provide a sensible message to the user. * Added an example for the pane-shell configuration. * Added the documentation to the example.md file instead. As the examples.rst files was replaced by the md-files in the main line. --- docs/examples.md | 20 ++++++++++++++++++++ examples/pane-shell.json | 40 +++++++++++++++++++++++++++++++++++++++ examples/pane-shell.yaml | 22 +++++++++++++++++++++ tmuxp/workspacebuilder.py | 21 +++++++++++++++++++- 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 examples/pane-shell.json create mode 100644 examples/pane-shell.yaml diff --git a/docs/examples.md b/docs/examples.md index c4b7e7a467..742b690238 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -307,6 +307,26 @@ without `window_index` will use the lowest available window index. ``` +## Shell per pane + +Every pane can have its own shell or application started. This allows for usage +of the ``remain-on-exit`` setting to be used properly, but also to have +different shells on different panes. + +### YAML + +```{literalinclude} ../examples/pane-shell.yaml +:language: yaml + +``` + +### JSON + +```{literalinclude} ../examples/pane-shell.json +:language: json + +``` + ## Set tmux options Works with global (server-wide) options, session options diff --git a/examples/pane-shell.json b/examples/pane-shell.json new file mode 100644 index 0000000000..1a4b6af487 --- /dev/null +++ b/examples/pane-shell.json @@ -0,0 +1,40 @@ +{ + "session_name": "Pane shell example", + "windows": [ + { + "window_name": "first", + "window_shell": "/usr/bin/python2", + "layout": "even-vertical", + "suppress_history": false, + "options": { + "remain-on-exit": true + }, + "panes": [ + { + "shell": "/usr/bin/python3", + "shell_command": [ + "print('This is python 3')" + ] + }, + { + "shell": "/usr/bin/vim -u none", + "shell_command": [ + "iAll panes have the `remain-on-exit` setting on.", + "When you exit out of the shell or application, the panes will remain.", + "Use tmux command `:kill-pane` to remove the pane.", + "Use tmux command `:respawn-pane` to restart the shell in the pane.", + "Use and then `:q!` to get out of this vim window. :-)" + ] + }, + { + "shell_command": [ + "print('Hello World 2')" + ] + }, + { + "shell": "/usr/bin/top" + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/pane-shell.yaml b/examples/pane-shell.yaml new file mode 100644 index 0000000000..0fee4fdea6 --- /dev/null +++ b/examples/pane-shell.yaml @@ -0,0 +1,22 @@ +session_name: Pane shell example +windows: + - window_name: first + window_shell: /usr/bin/python2 + layout: even-vertical + suppress_history: false + options: + remain-on-exit: true + panes: + - shell: /usr/bin/python3 + shell_command: + - print('This is python 3') + - shell: /usr/bin/vim -u none + shell_command: + - iAll panes have the `remain-on-exit` setting on. + - When you exit out of the shell or application, the panes will remain. + - Use tmux command `:kill-pane` to remove the pane. + - Use tmux command `:respawn-pane` to restart the shell in the pane. + - Use and then `:q!` to get out of this vim window. :-) + - shell_command: + - print('Hello World 2') + - shell: /usr/bin/top diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 3263342a2e..16ab6e90a1 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -265,6 +265,13 @@ def iter_create_windows(self, session, append=False): else: ws = None + # If the first pane specifies a shell, use that instead. + try: + if wconf['panes'][0]['shell'] != '': + ws = wconf['panes'][0]['shell'] + except (KeyError, IndexError): + pass + w = session.new_window( window_name=window_name, start_directory=sd, @@ -328,8 +335,20 @@ def get_pane_start_directory(): else: return None + def get_pane_shell(): + + if 'shell' in pconf: + return pconf['shell'] + elif 'window_shell' in wconf: + return wconf['window_shell'] + else: + return None + p = w.split_window( - attach=True, start_directory=get_pane_start_directory(), target=p.id + attach=True, + start_directory=get_pane_start_directory(), + shell=get_pane_shell(), + target=p.id ) assert isinstance(p, Pane) From 97b7e8d430ef397d1cb5b5731d47f716a43830a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Jan 2022 07:02:47 -0600 Subject: [PATCH 0862/2998] docs(CHANGES): Update for shell pane feature from @jerri in #672 --- CHANGES | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CHANGES b/CHANGES index 252d1fb71b..a9accab84f 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,39 @@ - _Insert changes/features/fixes for next release here_ +#### What's new + +- #672: Panes now accept `shell` for their initial command. + + Equivalent to `tmux split-windows`'s `[shell-command]` + + ```yaml + session_name: Pane shell example + windows: + - window_name: first + window_shell: /usr/bin/python2 + layout: even-vertical + suppress_history: false + options: + remain-on-exit: true + panes: + - shell: /usr/bin/python3 + shell_command: + - print('This is python 3') + - shell: /usr/bin/vim -u none + shell_command: + - iAll panes have the `remain-on-exit` setting on. + - When you exit out of the shell or application, the panes will remain. + - Use tmux command `:kill-pane` to remove the pane. + - Use tmux command `:respawn-pane` to restart the shell in the pane. + - Use and then `:q!` to get out of this vim window. :-) + - shell_command: + - print('Hello World 2') + - shell: /usr/bin/top + ``` + + Credit: @jerri + #### Bugs - #725: Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! From 199c32e9e02573eaed16b2a303ae16e8a1824ae8 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Tue, 12 Jan 2021 20:18:24 +0000 Subject: [PATCH 0863/2998] fix cli freeze test and remove duplicate cases --- tests/test_cli.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index cf0ec046b4..68f63fac6f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -868,9 +868,9 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): @pytest.mark.parametrize( "cli_args,inputs", [ - (['freeze', 'mysession'], ['\n', 'y\n', './la.yaml\n', 'y\n']), + (['freeze', 'myfrozensession'], ['\n', 'y\n', './la.yaml\n', 'y\n']), ( # Exists - ['freeze', 'mysession'], + ['freeze', 'myfrozensession'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], ), ( # Imply current session if not entered @@ -878,21 +878,21 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): ['\n', 'y\n', './la.yaml\n', 'y\n'], ), (['freeze'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists - ( # Create a new one - ['freeze', 'mysession', '--force'], - ['\n', 'y\n', './la.yaml\n', 'y\n'], - ), - ( # Imply current session if not entered - ['freeze', '--force'], - ['\n', 'y\n', './la.yaml\n', 'y\n'], - ), ], ) def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): monkeypatch.setenv('HOME', str(tmpdir)) tmpdir.join('exists.yaml').ensure() - server.new_session(session_name='mysession') + server.new_session(session_name='myfirstsession') + server.new_session(session_name='myfrozensession') + + # Assign an active pane to the session + second_session = server.list_sessions()[1] + first_pane_on_second_session_id = ( + second_session.list_windows()[0].list_panes()[0]["pane_id"] + ) + monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) with tmpdir.as_cwd(): runner = CliRunner() @@ -902,6 +902,11 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): print(out.output) assert tmpdir.join('la.yaml').check() + yaml_config = tmpdir.join('la.yaml').open().read() + frozen_config = kaptan.Kaptan(handler='yaml').import_config(yaml_config).get() + + assert frozen_config['session_name'] == 'myfrozensession' + @pytest.mark.parametrize( "cli_args,inputs", From bfc0e07ce812c25c009511d23ed57d3ea0049523 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Tue, 12 Jan 2021 20:29:42 +0000 Subject: [PATCH 0864/2998] get_session should return attached local session by default --- tests/test_util.py | 22 +++++++++++++++++++++- tmuxp/cli.py | 2 +- tmuxp/util.py | 11 +++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/tests/test_util.py b/tests/test_util.py index 17568ce7c1..4fde2fb62a 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -5,7 +5,7 @@ from tmuxp import exc from tmuxp.exc import BeforeLoadScriptError, BeforeLoadScriptNotExists -from tmuxp.util import run_before_script +from tmuxp.util import run_before_script, get_session from . import fixtures_dir @@ -49,3 +49,23 @@ def test_beforeload_returns_stderr_messages(): with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) assert excinfo.match(r'failed with returncode') + + +def test_get_session_should_default_to_local_attached_session(server, monkeypatch): + server.new_session(session_name='myfirstsession') + second_session = server.new_session(session_name='mysecondsession') + + # Assign an active pane to the session + first_pane_on_second_session_id = second_session.list_windows()[0].list_panes()[0][ + 'pane_id' + ] + monkeypatch.setenv('TMUX_PANE', first_pane_on_second_session_id) + + assert get_session(server) == second_session + + +def test_get_session_should_raise_exception_if_no_session(server): + first_session = server.new_session(session_name='myfirstsession') + server.new_session(session_name='mysecondsession') + + assert get_session(server) == first_session diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 201d72282e..9605e5d0ec 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -924,7 +924,7 @@ def command_freeze(session_name, socket_name, socket_path, force): if session_name: session = t.find_where({'session_name': session_name}) else: - session = t.list_sessions()[0] + session = util.get_session(t) if not session: raise exc.TmuxpException('Session not found.') diff --git a/tmuxp/util.py b/tmuxp/util.py index 7fc32f713d..725dcde8bd 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -111,10 +111,17 @@ def get_session(server, session_name=None, current_pane=None): elif current_pane is not None: session = server.find_where({'session_id': current_pane['session_id']}) else: - session = server.list_sessions()[0] + current_pane = get_current_pane(server) + if current_pane: + session = server.find_where({'session_id': current_pane['session_id']}) + else: + session = server.list_sessions()[0] if not session: - raise exc.TmuxpException('Session not found: %s' % session_name) + if session_name: + raise exc.TmuxpException('Session not found: %s' % session_name) + else: + raise exc.TmuxpException('Session not found') return session From aa48143242b6b391f3f005b91f960ebc9e727cd9 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Sat, 29 Jan 2022 13:54:39 +0000 Subject: [PATCH 0865/2998] add additional documentation on the `freeze` command --- docs/cli.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/cli.md b/docs/cli.md index 5c4ccf7fe5..be9f1adc30 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -130,13 +130,19 @@ my_window ## Freeze sessions ``` +tmuxp freeze tmuxp freeze +tmuxp freeze --force ``` You can save the state of your tmux session by freezing it. Tmuxp will offer to save your session state to `.json` or `.yaml`. +If no session is specified, it will default to the attached session. + +If the `--force` argument is passed, it will overwrite any existing config file with the same name. + (cli-load)= ## Load session From 47857300f979c20168a628d485356adc6b64a4a9 Mon Sep 17 00:00:00 2001 From: Will Ockmore Date: Mon, 25 Jan 2021 09:04:03 +0000 Subject: [PATCH 0866/2998] fix test naming --- tests/test_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_util.py b/tests/test_util.py index 4fde2fb62a..1d7d17f295 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -64,7 +64,7 @@ def test_get_session_should_default_to_local_attached_session(server, monkeypatc assert get_session(server) == second_session -def test_get_session_should_raise_exception_if_no_session(server): +def test_get_session_should_return_first_session_if_no_active_session(server): first_session = server.new_session(session_name='myfirstsession') server.new_session(session_name='mysecondsession') From 6c5ffe0edbc1b5d93999f45736a5aa6699716dd5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 29 Jan 2022 13:56:28 +0000 Subject: [PATCH 0867/2998] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_cli.py | 6 +++--- tests/test_util.py | 2 +- tmuxp/workspacebuilder.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 68f63fac6f..feb5a1f971 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -889,9 +889,9 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): # Assign an active pane to the session second_session = server.list_sessions()[1] - first_pane_on_second_session_id = ( - second_session.list_windows()[0].list_panes()[0]["pane_id"] - ) + first_pane_on_second_session_id = second_session.list_windows()[0].list_panes()[0][ + "pane_id" + ] monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) with tmpdir.as_cwd(): diff --git a/tests/test_util.py b/tests/test_util.py index 1d7d17f295..420e1abfd1 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -5,7 +5,7 @@ from tmuxp import exc from tmuxp.exc import BeforeLoadScriptError, BeforeLoadScriptNotExists -from tmuxp.util import run_before_script, get_session +from tmuxp.util import get_session, run_before_script from . import fixtures_dir diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 16ab6e90a1..c38b1c5b01 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -348,7 +348,7 @@ def get_pane_shell(): attach=True, start_directory=get_pane_start_directory(), shell=get_pane_shell(), - target=p.id + target=p.id, ) assert isinstance(p, Pane) From e67a72bade090e0f6adba0828d538aa5ddb87ad7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 29 Jan 2022 09:08:16 -0600 Subject: [PATCH 0868/2998] docs(CHANGES): Note improvement for tmuxp freeze from #660 --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index a9accab84f..ef996eff67 100644 --- a/CHANGES +++ b/CHANGES @@ -37,6 +37,11 @@ Credit: @jerri +#### Improvements + +- #660: `tmuxp freeze` will now detect the attached session if no session name + is specified. Credit: @will-ockmore. + #### Bugs - #725: Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! From a937b4b31b2c3cd9c11430d7b069d74f528ba625 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 21:33:05 -0600 Subject: [PATCH 0869/2998] [pre-commit.ci] pre-commit autoupdate (#733) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 21.12b0 → 22.1.0](https://github.com/psf/black/compare/21.12b0...22.1.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 66e50ce16d..8d9013686c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/psf/black - rev: 21.12b0 + rev: 22.1.0 hooks: - id: black language_version: python3.10 From 0c728649b3c5020cc17c314e2e50e2ebb4544894 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 05:48:14 -0600 Subject: [PATCH 0870/2998] deps(build): Update packages --- poetry.lock | 337 ++++++++++++++++++++++++---------------------------- 1 file changed, 154 insertions(+), 183 deletions(-) diff --git a/poetry.lock b/poetry.lock index b1b0c1a9e0..e9bc96cffa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -136,7 +136,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.10" +version = "2.0.12" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -158,7 +158,7 @@ clikit = ">=0.6.0,<0.7.0" [[package]] name = "click" -version = "8.0.3" +version = "8.0.4" description = "Composable command line interface toolkit" category = "main" optional = false @@ -203,7 +203,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "6.3" +version = "6.3.2" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -260,7 +260,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "filelock" -version = "3.4.2" +version = "3.6.0" description = "A platform independent file lock." category = "dev" optional = false @@ -394,7 +394,7 @@ PyYAML = ">=3.13,<6" [[package]] name = "keyring" -version = "21.8.0" +version = "22.3.0" description = "Store and access your passwords safely." category = "dev" optional = false @@ -408,7 +408,7 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] name = "libtmux" @@ -450,11 +450,11 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.0" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mccabe" @@ -566,7 +566,7 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "9.0.0" +version = "9.0.1" description = "Python Imaging Library (Fork)" category = "dev" optional = false @@ -585,7 +585,7 @@ testing = ["coverage", "nose"] [[package]] name = "platformdirs" -version = "2.4.1" +version = "2.5.1" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false @@ -612,7 +612,7 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poetry" -version = "1.1.12" +version = "1.1.13" description = "Python dependency management and packaging made easy." category = "dev" optional = false @@ -626,7 +626,7 @@ clikit = ">=0.6.2,<0.7.0" crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} html5lib = ">=1.0,<2.0" importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} -keyring = {version = ">=21.2.0,<22.0.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} packaging = ">=20.4,<21.0" pexpect = ">=4.7.0,<5.0.0" pkginfo = ">=1.4,<2.0" @@ -717,7 +717,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "6.2.5" +version = "7.0.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -732,10 +732,10 @@ iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" py = ">=1.8.2" -toml = "*" +tomli = ">=1.0.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -1017,7 +1017,7 @@ python-versions = ">=3.6" [[package]] name = "tomlkit" -version = "0.8.0" +version = "0.10.0" description = "Style preserving TOML library" category = "dev" optional = false @@ -1072,7 +1072,7 @@ python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "4.0.1" +version = "4.1.1" description = "Backported and Experimental Type Hints for Python 3.6+" category = "dev" optional = false @@ -1093,7 +1093,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.0" +version = "20.13.1" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1236,16 +1236,16 @@ cffi = [ {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"}, - {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"}, + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] cleo = [ {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, ] click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, + {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, + {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] clikit = [ {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, @@ -1261,50 +1261,47 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7"}, - {file = "coverage-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260"}, - {file = "coverage-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53"}, - {file = "coverage-6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5"}, - {file = "coverage-6.3-cp310-cp310-win32.whl", hash = "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e"}, - {file = "coverage-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2"}, - {file = "coverage-6.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30"}, - {file = "coverage-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92"}, - {file = "coverage-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d"}, - {file = "coverage-6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7"}, - {file = "coverage-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d"}, - {file = "coverage-6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318"}, - {file = "coverage-6.3-cp37-cp37m-win32.whl", hash = "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749"}, - {file = "coverage-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6"}, - {file = "coverage-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f"}, - {file = "coverage-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde"}, - {file = "coverage-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69"}, - {file = "coverage-6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6"}, - {file = "coverage-6.3-cp38-cp38-win32.whl", hash = "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89"}, - {file = "coverage-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6"}, - {file = "coverage-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606"}, - {file = "coverage-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76"}, - {file = "coverage-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7"}, - {file = "coverage-6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2"}, - {file = "coverage-6.3-cp39-cp39-win32.whl", hash = "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c"}, - {file = "coverage-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d"}, - {file = "coverage-6.3-pp36.pp37.pp38-none-any.whl", hash = "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab"}, - {file = "coverage-6.3.tar.gz", hash = "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf"}, + {file = "coverage-6.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4"}, + {file = "coverage-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f"}, + {file = "coverage-6.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05"}, + {file = "coverage-6.3.2-cp310-cp310-win32.whl", hash = "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39"}, + {file = "coverage-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1"}, + {file = "coverage-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7"}, + {file = "coverage-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359"}, + {file = "coverage-6.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4"}, + {file = "coverage-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca"}, + {file = "coverage-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d"}, + {file = "coverage-6.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca"}, + {file = "coverage-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6"}, + {file = "coverage-6.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2"}, + {file = "coverage-6.3.2-cp38-cp38-win32.whl", hash = "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e"}, + {file = "coverage-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620"}, + {file = "coverage-6.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7"}, + {file = "coverage-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69"}, + {file = "coverage-6.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684"}, + {file = "coverage-6.3.2-cp39-cp39-win32.whl", hash = "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4"}, + {file = "coverage-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92"}, + {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, + {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, ] crashtest = [ {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, @@ -1341,8 +1338,8 @@ docutils = [ {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] filelock = [ - {file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"}, - {file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"}, + {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, + {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, ] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, @@ -1384,8 +1381,8 @@ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] keyring = [ - {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, - {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ {file = "libtmux-0.10.3-py3-none-any.whl", hash = "sha256:ec20f1d9c265ceb2846ef98480c5279985f23eb43fe8f9eded79c03e9d7ae254"}, @@ -1400,75 +1397,46 @@ markdown-it-py = [ {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-win32.whl", hash = "sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454"}, + {file = "MarkupSafe-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-win32.whl", hash = "sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a"}, + {file = "MarkupSafe-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-win32.whl", hash = "sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8"}, + {file = "MarkupSafe-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-win32.whl", hash = "sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05"}, + {file = "MarkupSafe-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7"}, + {file = "MarkupSafe-2.1.0.tar.gz", hash = "sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, @@ -1543,54 +1511,57 @@ pexpect = [ {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pillow = [ - {file = "Pillow-9.0.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:113723312215b25c22df1fdf0e2da7a3b9c357a7d24a93ebbe80bfda4f37a8d4"}, - {file = "Pillow-9.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb47a548cea95b86494a26c89d153fd31122ed65255db5dcbc421a2d28eb3379"}, - {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31b265496e603985fad54d52d11970383e317d11e18e856971bdbb86af7242a4"}, - {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d154ed971a4cc04b93a6d5b47f37948d1f621f25de3e8fa0c26b2d44f24e3e8f"}, - {file = "Pillow-9.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fe92813d208ce8aa7d76da878bdc84b90809f79ccbad2a288e9bcbeac1d9bd"}, - {file = "Pillow-9.0.0-cp310-cp310-win32.whl", hash = "sha256:d5dcea1387331c905405b09cdbfb34611050cc52c865d71f2362f354faee1e9f"}, - {file = "Pillow-9.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:52abae4c96b5da630a8b4247de5428f593465291e5b239f3f843a911a3cf0105"}, - {file = "Pillow-9.0.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:72c3110228944019e5f27232296c5923398496b28be42535e3b2dc7297b6e8b6"}, - {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b6d21771da41497b81652d44191489296555b761684f82b7b544c49989110f"}, - {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72f649d93d4cc4d8cf79c91ebc25137c358718ad75f99e99e043325ea7d56100"}, - {file = "Pillow-9.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aaf07085c756f6cb1c692ee0d5a86c531703b6e8c9cae581b31b562c16b98ce"}, - {file = "Pillow-9.0.0-cp37-cp37m-win32.whl", hash = "sha256:03b27b197deb4ee400ed57d8d4e572d2d8d80f825b6634daf6e2c18c3c6ccfa6"}, - {file = "Pillow-9.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a09a9d4ec2b7887f7a088bbaacfd5c07160e746e3d47ec5e8050ae3b2a229e9f"}, - {file = "Pillow-9.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:490e52e99224858f154975db61c060686df8a6b3f0212a678e5d2e2ce24675c9"}, - {file = "Pillow-9.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:500d397ddf4bbf2ca42e198399ac13e7841956c72645513e8ddf243b31ad2128"}, - {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ebd8b9137630a7bbbff8c4b31e774ff05bbb90f7911d93ea2c9371e41039b52"}, - {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd0e5062f11cb3e730450a7d9f323f4051b532781026395c4323b8ad055523c4"}, - {file = "Pillow-9.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f3b4522148586d35e78313db4db0df4b759ddd7649ef70002b6c3767d0fdeb7"}, - {file = "Pillow-9.0.0-cp38-cp38-win32.whl", hash = "sha256:0b281fcadbb688607ea6ece7649c5d59d4bbd574e90db6cd030e9e85bde9fecc"}, - {file = "Pillow-9.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5050d681bcf5c9f2570b93bee5d3ec8ae4cf23158812f91ed57f7126df91762"}, - {file = "Pillow-9.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:c2067b3bb0781f14059b112c9da5a91c80a600a97915b4f48b37f197895dd925"}, - {file = "Pillow-9.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d16b6196fb7a54aff6b5e3ecd00f7c0bab1b56eee39214b2b223a9d938c50af"}, - {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98cb63ca63cb61f594511c06218ab4394bf80388b3d66cd61d0b1f63ee0ea69f"}, - {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc462d24500ba707e9cbdef436c16e5c8cbf29908278af053008d9f689f56dee"}, - {file = "Pillow-9.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3586e12d874ce2f1bc875a3ffba98732ebb12e18fb6d97be482bd62b56803281"}, - {file = "Pillow-9.0.0-cp39-cp39-win32.whl", hash = "sha256:68e06f8b2248f6dc8b899c3e7ecf02c9f413aab622f4d6190df53a78b93d97a5"}, - {file = "Pillow-9.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:6579f9ba84a3d4f1807c4aab4be06f373017fc65fff43498885ac50a9b47a553"}, - {file = "Pillow-9.0.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:47f5cf60bcb9fbc46011f75c9b45a8b5ad077ca352a78185bd3e7f1d294b98bb"}, - {file = "Pillow-9.0.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fd8053e1f8ff1844419842fd474fc359676b2e2a2b66b11cc59f4fa0a301315"}, - {file = "Pillow-9.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c5439bfb35a89cac50e81c751317faea647b9a3ec11c039900cd6915831064d"}, - {file = "Pillow-9.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95545137fc56ce8c10de646074d242001a112a92de169986abd8c88c27566a05"}, - {file = "Pillow-9.0.0.tar.gz", hash = "sha256:ee6e2963e92762923956fe5d3479b1fdc3b76c83f290aad131a2f98c3df0593e"}, + {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"}, + {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"}, + {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"}, + {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"}, + {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"}, + {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"}, + {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"}, + {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"}, + {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"}, + {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"}, + {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"}, + {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"}, + {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"}, + {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"}, + {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"}, + {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"}, + {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"}, + {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"}, + {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"}, + {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"}, + {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"}, + {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"}, + {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"}, + {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"}, + {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"}, + {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"}, + {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"}, + {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"}, + {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"}, + {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"}, + {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"}, + {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"}, + {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"}, + {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"}, + {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"}, ] pkginfo = [ {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, ] platformdirs = [ - {file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"}, - {file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"}, + {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, + {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] poetry = [ - {file = "poetry-1.1.12-py2.py3-none-any.whl", hash = "sha256:3d4dc5d4c7171fb251b32e49a98cecbe2795d5e681ecee2297e2b2d2ccd671fc"}, - {file = "poetry-1.1.12.tar.gz", hash = "sha256:5c66e2357fe37b552462a88b7d31bfa2ed8e84172208becd666933c776252567"}, + {file = "poetry-1.1.13-py2.py3-none-any.whl", hash = "sha256:52deb0792a2e801967ba9c4cdb39b56fe68b0b5cd3f195b004bef603db9d51a7"}, + {file = "poetry-1.1.13.tar.gz", hash = "sha256:b905ed610085f568aa61574e0e09260c02bff9eae12ff672af39e9f399357ac4"}, ] poetry-core = [ {file = "poetry-core-1.0.7.tar.gz", hash = "sha256:98c11c755a16ef6c5673c22ca94a3802a7df4746a0853a70b6fae8b9f5cac206"}, @@ -1629,8 +1600,8 @@ pyparsing = [ {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, + {file = "pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db"}, + {file = "pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171"}, ] pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, @@ -1752,8 +1723,8 @@ tomli = [ {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, ] tomlkit = [ - {file = "tomlkit-0.8.0-py3-none-any.whl", hash = "sha256:b824e3466f1d475b2b5f1c392954c6cb7ea04d64354ff7300dc7c14257dc85db"}, - {file = "tomlkit-0.8.0.tar.gz", hash = "sha256:29e84a855712dfe0e88a48f6d05c21118dbafb283bb2eed614d46f80deb8e9a1"}, + {file = "tomlkit-0.10.0-py3-none-any.whl", hash = "sha256:cac4aeaff42f18fef6e07831c2c2689a51df76cf2ede07a6a4fa5fcb83558870"}, + {file = "tomlkit-0.10.0.tar.gz", hash = "sha256:d99946c6aed3387c98b89d91fb9edff8f901bf9255901081266a84fb5604adcd"}, ] tox = [ {file = "tox-3.24.5-py2.py3-none-any.whl", hash = "sha256:be3362472a33094bce26727f5f771ca0facf6dafa217f65875314e9a6600c95c"}, @@ -1790,16 +1761,16 @@ typed-ast = [ {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, ] typing-extensions = [ - {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"}, - {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"}, + {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, + {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, ] urllib3 = [ {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, ] virtualenv = [ - {file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"}, - {file = "virtualenv-20.13.0.tar.gz", hash = "sha256:d8458cf8d59d0ea495ad9b34c2599487f8a7772d796f9910858376d1600dd2dd"}, + {file = "virtualenv-20.13.1-py2.py3-none-any.whl", hash = "sha256:45e1d053cad4cd453181ae877c4ffc053546ae99e7dd049b9ff1d9be7491abf7"}, + {file = "virtualenv-20.13.1.tar.gz", hash = "sha256:e0621bcbf4160e4e1030f05065c8834b4e93f4fcc223255db2a823440aca9c14"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, From 97cb0a7216590b6275e9b35b6b95c571fd38ddf9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 06:00:33 -0600 Subject: [PATCH 0871/2998] build(deps): Loosen black constraint and bump to 22.1.0 --- poetry.lock | 41 +++++++++++++++++++++++++++++------------ pyproject.toml | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index e9bc96cffa..a4920991cb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -60,29 +60,25 @@ pytz = ">=2015.7" [[package]] name = "black" -version = "21.12b0" +version = "22.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" +tomli = ">=1.1.0" typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -1140,7 +1136,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "37cd5845ee3010348472d35eabf63e6711fbd6662b9f0a640a91d8f801a3f817" +content-hash = "9f35ce142a569ab9764199828d3653668129d847587f2f89088a8d84c8846fe8" [metadata.files] aafigure = [ @@ -1168,8 +1164,29 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, + {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, + {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, + {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, + {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, + {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, + {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, + {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, + {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, + {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, + {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, + {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, + {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, + {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, + {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, + {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, + {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, + {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, ] cachecontrol = [ {file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"}, diff --git a/pyproject.toml b/pyproject.toml index 228a1ae7d9..c0b67c05e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,7 +77,7 @@ codecov = "*" coverage = "*" ### Format ### -black = "==21.12b0" +black = "*" isort = "*" ### Lint ### From 491576fbead8576321db00c892df1c35ffa37822 Mon Sep 17 00:00:00 2001 From: Joseph Flinn <58369717+joseph-flinn@users.noreply.github.com> Date: Tue, 22 Feb 2022 04:51:19 -0800 Subject: [PATCH 0872/2998] Tweaking `freeze` ux flow (#657) Fixes #627 --- CHANGES | 1 + tmuxp/cli.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ef996eff67..5471ede05c 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ ## current - _Insert changes/features/fixes for next release here_ +- {issue}`627` Tweaking `tmuxp freeze` UX flow #### What's new diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 9605e5d0ec..9f5edb0f98 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -966,7 +966,7 @@ def command_freeze(session_name, socket_name, socket_path, force): ) ) dest_prompt = click.prompt( - 'Save to: %s' % save_to, value_proc=get_abs_path, default=save_to + 'Path to new config:', value_proc=get_abs_path, default=save_to ) if not force and os.path.exists(dest_prompt): print('%s exists. Pick a new filename.' % dest_prompt) From c2b57ee04354e8c241530ec267c54d59ad5034fc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 06:56:03 -0600 Subject: [PATCH 0873/2998] docs(CHANGES): Note recent merges --- CHANGES | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 5471ede05c..9510bf0acf 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,6 @@ ## current - _Insert changes/features/fixes for next release here_ -- {issue}`627` Tweaking `tmuxp freeze` UX flow #### What's new @@ -40,12 +39,13 @@ #### Improvements -- #660: `tmuxp freeze` will now detect the attached session if no session name - is specified. Credit: @will-ockmore. +- Improve `tmuxp freeze` UX flow, credit @joseph-flinn (#657, in re: #627) +- `tmuxp freeze` will now detect the attached session if no session name + is specified. Credit: @will-ockmore. (#660) #### Bugs -- #725: Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! +- Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) ## tmuxp 1.9.4 (2022-01-10) From c7a4d3eb6e0c6954281cfc58b4fc926df5c44931 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 07:00:11 -0600 Subject: [PATCH 0874/2998] Add .prettierrc for make format-markdown / prettier --- .prettierrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..de753c537d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "printWidth": 100 +} From 6977a3c4aade0bb88f5f38f25476d22df0abfc68 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 07:00:49 -0600 Subject: [PATCH 0875/2998] chore: Run make format-markdown (prettier) --- docs/examples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples.md b/docs/examples.md index 742b690238..432f7e19cb 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -310,7 +310,7 @@ without `window_index` will use the lowest available window index. ## Shell per pane Every pane can have its own shell or application started. This allows for usage -of the ``remain-on-exit`` setting to be used properly, but also to have +of the `remain-on-exit` setting to be used properly, but also to have different shells on different panes. ### YAML From 022f807e63122f80bb9526fa57118356934842b3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 23 Feb 2022 11:51:39 -0600 Subject: [PATCH 0876/2998] docs(cli): Fix autocompletion command --- docs/cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli.md b/docs/cli.md index be9f1adc30..4e75b65eaf 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -20,7 +20,7 @@ In zsh (`~/.zshrc`): ```{code-block} sh -eval "$(_TMUXP_COMPLETE=source_zsh tmuxp)" +eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" ``` From 2c3850ebf14ac2cd67d4a894a213d33f14499637 Mon Sep 17 00:00:00 2001 From: David Assefa Tofu Date: Fri, 16 Jul 2021 10:49:06 +0300 Subject: [PATCH 0877/2998] Allow specifying file name and format as cmdline arguments for tmuxp freeze, deduce format from filename --- tmuxp/cli.py | 122 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 9f5edb0f98..a4c3ce2297 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -911,8 +911,25 @@ def command_shell( @click.argument('session_name', nargs=1, required=False) @click.option('-S', 'socket_path', help='pass-through for tmux -S') @click.option('-L', 'socket_name', help='pass-through for tmux -L') +@click.option( + '-f', + '--config-format', + type=click.Choice(['yaml', 'json']), + help='format to save in', +) +@click.option('-o', '--save-to', type=click.Path(exists=False), help='file to save to') +@click.option( + '-y', + '--yes', + type=bool, + is_flag=True, + default=False, + help="Don't prompt for confirmation", +) @click.option('--force', 'force', help='overwrite the config file', is_flag=True) -def command_freeze(session_name, socket_name, socket_path, force): +def command_freeze( + session_name, socket_name, config_format, save_to, socket_path, yes, force +): """Snapshot a session into a config. If SESSION_NAME is provided, snapshot that session. Otherwise, use the @@ -936,55 +953,18 @@ def command_freeze(session_name, socket_name, socket_path, force): configparser = kaptan.Kaptan() newconfig = config.inline(sconf) configparser.import_config(newconfig) - config_format = click.prompt( - 'Convert to', value_proc=_validate_choices(['yaml', 'json']), default='yaml' - ) - - if config_format == 'yaml': - newconfig = configparser.export( - 'yaml', indent=2, default_flow_style=False, safe=True - ) - elif config_format == 'json': - newconfig = configparser.export('json', indent=2) - else: - sys.exit('Unknown config format.') print( '---------------------------------------------------------------' '\n' 'Freeze does its best to snapshot live tmux sessions.\n' ) - if click.confirm( - 'The new config *WILL* require adjusting afterwards. Save config?' + if not ( + yes + or click.confirm( + 'The new config *WILL* require adjusting afterwards. Save config?' + ) ): - dest = None - while not dest: - save_to = os.path.abspath( - os.path.join( - get_config_dir(), - '%s.%s' % (sconf.get('session_name'), config_format), - ) - ) - dest_prompt = click.prompt( - 'Path to new config:', value_proc=get_abs_path, default=save_to - ) - if not force and os.path.exists(dest_prompt): - print('%s exists. Pick a new filename.' % dest_prompt) - continue - - dest = dest_prompt - - dest = os.path.abspath(os.path.relpath(os.path.expanduser(dest))) - if click.confirm('Save to %s?' % dest): - destdir = os.path.dirname(dest) - if not os.path.isdir(destdir): - os.makedirs(destdir) - buf = open(dest, 'w') - buf.write(newconfig) - buf.close() - - print('Saved to %s.' % dest) - else: print( 'tmuxp has examples in JSON and YAML format at ' '\n' @@ -992,6 +972,62 @@ def command_freeze(session_name, socket_name, socket_path, force): ) sys.exit() + dest = save_to + while not dest: + save_to = os.path.abspath( + os.path.join( + get_config_dir(), + '%s.%s' % (sconf.get('session_name'), config_format or 'yaml'), + ) + ) + dest_prompt = click.prompt( + 'Save to: %s' % save_to, value_proc=get_abs_path, default=save_to + ) + if not force and os.path.exists(dest_prompt): + print('%s exists. Pick a new filename.' % dest_prompt) + continue + + dest = dest_prompt + dest = os.path.abspath(os.path.relpath(os.path.expanduser(dest))) + + if config_format is None: + valid_config_formats = ['json', 'yaml'] + _, config_format = os.path.splitext(dest) + config_format = config_format[1:].lower() + if config_format not in valid_config_formats: + config_format = click.prompt( + "Couldn't ascertain one of [%s] from file name. Convert to" + % ", ".join(valid_config_formats), + value_proc=_validate_choices(['yaml', 'json']), + default='yaml', + ) + + if config_format == 'yaml': + newconfig = configparser.export( + 'yaml', indent=2, default_flow_style=False, safe=True + ) + elif config_format == 'json': + newconfig = configparser.export('json', indent=2) + + if yes or click.confirm('Save to %s?' % dest): + destdir = os.path.dirname(dest) + if not os.path.isdir(destdir): + os.makedirs(destdir) + buf = open(dest, 'w') + buf.write(newconfig) + buf.close() + + print('Saved to %s.' % dest) + + if config_format == 'yaml': + newconfig = configparser.export( + 'yaml', indent=2, default_flow_style=False, safe=True + ) + elif config_format == 'json': + newconfig = configparser.export('json', indent=2) + else: + sys.exit('Unknown config format.') + @cli.command(name='load', short_help='Load tmuxp workspaces.') @click.pass_context From 9fdadc8e3b256fc5f390b6dc4fcdb8160e90db18 Mon Sep 17 00:00:00 2001 From: David Assefa Tofu Date: Fri, 16 Jul 2021 11:12:24 +0300 Subject: [PATCH 0878/2998] Add --quiet to freeze --- tmuxp/cli.py | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index a4c3ce2297..a0ff5773e4 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -926,9 +926,17 @@ def command_shell( default=False, help="Don't prompt for confirmation", ) +@click.option( + '-q', + '--quiet', + type=bool, + is_flag=True, + default=False, + help="Don't prompt for confirmation", +) @click.option('--force', 'force', help='overwrite the config file', is_flag=True) def command_freeze( - session_name, socket_name, config_format, save_to, socket_path, yes, force + session_name, socket_name, config_format, save_to, socket_path, yes, quiet, force ): """Snapshot a session into a config. @@ -954,22 +962,24 @@ def command_freeze( newconfig = config.inline(sconf) configparser.import_config(newconfig) - print( - '---------------------------------------------------------------' - '\n' - 'Freeze does its best to snapshot live tmux sessions.\n' - ) + if not quiet: + print( + '---------------------------------------------------------------' + '\n' + 'Freeze does its best to snapshot live tmux sessions.\n' + ) if not ( yes or click.confirm( 'The new config *WILL* require adjusting afterwards. Save config?' ) ): - print( - 'tmuxp has examples in JSON and YAML format at ' - '\n' - 'View tmuxp docs at .' - ) + if not quiet: + print( + 'tmuxp has examples in JSON and YAML format at ' + '\n' + 'View tmuxp docs at .' + ) sys.exit() dest = save_to @@ -1017,16 +1027,8 @@ def command_freeze( buf.write(newconfig) buf.close() - print('Saved to %s.' % dest) - - if config_format == 'yaml': - newconfig = configparser.export( - 'yaml', indent=2, default_flow_style=False, safe=True - ) - elif config_format == 'json': - newconfig = configparser.export('json', indent=2) - else: - sys.exit('Unknown config format.') + if not quiet: + print('Saved to %s.' % dest) @cli.command(name='load', short_help='Load tmuxp workspaces.') From a1e01ffac9dfa3bfec707aa8ce554bcc96e5c84c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Feb 2022 09:45:20 -0600 Subject: [PATCH 0879/2998] tests: Update test_cli.py for new tmuxp freeze command --- tests/test_cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index feb5a1f971..8802535f6c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -868,16 +868,16 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): @pytest.mark.parametrize( "cli_args,inputs", [ - (['freeze', 'myfrozensession'], ['\n', 'y\n', './la.yaml\n', 'y\n']), + (['freeze', 'myfrozensession'], ['y\n', './la.yaml\n', 'y\n']), ( # Exists ['freeze', 'myfrozensession'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ['y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], ), ( # Imply current session if not entered ['freeze'], - ['\n', 'y\n', './la.yaml\n', 'y\n'], + ['y\n', './la.yaml\n', 'y\n'], ), - (['freeze'], ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists + (['freeze'], ['y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists ], ) def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): From 0322895ce92082f09b833b4c8dad76320e7e6673 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Feb 2022 09:48:50 -0600 Subject: [PATCH 0880/2998] docs(CHANGES): Add #701 --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 9510bf0acf..e3e0ae85ca 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,16 @@ #### What's new +- #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the + `--config-format` and filename (`--save-to`). This means you can do it all in + one command: + + `tmuxp freeze -yqo .tmuxp.yaml` + + Or bind it to `.tmux.conf` itself: `bind -T root C-s run-shell "tmuxp freeze -yqo .tmuxp.yaml"` + + Credit: [@davidatbu](https://github.com/davidatbu) + - #672: Panes now accept `shell` for their initial command. Equivalent to `tmux split-windows`'s `[shell-command]` From e50530887e2fd892475979b169784274417d784e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 22 Feb 2022 06:15:01 -0600 Subject: [PATCH 0881/2998] black: Use string normalization --- pyproject.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c0b67c05e5..453a16065d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,3 @@ -[tool.black] -skip-string-normalization = true - [tool.poetry] name = "tmuxp" version = "1.9.4" From 2b069bf52e589ece7c6772d75c6c1efbc16c2238 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Feb 2022 09:56:32 -0600 Subject: [PATCH 0882/2998] chore: Run black + isort with string normalization (one time diff) --- docs/_ext/aafig.py | 90 +-- docs/conf.py | 150 ++-- tests/__init__.py | 4 +- tests/conftest.py | 38 +- tests/fixtures/config/expand1.py | 84 +-- tests/fixtures/config/expand2.py | 6 +- tests/fixtures/config/expand_blank.py | 42 +- tests/fixtures/config/sampleconfig.py | 26 +- tests/fixtures/config/shell_command_before.py | 140 ++-- tests/fixtures/config/trickle.py | 48 +- tests/fixtures/config_teamocil/layouts.py | 192 ++--- tests/fixtures/config_teamocil/test1.py | 28 +- tests/fixtures/config_teamocil/test2.py | 32 +- tests/fixtures/config_teamocil/test3.py | 50 +- tests/fixtures/config_teamocil/test4.py | 20 +- tests/fixtures/config_tmuxinator/test1.py | 20 +- tests/fixtures/config_tmuxinator/test2.py | 88 +-- tests/fixtures/config_tmuxinator/test3.py | 94 +-- .../pluginsystem/partials/all_pass.py | 24 +- .../partials/libtmux_version_fail.py | 18 +- .../partials/test_plugin_helpers.py | 12 +- .../partials/tmux_version_fail.py | 18 +- .../partials/tmuxp_version_fail.py | 18 +- .../tmuxp_test_plugin_awf/plugin.py | 18 +- .../tmuxp_test_plugin_bs/plugin.py | 4 +- .../tmuxp_test_plugin_bwb/plugin.py | 4 +- .../tmuxp_test_plugin_fail/plugin.py | 4 +- .../tmuxp_test_plugin_owc/plugin.py | 18 +- .../tmuxp_test_plugin_r/plugin.py | 4 +- tests/test_cli.py | 712 +++++++++--------- tests/test_config.py | 142 ++-- tests/test_config_teamocil.py | 16 +- tests/test_config_tmuxinator.py | 4 +- tests/test_plugin.py | 36 +- tests/test_util.py | 28 +- tests/test_workspacebuilder.py | 272 +++---- tests/test_workspacefreezer.py | 6 +- tmuxp/__about__.py | 26 +- tmuxp/_compat.py | 2 +- tmuxp/cli.py | 492 ++++++------ tmuxp/config.py | 376 ++++----- tmuxp/exc.py | 8 +- tmuxp/log.py | 64 +- tmuxp/plugin.py | 44 +- tmuxp/shell.py | 58 +- tmuxp/util.py | 52 +- tmuxp/workspacebuilder.py | 162 ++-- 47 files changed, 1896 insertions(+), 1898 deletions(-) diff --git a/docs/_ext/aafig.py b/docs/_ext/aafig.py index 38dd315d3e..38e7e5f928 100644 --- a/docs/_ext/aafig.py +++ b/docs/_ext/aafig.py @@ -32,7 +32,7 @@ logger = logging.getLogger(__name__) -DEFAULT_FORMATS = dict(html='svg', latex='pdf', text=None) +DEFAULT_FORMATS = dict(html="svg", latex="pdf", text=None) def merge_dict(dst, src): @@ -42,17 +42,17 @@ def merge_dict(dst, src): return dst -def get_basename(text, options, prefix='aafig'): +def get_basename(text, options, prefix="aafig"): options = options.copy() - if 'format' in options: - del options['format'] + if "format" in options: + del options["format"] hashkey = text + str(options) - id = sha(hashkey.encode('utf-8')).hexdigest() - return '%s-%s' % (prefix, id) + id = sha(hashkey.encode("utf-8")).hexdigest() + return "%s-%s" % (prefix, id) class AafigError(SphinxError): - category = 'aafig error' + category = "aafig error" class AafigDirective(images.Image): @@ -76,22 +76,22 @@ class AafigDirective(images.Image): def run(self): aafig_options = dict() - own_options_keys = [self.own_option_spec.keys()] + ['scale'] + own_options_keys = [self.own_option_spec.keys()] + ["scale"] for (k, v) in self.options.items(): if k in own_options_keys: # convert flags to booleans if v is None: v = True # convert percentage to float - if k == 'scale' or k == 'aspect': + if k == "scale" or k == "aspect": v = float(v) / 100.0 aafig_options[k] = v del self.options[k] - self.arguments = [''] + self.arguments = [""] (image_node,) = images.Image.run(self) if isinstance(image_node, nodes.system_message): return [image_node] - text = '\n'.join(self.content) + text = "\n".join(self.content) image_node.aafig = dict(options=aafig_options, text=text) return [image_node] @@ -101,45 +101,45 @@ def render_aafig_images(app, doctree): merge_dict(format_map, DEFAULT_FORMATS) if aafigure is None: logger.warn( - 'aafigure module not installed, ASCII art images ' - 'will be redered as literal text' + "aafigure module not installed, ASCII art images " + "will be redered as literal text" ) for img in doctree.traverse(nodes.image): - if not hasattr(img, 'aafig'): + if not hasattr(img, "aafig"): continue if aafigure is None: continue - options = img.aafig['options'] - text = img.aafig['text'] + options = img.aafig["options"] + text = img.aafig["text"] format = app.builder.format merge_dict(options, app.builder.config.aafig_default_options) if format in format_map: - options['format'] = format_map[format] + options["format"] = format_map[format] else: logger.warn( 'unsupported builder format "%s", please ' - 'add a custom entry in aafig_format config ' - 'option for this builder' % format + "add a custom entry in aafig_format config " + "option for this builder" % format ) img.replace_self(nodes.literal_block(text, text)) continue - if options['format'] is None: + if options["format"] is None: img.replace_self(nodes.literal_block(text, text)) continue try: fname, outfn, id, extra = render_aafigure(app, text, options) except AafigError as exc: - logger.warn('aafigure error: ' + str(exc)) + logger.warn("aafigure error: " + str(exc)) img.replace_self(nodes.literal_block(text, text)) continue - img['uri'] = fname + img["uri"] = fname # FIXME: find some way to avoid this hack in aafigure if extra: (width, height) = [x.split('"')[1] for x in extra.split()] - if 'width' not in img: - img['width'] = width - if 'height' not in img: - img['height'] = height + if "width" not in img: + img["width"] = width + if "height" not in img: + img["height"] = height def render_aafigure(app, text, options): @@ -148,36 +148,36 @@ def render_aafigure(app, text, options): """ if aafigure is None: - raise AafigError('aafigure module not installed') + raise AafigError("aafigure module not installed") fname = get_basename(text, options) - fname = '%s.%s' % (get_basename(text, options), options['format']) - if app.builder.format == 'html': + fname = "%s.%s" % (get_basename(text, options), options["format"]) + if app.builder.format == "html": # HTML - imgpath = relative_uri(app.builder.env.docname, '_images') + imgpath = relative_uri(app.builder.env.docname, "_images") relfn = posixpath.join(imgpath, fname) - outfn = path.join(app.builder.outdir, '_images', fname) + outfn = path.join(app.builder.outdir, "_images", fname) else: # Non-HTML - if app.builder.format != 'latex': + if app.builder.format != "latex": logger.warn( - 'aafig: the builder format %s is not officially ' - 'supported, aafigure images could not work. ' - 'Please report problems and working builder to ' - 'avoid this warning inthe future' % app.builder.format + "aafig: the builder format %s is not officially " + "supported, aafigure images could not work. " + "Please report problems and working builder to " + "avoid this warning inthe future" % app.builder.format ) relfn = fname outfn = path.join(app.builder.outdir, fname) - metadata_fname = '%s.aafig' % outfn + metadata_fname = "%s.aafig" % outfn try: if path.isfile(outfn): extra = None - if options['format'].lower() == 'svg': + if options["format"].lower() == "svg": f = None try: try: - f = open(metadata_fname, 'r') + f = open(metadata_fname, "r") extra = f.read() except Exception: raise AafigError() @@ -197,9 +197,9 @@ def render_aafigure(app, text, options): raise AafigError(str(e)) extra = None - if options['format'].lower() == 'svg': + if options["format"].lower() == "svg": extra = visitor.get_size_attrs() - f = open(metadata_fname, 'w') + f = open(metadata_fname, "w") f.write(extra) f.close() @@ -207,10 +207,10 @@ def render_aafigure(app, text, options): def setup(app): - app.add_directive('aafig', AafigDirective) - app.connect('doctree-read', render_aafig_images) - app.add_config_value('aafig_format', DEFAULT_FORMATS, 'html') - app.add_config_value('aafig_default_options', dict(), 'html') + app.add_directive("aafig", AafigDirective) + app.connect("doctree-read", render_aafig_images) + app.add_config_value("aafig_format", DEFAULT_FORMATS, "html") + app.add_config_value("aafig_default_options", dict(), "html") # vim: set expandtab shiftwidth=4 softtabstop=4 : diff --git a/docs/conf.py b/docs/conf.py index ebd532c8d5..844c4358c2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,114 +21,114 @@ extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx_autodoc_typehints', - 'sphinx.ext.todo', - 'sphinx.ext.napoleon', - 'sphinx.ext.linkcode', - 'aafig', - 'alagitpull', - 'sphinx_issues', - 'myst_parser', + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx_autodoc_typehints", + "sphinx.ext.todo", + "sphinx.ext.napoleon", + "sphinx.ext.linkcode", + "aafig", + "alagitpull", + "sphinx_issues", + "myst_parser", ] myst_enable_extensions = ["colon_fence"] -issues_github_path = about['__github__'].replace('https://github.com/', '') +issues_github_path = about["__github__"].replace("https://github.com/", "") -templates_path = ['_templates'] +templates_path = ["_templates"] -source_suffix = {'.rst': 'restructuredtext', '.md': 'markdown'} +source_suffix = {".rst": "restructuredtext", ".md": "markdown"} -master_doc = 'index' +master_doc = "index" -project = about['__title__'] -copyright = about['__copyright__'] +project = about["__title__"] +copyright = about["__copyright__"] -version = '%s' % ('.'.join(about['__version__'].split('.'))[:2]) -release = '%s' % (about['__version__']) +version = "%s" % (".".join(about["__version__"].split("."))[:2]) +release = "%s" % (about["__version__"]) -exclude_patterns = ['_build'] +exclude_patterns = ["_build"] -pygments_style = 'sphinx' +pygments_style = "sphinx" html_theme_path = [alagitpull.get_path()] -html_theme = 'alagitpull' -html_extra_path = ['manifest.json'] -html_static_path = ['_static'] +html_theme = "alagitpull" +html_extra_path = ["manifest.json"] +html_static_path = ["_static"] html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', - 'more.html', - 'book.html', - 'searchbox.html', + "**": [ + "about.html", + "navigation.html", + "relations.html", + "more.html", + "book.html", + "searchbox.html", ] } html_theme_options = { - 'logo': 'img/tmuxp.svg', - 'github_user': 'tmux-python', - 'github_repo': 'tmuxp', - 'github_type': 'star', - 'github_banner': True, - 'projects': alagitpull.projects, - 'project_name': about['__title__'], - 'project_title': about['__title__'], - 'project_description': about['__description__'], - 'project_url': about['__docs__'], - 'show_meta_manifest_tag': True, - 'show_meta_og_tags': True, - 'show_meta_app_icon_tags': True, + "logo": "img/tmuxp.svg", + "github_user": "tmux-python", + "github_repo": "tmuxp", + "github_type": "star", + "github_banner": True, + "projects": alagitpull.projects, + "project_name": about["__title__"], + "project_title": about["__title__"], + "project_description": about["__description__"], + "project_url": about["__docs__"], + "show_meta_manifest_tag": True, + "show_meta_og_tags": True, + "show_meta_app_icon_tags": True, } -alagitpull_internal_hosts = ['tmuxp.git-pull.com', '0.0.0.0'] +alagitpull_internal_hosts = ["tmuxp.git-pull.com", "0.0.0.0"] alagitpull_external_hosts_new_window = True -htmlhelp_basename = '%sdoc' % about['__title__'] +htmlhelp_basename = "%sdoc" % about["__title__"] latex_documents = [ ( - 'index', - '{0}.tex'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], - 'manual', + "index", + "{0}.tex".format(about["__package_name__"]), + "{0} Documentation".format(about["__title__"]), + about["__author__"], + "manual", ) ] man_pages = [ ( - 'index', - about['__package_name__'], - '{0} Documentation'.format(about['__title__']), - about['__author__'], + "index", + about["__package_name__"], + "{0} Documentation".format(about["__title__"]), + about["__author__"], 1, ) ] texinfo_documents = [ ( - 'index', - '{0}'.format(about['__package_name__']), - '{0} Documentation'.format(about['__title__']), - about['__author__'], - about['__package_name__'], - about['__description__'], - 'Miscellaneous', + "index", + "{0}".format(about["__package_name__"]), + "{0} Documentation".format(about["__title__"]), + about["__author__"], + about["__package_name__"], + about["__description__"], + "Miscellaneous", ) ] intersphinx_mapping = { - 'python': ('https://docs.python.org/', None), - 'libtmux': ('https://libtmux.git-pull.com/', None), - 'click': ('http://click.pocoo.org/5', None), + "python": ("https://docs.python.org/", None), + "libtmux": ("https://libtmux.git-pull.com/", None), + "click": ("http://click.pocoo.org/5", None), } # aafig format, try to get working with pdf -aafig_format = dict(latex='pdf', html='gif') +aafig_format = dict(latex="pdf", html="gif") aafig_default_options = dict(scale=0.75, aspect=0.5, proportional=True) @@ -142,18 +142,18 @@ def linkcode_resolve(domain, info): # NOQA: C901 From https://github.com/numpy/numpy/blob/v1.15.1/doc/source/conf.py, 7c49cfa on Jul 31. License BSD-3. https://github.com/numpy/numpy/blob/v1.15.1/LICENSE.txt """ - if domain != 'py': + if domain != "py": return None - modname = info['module'] - fullname = info['fullname'] + modname = info["module"] + fullname = info["fullname"] submod = sys.modules.get(modname) if submod is None: return None obj = submod - for part in fullname.split('.'): + for part in fullname.split("."): try: obj = getattr(obj, part) except Exception: @@ -187,18 +187,18 @@ def linkcode_resolve(domain, info): # NOQA: C901 fn = relpath(fn, start=dirname(tmuxp.__file__)) - if 'dev' in about['__version__']: + if "dev" in about["__version__"]: return "%s/blob/master/%s/%s%s" % ( - about['__github__'], - about['__package_name__'], + about["__github__"], + about["__package_name__"], fn, linespec, ) else: return "%s/blob/v%s/%s/%s%s" % ( - about['__github__'], - about['__version__'], - about['__package_name__'], + about["__github__"], + about["__version__"], + about["__package_name__"], fn, linespec, ) diff --git a/tests/__init__.py b/tests/__init__.py index 8cee3f54f4..89d3f1684f 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -7,5 +7,5 @@ import os current_dir = os.path.abspath(os.path.dirname(__file__)) -example_dir = os.path.abspath(os.path.join(current_dir, '..', 'examples')) -fixtures_dir = os.path.realpath(os.path.join(current_dir, 'fixtures')) +example_dir = os.path.abspath(os.path.join(current_dir, "..", "examples")) +fixtures_dir = os.path.realpath(os.path.join(current_dir, "fixtures")) diff --git a/tests/conftest.py b/tests/conftest.py index 410171cc8a..7099fcb895 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def monkeypatch_plugin_test_packages(monkeypatch): paths = [ "tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/", @@ -24,12 +24,12 @@ def monkeypatch_plugin_test_packages(monkeypatch): monkeypatch.syspath_prepend(os.path.abspath(os.path.relpath(path))) -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def socket_name(request): - return 'tmuxp_test%s' % next(namer) + return "tmuxp_test%s" % next(namer) -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def server(request, socket_name): t = Server() t.socket_name = socket_name @@ -42,27 +42,27 @@ def fin(): return t -@pytest.fixture(scope='function') +@pytest.fixture(scope="function") def session(server): - session_name = 'tmuxp' + session_name = "tmuxp" if not server.has_session(session_name): server.cmd( - '-f', - '/dev/null', # use a blank config to reduce side effects - 'new-session', - '-d', # detached - '-s', + "-f", + "/dev/null", # use a blank config to reduce side effects + "new-session", + "-d", # detached + "-s", session_name, - '/bin/sh', # use /bin/sh as a shell to reduce side effects + "/bin/sh", # use /bin/sh as a shell to reduce side effects # normally, it'd be -c, but new-session is special ) # find current sessions prefixed with tmuxp old_test_sessions = [ - s.get('session_name') + s.get("session_name") for s in server._sessions - if s.get('session_name').startswith(TEST_SESSION_PREFIX) + if s.get("session_name").startswith(TEST_SESSION_PREFIX) ] TEST_SESSION_NAME = get_test_session_name(server=server) @@ -77,22 +77,22 @@ def session(server): the newly created session for that testcase. """ try: - server.switch_client(session.get('session_id')) + server.switch_client(session.get("session_id")) pass except exc.LibTmuxException: # server.attach_session(session.get('session_id')) pass for old_test_session in old_test_sessions: - logger.debug('Old test test session %s found. Killing it.' % old_test_session) + logger.debug("Old test test session %s found. Killing it." % old_test_session) server.kill_session(old_test_session) - assert TEST_SESSION_NAME == session.get('session_name') - assert TEST_SESSION_NAME != 'tmuxp' + assert TEST_SESSION_NAME == session.get("session_name") + assert TEST_SESSION_NAME != "tmuxp" return session @pytest.fixture() def tmpdir(tmpdir_factory): - fn = tmpdir_factory.mktemp('tmuxp') + fn = tmpdir_factory.mktemp("tmuxp") return fn diff --git a/tests/fixtures/config/expand1.py b/tests/fixtures/config/expand1.py index e5d536403c..d431741ef7 100644 --- a/tests/fixtures/config/expand1.py +++ b/tests/fixtures/config/expand1.py @@ -1,74 +1,74 @@ import os before_config = { - 'session_name': 'sampleconfig', - 'start_directory': '~', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "~", + "windows": [ { - 'window_name': 'editor', - 'panes': [ - {'shell_command': ['vim', 'top']}, - {'shell_command': ['vim']}, - {'shell_command': 'cowsay "hey"'}, + "window_name": "editor", + "panes": [ + {"shell_command": ["vim", "top"]}, + {"shell_command": ["vim"]}, + {"shell_command": 'cowsay "hey"'}, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], }, { - 'start_directory': '/var/log', - 'options': {'automatic-rename': True}, - 'panes': [{'shell_command': 'htop'}, 'vim'], + "start_directory": "/var/log", + "options": {"automatic-rename": True}, + "panes": [{"shell_command": "htop"}, "vim"], }, - {'start_directory': './', 'panes': ['pwd']}, - {'start_directory': './asdf/', 'panes': ['pwd']}, - {'start_directory': '../', 'panes': ['pwd']}, - {'panes': ['top']}, + {"start_directory": "./", "panes": ["pwd"]}, + {"start_directory": "./asdf/", "panes": ["pwd"]}, + {"start_directory": "../", "panes": ["pwd"]}, + {"panes": ["top"]}, ], } after_config = { - 'session_name': 'sampleconfig', - 'start_directory': os.path.expanduser('~'), - 'windows': [ + "session_name": "sampleconfig", + "start_directory": os.path.expanduser("~"), + "windows": [ { - 'window_name': 'editor', - 'panes': [ - {'shell_command': ['vim', 'top']}, - {'shell_command': ['vim']}, - {'shell_command': ['cowsay "hey"']}, + "window_name": "editor", + "panes": [ + {"shell_command": ["vim", "top"]}, + {"shell_command": ["vim"]}, + {"shell_command": ['cowsay "hey"']}, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], }, { - 'start_directory': '/var/log', - 'options': {'automatic-rename': True}, - 'panes': [{'shell_command': ['htop']}, {'shell_command': ['vim']}], + "start_directory": "/var/log", + "options": {"automatic-rename": True}, + "panes": [{"shell_command": ["htop"]}, {"shell_command": ["vim"]}], }, { - 'start_directory': os.path.normpath( - os.path.join(os.path.expanduser('~'), './') + "start_directory": os.path.normpath( + os.path.join(os.path.expanduser("~"), "./") ), - 'panes': [{'shell_command': ['pwd']}], + "panes": [{"shell_command": ["pwd"]}], }, { - 'start_directory': os.path.normpath( - os.path.join(os.path.expanduser('~'), './asdf') + "start_directory": os.path.normpath( + os.path.join(os.path.expanduser("~"), "./asdf") ), - 'panes': [{'shell_command': ['pwd']}], + "panes": [{"shell_command": ["pwd"]}], }, { - 'start_directory': os.path.normpath( - os.path.join(os.path.expanduser('~'), '../') + "start_directory": os.path.normpath( + os.path.join(os.path.expanduser("~"), "../") ), - 'panes': [{'shell_command': ['pwd']}], + "panes": [{"shell_command": ["pwd"]}], }, - {'panes': [{'shell_command': ['top']}]}, + {"panes": [{"shell_command": ["top"]}]}, ], } diff --git a/tests/fixtures/config/expand2.py b/tests/fixtures/config/expand2.py index 502ed04248..2673685b61 100644 --- a/tests/fixtures/config/expand2.py +++ b/tests/fixtures/config/expand2.py @@ -2,7 +2,7 @@ from .._util import loadfixture -unexpanded_yaml = loadfixture('config/expand2-unexpanded.yaml') -expanded_yaml = loadfixture('config/expand2-expanded.yaml').format( - HOME=os.path.expanduser('~') +unexpanded_yaml = loadfixture("config/expand2-unexpanded.yaml") +expanded_yaml = loadfixture("config/expand2-expanded.yaml").format( + HOME=os.path.expanduser("~") ) diff --git a/tests/fixtures/config/expand_blank.py b/tests/fixtures/config/expand_blank.py index 13d96e92fd..78343ca711 100644 --- a/tests/fixtures/config/expand_blank.py +++ b/tests/fixtures/config/expand_blank.py @@ -1,35 +1,35 @@ expected = { - 'session_name': 'Blank pane test', - 'windows': [ + "session_name": "Blank pane test", + "windows": [ { - 'window_name': 'Blank pane test', - 'panes': [ - {'shell_command': []}, - {'shell_command': []}, - {'shell_command': []}, + "window_name": "Blank pane test", + "panes": [ + {"shell_command": []}, + {"shell_command": []}, + {"shell_command": []}, ], }, { - 'window_name': 'More blank panes', - 'panes': [ - {'shell_command': []}, - {'shell_command': []}, - {'shell_command': []}, + "window_name": "More blank panes", + "panes": [ + {"shell_command": []}, + {"shell_command": []}, + {"shell_command": []}, ], }, { - 'window_name': 'Empty string (return)', - 'panes': [ - {'shell_command': ['']}, - {'shell_command': ['']}, - {'shell_command': ['']}, + "window_name": "Empty string (return)", + "panes": [ + {"shell_command": [""]}, + {"shell_command": [""]}, + {"shell_command": [""]}, ], }, { - 'window_name': 'Blank with options', - 'panes': [ - {'shell_command': [], 'focus': True}, - {'shell_command': [], 'start_directory': '/tmp'}, + "window_name": "Blank with options", + "panes": [ + {"shell_command": [], "focus": True}, + {"shell_command": [], "start_directory": "/tmp"}, ], }, ], diff --git a/tests/fixtures/config/sampleconfig.py b/tests/fixtures/config/sampleconfig.py index 65aee3b87a..46bc6f2d6f 100644 --- a/tests/fixtures/config/sampleconfig.py +++ b/tests/fixtures/config/sampleconfig.py @@ -1,24 +1,24 @@ sampleconfigdict = { - 'session_name': 'sampleconfig', - 'start_directory': '~', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "~", + "windows": [ { - 'window_name': 'editor', - 'panes': [ - {'start_directory': '~', 'shell_command': ['vim']}, - {'shell_command': ['cowsay "hey"']}, + "window_name": "editor", + "panes": [ + {"start_directory": "~", "shell_command": ["vim"]}, + {"shell_command": ['cowsay "hey"']}, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [ + "window_name": "logging", + "panes": [ { - 'shell_command': ['tail -F /var/log/syslog'], - 'start_directory': '/var/log', + "shell_command": ["tail -F /var/log/syslog"], + "start_directory": "/var/log", } ], }, - {'options': {'automatic_rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {"options": {"automatic_rename": True}, "panes": [{"shell_command": ["htop"]}]}, ], } diff --git a/tests/fixtures/config/shell_command_before.py b/tests/fixtures/config/shell_command_before.py index 7cc227dc05..2f0b1a6966 100644 --- a/tests/fixtures/config/shell_command_before.py +++ b/tests/fixtures/config/shell_command_before.py @@ -1,125 +1,125 @@ import os config_unexpanded = { # shell_command_before is string in some areas - 'session_name': 'sampleconfig', - 'start_directory': '/', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/", + "windows": [ { - 'window_name': 'editor', - 'start_directory': '~', - 'shell_command_before': 'source .venv/bin/activate', - 'panes': [ - {'shell_command': ['vim']}, + "window_name": "editor", + "start_directory": "~", + "shell_command_before": "source .venv/bin/activate", + "panes": [ + {"shell_command": ["vim"]}, { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['cowsay "hey"'], + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": ['cowsay "hey"'], }, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'shell_command_before': 'rbenv local 2.0.0-p0', - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}, {}], + "shell_command_before": "rbenv local 2.0.0-p0", + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}, {}], }, { - 'window_name': 'shufu', - 'panes': [ + "window_name": "shufu", + "panes": [ { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['htop'], + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": ["htop"], } ], }, - {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, - {'panes': ['top']}, + {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, + {"panes": ["top"]}, ], } config_expanded = { # shell_command_before is string in some areas - 'session_name': 'sampleconfig', - 'start_directory': '/', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/", + "windows": [ { - 'window_name': 'editor', - 'start_directory': os.path.expanduser('~'), - 'shell_command_before': ['source .venv/bin/activate'], - 'panes': [ - {'shell_command': ['vim']}, + "window_name": "editor", + "start_directory": os.path.expanduser("~"), + "shell_command_before": ["source .venv/bin/activate"], + "panes": [ + {"shell_command": ["vim"]}, { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['cowsay "hey"'], + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": ['cowsay "hey"'], }, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'window_name': 'logging', - 'panes': [ - {'shell_command': ['tail -F /var/log/syslog']}, - {'shell_command': []}, + "shell_command_before": ["rbenv local 2.0.0-p0"], + "window_name": "logging", + "panes": [ + {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": []}, ], }, { - 'window_name': 'shufu', - 'panes': [ + "window_name": "shufu", + "panes": [ { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['htop'], + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": ["htop"], } ], }, - {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, - {'panes': [{'shell_command': ['top']}]}, + {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, + {"panes": [{"shell_command": ["top"]}]}, ], } config_after = { # shell_command_before is string in some areas - 'session_name': 'sampleconfig', - 'start_directory': '/', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/", + "windows": [ { - 'window_name': 'editor', - 'start_directory': os.path.expanduser('~'), - 'shell_command_before': ['source .venv/bin/activate'], - 'panes': [ - {'shell_command': ['source .venv/bin/activate', 'vim']}, + "window_name": "editor", + "start_directory": os.path.expanduser("~"), + "shell_command_before": ["source .venv/bin/activate"], + "panes": [ + {"shell_command": ["source .venv/bin/activate", "vim"]}, { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': [ - 'source .venv/bin/activate', - 'rbenv local 2.0.0-p0', + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": [ + "source .venv/bin/activate", + "rbenv local 2.0.0-p0", 'cowsay "hey"', ], }, ], - 'layout': 'main-verticle', + "layout": "main-verticle", }, { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'start_directory': '/', - 'window_name': 'logging', - 'panes': [ - {'shell_command': ['rbenv local 2.0.0-p0', 'tail -F /var/log/syslog']}, - {'shell_command': ['rbenv local 2.0.0-p0']}, + "shell_command_before": ["rbenv local 2.0.0-p0"], + "start_directory": "/", + "window_name": "logging", + "panes": [ + {"shell_command": ["rbenv local 2.0.0-p0", "tail -F /var/log/syslog"]}, + {"shell_command": ["rbenv local 2.0.0-p0"]}, ], }, { - 'start_directory': '/', - 'window_name': 'shufu', - 'panes': [ + "start_directory": "/", + "window_name": "shufu", + "panes": [ { - 'shell_command_before': ['rbenv local 2.0.0-p0'], - 'shell_command': ['rbenv local 2.0.0-p0', 'htop'], + "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command": ["rbenv local 2.0.0-p0", "htop"], } ], }, { - 'start_directory': '/', - 'options': {'automatic-rename': True}, - 'panes': [{'shell_command': ['htop']}], + "start_directory": "/", + "options": {"automatic-rename": True}, + "panes": [{"shell_command": ["htop"]}], }, - {'start_directory': '/', 'panes': [{'shell_command': ['top']}]}, + {"start_directory": "/", "panes": [{"shell_command": ["top"]}]}, ], } diff --git a/tests/fixtures/config/trickle.py b/tests/fixtures/config/trickle.py index 938d641684..7792ba425a 100644 --- a/tests/fixtures/config/trickle.py +++ b/tests/fixtures/config/trickle.py @@ -1,40 +1,40 @@ before = { # shell_command_before is string in some areas - 'session_name': 'sampleconfig', - 'start_directory': '/var', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/var", + "windows": [ { - 'window_name': 'editor', - 'start_directory': 'log', - 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], - 'layout': 'main-verticle', + "window_name": "editor", + "start_directory": "log", + "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'start_directory': '~', - 'panes': [ - {'shell_command': ['tail -F /var/log/syslog']}, - {'shell_command': []}, + "window_name": "logging", + "start_directory": "~", + "panes": [ + {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": []}, ], }, ], } expected = { # shell_command_before is string in some areas - 'session_name': 'sampleconfig', - 'start_directory': '/var', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/var", + "windows": [ { - 'window_name': 'editor', - 'start_directory': '/var/log', - 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], - 'layout': 'main-verticle', + "window_name": "editor", + "start_directory": "/var/log", + "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "layout": "main-verticle", }, { - 'start_directory': '~', - 'window_name': 'logging', - 'panes': [ - {'shell_command': ['tail -F /var/log/syslog']}, - {'shell_command': []}, + "start_directory": "~", + "window_name": "logging", + "panes": [ + {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": []}, ], }, ], diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index 17803cf532..686f8311c9 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -1,79 +1,79 @@ from .._util import loadfixture -teamocil_yaml = loadfixture('config_teamocil/layouts.yaml') +teamocil_yaml = loadfixture("config_teamocil/layouts.yaml") teamocil_dict = { - 'two-windows': { - 'windows': [ + "two-windows": { + "windows": [ { - 'name': 'foo', - 'clear': True, - 'root': '/foo', - 'layout': 'tiled', - 'panes': [{'cmd': "echo 'foo'"}, {'cmd': "echo 'foo again'"}], + "name": "foo", + "clear": True, + "root": "/foo", + "layout": "tiled", + "panes": [{"cmd": "echo 'foo'"}, {"cmd": "echo 'foo again'"}], }, { - 'name': 'bar', - 'root': '/bar', - 'splits': [ + "name": "bar", + "root": "/bar", + "splits": [ { - 'cmd': ["echo 'bar'", "echo 'bar in an array'"], - 'target': 'bottom-right', + "cmd": ["echo 'bar'", "echo 'bar in an array'"], + "target": "bottom-right", }, - {'cmd': "echo 'bar again'", 'focus': True, 'width': 50}, + {"cmd": "echo 'bar again'", "focus": True, "width": 50}, ], }, ] }, - 'two-windows-with-filters': { - 'windows': [ + "two-windows-with-filters": { + "windows": [ { - 'name': 'foo', - 'root': '/foo', - 'filters': { - 'before': ['echo first before filter', 'echo second before filter'], - 'after': ['echo first after filter', 'echo second after filter'], + "name": "foo", + "root": "/foo", + "filters": { + "before": ["echo first before filter", "echo second before filter"], + "after": ["echo first after filter", "echo second after filter"], }, - 'panes': [ - {'cmd': "echo 'foo'"}, - {'cmd': "echo 'foo again'", 'width': 50}, + "panes": [ + {"cmd": "echo 'foo'"}, + {"cmd": "echo 'foo again'", "width": 50}, ], } ] }, - 'two-windows-with-custom-command-options': { - 'windows': [ + "two-windows-with-custom-command-options": { + "windows": [ { - 'name': 'foo', - 'cmd_separator': '\n', - 'with_env_var': False, - 'clear': True, - 'root': '/foo', - 'layout': 'tiled', - 'panes': [{'cmd': "echo 'foo'"}, {'cmd': "echo 'foo again'"}], + "name": "foo", + "cmd_separator": "\n", + "with_env_var": False, + "clear": True, + "root": "/foo", + "layout": "tiled", + "panes": [{"cmd": "echo 'foo'"}, {"cmd": "echo 'foo again'"}], }, { - 'name': 'bar', - 'cmd_separator': ' && ', - 'with_env_var': True, - 'root': '/bar', - 'splits': [ + "name": "bar", + "cmd_separator": " && ", + "with_env_var": True, + "root": "/bar", + "splits": [ { - 'cmd': ["echo 'bar'", "echo 'bar in an array'"], - 'target': 'bottom-right', + "cmd": ["echo 'bar'", "echo 'bar in an array'"], + "target": "bottom-right", }, - {'cmd': "echo 'bar again'", 'focus': True, 'width': 50}, + {"cmd": "echo 'bar again'", "focus": True, "width": 50}, ], }, ] }, - 'three-windows-within-a-session': { - 'session': { - 'name': 'my awesome session', - 'windows': [ - {'name': 'first window', 'panes': [{'cmd': "echo 'foo'"}]}, - {'name': 'second window', 'panes': [{'cmd': "echo 'foo'"}]}, - {'name': 'third window', 'panes': [{'cmd': "echo 'foo'"}]}, + "three-windows-within-a-session": { + "session": { + "name": "my awesome session", + "windows": [ + {"name": "first window", "panes": [{"cmd": "echo 'foo'"}]}, + {"name": "second window", "panes": [{"cmd": "echo 'foo'"}]}, + {"name": "third window", "panes": [{"cmd": "echo 'foo'"}]}, ], } }, @@ -81,86 +81,86 @@ two_windows = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'foo', - 'start_directory': '/foo', - 'clear': True, - 'layout': 'tiled', - 'panes': [ - {'shell_command': "echo 'foo'"}, - {'shell_command': "echo 'foo again'"}, + "window_name": "foo", + "start_directory": "/foo", + "clear": True, + "layout": "tiled", + "panes": [ + {"shell_command": "echo 'foo'"}, + {"shell_command": "echo 'foo again'"}, ], }, { - 'window_name': 'bar', - 'start_directory': '/bar', - 'panes': [ + "window_name": "bar", + "start_directory": "/bar", + "panes": [ { - 'shell_command': ["echo 'bar'", "echo 'bar in an array'"], - 'target': 'bottom-right', + "shell_command": ["echo 'bar'", "echo 'bar in an array'"], + "target": "bottom-right", }, - {'shell_command': "echo 'bar again'", 'focus': True}, + {"shell_command": "echo 'bar again'", "focus": True}, ], }, ], } two_windows_with_filters = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'foo', - 'start_directory': '/foo', - 'shell_command_before': [ - 'echo first before filter', - 'echo second before filter', + "window_name": "foo", + "start_directory": "/foo", + "shell_command_before": [ + "echo first before filter", + "echo second before filter", ], - 'shell_command_after': [ - 'echo first after filter', - 'echo second after filter', + "shell_command_after": [ + "echo first after filter", + "echo second after filter", ], - 'panes': [ - {'shell_command': "echo 'foo'"}, - {'shell_command': "echo 'foo again'"}, + "panes": [ + {"shell_command": "echo 'foo'"}, + {"shell_command": "echo 'foo again'"}, ], } ], } two_windows_with_custom_command_options = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'foo', - 'start_directory': '/foo', - 'clear': True, - 'layout': 'tiled', - 'panes': [ - {'shell_command': "echo 'foo'"}, - {'shell_command': "echo 'foo again'"}, + "window_name": "foo", + "start_directory": "/foo", + "clear": True, + "layout": "tiled", + "panes": [ + {"shell_command": "echo 'foo'"}, + {"shell_command": "echo 'foo again'"}, ], }, { - 'window_name': 'bar', - 'start_directory': '/bar', - 'panes': [ + "window_name": "bar", + "start_directory": "/bar", + "panes": [ { - 'shell_command': ["echo 'bar'", "echo 'bar in an array'"], - 'target': 'bottom-right', + "shell_command": ["echo 'bar'", "echo 'bar in an array'"], + "target": "bottom-right", }, - {'shell_command': "echo 'bar again'", 'focus': True}, + {"shell_command": "echo 'bar again'", "focus": True}, ], }, ], } three_windows_within_a_session = { - 'session_name': 'my awesome session', - 'windows': [ - {'window_name': 'first window', 'panes': [{'shell_command': "echo 'foo'"}]}, - {'window_name': 'second window', 'panes': [{'shell_command': "echo 'foo'"}]}, - {'window_name': 'third window', 'panes': [{'shell_command': "echo 'foo'"}]}, + "session_name": "my awesome session", + "windows": [ + {"window_name": "first window", "panes": [{"shell_command": "echo 'foo'"}]}, + {"window_name": "second window", "panes": [{"shell_command": "echo 'foo'"}]}, + {"window_name": "third window", "panes": [{"shell_command": "echo 'foo'"}]}, ], } diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index 0ea0dfa73f..9633095710 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -1,27 +1,27 @@ from .._util import loadfixture -teamocil_yaml = loadfixture('config_teamocil/test1.yaml') +teamocil_yaml = loadfixture("config_teamocil/test1.yaml") teamocil_conf = { - 'windows': [ + "windows": [ { - 'name': 'sample-two-panes', - 'root': '~/Code/sample/www', - 'layout': 'even-horizontal', - 'panes': [{'cmd': ['pwd', 'ls -la']}, {'cmd': 'rails server --port 3000'}], + "name": "sample-two-panes", + "root": "~/Code/sample/www", + "layout": "even-horizontal", + "panes": [{"cmd": ["pwd", "ls -la"]}, {"cmd": "rails server --port 3000"}], } ] } expected = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'sample-two-panes', - 'layout': 'even-horizontal', - 'start_directory': '~/Code/sample/www', - 'panes': [ - {'shell_command': ['pwd', 'ls -la']}, - {'shell_command': 'rails server --port 3000'}, + "window_name": "sample-two-panes", + "layout": "even-horizontal", + "start_directory": "~/Code/sample/www", + "panes": [ + {"shell_command": ["pwd", "ls -la"]}, + {"shell_command": "rails server --port 3000"}, ], } ], diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index 85ea65a82f..e9a0f69b6c 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -1,29 +1,29 @@ from .._util import loadfixture -teamocil_yaml = loadfixture('config_teamocil/test2.yaml') +teamocil_yaml = loadfixture("config_teamocil/test2.yaml") teamocil_dict = { - 'windows': [ + "windows": [ { - 'name': 'sample-four-panes', - 'root': '~/Code/sample/www', - 'layout': 'tiled', - 'panes': [{'cmd': 'pwd'}, {'cmd': 'pwd'}, {'cmd': 'pwd'}, {'cmd': 'pwd'}], + "name": "sample-four-panes", + "root": "~/Code/sample/www", + "layout": "tiled", + "panes": [{"cmd": "pwd"}, {"cmd": "pwd"}, {"cmd": "pwd"}, {"cmd": "pwd"}], } ] } expected = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'sample-four-panes', - 'layout': 'tiled', - 'start_directory': '~/Code/sample/www', - 'panes': [ - {'shell_command': 'pwd'}, - {'shell_command': 'pwd'}, - {'shell_command': 'pwd'}, - {'shell_command': 'pwd'}, + "window_name": "sample-four-panes", + "layout": "tiled", + "start_directory": "~/Code/sample/www", + "panes": [ + {"shell_command": "pwd"}, + {"shell_command": "pwd"}, + {"shell_command": "pwd"}, + {"shell_command": "pwd"}, ], } ], diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index 2406f2b0f5..0bc92980f2 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -1,42 +1,42 @@ from .._util import loadfixture -teamocil_yaml = loadfixture('config_teamocil/test3.yaml') +teamocil_yaml = loadfixture("config_teamocil/test3.yaml") teamocil_dict = { - 'windows': [ + "windows": [ { - 'name': 'my-first-window', - 'root': '~/Projects/foo-www', - 'layout': 'even-vertical', - 'filters': { - 'before': 'rbenv local 2.0.0-p0', - 'after': 'echo \'I am done initializing this pane.\'', + "name": "my-first-window", + "root": "~/Projects/foo-www", + "layout": "even-vertical", + "filters": { + "before": "rbenv local 2.0.0-p0", + "after": "echo 'I am done initializing this pane.'", }, - 'panes': [ - {'cmd': 'git status'}, - {'cmd': 'bundle exec rails server --port 40', 'focus': True}, - {'cmd': ['sudo service memcached start', 'sudo service mongodb start']}, + "panes": [ + {"cmd": "git status"}, + {"cmd": "bundle exec rails server --port 40", "focus": True}, + {"cmd": ["sudo service memcached start", "sudo service mongodb start"]}, ], } ] } expected = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'my-first-window', - 'layout': 'even-vertical', - 'start_directory': "~/Projects/foo-www", - 'shell_command_before': 'rbenv local 2.0.0-p0', - 'shell_command_after': ('echo ' '\'I am done initializing this pane.\''), - 'panes': [ - {'shell_command': 'git status'}, - {'shell_command': 'bundle exec rails server --port 40', 'focus': True}, + "window_name": "my-first-window", + "layout": "even-vertical", + "start_directory": "~/Projects/foo-www", + "shell_command_before": "rbenv local 2.0.0-p0", + "shell_command_after": ("echo " "'I am done initializing this pane.'"), + "panes": [ + {"shell_command": "git status"}, + {"shell_command": "bundle exec rails server --port 40", "focus": True}, { - 'shell_command': [ - 'sudo service memcached start', - 'sudo service mongodb start', + "shell_command": [ + "sudo service memcached start", + "sudo service mongodb start", ] }, ], diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index b9b5f97a35..5827bfcabd 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -1,24 +1,24 @@ from .._util import loadfixture -teamocil_yaml = loadfixture('config_teamocil/test4.yaml') +teamocil_yaml = loadfixture("config_teamocil/test4.yaml") teamocil_dict = { - 'windows': [ + "windows": [ { - 'name': 'erb-example', - 'root': "<%= ENV['MY_PROJECT_ROOT'] %>", - 'panes': [{'cmd': 'pwd'}], + "name": "erb-example", + "root": "<%= ENV['MY_PROJECT_ROOT'] %>", + "panes": [{"cmd": "pwd"}], } ] } expected = { - 'session_name': None, - 'windows': [ + "session_name": None, + "windows": [ { - 'window_name': 'erb-example', - 'start_directory': "<%= ENV['MY_PROJECT_ROOT'] %>", - 'panes': [{'shell_command': 'pwd'}], + "window_name": "erb-example", + "start_directory": "<%= ENV['MY_PROJECT_ROOT'] %>", + "panes": [{"shell_command": "pwd"}], } ], } diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index 2fe873812d..138671942e 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,19 +1,19 @@ from .._util import loadfixture -tmuxinator_yaml = loadfixture('config_tmuxinator/test1.yaml') +tmuxinator_yaml = loadfixture("config_tmuxinator/test1.yaml") tmuxinator_dict = { - 'windows': [ - {'editor': {'layout': 'main-vertical', 'panes': ['vim', 'guard']}}, - {'server': 'bundle exec rails s'}, - {'logs': 'tail -f logs/development.log'}, + "windows": [ + {"editor": {"layout": "main-vertical", "panes": ["vim", "guard"]}}, + {"server": "bundle exec rails s"}, + {"logs": "tail -f logs/development.log"}, ] } expected = { - 'session_name': None, - 'windows': [ - {'window_name': 'editor', 'layout': 'main-vertical', 'panes': ['vim', 'guard']}, - {'window_name': 'server', 'panes': ['bundle exec rails s']}, - {'window_name': 'logs', 'panes': ['tail -f logs/development.log']}, + "session_name": None, + "windows": [ + {"window_name": "editor", "layout": "main-vertical", "panes": ["vim", "guard"]}, + {"window_name": "server", "panes": ["bundle exec rails s"]}, + {"window_name": "logs", "panes": ["tail -f logs/development.log"]}, ], } diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index fe32160f04..23273bf7dd 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,76 +1,76 @@ from .._util import loadfixture -tmuxinator_yaml = loadfixture('config_tmuxinator/test2.yaml') +tmuxinator_yaml = loadfixture("config_tmuxinator/test2.yaml") tmuxinator_dict = { - 'project_name': 'sample', - 'project_root': '~/test', - 'socket_name': 'foo', - 'pre': 'sudo /etc/rc.d/mysqld start', - 'rbenv': '2.0.0-p247', - 'cli_args': '-f ~/.tmux.mac.conf', - 'tabs': [ + "project_name": "sample", + "project_root": "~/test", + "socket_name": "foo", + "pre": "sudo /etc/rc.d/mysqld start", + "rbenv": "2.0.0-p247", + "cli_args": "-f ~/.tmux.mac.conf", + "tabs": [ { - 'editor': { - 'pre': [ + "editor": { + "pre": [ 'echo "I get run in each pane, ' 'before each pane command!"', None, ], - 'layout': 'main-vertical', - 'panes': ['vim', None, 'top'], + "layout": "main-vertical", + "panes": ["vim", None, "top"], } }, - {'shell': 'git pull'}, + {"shell": "git pull"}, { - 'guard': { - 'layout': 'tiled', - 'pre': [ + "guard": { + "layout": "tiled", + "pre": [ 'echo "I get run in each pane."', 'echo "Before each pane command!"', ], - 'panes': [None, None, None], + "panes": [None, None, None], } }, - {'database': 'bundle exec rails db'}, - {'server': 'bundle exec rails s'}, - {'logs': 'tail -f log/development.log'}, - {'console': 'bundle exec rails c'}, - {'capistrano': None}, - {'server': 'ssh user@example.com'}, + {"database": "bundle exec rails db"}, + {"server": "bundle exec rails s"}, + {"logs": "tail -f log/development.log"}, + {"console": "bundle exec rails c"}, + {"capistrano": None}, + {"server": "ssh user@example.com"}, ], } expected = { - 'session_name': 'sample', - 'socket_name': 'foo', - 'config': '~/.tmux.mac.conf', - 'start_directory': '~/test', - 'shell_command_before': ['sudo /etc/rc.d/mysqld start', 'rbenv shell 2.0.0-p247'], - 'windows': [ + "session_name": "sample", + "socket_name": "foo", + "config": "~/.tmux.mac.conf", + "start_directory": "~/test", + "shell_command_before": ["sudo /etc/rc.d/mysqld start", "rbenv shell 2.0.0-p247"], + "windows": [ { - 'window_name': 'editor', - 'shell_command_before': [ + "window_name": "editor", + "shell_command_before": [ 'echo "I get run in each pane, before each pane command!"', None, ], - 'layout': 'main-vertical', - 'panes': ['vim', None, 'top'], + "layout": "main-vertical", + "panes": ["vim", None, "top"], }, - {'window_name': 'shell', 'panes': ['git pull']}, + {"window_name": "shell", "panes": ["git pull"]}, { - 'window_name': 'guard', - 'layout': 'tiled', - 'shell_command_before': [ + "window_name": "guard", + "layout": "tiled", + "shell_command_before": [ 'echo "I get run in each pane."', 'echo "Before each pane command!"', ], - 'panes': [None, None, None], + "panes": [None, None, None], }, - {'window_name': 'database', 'panes': ['bundle exec rails db']}, - {'window_name': 'server', 'panes': ['bundle exec rails s']}, - {'window_name': 'logs', 'panes': ['tail -f log/development.log']}, - {'window_name': 'console', 'panes': ['bundle exec rails c']}, - {'window_name': 'capistrano', 'panes': [None]}, - {'window_name': 'server', 'panes': ['ssh user@example.com']}, + {"window_name": "database", "panes": ["bundle exec rails db"]}, + {"window_name": "server", "panes": ["bundle exec rails s"]}, + {"window_name": "logs", "panes": ["tail -f log/development.log"]}, + {"window_name": "console", "panes": ["bundle exec rails c"]}, + {"window_name": "capistrano", "panes": [None]}, + {"window_name": "server", "panes": ["ssh user@example.com"]}, ], } diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index 9e5698083d..df2353f5c0 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,79 +1,79 @@ from .._util import loadfixture -tmuxinator_yaml = loadfixture('config_tmuxinator/test3.yaml') +tmuxinator_yaml = loadfixture("config_tmuxinator/test3.yaml") tmuxinator_dict = { - 'name': 'sample', - 'root': '~/test', - 'socket_name': 'foo', - 'tmux_options': '-f ~/.tmux.mac.conf', - 'pre': 'sudo /etc/rc.d/mysqld start', - 'pre_window': 'rbenv shell 2.0.0-p247', - 'windows': [ + "name": "sample", + "root": "~/test", + "socket_name": "foo", + "tmux_options": "-f ~/.tmux.mac.conf", + "pre": "sudo /etc/rc.d/mysqld start", + "pre_window": "rbenv shell 2.0.0-p247", + "windows": [ { - 'editor': { - 'pre': [ + "editor": { + "pre": [ 'echo "I get run in each pane, ' 'before each pane command!"', None, ], - 'layout': 'main-vertical', - 'root': '~/test/editor', - 'panes': ['vim', None, 'top'], + "layout": "main-vertical", + "root": "~/test/editor", + "panes": ["vim", None, "top"], } }, - {'shell': ['git pull', 'git merge']}, + {"shell": ["git pull", "git merge"]}, { - 'guard': { - 'layout': 'tiled', - 'pre': [ + "guard": { + "layout": "tiled", + "pre": [ 'echo "I get run in each pane."', 'echo "Before each pane command!"', ], - 'panes': [None, None, None], + "panes": [None, None, None], } }, - {'database': 'bundle exec rails db'}, - {'server': 'bundle exec rails s'}, - {'logs': 'tail -f log/development.log'}, - {'console': 'bundle exec rails c'}, - {'capistrano': None}, - {'server': 'ssh user@example.com'}, + {"database": "bundle exec rails db"}, + {"server": "bundle exec rails s"}, + {"logs": "tail -f log/development.log"}, + {"console": "bundle exec rails c"}, + {"capistrano": None}, + {"server": "ssh user@example.com"}, ], } expected = { - 'session_name': 'sample', - 'socket_name': 'foo', - 'start_directory': '~/test', - 'config': '~/.tmux.mac.conf', - 'shell_command': 'sudo /etc/rc.d/mysqld start', - 'shell_command_before': ['rbenv shell 2.0.0-p247'], - 'windows': [ + "session_name": "sample", + "socket_name": "foo", + "start_directory": "~/test", + "config": "~/.tmux.mac.conf", + "shell_command": "sudo /etc/rc.d/mysqld start", + "shell_command_before": ["rbenv shell 2.0.0-p247"], + "windows": [ { - 'window_name': 'editor', - 'shell_command_before': [ + "window_name": "editor", + "shell_command_before": [ 'echo "I get run in each pane, before each pane command!"', None, ], - 'layout': 'main-vertical', - 'start_directory': '~/test/editor', - 'panes': ['vim', None, 'top'], + "layout": "main-vertical", + "start_directory": "~/test/editor", + "panes": ["vim", None, "top"], }, - {'window_name': 'shell', 'panes': ['git pull', 'git merge']}, + {"window_name": "shell", "panes": ["git pull", "git merge"]}, { - 'window_name': 'guard', - 'layout': 'tiled', - 'shell_command_before': [ + "window_name": "guard", + "layout": "tiled", + "shell_command_before": [ 'echo "I get run in each pane."', 'echo "Before each pane command!"', ], - 'panes': [None, None, None], + "panes": [None, None, None], }, - {'window_name': 'database', 'panes': ['bundle exec rails db']}, - {'window_name': 'server', 'panes': ['bundle exec rails s']}, - {'window_name': 'logs', 'panes': ['tail -f log/development.log']}, - {'window_name': 'console', 'panes': ['bundle exec rails c']}, - {'window_name': 'capistrano', 'panes': [None]}, - {'window_name': 'server', 'panes': ['ssh user@example.com']}, + {"window_name": "database", "panes": ["bundle exec rails db"]}, + {"window_name": "server", "panes": ["bundle exec rails s"]}, + {"window_name": "logs", "panes": ["tail -f log/development.log"]}, + {"window_name": "console", "panes": ["bundle exec rails c"]}, + {"window_name": "capistrano", "panes": [None]}, + {"window_name": "server", "panes": ["ssh user@example.com"]}, ], } diff --git a/tests/fixtures/pluginsystem/partials/all_pass.py b/tests/fixtures/pluginsystem/partials/all_pass.py index 19da4b6e63..72c4116a42 100644 --- a/tests/fixtures/pluginsystem/partials/all_pass.py +++ b/tests/fixtures/pluginsystem/partials/all_pass.py @@ -4,17 +4,17 @@ class AllVersionPassPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmuxp-plugin-my-tmuxp-plugin', - 'tmux_min_version': '1.8', - 'tmux_max_version': '100.0', - 'tmux_version_incompatible': ['2.3'], - 'libtmux_min_version': '0.8.3', - 'libtmux_max_version': '100.0', - 'libtmux_version_incompatible': ['0.7.1'], - 'tmuxp_min_version': '1.7.0', - 'tmuxp_max_version': '100.0.0', - 'tmuxp_version_incompatible': ['1.5.6'], - 'tmux_version': '3.0', - 'tmuxp_version': '1.7.0', + "plugin_name": "tmuxp-plugin-my-tmuxp-plugin", + "tmux_min_version": "1.8", + "tmux_max_version": "100.0", + "tmux_version_incompatible": ["2.3"], + "libtmux_min_version": "0.8.3", + "libtmux_max_version": "100.0", + "libtmux_version_incompatible": ["0.7.1"], + "tmuxp_min_version": "1.7.0", + "tmuxp_max_version": "100.0.0", + "tmuxp_version_incompatible": ["1.5.6"], + "tmux_version": "3.0", + "tmuxp_version": "1.7.0", } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py index 8e7535cab1..80d992f415 100644 --- a/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/libtmux_version_fail.py @@ -4,9 +4,9 @@ class LibtmuxVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'libtmux-min-version-fail', - 'libtmux_min_version': '0.8.3', - 'libtmux_version': '0.7.0', + "plugin_name": "libtmux-min-version-fail", + "libtmux_min_version": "0.8.3", + "libtmux_version": "0.7.0", } MyTestTmuxpPlugin.__init__(self, config) @@ -14,9 +14,9 @@ def __init__(self): class LibtmuxVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'libtmux-max-version-fail', - 'libtmux_max_version': '3.0', - 'libtmux_version': '3.5', + "plugin_name": "libtmux-max-version-fail", + "libtmux_max_version": "3.0", + "libtmux_version": "3.5", } MyTestTmuxpPlugin.__init__(self, config) @@ -24,8 +24,8 @@ def __init__(self): class LibtmuxVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'libtmux-incompatible-version-fail', - 'libtmux_version_incompatible': ['0.7.1'], - 'libtmux_version': '0.7.1', + "plugin_name": "libtmux-incompatible-version-fail", + "libtmux_version_incompatible": ["0.7.1"], + "libtmux_version": "0.7.1", } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py index d58eca8dd8..1ca4ec5fa7 100644 --- a/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py +++ b/tests/fixtures/pluginsystem/partials/test_plugin_helpers.py @@ -3,18 +3,18 @@ class MyTestTmuxpPlugin(TmuxpPlugin): def __init__(self, config): - tmux_version = config.pop('tmux_version', None) - libtmux_version = config.pop('libtmux_version', None) - tmuxp_version = config.pop('tmuxp_version', None) + tmux_version = config.pop("tmux_version", None) + libtmux_version = config.pop("libtmux_version", None) + tmuxp_version = config.pop("tmuxp_version", None) TmuxpPlugin.__init__(self, **config) # WARNING! This should not be done in anything but a test if tmux_version: - self.version_constraints['tmux']['version'] = tmux_version + self.version_constraints["tmux"]["version"] = tmux_version if libtmux_version: - self.version_constraints['libtmux']['version'] = libtmux_version + self.version_constraints["libtmux"]["version"] = libtmux_version if tmuxp_version: - self.version_constraints['tmuxp']['version'] = tmuxp_version + self.version_constraints["tmuxp"]["version"] = tmuxp_version self._version_check() diff --git a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py index 19ffbb1e08..48b2f95f88 100644 --- a/tests/fixtures/pluginsystem/partials/tmux_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmux_version_fail.py @@ -4,9 +4,9 @@ class TmuxVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmux-min-version-fail', - 'tmux_min_version': '1.8', - 'tmux_version': '1.7', + "plugin_name": "tmux-min-version-fail", + "tmux_min_version": "1.8", + "tmux_version": "1.7", } MyTestTmuxpPlugin.__init__(self, config) @@ -14,9 +14,9 @@ def __init__(self): class TmuxVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmux-max-version-fail', - 'tmux_max_version': '3.0', - 'tmux_version': '3.5', + "plugin_name": "tmux-max-version-fail", + "tmux_max_version": "3.0", + "tmux_version": "3.5", } MyTestTmuxpPlugin.__init__(self, config) @@ -24,9 +24,9 @@ def __init__(self): class TmuxVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmux-incompatible-version-fail', - 'tmux_version_incompatible': ['2.3'], - 'tmux_version': '2.3', + "plugin_name": "tmux-incompatible-version-fail", + "tmux_version_incompatible": ["2.3"], + "tmux_version": "2.3", } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py index 47c4a8e82c..861f1cfcb8 100644 --- a/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py +++ b/tests/fixtures/pluginsystem/partials/tmuxp_version_fail.py @@ -4,9 +4,9 @@ class TmuxpVersionFailMinPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmuxp-min-version-fail', - 'tmuxp_min_version': '1.7.0', - 'tmuxp_version': '1.6.3', + "plugin_name": "tmuxp-min-version-fail", + "tmuxp_min_version": "1.7.0", + "tmuxp_version": "1.6.3", } MyTestTmuxpPlugin.__init__(self, config) @@ -14,9 +14,9 @@ def __init__(self): class TmuxpVersionFailMaxPlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmuxp-max-version-fail', - 'tmuxp_max_version': '2.0.0', - 'tmuxp_version': '2.5', + "plugin_name": "tmuxp-max-version-fail", + "tmuxp_max_version": "2.0.0", + "tmuxp_version": "2.5", } MyTestTmuxpPlugin.__init__(self, config) @@ -24,8 +24,8 @@ def __init__(self): class TmuxpVersionFailIncompatiblePlugin(MyTestTmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmuxp-incompatible-version-fail', - 'tmuxp_version_incompatible': ['1.5.0'], - 'tmuxp_version': '1.5.0', + "plugin_name": "tmuxp-incompatible-version-fail", + "tmuxp_version_incompatible": ["1.5.0"], + "tmuxp_version": "1.5.0", } MyTestTmuxpPlugin.__init__(self, config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py index 442f86e267..fb3ddc3572 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_awf/tmuxp_test_plugin_awf/plugin.py @@ -3,16 +3,16 @@ class PluginAfterWindowFinished(TmuxpPlugin): def __init__(self): - self.message = '[+] This is the Tmuxp Test Plugin' + self.message = "[+] This is the Tmuxp Test Plugin" def after_window_finished(self, window): - if window.name == 'editor': - window.rename_window('plugin_test_awf') - elif window.name == 'awf_mw_test': - window.rename_window('plugin_test_awf_mw') - elif window.name == 'awf_mw_test_2': - window.rename_window('plugin_test_awf_mw_2') - elif window.name == 'mp_test_owc': - window.rename_window('mp_test_awf') + if window.name == "editor": + window.rename_window("plugin_test_awf") + elif window.name == "awf_mw_test": + window.rename_window("plugin_test_awf_mw") + elif window.name == "awf_mw_test_2": + window.rename_window("plugin_test_awf_mw_2") + elif window.name == "mp_test_owc": + window.rename_window("mp_test_awf") else: pass diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py index 98692ac9f3..faacc0cd86 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/tmuxp_test_plugin_bs/plugin.py @@ -3,7 +3,7 @@ class PluginBeforeScript(TmuxpPlugin): def __init__(self): - self.message = '[+] This is the Tmuxp Test Plugin' + self.message = "[+] This is the Tmuxp Test Plugin" def before_script(self, session): - session.rename_session('plugin_test_bs') + session.rename_session("plugin_test_bs") diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py index 78fd68f28b..aa9cb1419e 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bwb/tmuxp_test_plugin_bwb/plugin.py @@ -3,7 +3,7 @@ class PluginBeforeWorkspaceBuilder(TmuxpPlugin): def __init__(self): - self.message = '[+] This is the Tmuxp Test Plugin' + self.message = "[+] This is the Tmuxp Test Plugin" def before_workspace_builder(self, session): - session.rename_session('plugin_test_bwb') + session.rename_session("plugin_test_bwb") diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py index abe56e46c7..4de06ee2e7 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_fail/tmuxp_test_plugin_fail/plugin.py @@ -4,7 +4,7 @@ class PluginFailVersion(TmuxpPlugin): def __init__(self): config = { - 'plugin_name': 'tmuxp-plugin-fail-version', - 'tmuxp_max_version': '0.0.0', + "plugin_name": "tmuxp-plugin-fail-version", + "tmuxp_max_version": "0.0.0", } TmuxpPlugin.__init__(self, **config) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py index 2ba059cd4d..0c6af1dc69 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_owc/tmuxp_test_plugin_owc/plugin.py @@ -3,16 +3,16 @@ class PluginOnWindowCreate(TmuxpPlugin): def __init__(self): - self.message = '[+] This is the Tmuxp Test Plugin' + self.message = "[+] This is the Tmuxp Test Plugin" def on_window_create(self, window): - if window.name == 'editor': - window.rename_window('plugin_test_owc') - elif window.name == 'owc_mw_test': - window.rename_window('plugin_test_owc_mw') - elif window.name == 'owc_mw_test_2': - window.rename_window('plugin_test_owc_mw_2') - elif window.name == 'mp_test': - window.rename_window('mp_test_owc') + if window.name == "editor": + window.rename_window("plugin_test_owc") + elif window.name == "owc_mw_test": + window.rename_window("plugin_test_owc_mw") + elif window.name == "owc_mw_test_2": + window.rename_window("plugin_test_owc_mw_2") + elif window.name == "mp_test": + window.rename_window("mp_test_owc") else: pass diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py index ccf251142a..1cc6ccb8f0 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_r/tmuxp_test_plugin_r/plugin.py @@ -3,7 +3,7 @@ class PluginReattach(TmuxpPlugin): def __init__(self): - self.message = '[+] This is the Tmuxp Test Plugin' + self.message = "[+] This is the Tmuxp Test Plugin" def reattach(self, session): - session.rename_session('plugin_test_r') + session.rename_session("plugin_test_r") diff --git a/tests/test_cli.py b/tests/test_cli.py index 8802535f6c..64cfce7593 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -68,28 +68,28 @@ def test_get_configs_cwd(tmpdir): confdir = tmpdir.mkdir("tmuxpconf2") with confdir.as_cwd(): - config1 = open('.tmuxp.json', 'w+b') + config1 = open(".tmuxp.json", "w+b") config1.close() configs_found = config.in_cwd() assert len(configs_found) == 1 - assert '.tmuxp.json' in configs_found + assert ".tmuxp.json" in configs_found @pytest.mark.parametrize( - 'path,expect', + "path,expect", [ - ('.', False), - ('./', False), - ('', False), - ('.tmuxp.yaml', False), - ('../.tmuxp.yaml', False), - ('../', False), - ('/hello/world', False), - ('~/.tmuxp/hey', False), - ('~/work/c/tmux/', False), - ('~/work/c/tmux/.tmuxp.yaml', False), - ('myproject', True), + (".", False), + ("./", False), + ("", False), + (".tmuxp.yaml", False), + ("../.tmuxp.yaml", False), + ("../", False), + ("/hello/world", False), + ("~/.tmuxp/hey", False), + ("~/work/c/tmux/", False), + ("~/work/c/tmux/.tmuxp.yaml", False), + ("myproject", True), ], ) def test_is_pure_name(path, expect): @@ -117,172 +117,172 @@ def test_is_pure_name(path, expect): @pytest.fixture def homedir(tmpdir): - return tmpdir.join('home').mkdir() + return tmpdir.join("home").mkdir() @pytest.fixture def configdir(homedir): - return homedir.join('.tmuxp').mkdir() + return homedir.join(".tmuxp").mkdir() @pytest.fixture def projectdir(homedir): - return homedir.join('work').join('project') + return homedir.join("work").join("project") def test_tmuxp_configdir_env_var(tmpdir, monkeypatch): - monkeypatch.setenv('TMUXP_CONFIGDIR', str(tmpdir)) + monkeypatch.setenv("TMUXP_CONFIGDIR", str(tmpdir)) assert get_config_dir() == tmpdir def test_tmuxp_configdir_xdg_config_dir(tmpdir, monkeypatch): - monkeypatch.setenv('XDG_CONFIG_HOME', str(tmpdir)) + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir)) tmux_dir = tmpdir.mkdir("tmuxp") assert get_config_dir() == str(tmux_dir) def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): - monkeypatch.setenv('HOME', str(homedir)) - monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir.join('.config'))) + monkeypatch.setenv("HOME", str(homedir)) + monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir.join(".config"))) - projectdir.join('.tmuxp.yaml').ensure() - user_config_name = 'myconfig' - user_config = configdir.join('%s.yaml' % user_config_name).ensure() + projectdir.join(".tmuxp.yaml").ensure() + user_config_name = "myconfig" + user_config = configdir.join("%s.yaml" % user_config_name).ensure() - project_config = str(projectdir.join('.tmuxp.yaml')) + project_config = str(projectdir.join(".tmuxp.yaml")) with projectdir.as_cwd(): expect = project_config - assert scan_config('.') == expect - assert scan_config('./') == expect - assert scan_config('') == expect - assert scan_config('../project') == expect - assert scan_config('../project/') == expect - assert scan_config('.tmuxp.yaml') == expect - assert scan_config('../../.tmuxp/%s.yaml' % user_config_name) == str( + assert scan_config(".") == expect + assert scan_config("./") == expect + assert scan_config("") == expect + assert scan_config("../project") == expect + assert scan_config("../project/") == expect + assert scan_config(".tmuxp.yaml") == expect + assert scan_config("../../.tmuxp/%s.yaml" % user_config_name) == str( user_config ) - assert scan_config('myconfig') == str(user_config) - assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) with pytest.raises(Exception): - scan_config('.tmuxp.json') + scan_config(".tmuxp.json") with pytest.raises(Exception): - scan_config('.tmuxp.ini') + scan_config(".tmuxp.ini") with pytest.raises(Exception): - scan_config('../') + scan_config("../") with pytest.raises(Exception): - scan_config('mooooooo') + scan_config("mooooooo") with homedir.as_cwd(): expect = project_config - assert scan_config('work/project') == expect - assert scan_config('work/project/') == expect - assert scan_config('./work/project') == expect - assert scan_config('./work/project/') == expect - assert scan_config('.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert scan_config('./.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert scan_config('myconfig') == str(user_config) - assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config("work/project") == expect + assert scan_config("work/project/") == expect + assert scan_config("./work/project") == expect + assert scan_config("./work/project/") == expect + assert scan_config(".tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) with pytest.raises(Exception): - scan_config('') + scan_config("") with pytest.raises(Exception): - scan_config('.') + scan_config(".") with pytest.raises(Exception): - scan_config('.tmuxp.yaml') + scan_config(".tmuxp.yaml") with pytest.raises(Exception): - scan_config('../') + scan_config("../") with pytest.raises(Exception): - scan_config('mooooooo') + scan_config("mooooooo") with configdir.as_cwd(): expect = project_config - assert scan_config('../work/project') == expect - assert scan_config('../../home/work/project') == expect - assert scan_config('../work/project/') == expect - assert scan_config('%s.yaml' % user_config_name) == str(user_config) - assert scan_config('./%s.yaml' % user_config_name) == str(user_config) - assert scan_config('myconfig') == str(user_config) - assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config("../work/project") == expect + assert scan_config("../../home/work/project") == expect + assert scan_config("../work/project/") == expect + assert scan_config("%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) with pytest.raises(Exception): - scan_config('') + scan_config("") with pytest.raises(Exception): - scan_config('.') + scan_config(".") with pytest.raises(Exception): - scan_config('.tmuxp.yaml') + scan_config(".tmuxp.yaml") with pytest.raises(Exception): - scan_config('../') + scan_config("../") with pytest.raises(Exception): - scan_config('mooooooo') + scan_config("mooooooo") with tmpdir.as_cwd(): expect = project_config - assert scan_config('home/work/project') == expect - assert scan_config('./home/work/project/') == expect - assert scan_config('home/.tmuxp/%s.yaml' % user_config_name) == str(user_config) - assert scan_config('./home/.tmuxp/%s.yaml' % user_config_name) == str( + assert scan_config("home/work/project") == expect + assert scan_config("./home/work/project/") == expect + assert scan_config("home/.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./home/.tmuxp/%s.yaml" % user_config_name) == str( user_config ) - assert scan_config('myconfig') == str(user_config) - assert scan_config('~/.tmuxp/myconfig.yaml') == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) with pytest.raises(Exception): - scan_config('') + scan_config("") with pytest.raises(Exception): - scan_config('.') + scan_config(".") with pytest.raises(Exception): - scan_config('.tmuxp.yaml') + scan_config(".tmuxp.yaml") with pytest.raises(Exception): - scan_config('../') + scan_config("../") with pytest.raises(Exception): - scan_config('mooooooo') + scan_config("mooooooo") def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): runner = CliRunner() @click.command() - @click.argument('config', type=cli.ConfigPath(exists=True), nargs=-1) + @click.argument("config", type=cli.ConfigPath(exists=True), nargs=-1) def config_cmd(config): click.echo(config) - monkeypatch.setenv('HOME', str(homedir)) - projectdir.join('.tmuxp.yaml').ensure() - user_config_name = 'myconfig' - user_config = configdir.join('%s.yaml' % user_config_name).ensure() + monkeypatch.setenv("HOME", str(homedir)) + projectdir.join(".tmuxp.yaml").ensure() + user_config_name = "myconfig" + user_config = configdir.join("%s.yaml" % user_config_name).ensure() - project_config = str(projectdir.join('.tmuxp.yaml')) + project_config = str(projectdir.join(".tmuxp.yaml")) def check_cmd(config_arg): return runner.invoke(config_cmd, [config_arg]).output with projectdir.as_cwd(): expect = project_config - assert expect in check_cmd('.') - assert expect in check_cmd('./') - assert expect in check_cmd('') - assert expect in check_cmd('../project') - assert expect in check_cmd('../project/') - assert expect in check_cmd('.tmuxp.yaml') - assert str(user_config) in check_cmd('../../.tmuxp/%s.yaml' % user_config_name) - assert user_config.purebasename in check_cmd('myconfig') - assert str(user_config) in check_cmd('~/.tmuxp/myconfig.yaml') - - assert 'file not found' in check_cmd('.tmuxp.json') - assert 'file not found' in check_cmd('.tmuxp.ini') - assert 'No tmuxp files found' in check_cmd('../') - assert 'config not found in config dir' in check_cmd('moo') + assert expect in check_cmd(".") + assert expect in check_cmd("./") + assert expect in check_cmd("") + assert expect in check_cmd("../project") + assert expect in check_cmd("../project/") + assert expect in check_cmd(".tmuxp.yaml") + assert str(user_config) in check_cmd("../../.tmuxp/%s.yaml" % user_config_name) + assert user_config.purebasename in check_cmd("myconfig") + assert str(user_config) in check_cmd("~/.tmuxp/myconfig.yaml") + + assert "file not found" in check_cmd(".tmuxp.json") + assert "file not found" in check_cmd(".tmuxp.ini") + assert "No tmuxp files found" in check_cmd("../") + assert "config not found in config dir" in check_cmd("moo") def test_load_workspace(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") # open it detached @@ -291,33 +291,33 @@ def test_load_workspace(server, monkeypatch): ) assert isinstance(session, libtmux.Session) - assert session.name == 'sampleconfig' + assert session.name == "sampleconfig" def test_load_workspace_named_session(server, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") # open it detached session = load_workspace( session_file, socket_name=server.socket_name, - new_session_name='tmuxp-new', + new_session_name="tmuxp-new", detached=True, ) assert isinstance(session, libtmux.Session) - assert session.name == 'tmuxp-new' + assert session.name == "tmuxp-new" @pytest.mark.skipif( - has_lt_version('2.1'), reason='exact session name matches only tmux >= 2.1' + has_lt_version("2.1"), reason="exact session name matches only tmux >= 2.1" ) def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") # open it detached @@ -326,9 +326,9 @@ def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): ) assert isinstance(session, libtmux.Session) - assert session.name == 'sampleconfig' + assert session.name == "sampleconfig" - projfile = tmpdir.join('simple.yaml') + projfile = tmpdir.join("simple.yaml") projfile.write( """ @@ -343,19 +343,19 @@ def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): session = load_workspace( projfile.strpath, socket_name=server.socket_name, detached=True ) - assert session.name == 'sampleconfi' + assert session.name == "sampleconfi" def test_load_symlinked_workspace(server, tmpdir, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) - realtemp = tmpdir.mkdir('myrealtemp') - linktemp = tmpdir.join('symlinktemp') + realtemp = tmpdir.mkdir("myrealtemp") + linktemp = tmpdir.join("symlinktemp") linktemp.mksymlinkto(realtemp) - projfile = linktemp.join('simple.yaml') + projfile = linktemp.join("simple.yaml") projfile.write( """ @@ -373,7 +373,7 @@ def test_load_symlinked_workspace(server, tmpdir, monkeypatch): pane = session.attached_window.attached_pane assert isinstance(session, libtmux.Session) - assert session.name == 'samplesimple' + assert session.name == "samplesimple" assert pane.current_path == realtemp.strpath @@ -383,134 +383,134 @@ def test_regression_00132_session_name_with_dots(tmpdir, server, session): inputs = [] runner = CliRunner() result = runner.invoke( - cli.command_load, cli_args, input=''.join(inputs), standalone_mode=False + cli.command_load, cli_args, input="".join(inputs), standalone_mode=False ) assert result.exception assert isinstance(result.exception, libtmux.exc.BadSessionName) -@pytest.mark.parametrize("cli_args", [(['load', '.']), (['load', '.tmuxp.yaml'])]) +@pytest.mark.parametrize("cli_args", [(["load", "."]), (["load", ".tmuxp.yaml"])]) def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join('.tmuxp.yaml').ensure() - tmpdir.join('.oh-my-zsh').ensure(dir=True) - monkeypatch.setenv('HOME', str(tmpdir)) + tmpdir.join(".tmuxp.yaml").ensure() + tmpdir.join(".oh-my-zsh").ensure(dir=True) + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): runner = CliRunner() - monkeypatch.delenv('DISABLE_AUTO_TITLE', raising=False) - monkeypatch.setenv('SHELL', 'zsh') + monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) + monkeypatch.setenv("SHELL", "zsh") result = runner.invoke(cli.cli, cli_args) - assert 'Please set' in result.output + assert "Please set" in result.output - monkeypatch.setenv('DISABLE_AUTO_TITLE', 'false') + monkeypatch.setenv("DISABLE_AUTO_TITLE", "false") result = runner.invoke(cli.cli, cli_args) - assert 'Please set' in result.output + assert "Please set" in result.output - monkeypatch.setenv('DISABLE_AUTO_TITLE', 'true') + monkeypatch.setenv("DISABLE_AUTO_TITLE", "true") result = runner.invoke(cli.cli, cli_args) - assert 'Please set' not in result.output + assert "Please set" not in result.output - monkeypatch.delenv('DISABLE_AUTO_TITLE', raising=False) - monkeypatch.setenv('SHELL', 'sh') + monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) + monkeypatch.setenv("SHELL", "sh") result = runner.invoke(cli.cli, cli_args) - assert 'Please set' not in result.output + assert "Please set" not in result.output @pytest.mark.parametrize( "cli_args", [ - (['load', '.', '--log-file', 'log.txt']), + (["load", ".", "--log-file", "log.txt"]), ], ) def test_load_log_file(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml that breaks to prevent actually loading tmux - tmpdir.join('.tmuxp.yaml').write( + tmpdir.join(".tmuxp.yaml").write( """ session_name: hello """ ) - tmpdir.join('.oh-my-zsh').ensure(dir=True) - monkeypatch.setenv('HOME', str(tmpdir)) + tmpdir.join(".oh-my-zsh").ensure(dir=True) + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): - print('tmpdir: {0}'.format(tmpdir)) + print("tmpdir: {0}".format(tmpdir)) runner = CliRunner() # If autoconfirm (-y) no need to prompt y - input_args = 'y\ny\n' if '-y' not in cli_args else '' + input_args = "y\ny\n" if "-y" not in cli_args else "" runner.invoke(cli.cli, cli_args, input=input_args) - assert 'Loading' in tmpdir.join('log.txt').open().read() + assert "Loading" in tmpdir.join("log.txt").open().read() -@pytest.mark.parametrize("cli_cmd", ['shell', ('shell', '--pdb')]) +@pytest.mark.parametrize("cli_cmd", ["shell", ("shell", "--pdb")]) @pytest.mark.parametrize( "cli_args,inputs,env,expected_output", [ ( - ['-L{SOCKET_NAME}', '-c', 'print(str(server.socket_name))'], + ["-L{SOCKET_NAME}", "-c", "print(str(server.socket_name))"], [], {}, - '{SERVER_SOCKET_NAME}', + "{SERVER_SOCKET_NAME}", ), ( [ - '-L{SOCKET_NAME}', - '{SESSION_NAME}', - '-c', - 'print(session.name)', + "-L{SOCKET_NAME}", + "{SESSION_NAME}", + "-c", + "print(session.name)", ], [], {}, - '{SESSION_NAME}', + "{SESSION_NAME}", ), ( [ - '-L{SOCKET_NAME}', - '{SESSION_NAME}', - '{WINDOW_NAME}', - '-c', - 'print(server.has_session(session.name))', + "-L{SOCKET_NAME}", + "{SESSION_NAME}", + "{WINDOW_NAME}", + "-c", + "print(server.has_session(session.name))", ], [], {}, - 'True', + "True", ), ( [ - '-L{SOCKET_NAME}', - '{SESSION_NAME}', - '{WINDOW_NAME}', - '-c', - 'print(window.name)', + "-L{SOCKET_NAME}", + "{SESSION_NAME}", + "{WINDOW_NAME}", + "-c", + "print(window.name)", ], [], {}, - '{WINDOW_NAME}', + "{WINDOW_NAME}", ), ( [ - '-L{SOCKET_NAME}', - '{SESSION_NAME}', - '{WINDOW_NAME}', - '-c', - 'print(pane.id)', + "-L{SOCKET_NAME}", + "{SESSION_NAME}", + "{WINDOW_NAME}", + "-c", + "print(pane.id)", ], [], {}, - '{PANE_ID}', + "{PANE_ID}", ), ( [ - '-L{SOCKET_NAME}', - '-c', - 'print(pane.id)', + "-L{SOCKET_NAME}", + "-c", + "print(pane.id)", ], [], - {'TMUX_PANE': '{PANE_ID}'}, - '{PANE_ID}', + {"TMUX_PANE": "{PANE_ID}"}, + "{PANE_ID}", ), ], ) @@ -525,8 +525,8 @@ def test_shell( server, session, ): - monkeypatch.setenv('HOME', str(tmpdir)) - window_name = 'my_window' + monkeypatch.setenv("HOME", str(tmpdir)) + window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -549,7 +549,7 @@ def test_shell( runner = CliRunner() result = runner.invoke( - cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + cli.cli, cli_args, input="".join(inputs), catch_exceptions=False ) assert expected_output.format(**template_ctx) in result.output @@ -557,47 +557,47 @@ def test_shell( @pytest.mark.parametrize( "cli_cmd", [ - 'shell', - ('shell', '--pdb'), + "shell", + ("shell", "--pdb"), ], ) @pytest.mark.parametrize( "cli_args,inputs,env,template_ctx,exception,message", [ ( - ['-LDoesNotExist', '-c', 'print(str(server.socket_name))'], + ["-LDoesNotExist", "-c", "print(str(server.socket_name))"], [], {}, {}, LibTmuxException, - r'.*DoesNotExist.*', + r".*DoesNotExist.*", ), ( [ - '-L{SOCKET_NAME}', - 'nonexistant_session', - '-c', - 'print(str(server.socket_name))', + "-L{SOCKET_NAME}", + "nonexistant_session", + "-c", + "print(str(server.socket_name))", ], [], {}, - {'session_name': 'nonexistant_session'}, + {"session_name": "nonexistant_session"}, exc.TmuxpException, - 'Session not found: nonexistant_session', + "Session not found: nonexistant_session", ), ( [ - '-L{SOCKET_NAME}', - '{SESSION_NAME}', - 'nonexistant_window', - '-c', - 'print(str(server.socket_name))', + "-L{SOCKET_NAME}", + "{SESSION_NAME}", + "nonexistant_window", + "-c", + "print(str(server.socket_name))", ], [], {}, - {'window_name': 'nonexistant_window'}, + {"window_name": "nonexistant_window"}, exc.TmuxpException, - 'Window not found: {WINDOW_NAME}', + "Window not found: {WINDOW_NAME}", ), ], ) @@ -615,8 +615,8 @@ def test_shell_target_missing( server, session, ): - monkeypatch.setenv('HOME', str(tmpdir)) - window_name = 'my_window' + monkeypatch.setenv("HOME", str(tmpdir)) + window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -624,8 +624,8 @@ def test_shell_target_missing( SOCKET_NAME=server.socket_name, SOCKET_PATH=server.socket_path, SESSION_NAME=session.name, - WINDOW_NAME=template_ctx.get('window_name', window_name), - PANE_ID=template_ctx.get('pane_id'), + WINDOW_NAME=template_ctx.get("window_name", window_name), + PANE_ID=template_ctx.get("pane_id"), SERVER_SOCKET_NAME=server.socket_name, ) cli_cmd = list(cli_cmd) if isinstance(cli_cmd, (list, tuple)) else [cli_cmd] @@ -640,11 +640,11 @@ def test_shell_target_missing( if exception is not None: with pytest.raises(exception, match=message.format(**template_ctx)): result = runner.invoke( - cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + cli.cli, cli_args, input="".join(inputs), catch_exceptions=False ) else: result = runner.invoke( - cli.cli, cli_args, input=''.join(inputs), catch_exceptions=False + cli.cli, cli_args, input="".join(inputs), catch_exceptions=False ) assert message.format(**template_ctx) in result.output @@ -654,7 +654,7 @@ def test_shell_target_missing( [ # 'shell', # ('shell', '--pdb'), - ('shell', '--code'), + ("shell", "--code"), # ('shell', '--bpython'), # ('shell', '--ptipython'), # ('shell', '--ptpython'), @@ -666,19 +666,19 @@ def test_shell_target_missing( [ ( [ - '-L{SOCKET_NAME}', + "-L{SOCKET_NAME}", ], [], {}, - '(InteractiveConsole)', + "(InteractiveConsole)", ), ( [ - '-L{SOCKET_NAME}', + "-L{SOCKET_NAME}", ], [], - {'PANE_ID': '{PANE_ID}'}, - '(InteractiveConsole)', + {"PANE_ID": "{PANE_ID}"}, + "(InteractiveConsole)", ), ], ) @@ -693,8 +693,8 @@ def test_shell_plus( server, session, ): - monkeypatch.setenv('HOME', str(tmpdir)) - window_name = 'my_window' + monkeypatch.setenv("HOME", str(tmpdir)) + window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -717,7 +717,7 @@ def test_shell_plus( runner = CliRunner() result = runner.invoke( - cli.cli, cli_args, input=''.join(inputs), catch_exceptions=True + cli.cli, cli_args, input="".join(inputs), catch_exceptions=True ) assert message.format(**template_ctx) in result.output @@ -725,167 +725,167 @@ def test_shell_plus( @pytest.mark.parametrize( "cli_args", [ - (['convert', '.']), - (['convert', '.tmuxp.yaml']), - (['convert', '.tmuxp.yaml', '-y']), - (['convert', '.tmuxp.yml']), - (['convert', '.tmuxp.yml', '-y']), + (["convert", "."]), + (["convert", ".tmuxp.yaml"]), + (["convert", ".tmuxp.yaml", "-y"]), + (["convert", ".tmuxp.yml"]), + (["convert", ".tmuxp.yml", "-y"]), ], ) def test_convert(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at filename = cli_args[1] - if filename == '.': - filename = '.tmuxp.yaml' - file_ext = filename.rsplit('.', 1)[-1] - assert file_ext in ['yaml', 'yml'], file_ext - tmpdir.join(filename).write('\nsession_name: hello\n') - tmpdir.join('.oh-my-zsh').ensure(dir=True) - monkeypatch.setenv('HOME', str(tmpdir)) + if filename == ".": + filename = ".tmuxp.yaml" + file_ext = filename.rsplit(".", 1)[-1] + assert file_ext in ["yaml", "yml"], file_ext + tmpdir.join(filename).write("\nsession_name: hello\n") + tmpdir.join(".oh-my-zsh").ensure(dir=True) + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): runner = CliRunner() # If autoconfirm (-y) no need to prompt y - input_args = 'y\ny\n' if '-y' not in cli_args else '' + input_args = "y\ny\n" if "-y" not in cli_args else "" runner.invoke(cli.cli, cli_args, input=input_args) - assert tmpdir.join('.tmuxp.json').check() - assert tmpdir.join('.tmuxp.json').open().read() == json.dumps( - {'session_name': 'hello'}, indent=2 + assert tmpdir.join(".tmuxp.json").check() + assert tmpdir.join(".tmuxp.json").open().read() == json.dumps( + {"session_name": "hello"}, indent=2 ) @pytest.mark.parametrize( "cli_args", [ - (['convert', '.']), - (['convert', '.tmuxp.json']), - (['convert', '.tmuxp.json', '-y']), + (["convert", "."]), + (["convert", ".tmuxp.json"]), + (["convert", ".tmuxp.json", "-y"]), ], ) def test_convert_json(cli_args, tmpdir, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join('.tmuxp.json').write('{"session_name": "hello"}') - tmpdir.join('.oh-my-zsh').ensure(dir=True) - monkeypatch.setenv('HOME', str(tmpdir)) + tmpdir.join(".tmuxp.json").write('{"session_name": "hello"}') + tmpdir.join(".oh-my-zsh").ensure(dir=True) + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): runner = CliRunner() # If autoconfirm (-y) no need to prompt y - input_args = 'y\ny\n' if '-y' not in cli_args else '' + input_args = "y\ny\n" if "-y" not in cli_args else "" runner.invoke(cli.cli, cli_args, input=input_args) - assert tmpdir.join('.tmuxp.yaml').check() - assert tmpdir.join('.tmuxp.yaml').open().read() == 'session_name: hello\n' + assert tmpdir.join(".tmuxp.yaml").check() + assert tmpdir.join(".tmuxp.yaml").open().read() == "session_name: hello\n" -@pytest.mark.parametrize("cli_args", [(['import'])]) +@pytest.mark.parametrize("cli_args", [(["import"])]) def test_import(cli_args, monkeypatch): runner = CliRunner() result = runner.invoke(cli.cli, cli_args) - assert 'tmuxinator' in result.output - assert 'teamocil' in result.output + assert "tmuxinator" in result.output + assert "teamocil" in result.output @pytest.mark.parametrize( "cli_args", [ - (['--help']), - (['-h']), + (["--help"]), + (["-h"]), ], ) def test_help(cli_args, monkeypatch): runner = CliRunner() result = runner.invoke(cli.cli, cli_args) - assert 'Usage: cli [OPTIONS] COMMAND [ARGS]...' in result.output + assert "Usage: cli [OPTIONS] COMMAND [ARGS]..." in result.output @pytest.mark.parametrize( "cli_args,inputs", [ ( - ['import', 'teamocil', './.teamocil/config.yaml'], - ['\n', 'y\n', './la.yaml\n', 'y\n'], + ["import", "teamocil", "./.teamocil/config.yaml"], + ["\n", "y\n", "./la.yaml\n", "y\n"], ), ( - ['import', 'teamocil', './.teamocil/config.yaml'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ["import", "teamocil", "./.teamocil/config.yaml"], + ["\n", "y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"], ), ( - ['import', 'teamocil', 'config'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ["import", "teamocil", "config"], + ["\n", "y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"], ), ], ) def test_import_teamocil(cli_args, inputs, tmpdir, monkeypatch): - teamocil_config = loadfixture('config_teamocil/test4.yaml') - teamocil_dir = tmpdir.join('.teamocil').mkdir() - teamocil_dir.join('config.yaml').write(teamocil_config) - tmpdir.join('exists.yaml').ensure() - monkeypatch.setenv('HOME', str(tmpdir)) + teamocil_config = loadfixture("config_teamocil/test4.yaml") + teamocil_dir = tmpdir.join(".teamocil").mkdir() + teamocil_dir.join("config.yaml").write(teamocil_config) + tmpdir.join("exists.yaml").ensure() + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): runner = CliRunner() - runner.invoke(cli.cli, cli_args, input=''.join(inputs)) - assert tmpdir.join('la.yaml').check() + runner.invoke(cli.cli, cli_args, input="".join(inputs)) + assert tmpdir.join("la.yaml").check() @pytest.mark.parametrize( "cli_args,inputs", [ ( - ['import', 'tmuxinator', './.tmuxinator/config.yaml'], - ['\n', 'y\n', './la.yaml\n', 'y\n'], + ["import", "tmuxinator", "./.tmuxinator/config.yaml"], + ["\n", "y\n", "./la.yaml\n", "y\n"], ), ( - ['import', 'tmuxinator', './.tmuxinator/config.yaml'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ["import", "tmuxinator", "./.tmuxinator/config.yaml"], + ["\n", "y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"], ), ( - ['import', 'tmuxinator', 'config'], - ['\n', 'y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ["import", "tmuxinator", "config"], + ["\n", "y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"], ), ], ) def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): - tmuxinator_config = loadfixture('config_tmuxinator/test3.yaml') - tmuxinator_dir = tmpdir.join('.tmuxinator').mkdir() - tmuxinator_dir.join('config.yaml').write(tmuxinator_config) - tmpdir.join('exists.yaml').ensure() - monkeypatch.setenv('HOME', str(tmpdir)) + tmuxinator_config = loadfixture("config_tmuxinator/test3.yaml") + tmuxinator_dir = tmpdir.join(".tmuxinator").mkdir() + tmuxinator_dir.join("config.yaml").write(tmuxinator_config) + tmpdir.join("exists.yaml").ensure() + monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): runner = CliRunner() - out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) print(out.output) - assert tmpdir.join('la.yaml').check() + assert tmpdir.join("la.yaml").check() @pytest.mark.parametrize( "cli_args,inputs", [ - (['freeze', 'myfrozensession'], ['y\n', './la.yaml\n', 'y\n']), + (["freeze", "myfrozensession"], ["y\n", "./la.yaml\n", "y\n"]), ( # Exists - ['freeze', 'myfrozensession'], - ['y\n', './exists.yaml\n', './la.yaml\n', 'y\n'], + ["freeze", "myfrozensession"], + ["y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"], ), ( # Imply current session if not entered - ['freeze'], - ['y\n', './la.yaml\n', 'y\n'], + ["freeze"], + ["y\n", "./la.yaml\n", "y\n"], ), - (['freeze'], ['y\n', './exists.yaml\n', './la.yaml\n', 'y\n']), # Exists + (["freeze"], ["y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"]), # Exists ], ) def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): - monkeypatch.setenv('HOME', str(tmpdir)) - tmpdir.join('exists.yaml').ensure() + monkeypatch.setenv("HOME", str(tmpdir)) + tmpdir.join("exists.yaml").ensure() - server.new_session(session_name='myfirstsession') - server.new_session(session_name='myfrozensession') + server.new_session(session_name="myfirstsession") + server.new_session(session_name="myfrozensession") # Assign an active pane to the session second_session = server.list_sessions()[1] @@ -897,60 +897,60 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): with tmpdir.as_cwd(): runner = CliRunner() # Use tmux server (socket name) used in the test - cli_args = cli_args + ['-L', server.socket_name] - out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + cli_args = cli_args + ["-L", server.socket_name] + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) print(out.output) - assert tmpdir.join('la.yaml').check() + assert tmpdir.join("la.yaml").check() - yaml_config = tmpdir.join('la.yaml').open().read() - frozen_config = kaptan.Kaptan(handler='yaml').import_config(yaml_config).get() + yaml_config = tmpdir.join("la.yaml").open().read() + frozen_config = kaptan.Kaptan(handler="yaml").import_config(yaml_config).get() - assert frozen_config['session_name'] == 'myfrozensession' + assert frozen_config["session_name"] == "myfrozensession" @pytest.mark.parametrize( "cli_args,inputs", [ ( # Overwrite - ['freeze', 'mysession', '--force'], - ['\n', 'y\n', './exists.yaml\n', 'y\n'], + ["freeze", "mysession", "--force"], + ["\n", "y\n", "./exists.yaml\n", "y\n"], ), ( # Imply current session if not entered - ['freeze', '--force'], - ['\n', 'y\n', './exists.yaml\n', 'y\n'], + ["freeze", "--force"], + ["\n", "y\n", "./exists.yaml\n", "y\n"], ), ], ) def test_freeze_overwrite(server, cli_args, inputs, tmpdir, monkeypatch): - monkeypatch.setenv('HOME', str(tmpdir)) - tmpdir.join('exists.yaml').ensure() + monkeypatch.setenv("HOME", str(tmpdir)) + tmpdir.join("exists.yaml").ensure() - server.new_session(session_name='mysession') + server.new_session(session_name="mysession") with tmpdir.as_cwd(): runner = CliRunner() # Use tmux server (socket name) used in the test - cli_args = cli_args + ['-L', server.socket_name] - out = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) + cli_args = cli_args + ["-L", server.socket_name] + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) print(out.output) - assert tmpdir.join('exists.yaml').check() + assert tmpdir.join("exists.yaml").check() def test_get_abs_path(tmpdir): expect = str(tmpdir) with tmpdir.as_cwd(): - cli.get_abs_path('../') == os.path.dirname(expect) - cli.get_abs_path('.') == expect - cli.get_abs_path('./') == expect + cli.get_abs_path("../") == os.path.dirname(expect) + cli.get_abs_path(".") == expect + cli.get_abs_path("./") == expect cli.get_abs_path(expect) == expect def test_get_tmuxinator_dir(monkeypatch): - assert cli.get_tmuxinator_dir() == os.path.expanduser('~/.tmuxinator/') + assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") - monkeypatch.setenv('HOME', '/moo') - assert cli.get_tmuxinator_dir() == '/moo/.tmuxinator/' - assert cli.get_tmuxinator_dir() == os.path.expanduser('~/.tmuxinator/') + monkeypatch.setenv("HOME", "/moo") + assert cli.get_tmuxinator_dir() == "/moo/.tmuxinator/" + assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") def test_get_cwd(tmpdir): @@ -962,36 +962,36 @@ def test_get_cwd(tmpdir): def test_get_teamocil_dir(monkeypatch): - assert cli.get_teamocil_dir() == os.path.expanduser('~/.teamocil/') + assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") - monkeypatch.setenv('HOME', '/moo') - assert cli.get_teamocil_dir() == '/moo/.teamocil/' - assert cli.get_teamocil_dir() == os.path.expanduser('~/.teamocil/') + monkeypatch.setenv("HOME", "/moo") + assert cli.get_teamocil_dir() == "/moo/.teamocil/" + assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") def test_validate_choices(): - validate = cli._validate_choices(['choice1', 'choice2']) + validate = cli._validate_choices(["choice1", "choice2"]) - assert validate('choice1') - assert validate('choice2') + assert validate("choice1") + assert validate("choice2") with pytest.raises(click.BadParameter): - assert validate('choice3') + assert validate("choice3") def test_pass_config_dir_ClickPath(tmpdir): - configdir = tmpdir.join('myconfigdir') + configdir = tmpdir.join("myconfigdir") configdir.mkdir() - user_config_name = 'myconfig' - user_config = configdir.join('%s.yaml' % user_config_name).ensure() + user_config_name = "myconfig" + user_config = configdir.join("%s.yaml" % user_config_name).ensure() - expect = str(configdir.join('myconfig.yaml')) + expect = str(configdir.join("myconfig.yaml")) runner = CliRunner() @click.command() @click.argument( - 'config', + "config", type=cli.ConfigPath(exists=True, config_dir=(str(configdir))), nargs=-1, ) @@ -1002,43 +1002,43 @@ def check_cmd(config_arg): return runner.invoke(config_cmd, [config_arg]).output with configdir.as_cwd(): - assert expect in check_cmd('myconfig') - assert expect in check_cmd('myconfig.yaml') - assert expect in check_cmd('./myconfig.yaml') - assert str(user_config) in check_cmd(str(configdir.join('myconfig.yaml'))) + assert expect in check_cmd("myconfig") + assert expect in check_cmd("myconfig.yaml") + assert expect in check_cmd("./myconfig.yaml") + assert str(user_config) in check_cmd(str(configdir.join("myconfig.yaml"))) - assert 'file not found' in check_cmd('.tmuxp.json') + assert "file not found" in check_cmd(".tmuxp.json") def test_ls_cli(monkeypatch, tmpdir): monkeypatch.setenv("HOME", str(tmpdir)) - monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir.join('.config'))) + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir.join(".config"))) filenames = [ - '.git/', - '.gitignore/', - 'session_1.yaml', - 'session_2.yaml', - 'session_3.json', - 'session_4.txt', + ".git/", + ".gitignore/", + "session_1.yaml", + "session_2.yaml", + "session_3.json", + "session_4.txt", ] # should ignore: # - directories should be ignored # - extensions not covered in VALID_CONFIG_DIR_FILE_EXTENSIONS - ignored_filenames = ['.git/', '.gitignore/', 'session_4.txt'] + ignored_filenames = [".git/", ".gitignore/", "session_4.txt"] stems = [os.path.splitext(f)[0] for f in filenames if f not in ignored_filenames] for filename in filenames: - location = tmpdir.join('.tmuxp/{}'.format(filename)) - if filename.endswith('/'): + location = tmpdir.join(".tmuxp/{}".format(filename)) + if filename.endswith("/"): location.ensure_dir() else: location.ensure() runner = CliRunner() cli_output = runner.invoke(command_ls).output - assert cli_output == '\n'.join(stems) + '\n' + assert cli_output == "\n".join(stems) + "\n" def test_load_plugins(monkeypatch_plugin_test_packages): @@ -1046,7 +1046,7 @@ def test_load_plugins(monkeypatch_plugin_test_packages): plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(plugins_config).get() sconfig = config.expand(sconfig) @@ -1061,13 +1061,13 @@ def test_load_plugins(monkeypatch_plugin_test_packages): assert plugin.__class__ in test_plugin_class_types -@pytest.mark.skip('Not sure how to clean up the tmux session this makes') +@pytest.mark.skip("Not sure how to clean up the tmux session this makes") @pytest.mark.parametrize( "cli_args,inputs", [ ( - ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], - ['y\n'], + ["load", "tests/fixtures/workspacebuilder/plugin_versions_fail.yaml"], + ["y\n"], ) ], ) @@ -1076,16 +1076,16 @@ def test_load_plugins_version_fail_skip( ): runner = CliRunner() - results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) - assert '[Loading]' in results.output + results = runner.invoke(cli.cli, cli_args, input="".join(inputs)) + assert "[Loading]" in results.output @pytest.mark.parametrize( "cli_args,inputs", [ ( - ['load', 'tests/fixtures/workspacebuilder/plugin_versions_fail.yaml'], - ['n\n'], + ["load", "tests/fixtures/workspacebuilder/plugin_versions_fail.yaml"], + ["n\n"], ) ], ) @@ -1094,18 +1094,18 @@ def test_load_plugins_version_fail_no_skip( ): runner = CliRunner() - results = runner.invoke(cli.cli, cli_args, input=''.join(inputs)) - assert '[Not Skipping]' in results.output + results = runner.invoke(cli.cli, cli_args, input="".join(inputs)) + assert "[Not Skipping]" in results.output @pytest.mark.parametrize( - "cli_args", [(['load', 'tests/fixtures/workspacebuilder/plugin_missing_fail.yaml'])] + "cli_args", [(["load", "tests/fixtures/workspacebuilder/plugin_missing_fail.yaml"])] ) def test_load_plugins_plugin_missing(monkeypatch_plugin_test_packages, cli_args): runner = CliRunner() results = runner.invoke(cli.cli, cli_args) - assert '[Plugin Error]' in results.output + assert "[Plugin Error]" in results.output def test_plugin_system_before_script( @@ -1114,7 +1114,7 @@ def test_plugin_system_before_script( # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) session_file = curjoin("workspacebuilder/plugin_bs.yaml") # open it detached @@ -1123,13 +1123,13 @@ def test_plugin_system_before_script( ) assert isinstance(session, libtmux.Session) - assert session.name == 'plugin_test_bs' + assert session.name == "plugin_test_bs" def test_reattach_plugins(monkeypatch_plugin_test_packages, server): config_plugins = loadfixture("workspacebuilder/plugin_r.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -1144,14 +1144,14 @@ def test_reattach_plugins(monkeypatch_plugin_test_packages, server): except libtmux.exc.LibTmuxException: pass - proc = builder.session.cmd('display-message', '-p', "'#S'") + proc = builder.session.cmd("display-message", "-p", "'#S'") assert proc.stdout[0] == "'plugin_test_r'" def test_load_attached(server, monkeypatch): # Load a session and attach from outside tmux - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) attach_session_mock = MagicMock() attach_session_mock.return_value.stderr = None @@ -1159,7 +1159,7 @@ def test_load_attached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) yaml_config = loadfixture("workspacebuilder/two_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -1171,7 +1171,7 @@ def test_load_attached(server, monkeypatch): def test_load_attached_detached(server, monkeypatch): # Load a session but don't attach - monkeypatch.delenv('TMUX', raising=False) + monkeypatch.delenv("TMUX", raising=False) attach_session_mock = MagicMock() attach_session_mock.return_value.stderr = None @@ -1179,7 +1179,7 @@ def test_load_attached_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) yaml_config = loadfixture("workspacebuilder/two_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -1191,7 +1191,7 @@ def test_load_attached_detached(server, monkeypatch): def test_load_attached_within_tmux(server, monkeypatch): # Load a session and attach from within tmux - monkeypatch.setenv('TMUX', "/tmp/tmux-1234/default,123,0") + monkeypatch.setenv("TMUX", "/tmp/tmux-1234/default,123,0") switch_client_mock = MagicMock() switch_client_mock.return_value.stderr = None @@ -1199,7 +1199,7 @@ def test_load_attached_within_tmux(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) yaml_config = loadfixture("workspacebuilder/two_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -1211,7 +1211,7 @@ def test_load_attached_within_tmux(server, monkeypatch): def test_load_attached_within_tmux_detached(server, monkeypatch): # Load a session and attach from within tmux - monkeypatch.setenv('TMUX', "/tmp/tmux-1234/default,123,0") + monkeypatch.setenv("TMUX", "/tmp/tmux-1234/default,123,0") switch_client_mock = MagicMock() switch_client_mock.return_value.stderr = None @@ -1219,7 +1219,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) yaml_config = loadfixture("workspacebuilder/two_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -1231,7 +1231,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): def test_load_append_windows_to_current_session(server, monkeypatch): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -1251,21 +1251,21 @@ def test_load_append_windows_to_current_session(server, monkeypatch): def test_debug_info_cli(monkeypatch, tmpdir): - monkeypatch.setenv('SHELL', '/bin/bash') + monkeypatch.setenv("SHELL", "/bin/bash") runner = CliRunner() cli_output = runner.invoke(command_debug_info).output - assert 'environment' in cli_output - assert 'python version' in cli_output - assert 'system PATH' in cli_output - assert 'tmux version' in cli_output - assert 'libtmux version' in cli_output - assert 'tmuxp version' in cli_output - assert 'tmux path' in cli_output - assert 'tmuxp path' in cli_output - assert 'shell' in cli_output - assert 'tmux session' in cli_output - assert 'tmux windows' in cli_output - assert 'tmux panes' in cli_output - assert 'tmux global options' in cli_output - assert 'tmux window options' in cli_output + assert "environment" in cli_output + assert "python version" in cli_output + assert "system PATH" in cli_output + assert "tmux version" in cli_output + assert "libtmux version" in cli_output + assert "tmuxp version" in cli_output + assert "tmux path" in cli_output + assert "tmuxp path" in cli_output + assert "shell" in cli_output + assert "tmux session" in cli_output + assert "tmux windows" in cli_output + assert "tmux panes" in cli_output + assert "tmux global options" in cli_output + assert "tmux window options" in cli_output diff --git a/tests/test_config.py b/tests/test_config.py index 74e58ea829..181751684b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -10,11 +10,11 @@ from . import example_dir from .fixtures import config as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), '.tmuxp') +TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") def load_yaml(yaml): - return kaptan.Kaptan(handler='yaml').import_config(yaml).get() + return kaptan.Kaptan(handler="yaml").import_config(yaml).get() def load_config(_file): @@ -22,12 +22,12 @@ def load_config(_file): def test_export_json(tmpdir): - json_config_file = tmpdir.join('config.json') + json_config_file = tmpdir.join("config.json") configparser = kaptan.Kaptan() configparser.import_config(fixtures.sampleconfig.sampleconfigdict) - json_config_data = configparser.export('json', indent=2) + json_config_data = configparser.export("json", indent=2) json_config_file.write(json_config_data) @@ -37,13 +37,13 @@ def test_export_json(tmpdir): def test_export_yaml(tmpdir): - yaml_config_file = tmpdir.join('config.yaml') + yaml_config_file = tmpdir.join("config.yaml") configparser = kaptan.Kaptan() sampleconfig = config.inline(fixtures.sampleconfig.sampleconfigdict) configparser.import_config(sampleconfig) - yaml_config_data = configparser.export('yaml', indent=2, default_flow_style=False) + yaml_config_data = configparser.export("yaml", indent=2, default_flow_style=False) yaml_config_file.write(yaml_config_data) @@ -54,25 +54,25 @@ def test_export_yaml(tmpdir): def test_scan_config(tmpdir): configs = [] - garbage_file = tmpdir.join('config.psd') - garbage_file.write('wat') + garbage_file = tmpdir.join("config.psd") + garbage_file.write("wat") for r, d, f in os.walk(str(tmpdir)): - for filela in (x for x in f if x.endswith(('.json', '.ini', 'yaml'))): + for filela in (x for x in f if x.endswith((".json", ".ini", "yaml"))): configs.append(str(tmpdir.join(filela))) files = 0 - if tmpdir.join('config.json').check(): + if tmpdir.join("config.json").check(): files += 1 - assert str(tmpdir.join('config.json')) in configs + assert str(tmpdir.join("config.json")) in configs - if tmpdir.join('config.yaml').check(): + if tmpdir.join("config.yaml").check(): files += 1 - assert str(tmpdir.join('config.yaml')) in configs + assert str(tmpdir.join("config.yaml")) in configs - if tmpdir.join('config.ini').check(): + if tmpdir.join("config.ini").check(): files += 1 - assert str(tmpdir.join('config.ini')) in configs + assert str(tmpdir.join("config.ini")) in configs assert len(configs) == files @@ -96,35 +96,35 @@ def test_config_expand2(): """Tests for :meth:`config.inline()`.""" ibefore_config = { # inline config - 'session_name': 'sampleconfig', - 'start_directory': '~', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "~", + "windows": [ { - 'shell_command': ['top'], - 'window_name': 'editor', - 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], - 'layout': 'main-verticle', + "shell_command": ["top"], + "window_name": "editor", + "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], }, - {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, ], } iafter_config = { - 'session_name': 'sampleconfig', - 'start_directory': '~', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "~", + "windows": [ { - 'shell_command': 'top', - 'window_name': 'editor', - 'panes': ['vim', 'cowsay "hey"'], - 'layout': 'main-verticle', + "shell_command": "top", + "window_name": "editor", + "panes": ["vim", 'cowsay "hey"'], + "layout": "main-verticle", }, - {'window_name': 'logging', 'panes': ['tail -F /var/log/syslog']}, - {'options': {'automatic-rename': True}, 'panes': ['htop']}, + {"window_name": "logging", "panes": ["tail -F /var/log/syslog"]}, + {"options": {"automatic-rename": True}, "panes": ["htop"]}, ], } @@ -139,40 +139,40 @@ def test_inline_config(): """Test config inheritance for the nested 'start_command'.""" inheritance_config_before = { - 'session_name': 'sampleconfig', - 'start_directory': '/', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/", + "windows": [ { - 'window_name': 'editor', - 'start_directory': '~', - 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], - 'layout': 'main-verticle', + "window_name": "editor", + "start_directory": "~", + "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], }, - {'window_name': 'shufu', 'panes': [{'shell_command': ['htop']}]}, - {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {"window_name": "shufu", "panes": [{"shell_command": ["htop"]}]}, + {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, ], } inheritance_config_after = { - 'session_name': 'sampleconfig', - 'start_directory': '/', - 'windows': [ + "session_name": "sampleconfig", + "start_directory": "/", + "windows": [ { - 'window_name': 'editor', - 'start_directory': '~', - 'panes': [{'shell_command': ['vim']}, {'shell_command': ['cowsay "hey"']}], - 'layout': 'main-verticle', + "window_name": "editor", + "start_directory": "~", + "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "layout": "main-verticle", }, { - 'window_name': 'logging', - 'panes': [{'shell_command': ['tail -F /var/log/syslog']}], + "window_name": "logging", + "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], }, - {'window_name': 'shufu', 'panes': [{'shell_command': ['htop']}]}, - {'options': {'automatic-rename': True}, 'panes': [{'shell_command': ['htop']}]}, + {"window_name": "shufu", "panes": [{"shell_command": ["htop"]}]}, + {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, ], } @@ -245,8 +245,8 @@ def test_trickle_window_with_no_pane_config(): sconfig = load_yaml(test_yaml) config.validate_schema(sconfig) - assert config.expand(config.trickle(sconfig))['windows'][1]['panes'][0] == { - 'shell_command': [] + assert config.expand(config.trickle(sconfig))["windows"][1]["panes"][0] == { + "shell_command": [] } @@ -278,7 +278,7 @@ def test_expands_blank_panes(): """ - yaml_config_file = os.path.join(example_dir, 'blank-panes.yaml') + yaml_config_file = os.path.join(example_dir, "blank-panes.yaml") test_config = load_config(yaml_config_file) assert config.expand(test_config) == fixtures.expand_blank.expected @@ -297,7 +297,7 @@ def test_no_session_name(): - htop """ - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() with pytest.raises(exc.ConfigError) as excinfo: @@ -310,7 +310,7 @@ def test_no_windows(): session_name: test session """ - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() with pytest.raises(exc.ConfigError) as excinfo: @@ -333,7 +333,7 @@ def test_no_window_name(): - htop """ - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() with pytest.raises(exc.ConfigError) as excinfo: @@ -372,13 +372,13 @@ def test_replaces_env_variables(monkeypatch): monkeypatch.setenv(str(env_key), str(env_val)) sconfig = config.expand(sconfig) - assert "%s/test" % env_val == sconfig['start_directory'] - assert "%s/test2" % env_val in sconfig['shell_command_before'] - assert "%s/test3" % env_val == sconfig['before_script'] - assert "hi - %s" % env_val == sconfig['session_name'] - assert "%s/moo" % env_val == sconfig['global_options']['default-shell'] - assert "%s/lol" % env_val == sconfig['options']['default-command'] - assert "logging @ %s" % env_val == sconfig['windows'][1]['window_name'] + assert "%s/test" % env_val == sconfig["start_directory"] + assert "%s/test2" % env_val in sconfig["shell_command_before"] + assert "%s/test3" % env_val == sconfig["before_script"] + assert "hi - %s" % env_val == sconfig["session_name"] + assert "%s/moo" % env_val == sconfig["global_options"]["default-shell"] + assert "%s/lol" % env_val == sconfig["options"]["default-command"] + assert "logging @ %s" % env_val == sconfig["windows"][1]["window_name"] def test_plugins(): @@ -393,9 +393,9 @@ def test_plugins(): start_directory: /var/log """ - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() with pytest.raises(exc.ConfigError) as excinfo: config.validate_schema(sconfig) - assert excinfo.matches('only supports list type') + assert excinfo.matches("only supports list type") diff --git a/tests/test_config_teamocil.py b/tests/test_config_teamocil.py index dda802fbd8..721e3878ab 100644 --- a/tests/test_config_teamocil.py +++ b/tests/test_config_teamocil.py @@ -9,7 +9,7 @@ from .fixtures import config_teamocil as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), '.tmuxp') +TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") @pytest.mark.parametrize( @@ -38,7 +38,7 @@ ], ) def test_config_to_dict(teamocil_yaml, teamocil_dict, tmuxp_dict): - configparser = kaptan.Kaptan(handler='yaml') + configparser = kaptan.Kaptan(handler="yaml") test_config = configparser.import_config(teamocil_yaml) yaml_to_dict = test_config.get() assert yaml_to_dict == teamocil_dict @@ -48,14 +48,14 @@ def test_config_to_dict(teamocil_yaml, teamocil_dict, tmuxp_dict): config.validate_schema(config.import_teamocil(teamocil_dict)) -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def multisession_config(): """Return loaded multisession teamocil config as a dictionary. Also prevents re-running assertion the loads the yaml, since ordering of deep list items like panes will be inconsistent.""" teamocil_yaml = fixtures.layouts.teamocil_yaml - configparser = kaptan.Kaptan(handler='yaml') + configparser = kaptan.Kaptan(handler="yaml") test_config = configparser.import_config(teamocil_yaml) teamocil_dict = fixtures.layouts.teamocil_dict @@ -66,14 +66,14 @@ def multisession_config(): @pytest.mark.parametrize( "session_name,expected", [ - ('two-windows', fixtures.layouts.two_windows), - ('two-windows-with-filters', fixtures.layouts.two_windows_with_filters), + ("two-windows", fixtures.layouts.two_windows), + ("two-windows-with-filters", fixtures.layouts.two_windows_with_filters), ( - 'two-windows-with-custom-command-options', + "two-windows-with-custom-command-options", fixtures.layouts.two_windows_with_custom_command_options, ), ( - 'three-windows-within-a-session', + "three-windows-within-a-session", fixtures.layouts.three_windows_within_a_session, ), ], diff --git a/tests/test_config_tmuxinator.py b/tests/test_config_tmuxinator.py index 3f2341ca30..88241c22a9 100644 --- a/tests/test_config_tmuxinator.py +++ b/tests/test_config_tmuxinator.py @@ -9,7 +9,7 @@ from .fixtures import config_tmuxinator as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), '.tmuxp') +TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") @pytest.mark.parametrize( @@ -33,7 +33,7 @@ ], ) def test_config_to_dict(tmuxinator_yaml, tmuxinator_dict, tmuxp_dict): - configparser = kaptan.Kaptan(handler='yaml') + configparser = kaptan.Kaptan(handler="yaml") test_config = configparser.import_config(tmuxinator_yaml) yaml_to_dict = test_config.get() assert yaml_to_dict == tmuxinator_dict diff --git a/tests/test_plugin.py b/tests/test_plugin.py index d894c98937..adb47044cf 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -31,54 +31,54 @@ def test_all_pass(): def test_tmux_version_fail_min(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxVersionFailMinPlugin() - assert 'tmux-min-version-fail' in str(exc_info.value) + assert "tmux-min-version-fail" in str(exc_info.value) def test_tmux_version_fail_max(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxVersionFailMaxPlugin() - assert 'tmux-max-version-fail' in str(exc_info.value) + assert "tmux-max-version-fail" in str(exc_info.value) def test_tmux_version_fail_incompatible(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxVersionFailIncompatiblePlugin() - assert 'tmux-incompatible-version-fail' in str(exc_info.value) + assert "tmux-incompatible-version-fail" in str(exc_info.value) def test_tmuxp_version_fail_min(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxpVersionFailMinPlugin() - assert 'tmuxp-min-version-fail' in str(exc_info.value) + assert "tmuxp-min-version-fail" in str(exc_info.value) def test_tmuxp_version_fail_max(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxpVersionFailMaxPlugin() - assert 'tmuxp-max-version-fail' in str(exc_info.value) + assert "tmuxp-max-version-fail" in str(exc_info.value) def test_tmuxp_version_fail_incompatible(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: TmuxpVersionFailIncompatiblePlugin() - assert 'tmuxp-incompatible-version-fail' in str(exc_info.value) + assert "tmuxp-incompatible-version-fail" in str(exc_info.value) def test_libtmux_version_fail_min(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: LibtmuxVersionFailMinPlugin() - assert 'libtmux-min-version-fail' in str(exc_info.value) + assert "libtmux-min-version-fail" in str(exc_info.value) def test_libtmux_version_fail_max(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: LibtmuxVersionFailMaxPlugin() - assert 'libtmux-max-version-fail' in str(exc_info.value) + assert "libtmux-max-version-fail" in str(exc_info.value) def test_libtmux_version_fail_incompatible(): - with pytest.raises(TmuxpPluginException, match=r'Incompatible.*') as exc_info: + with pytest.raises(TmuxpPluginException, match=r"Incompatible.*") as exc_info: LibtmuxVersionFailIncompatiblePlugin() - assert 'libtmux-incompatible-version-fail' in str(exc_info.value) + assert "libtmux-incompatible-version-fail" in str(exc_info.value) diff --git a/tests/test_util.py b/tests/test_util.py index 420e1abfd1..e87c3bf0f9 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -11,7 +11,7 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): - script_file = os.path.join(fixtures_dir, 'script_noexists.sh') + script_file = os.path.join(fixtures_dir, "script_noexists.sh") with pytest.raises(BeforeLoadScriptNotExists): run_before_script(script_file) @@ -21,51 +21,51 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): def test_raise_BeforeLoadScriptError_if_retcode(): - script_file = os.path.join(fixtures_dir, 'script_failed.sh') + script_file = os.path.join(fixtures_dir, "script_failed.sh") with pytest.raises(BeforeLoadScriptError): run_before_script(script_file) def test_return_stdout_if_ok(capsys): - script_file = os.path.join(fixtures_dir, 'script_complete.sh') + script_file = os.path.join(fixtures_dir, "script_complete.sh") run_before_script(script_file) out, err = capsys.readouterr() - assert 'hello' in out + assert "hello" in out def test_beforeload_returncode(): - script_file = os.path.join(fixtures_dir, 'script_failed.sh') + script_file = os.path.join(fixtures_dir, "script_failed.sh") with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) - assert excinfo.match(r'113') + assert excinfo.match(r"113") def test_beforeload_returns_stderr_messages(): - script_file = os.path.join(fixtures_dir, 'script_failed.sh') + script_file = os.path.join(fixtures_dir, "script_failed.sh") with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) - assert excinfo.match(r'failed with returncode') + assert excinfo.match(r"failed with returncode") def test_get_session_should_default_to_local_attached_session(server, monkeypatch): - server.new_session(session_name='myfirstsession') - second_session = server.new_session(session_name='mysecondsession') + server.new_session(session_name="myfirstsession") + second_session = server.new_session(session_name="mysecondsession") # Assign an active pane to the session first_pane_on_second_session_id = second_session.list_windows()[0].list_panes()[0][ - 'pane_id' + "pane_id" ] - monkeypatch.setenv('TMUX_PANE', first_pane_on_second_session_id) + monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) assert get_session(server) == second_session def test_get_session_should_return_first_session_if_no_active_session(server): - first_session = server.new_session(session_name='myfirstsession') - server.new_session(session_name='mysecondsession') + first_session = server.new_session(session_name="myfirstsession") + server.new_session(session_name="mysecondsession") assert get_session(server) == first_session diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e85b409177..03e800ce9d 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -19,7 +19,7 @@ def test_split_windows(session): yaml_config = loadfixture("workspacebuilder/two_pane.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) @@ -28,7 +28,7 @@ def test_split_windows(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): - w.select_layout('tiled') # fix glitch with pane size + w.select_layout("tiled") # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) @@ -41,7 +41,7 @@ def test_split_windows_three_pane(session): yaml_config = loadfixture("workspacebuilder/three_pane.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) @@ -50,21 +50,21 @@ def test_split_windows_three_pane(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): - w.select_layout('tiled') # fix glitch with pane size + w.select_layout("tiled") # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) assert len(s._windows) == window_count window_count += 1 - w.set_window_option('main-pane-height', 50) - w.select_layout(wconf['layout']) + w.set_window_option("main-pane-height", 50) + w.select_layout(wconf["layout"]) def test_focus_pane_index(session): - yaml_config = loadfixture('workspacebuilder/focus_and_pane.yaml') + yaml_config = loadfixture("workspacebuilder/focus_and_pane.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) @@ -73,10 +73,10 @@ def test_focus_pane_index(session): builder.build(session=session) - assert session.attached_window.name == 'focused window' + assert session.attached_window.name == "focused window" pane_base_index = int( - session.attached_window.show_window_option('pane-base-index', g=True) + session.attached_window.show_window_option("pane-base-index", g=True) ) if not pane_base_index: @@ -94,9 +94,9 @@ def test_focus_pane_index(session): w = session.attached_window - assert w.name != 'man' + assert w.name != "man" - pane_path = '/usr' + pane_path = "/usr" while retry(): p = w.attached_pane @@ -106,15 +106,15 @@ def test_focus_pane_index(session): assert p.current_path == pane_path - proc = session.cmd('show-option', '-gv', 'base-index') + proc = session.cmd("show-option", "-gv", "base-index") base_index = int(proc.stdout[0]) session.server._update_windows() - window3 = session.find_where({'window_index': str(base_index + 2)}) + window3 = session.find_where({"window_index": str(base_index + 2)}) assert isinstance(window3, Window) p = None - pane_path = '/' + pane_path = "/" while retry(): p = window3.attached_pane @@ -126,14 +126,14 @@ def test_focus_pane_index(session): @pytest.mark.skip( - reason=''' + reason=""" Test needs to be rewritten, assertion not reliable across platforms and CI. See https://github.com/tmux-python/tmuxp/issues/310. - '''.strip() + """.strip() ) def test_suppress_history(session): yaml_config = loadfixture("workspacebuilder/suppress_history.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) @@ -141,18 +141,18 @@ def test_suppress_history(session): builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - inHistoryWindow = session.find_where({'window_name': 'inHistory'}) - isMissingWindow = session.find_where({'window_name': 'isMissing'}) + inHistoryWindow = session.find_where({"window_name": "inHistory"}) + isMissingWindow = session.find_where({"window_name": "isMissing"}) def assertHistory(cmd, hist): - return 'inHistory' in cmd and cmd.endswith(hist) + return "inHistory" in cmd and cmd.endswith(hist) def assertIsMissing(cmd, hist): - return 'isMissing' in cmd and not cmd.endswith(hist) + return "isMissing" in cmd and not cmd.endswith(hist) for w, window_name, assertCase in [ - (inHistoryWindow, 'inHistory', assertHistory), - (isMissingWindow, 'isMissing', assertIsMissing), + (inHistoryWindow, "inHistory", assertHistory), + (isMissingWindow, "isMissing", assertIsMissing), ]: assert w.name == window_name correct = False @@ -161,19 +161,19 @@ def assertIsMissing(cmd, hist): p.select_pane() # Print the last-in-history command in the pane - p.cmd('send-keys', ' fc -ln -1') - p.cmd('send-keys', 'Enter') + p.cmd("send-keys", " fc -ln -1") + p.cmd("send-keys", "Enter") - buffer_name = 'test' + buffer_name = "test" while retry(): # from v0.7.4 libtmux session.cmd adds target -t self.id by default # show-buffer doesn't accept -t, use global cmd. # Get the contents of the pane - p.cmd('capture-pane', '-b', buffer_name) + p.cmd("capture-pane", "-b", buffer_name) - captured_pane = session.server.cmd('show-buffer', '-b', buffer_name) - session.server.cmd('delete-buffer', '-b', buffer_name) + captured_pane = session.server.cmd("show-buffer", "-b", buffer_name) + session.server.cmd("delete-buffer", "-b", buffer_name) # Parse the sent and last-in-history commands sent_cmd = captured_pane.stdout[0].strip() @@ -188,62 +188,62 @@ def assertIsMissing(cmd, hist): def test_session_options(session): yaml_config = loadfixture("workspacebuilder/session_options.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - assert "/bin/sh" in s.show_option('default-shell') - assert "/bin/sh" in s.show_option('default-command') + assert "/bin/sh" in s.show_option("default-shell") + assert "/bin/sh" in s.show_option("default-command") def test_global_options(session): yaml_config = loadfixture("workspacebuilder/global_options.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - assert "top" in s.show_option('status-position', _global=True) - assert 493 == s.show_option('repeat-time', _global=True) + assert "top" in s.show_option("status-position", _global=True) + assert 493 == s.show_option("repeat-time", _global=True) def test_global_session_env_options(session, monkeypatch): - visual_silence = 'on' - monkeypatch.setenv(str('VISUAL_SILENCE'), str(visual_silence)) + visual_silence = "on" + monkeypatch.setenv(str("VISUAL_SILENCE"), str(visual_silence)) repeat_time = 738 - monkeypatch.setenv(str('REPEAT_TIME'), str(repeat_time)) + monkeypatch.setenv(str("REPEAT_TIME"), str(repeat_time)) main_pane_height = 8 - monkeypatch.setenv(str('MAIN_PANE_HEIGHT'), str(main_pane_height)) + monkeypatch.setenv(str("MAIN_PANE_HEIGHT"), str(main_pane_height)) yaml_config = loadfixture("workspacebuilder/env_var_options.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session=session) - assert visual_silence in s.show_option('visual-silence', _global=True) - assert repeat_time == s.show_option('repeat-time') - assert main_pane_height == s.attached_window.show_window_option('main-pane-height') + assert visual_silence in s.show_option("visual-silence", _global=True) + assert repeat_time == s.show_option("repeat-time") + assert main_pane_height == s.attached_window.show_window_option("main-pane-height") def test_window_options(session): yaml_config = loadfixture("workspacebuilder/window_options.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) - if has_gte_version('2.3'): - sconfig['windows'][0]['options']['pane-border-format'] = ' #P ' + if has_gte_version("2.3"): + sconfig["windows"][0]["options"]["pane-border-format"] = " #P " builder = WorkspaceBuilder(sconf=sconfig) @@ -251,23 +251,23 @@ def test_window_options(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): - w.select_layout('tiled') # fix glitch with pane size + w.select_layout("tiled") # fix glitch with pane size p = p assert len(s._windows) == window_count assert isinstance(w, Window) - assert w.show_window_option('main-pane-height') == 5 - if has_gte_version('2.3'): - assert w.show_window_option('pane-border-format') == ' #P ' + assert w.show_window_option("main-pane-height") == 5 + if has_gte_version("2.3"): + assert w.show_window_option("pane-border-format") == " #P " assert len(s._windows) == window_count window_count += 1 - w.select_layout(wconf['layout']) + w.select_layout(wconf["layout"]) @pytest.mark.flaky(reruns=5) def test_window_options_after(session): yaml_config = loadfixture("workspacebuilder/window_options_after.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -278,7 +278,7 @@ def assert_last_line(p, s): correct = False while retry(): - pane_out = p.cmd('capture-pane', '-p', '-J').stdout + pane_out = p.cmd("capture-pane", "-p", "-J").stdout while not pane_out[-1].strip(): # delete trailing lines tmux 1.8 pane_out.pop() if len(pane_out) > 1 and pane_out[-2].strip() == s: @@ -287,7 +287,7 @@ def assert_last_line(p, s): # Print output for easier debugging if assertion fails if not correct: - print('\n'.join(pane_out)) + print("\n".join(pane_out)) return correct @@ -295,60 +295,60 @@ def assert_last_line(p, s): assert assert_last_line( pane, str(i) ), "Initial command did not execute properly/" + str(i) - pane.cmd('send-keys', 'Up') # Will repeat echo + pane.cmd("send-keys", "Up") # Will repeat echo pane.enter() # in each iteration assert assert_last_line( pane, str(i) ), "Repeated command did not execute properly/" + str(i) - session.cmd('send-keys', ' echo moo') - session.cmd('send-keys', 'Enter') + session.cmd("send-keys", " echo moo") + session.cmd("send-keys", "Enter") for pane in session.attached_window.panes: assert assert_last_line( - pane, 'moo' + pane, "moo" ), "Synchronized command did not execute properly" def test_window_shell(session): yaml_config = loadfixture("workspacebuilder/window_shell.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) for w, wconf in builder.iter_create_windows(s): - if 'window_shell' in wconf: - assert wconf['window_shell'] == str('top') + if "window_shell" in wconf: + assert wconf["window_shell"] == str("top") while retry(): session.server._update_windows() - if w['window_name'] != 'top': + if w["window_name"] != "top": break - assert w.name != str('top') + assert w.name != str("top") def test_environment_variables(session): yaml_config = loadfixture("workspacebuilder/environment_vars.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) builder = WorkspaceBuilder(sconf=sconfig) builder.build(session) - assert session.show_environment('FOO') == 'BAR' - assert session.show_environment('PATH') == '/tmp' + assert session.show_environment("FOO") == "BAR" + assert session.show_environment("PATH") == "/tmp" def test_automatic_rename_option(session): """With option automatic-rename: on.""" yaml_config = loadfixture("workspacebuilder/window_automatic_rename.yaml") s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) @@ -358,50 +358,50 @@ def test_automatic_rename_option(session): for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): - w.select_layout('tiled') # fix glitch with pane size + w.select_layout("tiled") # fix glitch with pane size p = p assert len(s._windows), window_count assert isinstance(w, Window) - assert w.show_window_option('automatic-rename') == 'on' + assert w.show_window_option("automatic-rename") == "on" assert len(s._windows) == window_count window_count += 1 - w.select_layout(wconf['layout']) + w.select_layout(wconf["layout"]) - assert s.name != 'tmuxp' + assert s.name != "tmuxp" w = s.windows[0] while retry(): session.server._update_windows() - if w.name != 'sh': + if w.name != "sh": break - assert w.name != 'sh' + assert w.name != "sh" - pane_base_index = w.show_window_option('pane-base-index', g=True) + pane_base_index = w.show_window_option("pane-base-index", g=True) w.select_pane(pane_base_index) while retry(): session.server._update_windows() - if w.name == 'sh': + if w.name == "sh": break - assert w.name == 'sh' + assert w.name == "sh" - w.select_pane('-D') + w.select_pane("-D") while retry(): session.server._update_windows() - if w['window_name'] != 'sh': + if w["window_name"] != "sh": break - assert w.name != 'sh' + assert w.name != "sh" def test_blank_pane_count(session): """:todo: Verify blank panes of various types build into workspaces.""" - yaml_config_file = os.path.join(example_dir, 'blank-panes.yaml') + yaml_config_file = os.path.join(example_dir, "blank-panes.yaml") test_config = kaptan.Kaptan().import_config(yaml_config_file).get() test_config = config.expand(test_config) builder = WorkspaceBuilder(sconf=test_config) @@ -409,25 +409,25 @@ def test_blank_pane_count(session): assert session == builder.session - window1 = session.find_where({'window_name': 'Blank pane test'}) + window1 = session.find_where({"window_name": "Blank pane test"}) assert len(window1._panes) == 3 - window2 = session.find_where({'window_name': 'More blank panes'}) + window2 = session.find_where({"window_name": "More blank panes"}) assert len(window2._panes) == 3 - window3 = session.find_where({'window_name': 'Empty string (return)'}) + window3 = session.find_where({"window_name": "Empty string (return)"}) assert len(window3._panes) == 3 - window4 = session.find_where({'window_name': 'Blank with options'}) + window4 = session.find_where({"window_name": "Blank with options"}) assert len(window4._panes) == 2 def test_start_directory(session, tmpdir): yaml_config = loadfixture("workspacebuilder/start_directory.yaml") - test_dir = str(tmpdir.mkdir('foo bar')) + test_dir = str(tmpdir.mkdir("foo bar")) test_config = yaml_config.format(TMP_DIR=str(tmpdir), TEST_DIR=test_dir) - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(test_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) @@ -436,7 +436,7 @@ def test_start_directory(session, tmpdir): builder.build(session=session) assert session == builder.session - dirs = ['/usr/bin', '/dev', test_dir, '/usr', '/usr'] + dirs = ["/usr/bin", "/dev", test_dir, "/usr", "/usr"] for path, window in zip(dirs, session.windows): for p in window.panes: @@ -467,11 +467,11 @@ def test_start_directory_relative(session, tmpdir): """ yaml_config = loadfixture("workspacebuilder/start_directory_relative.yaml") - test_dir = str(tmpdir.mkdir('foo bar')) - config_dir = str(tmpdir.mkdir('testRelConfigDir')) + test_dir = str(tmpdir.mkdir("foo bar")) + config_dir = str(tmpdir.mkdir("testRelConfigDir")) test_config = yaml_config.format(TEST_DIR=test_dir) - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(test_config).get() # the second argument of os.getcwd() mimics the behavior # the CLI loader will do, but it passes in the config file's location. @@ -486,7 +486,7 @@ def test_start_directory_relative(session, tmpdir): assert session == builder.session - dirs = ['/usr/bin', '/dev', test_dir, config_dir, config_dir] + dirs = ["/usr/bin", "/dev", test_dir, config_dir, config_dir] for path, window in zip(dirs, session.windows): for p in window.panes: @@ -511,19 +511,19 @@ def test_pane_order(session): """ yaml_config = loadfixture("workspacebuilder/pane_ordering.yaml").format( - HOME=os.path.realpath(os.path.expanduser('~')) + HOME=os.path.realpath(os.path.expanduser("~")) ) # test order of `panes` (and pane_index) above aganist pane_dirs pane_paths = [ - '/usr/bin', - '/usr', - '/usr/sbin', - os.path.realpath(os.path.expanduser('~')), + "/usr/bin", + "/usr", + "/usr/sbin", + os.path.realpath(os.path.expanduser("~")), ] s = session - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) @@ -534,7 +534,7 @@ def test_pane_order(session): assert len(s._windows) == window_count for w, wconf in builder.iter_create_windows(s): for p in builder.iter_create_panes(w, wconf): - w.select_layout('tiled') # fix glitch with pane size + w.select_layout("tiled") # fix glitch with pane size p = p assert len(s._windows) == window_count @@ -544,7 +544,7 @@ def test_pane_order(session): window_count += 1 for w in session.windows: - pane_base_index = w.show_window_option('pane-base-index', g=True) + pane_base_index = w.show_window_option("pane-base-index", g=True) for p_index, p in enumerate(w.list_panes(), start=pane_base_index): assert int(p_index) == int(p.index) @@ -562,11 +562,11 @@ def test_pane_order(session): def test_window_index(session): yaml_config = loadfixture("workspacebuilder/window_index.yaml") - proc = session.cmd('show-option', '-gv', 'base-index') + proc = session.cmd("show-option", "-gv", "base-index") base_index = int(proc.stdout[0]) - name_index_map = {'zero': 0 + base_index, 'one': 1 + base_index, 'five': 5} + name_index_map = {"zero": 0 + base_index, "one": 1 + base_index, "five": 5} - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) @@ -574,16 +574,16 @@ def test_window_index(session): builder = WorkspaceBuilder(sconf=sconfig) for window, _ in builder.iter_create_windows(session): - expected_index = name_index_map[window['window_name']] - assert int(window['window_index']) == expected_index + expected_index = name_index_map[window["window_name"]] + assert int(window["window_index"]) == expected_index def test_before_load_throw_error_if_retcode_error(server): config_script_fails = loadfixture("workspacebuilder/config_script_fails.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( fixtures_dir=fixtures_dir, - script_failed=os.path.join(fixtures_dir, 'script_failed.sh'), + script_failed=os.path.join(fixtures_dir, "script_failed.sh"), ) sconfig = sconfig.import_config(yaml).get() @@ -606,10 +606,10 @@ def test_before_load_throw_error_if_file_not_exists(server): config_script_not_exists = loadfixture( "workspacebuilder/config_script_not_exists.yaml" ) - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_not_exists.format( fixtures_dir=fixtures_dir, - script_not_exists=os.path.join(fixtures_dir, 'script_not_exists.sh'), + script_not_exists=os.path.join(fixtures_dir, "script_not_exists.sh"), ) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) @@ -623,7 +623,7 @@ def test_before_load_throw_error_if_file_not_exists(server): assert temp_session_exists with pytest.raises((exc.BeforeLoadScriptNotExists, OSError)) as excinfo: builder.build(session=sess) - excinfo.match(r'No such file or directory') + excinfo.match(r"No such file or directory") result = server.has_session(session_name) assert not result, "Kills session if before_script doesn't exist" @@ -632,11 +632,11 @@ def test_before_load_true_if_test_passes(server): config_script_completes = loadfixture( "workspacebuilder/config_script_completes.yaml" ) - assert os.path.exists(os.path.join(fixtures_dir, 'script_complete.sh')) - sconfig = kaptan.Kaptan(handler='yaml') + assert os.path.exists(os.path.join(fixtures_dir, "script_complete.sh")) + sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( fixtures_dir=fixtures_dir, - script_complete=os.path.join(fixtures_dir, 'script_complete.sh'), + script_complete=os.path.join(fixtures_dir, "script_complete.sh"), ) sconfig = sconfig.import_config(yaml).get() @@ -654,11 +654,11 @@ def test_before_load_true_if_test_passes_with_args(server): "workspacebuilder/config_script_completes.yaml" ) - assert os.path.exists(os.path.join(fixtures_dir, 'script_complete.sh')) - sconfig = kaptan.Kaptan(handler='yaml') + assert os.path.exists(os.path.join(fixtures_dir, "script_complete.sh")) + sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( fixtures_dir=fixtures_dir, - script_complete=os.path.join(fixtures_dir, 'script_complete.sh') + ' -v', + script_complete=os.path.join(fixtures_dir, "script_complete.sh") + " -v", ) sconfig = sconfig.import_config(yaml).get() @@ -676,7 +676,7 @@ def test_plugin_system_before_workspace_builder( ): config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -685,14 +685,14 @@ def test_plugin_system_before_workspace_builder( builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#S'") + proc = session.cmd("display-message", "-p", "'#S'") assert proc.stdout[0] == "'plugin_test_bwb'" def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_owc.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -701,14 +701,14 @@ def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, sessio builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#W'") + proc = session.cmd("display-message", "-p", "'#W'") assert proc.stdout[0] == "'plugin_test_owc'" def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_awf.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -717,14 +717,14 @@ def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, s builder.build(session=session) - proc = session.cmd('display-message', '-p', "'#W'") + proc = session.cmd("display-message", "-p", "'#W'") assert proc.stdout[0] == "'plugin_test_awf'" def test_plugin_system_on_window_create_multiple_windows(session): config_plugins = loadfixture("workspacebuilder/plugin_owc_multiple_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -733,7 +733,7 @@ def test_plugin_system_on_window_create_multiple_windows(session): builder.build(session=session) - proc = session.cmd('list-windows', '-F', "'#W'") + proc = session.cmd("list-windows", "-F", "'#W'") assert "'plugin_test_owc_mw'" in proc.stdout assert "'plugin_test_owc_mw_2'" in proc.stdout @@ -743,7 +743,7 @@ def test_plugin_system_after_window_finished_multiple_windows( ): config_plugins = loadfixture("workspacebuilder/plugin_awf_multiple_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -752,7 +752,7 @@ def test_plugin_system_after_window_finished_multiple_windows( builder.build(session=session) - proc = session.cmd('list-windows', '-F', "'#W'") + proc = session.cmd("list-windows", "-F", "'#W'") assert "'plugin_test_awf_mw'" in proc.stdout assert "'plugin_test_awf_mw_2'" in proc.stdout @@ -760,7 +760,7 @@ def test_plugin_system_after_window_finished_multiple_windows( def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, session): config_plugins = loadfixture("workspacebuilder/plugin_multiple_plugins.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() sconfig = config.expand(sconfig) @@ -770,19 +770,19 @@ def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, sessio builder.build(session=session) # Drop through to the before_script plugin hook - proc = session.cmd('display-message', '-p', "'#S'") + proc = session.cmd("display-message", "-p", "'#S'") assert proc.stdout[0] == "'plugin_test_bwb'" # Drop through to the after_window_finished. This won't succeed # unless on_window_create succeeds because of how the test plugin # override methods are currently written - proc = session.cmd('display-message', '-p', "'#W'") + proc = session.cmd("display-message", "-p", "'#W'") assert proc.stdout[0] == "'mp_test_awf'" def test_load_configs_same_session(server): yaml_config = loadfixture("workspacebuilder/three_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -793,7 +793,7 @@ def test_load_configs_same_session(server): yaml_config = loadfixture("workspacebuilder/two_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -803,7 +803,7 @@ def test_load_configs_same_session(server): yaml_config = loadfixture("workspacebuilder/two_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -815,7 +815,7 @@ def test_load_configs_same_session(server): def test_load_configs_separate_sessions(server): yaml_config = loadfixture("workspacebuilder/three_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -826,7 +826,7 @@ def test_load_configs_separate_sessions(server): yaml_config = loadfixture("workspacebuilder/two_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -839,7 +839,7 @@ def test_load_configs_separate_sessions(server): def test_find_current_active_pane(server, monkeypatch): yaml_config = loadfixture("workspacebuilder/three_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) @@ -847,7 +847,7 @@ def test_find_current_active_pane(server, monkeypatch): yaml_config = loadfixture("workspacebuilder/two_windows.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 62acb5bdaf..f85dc5dd24 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -11,7 +11,7 @@ def test_freeze_config(session): yaml_config = loadfixture("workspacefreezer/sampleconfig.yaml") - sconfig = kaptan.Kaptan(handler='yaml') + sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig) @@ -29,5 +29,5 @@ def test_freeze_config(session): kaptanconf = kaptan.Kaptan() kaptanconf = kaptanconf.import_config(sconf) - kaptanconf.export('json', indent=2) - kaptanconf.export('yaml', indent=2, default_flow_style=False, safe=True) + kaptanconf.export("json", indent=2) + kaptanconf.export("yaml", indent=2, default_flow_style=False, safe=True) diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 284692e9b3..915b7928cc 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,13 +1,13 @@ -__title__ = 'tmuxp' -__package_name__ = 'tmuxp' -__version__ = '1.9.4' -__description__ = 'tmux session manager' -__email__ = 'tony@git-pull.com' -__author__ = 'Tony Narlock' -__github__ = 'https://github.com/tmux-python/tmuxp' -__docs__ = 'https://tmuxp.git-pull.com' -__tracker__ = 'https://github.com/tmux-python/tmuxp/issues' -__changes__ = 'https://github.com/tmux-python/tmuxp/blob/master/CHANGES' -__pypi__ = 'https://pypi.org/project/tmuxp/' -__license__ = 'MIT' -__copyright__ = 'Copyright 2013- Tony Narlock' +__title__ = "tmuxp" +__package_name__ = "tmuxp" +__version__ = "1.9.4" +__description__ = "tmux session manager" +__email__ = "tony@git-pull.com" +__author__ = "Tony Narlock" +__github__ = "https://github.com/tmux-python/tmuxp" +__docs__ = "https://tmuxp.git-pull.com" +__tracker__ = "https://github.com/tmux-python/tmuxp/issues" +__changes__ = "https://github.com/tmux-python/tmuxp/blob/master/CHANGES" +__pypi__ = "https://pypi.org/project/tmuxp/" +__license__ = "MIT" +__copyright__ = "Copyright 2013- Tony Narlock" diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index 4569077291..77ed92d740 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -26,4 +26,4 @@ def console_to_str(s): try: return s.decode(console_encoding) except UnicodeDecodeError: - return s.decode('utf_8') + return s.decode("utf_8") diff --git a/tmuxp/cli.py b/tmuxp/cli.py index a0ff5773e4..c457a6fd83 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -33,14 +33,14 @@ logger = logging.getLogger(__name__) -VALID_CONFIG_DIR_FILE_EXTENSIONS = ['.yaml', '.yml', '.json'] +VALID_CONFIG_DIR_FILE_EXTENSIONS = [".yaml", ".yml", ".json"] def get_cwd(): return os.getcwd() -def tmuxp_echo(message=None, log_level='INFO', style_log=False, **click_kwargs): +def tmuxp_echo(message=None, log_level="INFO", style_log=False, **click_kwargs): """ Combines logging.log and click.echo """ @@ -68,13 +68,13 @@ def get_config_dir(): """ paths = [] - if 'TMUXP_CONFIGDIR' in os.environ: - paths.append(os.environ['TMUXP_CONFIGDIR']) - if 'XDG_CONFIG_HOME' in os.environ: - paths.append(os.path.join(os.environ['XDG_CONFIG_HOME'], 'tmuxp')) + if "TMUXP_CONFIGDIR" in os.environ: + paths.append(os.environ["TMUXP_CONFIGDIR"]) + if "XDG_CONFIG_HOME" in os.environ: + paths.append(os.path.join(os.environ["XDG_CONFIG_HOME"], "tmuxp")) else: - paths.append('~/.config/tmuxp/') - paths.append('~/.tmuxp') + paths.append("~/.config/tmuxp/") + paths.append("~/.tmuxp") for path in paths: path = os.path.expanduser(path) @@ -99,10 +99,10 @@ def get_tmuxinator_dir(): -------- :meth:`tmuxp.config.import_tmuxinator` """ - if 'TMUXINATOR_CONFIG' in os.environ: - return os.path.expanduser(os.environ['TMUXINATOR_CONFIG']) + if "TMUXINATOR_CONFIG" in os.environ: + return os.path.expanduser(os.environ["TMUXINATOR_CONFIG"]) - return os.path.expanduser('~/.tmuxinator/') + return os.path.expanduser("~/.tmuxinator/") def get_teamocil_dir(): @@ -118,7 +118,7 @@ def get_teamocil_dir(): -------- :meth:`tmuxp.config.import_teamocil` """ - return os.path.expanduser('~/.teamocil/') + return os.path.expanduser("~/.teamocil/") def _validate_choices(options): @@ -143,7 +143,7 @@ def _validate_choices(options): def func(value): if value not in options: raise click.BadParameter( - 'Possible choices are: {0}.'.format(', '.join(options)) + "Possible choices are: {0}.".format(", ".join(options)) ) return value @@ -181,28 +181,28 @@ def set_layout_hook(session, hook_name): hook_name : str hook name to bind to, e.g. 'client-attached' """ - cmd = ['set-hook', '-t', session.id, hook_name] + cmd = ["set-hook", "-t", session.id, hook_name] hook_cmd = [] attached_window = session.attached_window for window in session.windows: # unfortunately, select-layout won't work unless # we've literally selected the window at least once # with the client - hook_cmd.append('selectw -t {}'.format(window.id)) + hook_cmd.append("selectw -t {}".format(window.id)) # edit: removed -t, or else it won't respect main-pane-w/h - hook_cmd.append('selectl') - hook_cmd.append('selectw -p') + hook_cmd.append("selectl") + hook_cmd.append("selectw -p") # unset the hook immediately after executing hook_cmd.append( - 'set-hook -u -t {target_session} {hook_name}'.format( + "set-hook -u -t {target_session} {hook_name}".format( target_session=session.id, hook_name=hook_name ) ) - hook_cmd.append('selectw -t {}'.format(attached_window.id)) + hook_cmd.append("selectw -t {}".format(attached_window.id)) # join the hook's commands with semicolons - hook_cmd = '{}'.format('; '.join(hook_cmd)) + hook_cmd = "{}".format("; ".join(hook_cmd)) # append the hook command cmd.append(hook_cmd) @@ -229,8 +229,8 @@ def is_pure_name(path): not os.path.isabs(path) and len(os.path.dirname(path)) == 0 and not os.path.splitext(path)[1] - and path != '.' - and path != '' + and path != "." + and path != "" ) @@ -285,7 +285,7 @@ def get_abs_path(config): def _resolve_path_no_overwrite(config): path = get_abs_path(config) if os.path.exists(path): - raise click.exceptions.UsageError('%s exists. Pick a new filename.' % path) + raise click.exceptions.UsageError("%s exists. Pick a new filename." % path) return path @@ -334,7 +334,7 @@ def scan_config(config, config_dir=None): elif ( not isabs(config) or len(dirname(config)) > 1 - or config == '.' + or config == "." or config == "" or config == "./" ): # if relative, fill in full path @@ -346,22 +346,22 @@ def scan_config(config, config_dir=None): candidates = [ x for x in [ - '%s%s' % (join(config_dir, config), ext) + "%s%s" % (join(config_dir, config), ext) for ext in VALID_CONFIG_DIR_FILE_EXTENSIONS ] if exists(x) ] if not len(candidates): file_error = ( - 'config not found in config dir (yaml/yml/json) %s ' - 'for name' % (config_dir) + "config not found in config dir (yaml/yml/json) %s " + "for name" % (config_dir) ) else: candidates = [ x for x in [ join(config, ext) - for ext in ['.tmuxp.yaml', '.tmuxp.yml', '.tmuxp.json'] + for ext in [".tmuxp.yaml", ".tmuxp.yml", ".tmuxp.json"] ] if exists(x) ] @@ -369,24 +369,24 @@ def scan_config(config, config_dir=None): if len(candidates) > 1: tmuxp_echo( click.style( - 'Multiple .tmuxp.{yml,yaml,json} configs in %s' + "Multiple .tmuxp.{yml,yaml,json} configs in %s" % dirname(config), fg="red", ) ) tmuxp_echo( click.wrap_text( - 'This is undefined behavior, use only one. ' - 'Use file names e.g. myproject.json, coolproject.yaml. ' - 'You can load them by filename.' + "This is undefined behavior, use only one. " + "Use file names e.g. myproject.json, coolproject.yaml. " + "You can load them by filename." ) ) elif not len(candidates): - file_error = 'No tmuxp files found in directory' + file_error = "No tmuxp files found in directory" if len(candidates): config = candidates[0] elif not exists(config): - file_error = 'file not found' + file_error = "file not found" if file_error: raise FileError(file_error, config) @@ -399,30 +399,30 @@ def load_plugins(sconf): Load and return plugins in config """ plugins = [] - if 'plugins' in sconf: - for plugin in sconf['plugins']: + if "plugins" in sconf: + for plugin in sconf["plugins"]: try: - module_name = plugin.split('.') - module_name = '.'.join(module_name[:-1]) - plugin_name = plugin.split('.')[-1] + module_name = plugin.split(".") + module_name = ".".join(module_name[:-1]) + plugin_name = plugin.split(".")[-1] plugin = getattr(importlib.import_module(module_name), plugin_name) plugins.append(plugin()) except exc.TmuxpPluginException as error: if not click.confirm( - '%sSkip loading %s?' - % (click.style(str(error), fg='yellow'), plugin_name), + "%sSkip loading %s?" + % (click.style(str(error), fg="yellow"), plugin_name), default=True, ): click.echo( - click.style('[Not Skipping] ', fg='yellow') - + 'Plugin versions constraint not met. Exiting...' + click.style("[Not Skipping] ", fg="yellow") + + "Plugin versions constraint not met. Exiting..." ) sys.exit(1) except Exception as error: click.echo( - click.style('[Plugin Error] ', fg='red') - + "Couldn\'t load {0}\n".format(plugin) - + click.style('{0}'.format(error), fg='yellow') + click.style("[Plugin Error] ", fg="red") + + "Couldn't load {0}\n".format(plugin) + + click.style("{0}".format(error), fg="yellow") ) sys.exit(1) @@ -447,11 +447,11 @@ def _reattach(builder): """ for plugin in builder.plugins: plugin.reattach(builder.session) - proc = builder.session.cmd('display-message', '-p', "'#S'") + proc = builder.session.cmd("display-message", "-p", "'#S'") for line in proc.stdout: print(line) - if 'TMUX' in os.environ: + if "TMUX" in os.environ: builder.session.switch_client() else: @@ -469,23 +469,23 @@ def _load_attached(builder, detached): """ builder.build() - if 'TMUX' in os.environ: # tmuxp ran from inside tmux + if "TMUX" in os.environ: # tmuxp ran from inside tmux # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' - tmux_env = os.environ.pop('TMUX') + tmux_env = os.environ.pop("TMUX") - if has_gte_version('2.6'): - set_layout_hook(builder.session, 'client-session-changed') + if has_gte_version("2.6"): + set_layout_hook(builder.session, "client-session-changed") builder.session.switch_client() # switch client to new session - os.environ['TMUX'] = tmux_env # set TMUX back again + os.environ["TMUX"] = tmux_env # set TMUX back again else: - if has_gte_version('2.6'): + if has_gte_version("2.6"): # if attaching for first time - set_layout_hook(builder.session, 'client-attached') + set_layout_hook(builder.session, "client-attached") # for cases where user switches client for first time - set_layout_hook(builder.session, 'client-session-changed') + set_layout_hook(builder.session, "client-session-changed") if not detached: builder.session.attach_session() @@ -501,11 +501,11 @@ def _load_detached(builder): """ builder.build() - if has_gte_version('2.6'): # prepare for both cases - set_layout_hook(builder.session, 'client-attached') - set_layout_hook(builder.session, 'client-session-changed') + if has_gte_version("2.6"): # prepare for both cases + set_layout_hook(builder.session, "client-attached") + set_layout_hook(builder.session, "client-session-changed") - print('Session created in detached state.') + print("Session created in detached state.") def _load_append_windows_to_current_session(builder): @@ -518,9 +518,9 @@ def _load_append_windows_to_current_session(builder): """ current_attached_session = builder.find_current_attached_session() builder.build(current_attached_session, append=True) - if has_gte_version('2.6'): # prepare for both cases - set_layout_hook(builder.session, 'client-attached') - set_layout_hook(builder.session, 'client-session-changed') + if has_gte_version("2.6"): # prepare for both cases + set_layout_hook(builder.session, "client-attached") + set_layout_hook(builder.session, "client-session-changed") def _setup_plugins(builder): @@ -645,8 +645,8 @@ def load_workspace( config_file = os.path.realpath(config_file) tmuxp_echo( - click.style('[Loading] ', fg='green') - + click.style(config_file, fg='blue', bold=True) + click.style("[Loading] ", fg="green") + + click.style(config_file, fg="blue", bold=True) ) # kaptan allows us to open a yaml or json file as a dict @@ -656,7 +656,7 @@ def load_workspace( sconfig = config.expand(sconfig, os.path.dirname(config_file)) # Overwrite session name if new_session_name: - sconfig['session_name'] = new_session_name + sconfig["session_name"] = new_session_name # propagate config inheritance (e.g. session -> window, window -> pane) sconfig = config.trickle(sconfig) @@ -667,25 +667,25 @@ def load_workspace( colors=colors, ) - which('tmux') # raise exception if tmux not found + which("tmux") # raise exception if tmux not found try: # load WorkspaceBuilder object for tmuxp config / tmux server builder = WorkspaceBuilder( sconf=sconfig, plugins=load_plugins(sconfig), server=t ) except exc.EmptyConfigException: - tmuxp_echo('%s is empty or parsed no config data' % config_file, err=True) + tmuxp_echo("%s is empty or parsed no config data" % config_file, err=True) return - session_name = sconfig['session_name'] + session_name = sconfig["session_name"] # if the session already exists, prompt the user to attach if builder.session_exists(session_name) and not append: if not detached and ( answer_yes or click.confirm( - '%s is already running. Attach?' - % click.style(session_name, fg='green'), + "%s is already running. Attach?" + % click.style(session_name, fg="green"), default=True, ) ): @@ -698,7 +698,7 @@ def load_workspace( return _setup_plugins(builder) if append: - if 'TMUX' in os.environ: # tmuxp ran from inside tmux + if "TMUX" in os.environ: # tmuxp ran from inside tmux _load_append_windows_to_current_session(builder) else: _load_attached(builder, detached) @@ -710,17 +710,17 @@ def load_workspace( _load_attached(builder, detached) return _setup_plugins(builder) - if 'TMUX' in os.environ: # tmuxp ran from inside tmux + if "TMUX" in os.environ: # tmuxp ran from inside tmux msg = ( "Already inside TMUX, switch to session? yes/no\n" "Or (a)ppend windows in the current active session?\n[y/n/a]" ) - options = ['y', 'n', 'a'] + options = ["y", "n", "a"] choice = click.prompt(msg, value_proc=_validate_choices(options)) - if choice == 'y': + if choice == "y": _load_attached(builder, detached) - elif choice == 'a': + elif choice == "a": _load_append_windows_to_current_session(builder) else: _load_detached(builder) @@ -734,15 +734,15 @@ def load_workspace( tmuxp_echo(e, err=True) choice = click.prompt( - 'Error loading workspace. (k)ill, (a)ttach, (d)etach?', - value_proc=_validate_choices(['k', 'a', 'd']), - default='k', + "Error loading workspace. (k)ill, (a)ttach, (d)etach?", + value_proc=_validate_choices(["k", "a", "d"]), + default="k", ) - if choice == 'k': + if choice == "k": builder.session.kill_session() - tmuxp_echo('Session killed.') - elif choice == 'a': + tmuxp_echo("Session killed.") + elif choice == "a": _reattach(builder) else: sys.exit() @@ -750,12 +750,12 @@ def load_workspace( return _setup_plugins(builder) -@click.group(context_settings={'obj': {}, 'help_option_names': ['-h', '--help']}) -@click.version_option(__version__, '-V', '--version', message='%(prog)s %(version)s') +@click.group(context_settings={"obj": {}, "help_option_names": ["-h", "--help"]}) +@click.version_option(__version__, "-V", "--version", message="%(prog)s %(version)s") @click.option( - '--log-level', - default='INFO', - help='Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)', + "--log-level", + default="INFO", + help="Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)", ) def cli(log_level): """Manage tmux sessions. @@ -766,7 +766,7 @@ def cli(log_level): try: has_minimum_version() except TmuxCommandNotFound: - tmuxp_echo('tmux not found. tmuxp requires you install tmux first.') + tmuxp_echo("tmux not found. tmuxp requires you install tmux first.") sys.exit() except exc.TmuxpException as e: tmuxp_echo(e, err=True) @@ -774,7 +774,7 @@ def cli(log_level): setup_logger(logger=logger, level=log_level.upper()) -def setup_logger(logger=None, level='INFO'): +def setup_logger(logger=None, level="INFO"): """ Setup logging for CLI use. @@ -811,43 +811,41 @@ def startup(config_dir): os.makedirs(config_dir) -@cli.command(name='shell') -@click.argument('session_name', nargs=1, required=False) -@click.argument('window_name', nargs=1, required=False) -@click.option('-S', 'socket_path', help='pass-through for tmux -S') -@click.option('-L', 'socket_name', help='pass-through for tmux -L') +@cli.command(name="shell") +@click.argument("session_name", nargs=1, required=False) +@click.argument("window_name", nargs=1, required=False) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") @click.option( - '-c', - 'command', - help='Instead of opening shell, execute python code in libtmux and exit', + "-c", + "command", + help="Instead of opening shell, execute python code in libtmux and exit", ) @click.option( - '--best', - 'shell', - flag_value='best', - help='Use best shell available in site packages', + "--best", + "shell", + flag_value="best", + help="Use best shell available in site packages", default=True, ) -@click.option('--pdb', 'shell', flag_value='pdb', help='Use plain pdb') +@click.option("--pdb", "shell", flag_value="pdb", help="Use plain pdb") +@click.option("--code", "shell", flag_value="code", help="Use stdlib's code.interact()") @click.option( - '--code', 'shell', flag_value='code', help='Use stdlib\'s code.interact()' + "--ptipython", "shell", flag_value="ptipython", help="Use ptpython + ipython" ) +@click.option("--ptpython", "shell", flag_value="ptpython", help="Use ptpython") +@click.option("--ipython", "shell", flag_value="ipython", help="Use ipython") +@click.option("--bpython", "shell", flag_value="bpython", help="Use bpython") @click.option( - '--ptipython', 'shell', flag_value='ptipython', help='Use ptpython + ipython' -) -@click.option('--ptpython', 'shell', flag_value='ptpython', help='Use ptpython') -@click.option('--ipython', 'shell', flag_value='ipython', help='Use ipython') -@click.option('--bpython', 'shell', flag_value='bpython', help='Use bpython') -@click.option( - '--use-pythonrc/--no-startup', - 'use_pythonrc', - help='Load PYTHONSTARTUP env var and ~/.pythonrc.py script in --code', + "--use-pythonrc/--no-startup", + "use_pythonrc", + help="Load PYTHONSTARTUP env var and ~/.pythonrc.py script in --code", default=False, ) @click.option( - '--use-vi-mode/--no-vi-mode', - 'use_vi_mode', - help='Use vi-mode in ptpython/ptipython', + "--use-vi-mode/--no-vi-mode", + "use_vi_mode", + help="Use vi-mode in ptpython/ptipython", default=False, ) def command_shell( @@ -887,7 +885,7 @@ def command_shell( if command is not None: exec(command) else: - if shell == 'pdb' or (os.getenv('PYTHONBREAKPOINT') and PY3 and PYMINOR >= 7): + if shell == "pdb" or (os.getenv("PYTHONBREAKPOINT") and PY3 and PYMINOR >= 7): from ._compat import breakpoint as tmuxp_breakpoint tmuxp_breakpoint() @@ -907,34 +905,34 @@ def command_shell( ) -@cli.command(name='freeze') -@click.argument('session_name', nargs=1, required=False) -@click.option('-S', 'socket_path', help='pass-through for tmux -S') -@click.option('-L', 'socket_name', help='pass-through for tmux -L') +@cli.command(name="freeze") +@click.argument("session_name", nargs=1, required=False) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") @click.option( - '-f', - '--config-format', - type=click.Choice(['yaml', 'json']), - help='format to save in', + "-f", + "--config-format", + type=click.Choice(["yaml", "json"]), + help="format to save in", ) -@click.option('-o', '--save-to', type=click.Path(exists=False), help='file to save to') +@click.option("-o", "--save-to", type=click.Path(exists=False), help="file to save to") @click.option( - '-y', - '--yes', + "-y", + "--yes", type=bool, is_flag=True, default=False, help="Don't prompt for confirmation", ) @click.option( - '-q', - '--quiet', + "-q", + "--quiet", type=bool, is_flag=True, default=False, help="Don't prompt for confirmation", ) -@click.option('--force', 'force', help='overwrite the config file', is_flag=True) +@click.option("--force", "force", help="overwrite the config file", is_flag=True) def command_freeze( session_name, socket_name, config_format, save_to, socket_path, yes, quiet, force ): @@ -947,12 +945,12 @@ def command_freeze( try: if session_name: - session = t.find_where({'session_name': session_name}) + session = t.find_where({"session_name": session_name}) else: session = util.get_session(t) if not session: - raise exc.TmuxpException('Session not found.') + raise exc.TmuxpException("Session not found.") except exc.TmuxpException as e: print(e) return @@ -964,21 +962,21 @@ def command_freeze( if not quiet: print( - '---------------------------------------------------------------' - '\n' - 'Freeze does its best to snapshot live tmux sessions.\n' + "---------------------------------------------------------------" + "\n" + "Freeze does its best to snapshot live tmux sessions.\n" ) if not ( yes or click.confirm( - 'The new config *WILL* require adjusting afterwards. Save config?' + "The new config *WILL* require adjusting afterwards. Save config?" ) ): if not quiet: print( - 'tmuxp has examples in JSON and YAML format at ' - '\n' - 'View tmuxp docs at .' + "tmuxp has examples in JSON and YAML format at " + "\n" + "View tmuxp docs at ." ) sys.exit() @@ -987,81 +985,81 @@ def command_freeze( save_to = os.path.abspath( os.path.join( get_config_dir(), - '%s.%s' % (sconf.get('session_name'), config_format or 'yaml'), + "%s.%s" % (sconf.get("session_name"), config_format or "yaml"), ) ) dest_prompt = click.prompt( - 'Save to: %s' % save_to, value_proc=get_abs_path, default=save_to + "Save to: %s" % save_to, value_proc=get_abs_path, default=save_to ) if not force and os.path.exists(dest_prompt): - print('%s exists. Pick a new filename.' % dest_prompt) + print("%s exists. Pick a new filename." % dest_prompt) continue dest = dest_prompt dest = os.path.abspath(os.path.relpath(os.path.expanduser(dest))) if config_format is None: - valid_config_formats = ['json', 'yaml'] + valid_config_formats = ["json", "yaml"] _, config_format = os.path.splitext(dest) config_format = config_format[1:].lower() if config_format not in valid_config_formats: config_format = click.prompt( "Couldn't ascertain one of [%s] from file name. Convert to" % ", ".join(valid_config_formats), - value_proc=_validate_choices(['yaml', 'json']), - default='yaml', + value_proc=_validate_choices(["yaml", "json"]), + default="yaml", ) - if config_format == 'yaml': + if config_format == "yaml": newconfig = configparser.export( - 'yaml', indent=2, default_flow_style=False, safe=True + "yaml", indent=2, default_flow_style=False, safe=True ) - elif config_format == 'json': - newconfig = configparser.export('json', indent=2) + elif config_format == "json": + newconfig = configparser.export("json", indent=2) - if yes or click.confirm('Save to %s?' % dest): + if yes or click.confirm("Save to %s?" % dest): destdir = os.path.dirname(dest) if not os.path.isdir(destdir): os.makedirs(destdir) - buf = open(dest, 'w') + buf = open(dest, "w") buf.write(newconfig) buf.close() if not quiet: - print('Saved to %s.' % dest) + print("Saved to %s." % dest) -@cli.command(name='load', short_help='Load tmuxp workspaces.') +@cli.command(name="load", short_help="Load tmuxp workspaces.") @click.pass_context -@click.argument('config', type=ConfigPath(exists=True), nargs=-1) -@click.option('-S', 'socket_path', help='pass-through for tmux -S') -@click.option('-L', 'socket_name', help='pass-through for tmux -L') -@click.option('-f', 'tmux_config_file', help='pass-through for tmux -f') -@click.option('-s', 'new_session_name', help='start new session with new session name') -@click.option('--yes', '-y', 'answer_yes', help='yes', is_flag=True) +@click.argument("config", type=ConfigPath(exists=True), nargs=-1) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") +@click.option("-f", "tmux_config_file", help="pass-through for tmux -f") +@click.option("-s", "new_session_name", help="start new session with new session name") +@click.option("--yes", "-y", "answer_yes", help="yes", is_flag=True) @click.option( - '-d', 'detached', help='Load the session without attaching it', is_flag=True + "-d", "detached", help="Load the session without attaching it", is_flag=True ) @click.option( - '-a', - 'append', - help='Load configuration, appending windows to the current session', + "-a", + "append", + help="Load configuration, appending windows to the current session", is_flag=True, ) @click.option( - 'colors', - '-2', + "colors", + "-2", flag_value=256, default=True, - help='Force tmux to assume the terminal supports 256 colours.', + help="Force tmux to assume the terminal supports 256 colours.", ) @click.option( - 'colors', - '-8', + "colors", + "-8", flag_value=88, - help='Like -2, but indicates that the terminal supports 88 colours.', + help="Like -2, but indicates that the terminal supports 88 colours.", ) -@click.option('--log-file', help='File to log errors/output to') +@click.option("--log-file", help="File to log errors/output to") def command_load( ctx, config, @@ -1104,14 +1102,14 @@ def command_load( logger.addHandler(logfile_handler) tmux_options = { - 'socket_name': socket_name, - 'socket_path': socket_path, - 'tmux_config_file': tmux_config_file, - 'new_session_name': new_session_name, - 'answer_yes': answer_yes, - 'colors': colors, - 'detached': detached, - 'append': append, + "socket_name": socket_name, + "socket_path": socket_path, + "tmux_config_file": tmux_config_file, + "new_session_name": new_session_name, + "answer_yes": answer_yes, + "colors": colors, + "detached": detached, + "append": append, } if not config: @@ -1127,74 +1125,74 @@ def command_load( # Load each configuration but the last to the background for cfg in config[:-1]: opt = tmux_options.copy() - opt.update({'detached': True, 'new_session_name': None}) + opt.update({"detached": True, "new_session_name": None}) load_workspace(cfg, **opt) # todo: obey the -d in the cli args only if user specifies load_workspace(config[-1], **tmux_options) -@cli.group(name='import') +@cli.group(name="import") def import_config_cmd(): """Import a teamocil/tmuxinator config.""" pass def import_config(configfile, importfunc): - configparser = kaptan.Kaptan(handler='yaml') + configparser = kaptan.Kaptan(handler="yaml") configparser.import_config(configfile) newconfig = importfunc(configparser.get()) configparser.import_config(newconfig) config_format = click.prompt( - 'Convert to', value_proc=_validate_choices(['yaml', 'json']), default='yaml' + "Convert to", value_proc=_validate_choices(["yaml", "json"]), default="yaml" ) - if config_format == 'yaml': - newconfig = configparser.export('yaml', indent=2, default_flow_style=False) - elif config_format == 'json': - newconfig = configparser.export('json', indent=2) + if config_format == "yaml": + newconfig = configparser.export("yaml", indent=2, default_flow_style=False) + elif config_format == "json": + newconfig = configparser.export("json", indent=2) else: - sys.exit('Unknown config format.') + sys.exit("Unknown config format.") tmuxp_echo( - newconfig + '---------------------------------------------------------------' - '\n' - 'Configuration import does its best to convert files.\n' + newconfig + "---------------------------------------------------------------" + "\n" + "Configuration import does its best to convert files.\n" ) if click.confirm( - 'The new config *WILL* require adjusting afterwards. Save config?' + "The new config *WILL* require adjusting afterwards. Save config?" ): dest = None while not dest: dest_path = click.prompt( - 'Save to [%s]' % os.getcwd(), value_proc=_resolve_path_no_overwrite + "Save to [%s]" % os.getcwd(), value_proc=_resolve_path_no_overwrite ) # dest = dest_prompt - if click.confirm('Save to %s?' % dest_path): + if click.confirm("Save to %s?" % dest_path): dest = dest_path - buf = open(dest, 'w') + buf = open(dest, "w") buf.write(newconfig) buf.close() - tmuxp_echo('Saved to %s.' % dest) + tmuxp_echo("Saved to %s." % dest) else: tmuxp_echo( - 'tmuxp has examples in JSON and YAML format at ' - '\n' - 'View tmuxp docs at ' + "tmuxp has examples in JSON and YAML format at " + "\n" + "View tmuxp docs at " ) sys.exit() @import_config_cmd.command( - name='teamocil', short_help='Convert and import a teamocil config.' + name="teamocil", short_help="Convert and import a teamocil config." ) @click.argument( - 'configfile', type=ConfigPath(exists=True, config_dir=get_teamocil_dir), nargs=1 + "configfile", type=ConfigPath(exists=True, config_dir=get_teamocil_dir), nargs=1 ) def command_import_teamocil(configfile): """Convert a teamocil config from CONFIGFILE to tmuxp format and import @@ -1204,10 +1202,10 @@ def command_import_teamocil(configfile): @import_config_cmd.command( - name='tmuxinator', short_help='Convert and import a tmuxinator config.' + name="tmuxinator", short_help="Convert and import a tmuxinator config." ) @click.argument( - 'configfile', type=ConfigPath(exists=True, config_dir=get_tmuxinator_dir), nargs=1 + "configfile", type=ConfigPath(exists=True, config_dir=get_tmuxinator_dir), nargs=1 ) def command_import_tmuxinator(configfile): """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import @@ -1215,55 +1213,55 @@ def command_import_tmuxinator(configfile): import_config(configfile, config.import_tmuxinator) -@cli.command(name='convert') +@cli.command(name="convert") @click.option( - '--yes', '-y', 'confirmed', help='Auto confirms with "yes".', is_flag=True + "--yes", "-y", "confirmed", help='Auto confirms with "yes".', is_flag=True ) -@click.argument('config', type=ConfigPath(exists=True), nargs=1) +@click.argument("config", type=ConfigPath(exists=True), nargs=1) def command_convert(confirmed, config): """Convert a tmuxp config between JSON and YAML.""" _, ext = os.path.splitext(config) ext = ext.lower() - if ext == '.json': - to_filetype = 'yaml' - elif ext in ['.yaml', '.yml']: - to_filetype = 'json' + if ext == ".json": + to_filetype = "yaml" + elif ext in [".yaml", ".yml"]: + to_filetype = "json" else: raise click.BadParameter( - 'Unknown filetype: %s (valid: [.json, .yaml, .yml])' % (ext,) + "Unknown filetype: %s (valid: [.json, .yaml, .yml])" % (ext,) ) configparser = kaptan.Kaptan() configparser.import_config(config) - newfile = config.replace(ext, '.%s' % to_filetype) + newfile = config.replace(ext, ".%s" % to_filetype) - export_kwargs = {'default_flow_style': False} if to_filetype == 'yaml' else {} + export_kwargs = {"default_flow_style": False} if to_filetype == "yaml" else {} newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) if not confirmed: - if click.confirm('convert to <%s> to %s?' % (config, to_filetype)): - if click.confirm('Save config to %s?' % newfile): + if click.confirm("convert to <%s> to %s?" % (config, to_filetype)): + if click.confirm("Save config to %s?" % newfile): confirmed = True if confirmed: - buf = open(newfile, 'w') + buf = open(newfile, "w") buf.write(newconfig) buf.close() - print('New config saved to <%s>.' % newfile) + print("New config saved to <%s>." % newfile) -@cli.command(name='edit', short_help='Run $EDITOR on config.') -@click.argument('config', type=ConfigPath(exists=True), nargs=1) +@cli.command(name="edit", short_help="Run $EDITOR on config.") +@click.argument("config", type=ConfigPath(exists=True), nargs=1) def command_edit_config(config): config = scan_config(config) - sys_editor = os.environ.get('EDITOR', 'vim') + sys_editor = os.environ.get("EDITOR", "vim") call([sys_editor, config]) @cli.command( - name='ls', short_help='List configured sessions in {}.'.format(get_config_dir()) + name="ls", short_help="List configured sessions in {}.".format(get_config_dir()) ) def command_ls(): tmuxp_dir = get_config_dir() @@ -1275,7 +1273,7 @@ def command_ls(): print(stem) -@cli.command(name='debug-info', short_help='Print out all diagnostic info') +@cli.command(name="debug-info", short_help="Print out all diagnostic info") def command_debug_info(): """ Print debug info to submit with Issues. @@ -1285,54 +1283,54 @@ def prepend_tab(strings): """ Prepend tab to strings in list. """ - return list(map(lambda x: '\t%s' % x, strings)) + return list(map(lambda x: "\t%s" % x, strings)) def output_break(): """ Generate output break. """ - return '-' * 25 + return "-" * 25 def format_tmux_resp(std_resp): """ Format tmux command response for tmuxp stdout. """ - return '\n'.join( + return "\n".join( [ - '\n'.join(prepend_tab(std_resp.stdout)), - click.style('\n'.join(prepend_tab(std_resp.stderr)), fg='red'), + "\n".join(prepend_tab(std_resp.stdout)), + click.style("\n".join(prepend_tab(std_resp.stderr)), fg="red"), ] ) output = [ output_break(), - 'environment:\n%s' - % '\n'.join( + "environment:\n%s" + % "\n".join( prepend_tab( [ - 'dist: %s' % platform.platform(), - 'arch: %s' % platform.machine(), - 'uname: %s' % '; '.join(platform.uname()[:3]), - 'version: %s' % platform.version(), + "dist: %s" % platform.platform(), + "arch: %s" % platform.machine(), + "uname: %s" % "; ".join(platform.uname()[:3]), + "version: %s" % platform.version(), ] ) ), output_break(), - 'python version: %s' % ' '.join(sys.version.split('\n')), - 'system PATH: %s' % os.environ['PATH'], - 'tmux version: %s' % get_version(), - 'libtmux version: %s' % libtmux_version, - 'tmuxp version: %s' % __version__, - 'tmux path: %s' % which('tmux'), - 'tmuxp path: %s' % tmuxp_path, - 'shell: %s' % os.environ['SHELL'], + "python version: %s" % " ".join(sys.version.split("\n")), + "system PATH: %s" % os.environ["PATH"], + "tmux version: %s" % get_version(), + "libtmux version: %s" % libtmux_version, + "tmuxp version: %s" % __version__, + "tmux path: %s" % which("tmux"), + "tmuxp path: %s" % tmuxp_path, + "shell: %s" % os.environ["SHELL"], output_break(), - 'tmux sessions:\n%s' % format_tmux_resp(tmux_cmd('list-sessions')), - 'tmux windows:\n%s' % format_tmux_resp(tmux_cmd('list-windows')), - 'tmux panes:\n%s' % format_tmux_resp(tmux_cmd('list-panes')), - 'tmux global options:\n%s' % format_tmux_resp(tmux_cmd('show-options', '-g')), - 'tmux window options:\n%s' - % format_tmux_resp(tmux_cmd('show-window-options', '-g')), + "tmux sessions:\n%s" % format_tmux_resp(tmux_cmd("list-sessions")), + "tmux windows:\n%s" % format_tmux_resp(tmux_cmd("list-windows")), + "tmux panes:\n%s" % format_tmux_resp(tmux_cmd("list-panes")), + "tmux global options:\n%s" % format_tmux_resp(tmux_cmd("show-options", "-g")), + "tmux window options:\n%s" + % format_tmux_resp(tmux_cmd("show-window-options", "-g")), ] - tmuxp_echo('\n'.join(output)) + tmuxp_echo("\n".join(output)) diff --git a/tmuxp/config.py b/tmuxp/config.py index d7b8047ebe..243d644fbb 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -28,24 +28,24 @@ def validate_schema(sconf): """ # verify session_name - if 'session_name' not in sconf: + if "session_name" not in sconf: raise exc.ConfigError('config requires "session_name"') - if 'windows' not in sconf: + if "windows" not in sconf: raise exc.ConfigError('config requires list of "windows"') - for window in sconf['windows']: - if 'window_name' not in window: + for window in sconf["windows"]: + if "window_name" not in window: raise exc.ConfigError('config window is missing "window_name"') - if 'plugins' in sconf: - if not isinstance(sconf['plugins'], list): + if "plugins" in sconf: + if not isinstance(sconf["plugins"], list): raise exc.ConfigError('"plugins" only supports list type') return True -def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): +def is_config_file(filename, extensions=[".yml", ".yaml", ".json"]): """ Return True if file has a valid config file type. @@ -65,7 +65,7 @@ def is_config_file(filename, extensions=['.yml', '.yaml', '.json']): def in_dir( - config_dir=os.path.expanduser('~/.tmuxp'), extensions=['.yml', '.yaml', '.json'] + config_dir=os.path.expanduser("~/.tmuxp"), extensions=[".yml", ".yaml", ".json"] ): """ Return a list of configs in ``config_dir``. @@ -84,7 +84,7 @@ def in_dir( configs = [] for filename in os.listdir(config_dir): - if is_config_file(filename, extensions) and not filename.startswith('.'): + if is_config_file(filename, extensions) and not filename.startswith("."): configs.append(filename) return configs @@ -104,7 +104,7 @@ def in_cwd(): configs = [] for filename in os.listdir(os.getcwd()): - if filename.startswith('.tmuxp') and is_config_file(filename): + if filename.startswith(".tmuxp") and is_config_file(filename): configs.append(filename) return configs @@ -144,26 +144,26 @@ def inline(sconf): """ if ( - 'shell_command' in sconf - and isinstance(sconf['shell_command'], list) - and len(sconf['shell_command']) == 1 + "shell_command" in sconf + and isinstance(sconf["shell_command"], list) + and len(sconf["shell_command"]) == 1 ): - sconf['shell_command'] = sconf['shell_command'][0] + sconf["shell_command"] = sconf["shell_command"][0] if len(sconf.keys()) == int(1): - sconf = sconf['shell_command'] + sconf = sconf["shell_command"] if ( - 'shell_command_before' in sconf - and isinstance(sconf['shell_command_before'], list) - and len(sconf['shell_command_before']) == 1 + "shell_command_before" in sconf + and isinstance(sconf["shell_command_before"], list) + and len(sconf["shell_command_before"]) == 1 ): - sconf['shell_command_before'] = sconf['shell_command_before'][0] + sconf["shell_command_before"] = sconf["shell_command_before"][0] # recurse into window and pane config items - if 'windows' in sconf: - sconf['windows'] = [inline(window) for window in sconf['windows']] - if 'panes' in sconf: - sconf['panes'] = [inline(pane) for pane in sconf['panes']] + if "windows" in sconf: + sconf["windows"] = [inline(window) for window in sconf["windows"]] + if "panes" in sconf: + sconf["panes"] = [inline(pane) for pane in sconf["panes"]] return sconf @@ -206,40 +206,40 @@ def expand(sconf, cwd=None, parent=None): if not cwd: cwd = os.getcwd() - if 'session_name' in sconf: - sconf['session_name'] = expandshell(sconf['session_name']) - if 'window_name' in sconf: - sconf['window_name'] = expandshell(sconf['window_name']) - if 'environment' in sconf: - for key in sconf['environment']: - val = sconf['environment'][key] + if "session_name" in sconf: + sconf["session_name"] = expandshell(sconf["session_name"]) + if "window_name" in sconf: + sconf["window_name"] = expandshell(sconf["window_name"]) + if "environment" in sconf: + for key in sconf["environment"]: + val = sconf["environment"][key] val = expandshell(val) - if any(val.startswith(a) for a in ['.', './']): + if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf['environment'][key] = val - if 'global_options' in sconf: - for key in sconf['global_options']: - val = sconf['global_options'][key] + sconf["environment"][key] = val + if "global_options" in sconf: + for key in sconf["global_options"]: + val = sconf["global_options"][key] if isinstance(val, str): val = expandshell(val) - if any(val.startswith(a) for a in ['.', './']): + if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf['global_options'][key] = val - if 'options' in sconf: - for key in sconf['options']: - val = sconf['options'][key] + sconf["global_options"][key] = val + if "options" in sconf: + for key in sconf["options"]: + val = sconf["options"][key] if isinstance(val, str): val = expandshell(val) - if any(val.startswith(a) for a in ['.', './']): + if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf['options'][key] = val + sconf["options"][key] = val # Any config section, session, window, pane that can contain the # 'shell_command' value - if 'start_directory' in sconf: - sconf['start_directory'] = expandshell(sconf['start_directory']) - start_path = sconf['start_directory'] - if any(start_path.startswith(a) for a in ['.', './']): + if "start_directory" in sconf: + sconf["start_directory"] = expandshell(sconf["start_directory"]) + start_path = sconf["start_directory"] + if any(start_path.startswith(a) for a in [".", "./"]): # if window has a session, or pane has a window with a # start_directory of . or ./, make sure the start_directory can be # relative to the parent. @@ -247,67 +247,67 @@ def expand(sconf, cwd=None, parent=None): # This is for the case where you may be loading a config from # outside your shell current directory. if parent: - cwd = parent['start_directory'] + cwd = parent["start_directory"] start_path = os.path.normpath(os.path.join(cwd, start_path)) - sconf['start_directory'] = start_path + sconf["start_directory"] = start_path - if 'before_script' in sconf: - sconf['before_script'] = expandshell(sconf['before_script']) - if any(sconf['before_script'].startswith(a) for a in ['.', './']): - sconf['before_script'] = os.path.normpath( - os.path.join(cwd, sconf['before_script']) + if "before_script" in sconf: + sconf["before_script"] = expandshell(sconf["before_script"]) + if any(sconf["before_script"].startswith(a) for a in [".", "./"]): + sconf["before_script"] = os.path.normpath( + os.path.join(cwd, sconf["before_script"]) ) - if 'shell_command' in sconf and isinstance(sconf['shell_command'], str): - sconf['shell_command'] = [sconf['shell_command']] + if "shell_command" in sconf and isinstance(sconf["shell_command"], str): + sconf["shell_command"] = [sconf["shell_command"]] - if 'shell_command_before' in sconf and isinstance( - sconf['shell_command_before'], str + if "shell_command_before" in sconf and isinstance( + sconf["shell_command_before"], str ): - sconf['shell_command_before'] = [sconf['shell_command_before']] + sconf["shell_command_before"] = [sconf["shell_command_before"]] - if 'shell_command_before' in sconf and isinstance( - sconf['shell_command_before'], list + if "shell_command_before" in sconf and isinstance( + sconf["shell_command_before"], list ): - sconf['shell_command_before'] = [ - expandshell(scmd) for scmd in sconf['shell_command_before'] + sconf["shell_command_before"] = [ + expandshell(scmd) for scmd in sconf["shell_command_before"] ] # recurse into window and pane config items - if 'windows' in sconf: - sconf['windows'] = [expand(window, parent=sconf) for window in sconf['windows']] - elif 'panes' in sconf: + if "windows" in sconf: + sconf["windows"] = [expand(window, parent=sconf) for window in sconf["windows"]] + elif "panes" in sconf: - for pconf in sconf['panes']: - p_index = sconf['panes'].index(pconf) + for pconf in sconf["panes"]: + p_index = sconf["panes"].index(pconf) p = copy.deepcopy(pconf) - pconf = sconf['panes'][p_index] = {} + pconf = sconf["panes"][p_index] = {} if isinstance(p, str): - p = {'shell_command': [p]} + p = {"shell_command": [p]} elif not p: - p = {'shell_command': []} + p = {"shell_command": []} assert isinstance(p, dict) - if 'shell_command' in p: - cmd = p['shell_command'] + if "shell_command" in p: + cmd = p["shell_command"] - if isinstance(p['shell_command'], str): + if isinstance(p["shell_command"], str): cmd = [cmd] - if not cmd or any(a == cmd for a in [None, 'blank', 'pane']): + if not cmd or any(a == cmd for a in [None, "blank", "pane"]): cmd = [] if isinstance(cmd, list) and len(cmd) == int(1): - if any(a in cmd for a in [None, 'blank', 'pane']): + if any(a in cmd for a in [None, "blank", "pane"]): cmd = [] - p['shell_command'] = cmd + p["shell_command"] = cmd else: - p['shell_command'] = [] + p["shell_command"] = [] pconf.update(p) - sconf['panes'] = [expand(pane, parent=sconf) for pane in sconf['panes']] + sconf["panes"] = [expand(pane, parent=sconf) for pane in sconf["panes"]] return sconf @@ -335,57 +335,57 @@ def trickle(sconf): # prepends a pane's ``shell_command`` list with the window and sessions' # ``shell_command_before``. - if 'start_directory' in sconf: - session_start_directory = sconf['start_directory'] + if "start_directory" in sconf: + session_start_directory = sconf["start_directory"] else: session_start_directory = None - if 'suppress_history' in sconf: - suppress_history = sconf['suppress_history'] + if "suppress_history" in sconf: + suppress_history = sconf["suppress_history"] else: suppress_history = None - for windowconfig in sconf['windows']: + for windowconfig in sconf["windows"]: # Prepend start_directory to relative window commands if session_start_directory: - if 'start_directory' not in windowconfig: - windowconfig['start_directory'] = session_start_directory + if "start_directory" not in windowconfig: + windowconfig["start_directory"] = session_start_directory else: if not any( - windowconfig['start_directory'].startswith(a) for a in ['~', '/'] + windowconfig["start_directory"].startswith(a) for a in ["~", "/"] ): window_start_path = os.path.join( - session_start_directory, windowconfig['start_directory'] + session_start_directory, windowconfig["start_directory"] ) - windowconfig['start_directory'] = window_start_path + windowconfig["start_directory"] = window_start_path # We only need to trickle to the window, workspace builder checks wconf if suppress_history is not None: - if 'suppress_history' not in windowconfig: - windowconfig['suppress_history'] = suppress_history + if "suppress_history" not in windowconfig: + windowconfig["suppress_history"] = suppress_history # If panes were NOT specified for a window, assume that a single pane # with no shell commands is desired - if 'panes' not in windowconfig: - windowconfig['panes'] = [{'shell_command': []}] + if "panes" not in windowconfig: + windowconfig["panes"] = [{"shell_command": []}] - for paneconfig in windowconfig['panes']: + for paneconfig in windowconfig["panes"]: commands_before = [] # Prepend shell_command_before to commands - if 'shell_command_before' in sconf: - commands_before.extend(sconf['shell_command_before']) - if 'shell_command_before' in windowconfig: - commands_before.extend(windowconfig['shell_command_before']) - if 'shell_command_before' in paneconfig: - commands_before.extend(paneconfig['shell_command_before']) - - if 'shell_command' in paneconfig: - commands_before.extend(paneconfig['shell_command']) - - p_index = windowconfig['panes'].index(paneconfig) - windowconfig['panes'][p_index]['shell_command'] = commands_before + if "shell_command_before" in sconf: + commands_before.extend(sconf["shell_command_before"]) + if "shell_command_before" in windowconfig: + commands_before.extend(windowconfig["shell_command_before"]) + if "shell_command_before" in paneconfig: + commands_before.extend(paneconfig["shell_command_before"]) + + if "shell_command" in paneconfig: + commands_before.extend(paneconfig["shell_command"]) + + p_index = windowconfig["panes"].index(paneconfig) + windowconfig["panes"][p_index]["shell_command"] = commands_before # paneconfig['shell_command'] = commands_before return sconf @@ -408,79 +408,79 @@ def import_tmuxinator(sconf): tmuxp_config = {} - if 'project_name' in sconf: - tmuxp_config['session_name'] = sconf.pop('project_name') - elif 'name' in sconf: - tmuxp_config['session_name'] = sconf.pop('name') + if "project_name" in sconf: + tmuxp_config["session_name"] = sconf.pop("project_name") + elif "name" in sconf: + tmuxp_config["session_name"] = sconf.pop("name") else: - tmuxp_config['session_name'] = None + tmuxp_config["session_name"] = None - if 'project_root' in sconf: - tmuxp_config['start_directory'] = sconf.pop('project_root') - elif 'root' in sconf: - tmuxp_config['start_directory'] = sconf.pop('root') + if "project_root" in sconf: + tmuxp_config["start_directory"] = sconf.pop("project_root") + elif "root" in sconf: + tmuxp_config["start_directory"] = sconf.pop("root") - if 'cli_args' in sconf: - tmuxp_config['config'] = sconf['cli_args'] + if "cli_args" in sconf: + tmuxp_config["config"] = sconf["cli_args"] - if '-f' in tmuxp_config['config']: - tmuxp_config['config'] = tmuxp_config['config'].replace('-f', '').strip() - elif 'tmux_options' in sconf: - tmuxp_config['config'] = sconf['tmux_options'] + if "-f" in tmuxp_config["config"]: + tmuxp_config["config"] = tmuxp_config["config"].replace("-f", "").strip() + elif "tmux_options" in sconf: + tmuxp_config["config"] = sconf["tmux_options"] - if '-f' in tmuxp_config['config']: - tmuxp_config['config'] = tmuxp_config['config'].replace('-f', '').strip() + if "-f" in tmuxp_config["config"]: + tmuxp_config["config"] = tmuxp_config["config"].replace("-f", "").strip() - if 'socket_name' in sconf: - tmuxp_config['socket_name'] = sconf['socket_name'] + if "socket_name" in sconf: + tmuxp_config["socket_name"] = sconf["socket_name"] - tmuxp_config['windows'] = [] + tmuxp_config["windows"] = [] - if 'tabs' in sconf: - sconf['windows'] = sconf.pop('tabs') + if "tabs" in sconf: + sconf["windows"] = sconf.pop("tabs") - if 'pre' in sconf and 'pre_window' in sconf: - tmuxp_config['shell_command'] = sconf['pre'] + if "pre" in sconf and "pre_window" in sconf: + tmuxp_config["shell_command"] = sconf["pre"] - if isinstance(sconf['pre'], str): - tmuxp_config['shell_command_before'] = [sconf['pre_window']] + if isinstance(sconf["pre"], str): + tmuxp_config["shell_command_before"] = [sconf["pre_window"]] else: - tmuxp_config['shell_command_before'] = sconf['pre_window'] - elif 'pre' in sconf: - if isinstance(sconf['pre'], str): - tmuxp_config['shell_command_before'] = [sconf['pre']] + tmuxp_config["shell_command_before"] = sconf["pre_window"] + elif "pre" in sconf: + if isinstance(sconf["pre"], str): + tmuxp_config["shell_command_before"] = [sconf["pre"]] else: - tmuxp_config['shell_command_before'] = sconf['pre'] + tmuxp_config["shell_command_before"] = sconf["pre"] - if 'rbenv' in sconf: - if 'shell_command_before' not in tmuxp_config: - tmuxp_config['shell_command_before'] = [] - tmuxp_config['shell_command_before'].append('rbenv shell %s' % sconf['rbenv']) + if "rbenv" in sconf: + if "shell_command_before" not in tmuxp_config: + tmuxp_config["shell_command_before"] = [] + tmuxp_config["shell_command_before"].append("rbenv shell %s" % sconf["rbenv"]) - for w in sconf['windows']: + for w in sconf["windows"]: for k, v in w.items(): - windowdict = {'window_name': k} + windowdict = {"window_name": k} if isinstance(v, str) or v is None: - windowdict['panes'] = [v] - tmuxp_config['windows'].append(windowdict) + windowdict["panes"] = [v] + tmuxp_config["windows"].append(windowdict) continue elif isinstance(v, list): - windowdict['panes'] = v - tmuxp_config['windows'].append(windowdict) + windowdict["panes"] = v + tmuxp_config["windows"].append(windowdict) continue - if 'pre' in v: - windowdict['shell_command_before'] = v['pre'] - if 'panes' in v: - windowdict['panes'] = v['panes'] - if 'root' in v: - windowdict['start_directory'] = v['root'] + if "pre" in v: + windowdict["shell_command_before"] = v["pre"] + if "panes" in v: + windowdict["panes"] = v["panes"] + if "root" in v: + windowdict["start_directory"] = v["root"] - if 'layout' in v: - windowdict['layout'] = v['layout'] - tmuxp_config['windows'].append(windowdict) + if "layout" in v: + windowdict["layout"] = v["layout"] + tmuxp_config["windows"].append(windowdict) return tmuxp_config @@ -508,51 +508,51 @@ def import_teamocil(sconf): tmuxp_config = {} - if 'session' in sconf: - sconf = sconf['session'] + if "session" in sconf: + sconf = sconf["session"] - if 'name' in sconf: - tmuxp_config['session_name'] = sconf['name'] + if "name" in sconf: + tmuxp_config["session_name"] = sconf["name"] else: - tmuxp_config['session_name'] = None + tmuxp_config["session_name"] = None - if 'root' in sconf: - tmuxp_config['start_directory'] = sconf.pop('root') + if "root" in sconf: + tmuxp_config["start_directory"] = sconf.pop("root") - tmuxp_config['windows'] = [] + tmuxp_config["windows"] = [] - for w in sconf['windows']: + for w in sconf["windows"]: - windowdict = {'window_name': w['name']} + windowdict = {"window_name": w["name"]} - if 'clear' in w: - windowdict['clear'] = w['clear'] + if "clear" in w: + windowdict["clear"] = w["clear"] - if 'filters' in w: - if 'before' in w['filters']: - for b in w['filters']['before']: - windowdict['shell_command_before'] = w['filters']['before'] - if 'after' in w['filters']: - for b in w['filters']['after']: - windowdict['shell_command_after'] = w['filters']['after'] + if "filters" in w: + if "before" in w["filters"]: + for b in w["filters"]["before"]: + windowdict["shell_command_before"] = w["filters"]["before"] + if "after" in w["filters"]: + for b in w["filters"]["after"]: + windowdict["shell_command_after"] = w["filters"]["after"] - if 'root' in w: - windowdict['start_directory'] = w.pop('root') + if "root" in w: + windowdict["start_directory"] = w.pop("root") - if 'splits' in w: - w['panes'] = w.pop('splits') + if "splits" in w: + w["panes"] = w.pop("splits") - if 'panes' in w: - for p in w['panes']: - if 'cmd' in p: - p['shell_command'] = p.pop('cmd') - if 'width' in p: + if "panes" in w: + for p in w["panes"]: + if "cmd" in p: + p["shell_command"] = p.pop("cmd") + if "width" in p: # todo support for height/width - p.pop('width') - windowdict['panes'] = w['panes'] + p.pop("width") + windowdict["panes"] = w["panes"] - if 'layout' in w: - windowdict['layout'] = w['layout'] - tmuxp_config['windows'].append(windowdict) + if "layout" in w: + windowdict["layout"] = w["layout"] + tmuxp_config["windows"].append(windowdict) return tmuxp_config diff --git a/tmuxp/exc.py b/tmuxp/exc.py index 7ddcb24a09..7f5e38adde 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -54,10 +54,10 @@ def __init__(self, returncode, cmd, output=None): self.cmd = cmd self.output = output self.message = ( - 'before_script failed with returncode {returncode}.\n' - 'command: {cmd}\n' - 'Error output:\n' - '{output}' + "before_script failed with returncode {returncode}.\n" + "command: {cmd}\n" + "Error output:\n" + "{output}" ).format(returncode=self.returncode, cmd=self.cmd, output=self.output) def __str__(self): diff --git a/tmuxp/log.py b/tmuxp/log.py index 15f3b8b669..98db7ec633 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -11,25 +11,25 @@ from colorama import Fore, Style LEVEL_COLORS = { - 'DEBUG': Fore.BLUE, # Blue - 'INFO': Fore.GREEN, # Green - 'WARNING': Fore.YELLOW, - 'ERROR': Fore.RED, - 'CRITICAL': Fore.RED, + "DEBUG": Fore.BLUE, # Blue + "INFO": Fore.GREEN, # Green + "WARNING": Fore.YELLOW, + "ERROR": Fore.RED, + "CRITICAL": Fore.RED, } LOG_LEVELS = { - 'CRITICAL': 50, - 'ERROR': 40, - 'WARNING': 30, - 'INFO': 20, - 'DEBUG': 10, - 'NOTSET': 0, + "CRITICAL": 50, + "ERROR": 40, + "WARNING": 30, + "INFO": 20, + "DEBUG": 10, + "NOTSET": 0, } def set_style( - message, stylized, style_before=None, style_after=None, prefix='', suffix='' + message, stylized, style_before=None, style_after=None, prefix="", suffix="" ): if stylized: return prefix + style_before + message + style_after + suffix @@ -55,27 +55,27 @@ def default_log_template(self, record, stylized=False): reset = Style.RESET_ALL levelname = set_style( - '(%(levelname)s)', + "(%(levelname)s)", stylized, style_before=(LEVEL_COLORS.get(record.levelname) + Style.BRIGHT), style_after=Style.RESET_ALL, - suffix=' ', + suffix=" ", ) asctime = set_style( - '%(asctime)s', + "%(asctime)s", stylized, style_before=(Fore.BLACK + Style.DIM + Style.BRIGHT), style_after=(Fore.RESET + Style.RESET_ALL), - prefix='[', - suffix=']', + prefix="[", + suffix="]", ) name = set_style( - '%(name)s', + "%(name)s", stylized, style_before=(Fore.WHITE + Style.DIM + Style.BRIGHT), style_after=(Fore.RESET + Style.RESET_ALL), - prefix=' ', - suffix=' ', + prefix=" ", + suffix=" ", ) if stylized: @@ -96,7 +96,7 @@ def format(self, record): except Exception as e: record.message = "Bad message (%r): %r" % (e, record.__dict__) - date_format = '%H:%m:%S' + date_format = "%H:%m:%S" record.asctime = time.strftime(date_format, self.converter(record.created)) prefix = self.template(record) % record.__dict__ @@ -126,39 +126,39 @@ def debug_log_template(self, record): levelname = ( LEVEL_COLORS.get(record.levelname) + Style.BRIGHT - + '(%(levelname)1.1s)' + + "(%(levelname)1.1s)" + Style.RESET_ALL - + ' ' + + " " ) asctime = ( - '[' + "[" + Fore.BLACK + Style.DIM + Style.BRIGHT - + '%(asctime)s' + + "%(asctime)s" + Fore.RESET + Style.RESET_ALL - + ']' + + "]" ) name = ( - ' ' + " " + Fore.WHITE + Style.DIM + Style.BRIGHT - + '%(name)s' + + "%(name)s" + Fore.RESET + Style.RESET_ALL - + ' ' + + " " ) - module_funcName = Fore.GREEN + Style.BRIGHT + '%(module)s.%(funcName)s()' + module_funcName = Fore.GREEN + Style.BRIGHT + "%(module)s.%(funcName)s()" lineno = ( Fore.BLACK + Style.DIM + Style.BRIGHT - + ':' + + ":" + Style.RESET_ALL + Fore.CYAN - + '%(lineno)d' + + "%(lineno)d" ) tpl = reset + levelname + asctime + name + module_funcName + lineno + reset diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index 759e0bb471..58cb500d72 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -7,19 +7,19 @@ from .exc import TmuxpPluginException #: Minimum version of tmux required to run libtmux -TMUX_MIN_VERSION = '1.8' +TMUX_MIN_VERSION = "1.8" #: Most recent version of tmux supported TMUX_MAX_VERSION = None #: Minimum version of libtmux required to run libtmux -LIBTMUX_MIN_VERSION = '0.8.3' +LIBTMUX_MIN_VERSION = "0.8.3" #: Most recent version of libtmux supported LIBTMUX_MAX_VERSION = None #: Minimum version of tmuxp required to use plugins -TMUXP_MIN_VERSION = '1.6.0' +TMUXP_MIN_VERSION = "1.6.0" #: Most recent version of tmuxp TMUXP_MAX_VERSION = None @@ -28,7 +28,7 @@ class TmuxpPlugin: def __init__( self, - plugin_name='tmuxp-plugin', + plugin_name="tmuxp-plugin", tmux_min_version=TMUX_MIN_VERSION, tmux_max_version=TMUX_MAX_VERSION, tmux_version_incompatible=None, @@ -87,27 +87,27 @@ def __init__( self.tmuxp_version = LooseVersion(__version__) self.version_constraints = { - 'tmux': { - 'version': self.tmux_version, - 'vmin': tmux_min_version, - 'vmax': tmux_max_version, - 'incompatible': tmux_version_incompatible + "tmux": { + "version": self.tmux_version, + "vmin": tmux_min_version, + "vmax": tmux_max_version, + "incompatible": tmux_version_incompatible if tmux_version_incompatible else [], }, - 'libtmux': { - 'version': self.libtmux_version, - 'vmin': libtmux_min_version, - 'vmax': libtmux_max_version, - 'incompatible': libtmux_version_incompatible + "libtmux": { + "version": self.libtmux_version, + "vmin": libtmux_min_version, + "vmax": libtmux_max_version, + "incompatible": libtmux_version_incompatible if libtmux_version_incompatible else [], }, - 'tmuxp': { - 'version': self.tmuxp_version, - 'vmin': tmuxp_min_version, - 'vmax': tmuxp_max_version, - 'incompatible': tmuxp_version_incompatible + "tmuxp": { + "version": self.tmuxp_version, + "vmin": tmuxp_min_version, + "vmax": tmuxp_max_version, + "incompatible": tmuxp_version_incompatible if tmuxp_version_incompatible else [], }, @@ -124,9 +124,9 @@ def _version_check(self): assert self._pass_version_check(**constraints) except AssertionError: raise TmuxpPluginException( - 'Incompatible {dep} version: {version}\n{plugin_name} ' - 'requirements:\nmin: {vmin} | max: {vmax} | ' - 'incompatible: {incompatible}\n'.format( + "Incompatible {dep} version: {version}\n{plugin_name} " + "requirements:\nmin: {vmin} | max: {vmax} | " + "incompatible: {incompatible}\n".format( dep=dep, plugin_name=self.plugin_name, **constraints ) ) diff --git a/tmuxp/shell.py b/tmuxp/shell.py index 3607b75290..33936d28f1 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -58,14 +58,14 @@ def has_bpython(): def detect_best_shell(): if has_ptipython(): - return 'ptipython' + return "ptipython" elif has_ptpython(): - return 'ptpython' + return "ptpython" elif has_ipython(): - return 'ipython' + return "ipython" elif has_bpython(): - return 'bpython' - return 'code' + return "bpython" + return "code" def get_bpython(options, extra_args=None): @@ -78,15 +78,15 @@ def launch_bpython(): imported_objects = get_launch_args(**options) kwargs = {} if extra_args: - kwargs['args'] = extra_args + kwargs["args"] = extra_args embed(imported_objects, **kwargs) return launch_bpython def get_ipython_arguments(): - ipython_args = 'IPYTHON_ARGUMENTS' - return os.environ.get(ipython_args, '').split() + ipython_args = "IPYTHON_ARGUMENTS" + return os.environ.get(ipython_args, "").split() def get_ipython(options, **extra_args): @@ -122,7 +122,7 @@ def get_ptpython(options, vi_mode=False): def launch_ptpython(): imported_objects = get_launch_args(**options) - history_filename = os.path.expanduser('~/.ptpython_history') + history_filename = os.path.expanduser("~/.ptpython_history") embed( globals=imported_objects, history_filename=history_filename, @@ -148,7 +148,7 @@ def get_ptipython(options, vi_mode=False): def launch_ptipython(): imported_objects = get_launch_args(**options) - history_filename = os.path.expanduser('~/.ptpython_history') + history_filename = os.path.expanduser("~/.ptpython_history") embed( user_ns=imported_objects, history_filename=history_filename, @@ -163,15 +163,15 @@ def get_launch_args(**kwargs): import libtmux return { - 'libtmux': libtmux, - 'Server': libtmux.Server, - 'Session': libtmux.Session, - 'Window': libtmux.Window, - 'Pane': libtmux.Pane, - 'server': kwargs.get('server'), - 'session': kwargs.get('session'), - 'window': kwargs.get('window'), - 'pane': kwargs.get('pane'), + "libtmux": libtmux, + "Server": libtmux.Server, + "Session": libtmux.Session, + "Window": libtmux.Window, + "Pane": libtmux.Pane, + "server": kwargs.get("server"), + "session": kwargs.get("session"), + "window": kwargs.get("window"), + "pane": kwargs.get("pane"), } @@ -191,8 +191,8 @@ def get_code(use_pythonrc, imported_objects): readline.set_completer(rlcompleter.Completer(imported_objects).complete) # Enable tab completion on systems using libedit (e.g. macOS). # These lines are copied from Lib/site.py on Python 3.4. - readline_doc = getattr(readline, '__doc__', '') - if readline_doc is not None and 'libedit' in readline_doc: + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: readline.parse_and_bind("bind ^I rl_complete") else: readline.parse_and_bind("tab:complete") @@ -201,7 +201,7 @@ def get_code(use_pythonrc, imported_objects): # conventions and get $PYTHONSTARTUP first then .pythonrc.py. if use_pythonrc: for pythonrc in set( - [os.environ.get("PYTHONSTARTUP"), os.path.expanduser('~/.pythonrc.py')] + [os.environ.get("PYTHONSTARTUP"), os.path.expanduser("~/.pythonrc.py")] ): if not pythonrc: continue @@ -211,7 +211,7 @@ def get_code(use_pythonrc, imported_objects): pythonrc_code = handle.read() # Match the behavior of the cpython shell where an error in # PYTHONSTARTUP prints an exception and continues. - exec(compile(pythonrc_code, pythonrc, 'exec'), imported_objects) + exec(compile(pythonrc_code, pythonrc, "exec"), imported_objects) def launch_code(): code.interact(local=imported_objects) @@ -219,20 +219,20 @@ def launch_code(): return launch_code -def launch(shell='best', use_pythonrc=False, use_vi_mode=False, **kwargs): +def launch(shell="best", use_pythonrc=False, use_vi_mode=False, **kwargs): # Also allowing passing shell='code' to force using code.interact imported_objects = get_launch_args(**kwargs) - if shell == 'best': + if shell == "best": shell = detect_best_shell() - if shell == 'ptipython': + if shell == "ptipython": launch = get_ptipython(options=kwargs, vi_mode=use_vi_mode) - elif shell == 'ptpython': + elif shell == "ptpython": launch = get_ptpython(options=kwargs, vi_mode=use_vi_mode) - elif shell == 'ipython': + elif shell == "ipython": launch = get_ipython(options=kwargs) - elif shell == 'bpython': + elif shell == "bpython": launch = get_bpython(options=kwargs) else: launch = get_code(use_pythonrc=use_pythonrc, imported_objects=imported_objects) diff --git a/tmuxp/util.py b/tmuxp/util.py index 725dcde8bd..118345a611 100644 --- a/tmuxp/util.py +++ b/tmuxp/util.py @@ -29,15 +29,15 @@ def run_before_script(script_file, cwd=None): stdout=subprocess.PIPE, cwd=cwd, ) - for line in iter(proc.stdout.readline, b''): + for line in iter(proc.stdout.readline, b""): sys.stdout.write(console_to_str(line)) proc.wait() if proc.returncode: stderr = proc.stderr.read() proc.stderr.close() - stderr = console_to_str(stderr).split('\n') - stderr = '\n'.join(list(filter(None, stderr))) # filter empty + stderr = console_to_str(stderr).split("\n") + stderr = "\n".join(list(filter(None, stderr))) # filter empty raise exc.BeforeLoadScriptError( proc.returncode, os.path.abspath(script_file), stderr @@ -58,20 +58,20 @@ def oh_my_zsh_auto_title(): """ - if 'SHELL' in os.environ and 'zsh' in os.environ.get('SHELL'): - if os.path.exists(os.path.expanduser('~/.oh-my-zsh')): + if "SHELL" in os.environ and "zsh" in os.environ.get("SHELL"): + if os.path.exists(os.path.expanduser("~/.oh-my-zsh")): # oh-my-zsh exists if ( - 'DISABLE_AUTO_TITLE' not in os.environ - or os.environ.get('DISABLE_AUTO_TITLE') == "false" + "DISABLE_AUTO_TITLE" not in os.environ + or os.environ.get("DISABLE_AUTO_TITLE") == "false" ): print( - 'Please set:\n\n' - '\texport DISABLE_AUTO_TITLE=\'true\'\n\n' - 'in ~/.zshrc or where your zsh profile is stored.\n' + "Please set:\n\n" + "\texport DISABLE_AUTO_TITLE='true'\n\n" + "in ~/.zshrc or where your zsh profile is stored.\n" 'Remember the "export" at the beginning!\n\n' - 'Then create a new shell or type:\n\n' - '\t$ source ~/.zshrc' + "Then create a new shell or type:\n\n" + "\t$ source ~/.zshrc" ) @@ -82,11 +82,11 @@ def raise_if_tmux_not_running(server): except LibTmuxException as e: if any( needle in str(e) - for needle in ['No such file or directory', 'no server running on'] + for needle in ["No such file or directory", "no server running on"] ): raise LibTmuxException( - 'no tmux session found. Start a tmux session and try again. \n' - 'Original error: ' + str(e) + "no tmux session found. Start a tmux session and try again. \n" + "Original error: " + str(e) ) else: raise e @@ -94,12 +94,12 @@ def raise_if_tmux_not_running(server): def get_current_pane(server): """Return Pane if one found in env""" - if os.getenv('TMUX_PANE') is not None: + if os.getenv("TMUX_PANE") is not None: try: return [ p for p in server._list_panes() - if p.get('pane_id') == os.getenv('TMUX_PANE') + if p.get("pane_id") == os.getenv("TMUX_PANE") ][0] except IndexError: pass @@ -107,32 +107,32 @@ def get_current_pane(server): def get_session(server, session_name=None, current_pane=None): if session_name: - session = server.find_where({'session_name': session_name}) + session = server.find_where({"session_name": session_name}) elif current_pane is not None: - session = server.find_where({'session_id': current_pane['session_id']}) + session = server.find_where({"session_id": current_pane["session_id"]}) else: current_pane = get_current_pane(server) if current_pane: - session = server.find_where({'session_id': current_pane['session_id']}) + session = server.find_where({"session_id": current_pane["session_id"]}) else: session = server.list_sessions()[0] if not session: if session_name: - raise exc.TmuxpException('Session not found: %s' % session_name) + raise exc.TmuxpException("Session not found: %s" % session_name) else: - raise exc.TmuxpException('Session not found') + raise exc.TmuxpException("Session not found") return session def get_window(session, window_name=None, current_pane=None): if window_name: - window = session.find_where({'window_name': window_name}) + window = session.find_where({"window_name": window_name}) if not window: - raise exc.TmuxpException('Window not found: %s' % window_name) + raise exc.TmuxpException("Window not found: %s" % window_name) elif current_pane is not None: - window = session.find_where({'window_id': current_pane['window_id']}) + window = session.find_where({"window_id": current_pane["window_id"]}) else: window = session.list_windows()[0] @@ -142,7 +142,7 @@ def get_window(session, window_name=None, current_pane=None): def get_pane(window, current_pane=None): try: if current_pane is not None: - pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841 + pane = window.find_where({"pane_id": current_pane["pane_id"]}) # NOQA: F841 else: pane = window.attached_pane # NOQA: F841 except exc.TmuxpException as e: diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index c38b1c5b01..9f60471705 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -86,7 +86,7 @@ def __init__(self, sconf, plugins=[], server=None): """ if not sconf: - raise exc.EmptyConfigException('session configuration is empty.') + raise exc.EmptyConfigException("session configuration is empty.") # config.validate_schema(sconf) @@ -104,7 +104,7 @@ def session_exists(self, session_name=None): if not exists: return exists - self.session = self.server.find_where({'session_name': session_name}) + self.session = self.server.find_where({"session_name": session_name}) return True def build(self, session=None, append=False): @@ -128,30 +128,30 @@ def build(self, session=None, append=False): if not session: if not self.server: raise exc.TmuxpException( - 'WorkspaceBuilder.build requires server to be passed ' - + 'on initialization, or pass in session object to here.' + "WorkspaceBuilder.build requires server to be passed " + + "on initialization, or pass in session object to here." ) - if self.server.has_session(self.sconf['session_name']): + if self.server.has_session(self.sconf["session_name"]): self.session = self.server.find_where( - {'session_name': self.sconf['session_name']} + {"session_name": self.sconf["session_name"]} ) raise TmuxSessionExists( - 'Session name %s is already running.' % self.sconf['session_name'] + "Session name %s is already running." % self.sconf["session_name"] ) else: - if 'start_directory' in self.sconf: + if "start_directory" in self.sconf: session = self.server.new_session( - session_name=self.sconf['session_name'], - start_directory=self.sconf['start_directory'], + session_name=self.sconf["session_name"], + start_directory=self.sconf["start_directory"], ) else: session = self.server.new_session( - session_name=self.sconf['session_name'] + session_name=self.sconf["session_name"] ) - assert self.sconf['session_name'] == session.name - assert len(self.sconf['session_name']) > 0 + assert self.sconf["session_name"] == session.name + assert len(self.sconf["session_name"]) > 0 self.session = session self.server = session.server @@ -167,26 +167,26 @@ def build(self, session=None, append=False): focus = None - if 'before_script' in self.sconf: + if "before_script" in self.sconf: try: cwd = None # we want to run the before_script file cwd'd from the # session start directory, if it exists. - if 'start_directory' in self.sconf: - cwd = self.sconf['start_directory'] - run_before_script(self.sconf['before_script'], cwd=cwd) + if "start_directory" in self.sconf: + cwd = self.sconf["start_directory"] + run_before_script(self.sconf["before_script"], cwd=cwd) except Exception as e: self.session.kill_session() raise e - if 'options' in self.sconf: - for option, value in self.sconf['options'].items(): + if "options" in self.sconf: + for option, value in self.sconf["options"].items(): self.session.set_option(option, value) - if 'global_options' in self.sconf: - for option, value in self.sconf['global_options'].items(): + if "global_options" in self.sconf: + for option, value in self.sconf["global_options"].items(): self.session.set_option(option, value, _global=True) - if 'environment' in self.sconf: - for option, value in self.sconf['environment'].items(): + if "environment" in self.sconf: + for option, value in self.sconf["environment"].items(): self.session.set_environment(option, value) for w, wconf in self.iter_create_windows(session, append): @@ -200,13 +200,13 @@ def build(self, session=None, append=False): assert isinstance(p, Pane) p = p - if 'layout' in wconf: - w.select_layout(wconf['layout']) + if "layout" in wconf: + w.select_layout(wconf["layout"]) - if 'focus' in pconf and pconf['focus']: + if "focus" in pconf and pconf["focus"]: focus_pane = p - if 'focus' in wconf and wconf['focus']: + if "focus" in wconf and wconf["focus"]: focus = w self.config_after_window(w, wconf) @@ -242,11 +242,11 @@ def iter_create_windows(self, session, append=False): Newly created window, and the section from the tmuxp configuration that was used to create the window. """ - for i, wconf in enumerate(self.sconf['windows'], start=1): - if 'window_name' not in wconf: + for i, wconf in enumerate(self.sconf["windows"], start=1): + if "window_name" not in wconf: window_name = None else: - window_name = wconf['window_name'] + window_name = wconf["window_name"] is_first_window_pass = self.first_window_pass(i, session, append) @@ -255,20 +255,20 @@ def iter_create_windows(self, session, append=False): w1 = session.attached_window w1.move_window(99) - if 'start_directory' in wconf: - sd = wconf['start_directory'] + if "start_directory" in wconf: + sd = wconf["start_directory"] else: sd = None - if 'window_shell' in wconf: - ws = wconf['window_shell'] + if "window_shell" in wconf: + ws = wconf["window_shell"] else: ws = None # If the first pane specifies a shell, use that instead. try: - if wconf['panes'][0]['shell'] != '': - ws = wconf['panes'][0]['shell'] + if wconf["panes"][0]["shell"] != "": + ws = wconf["panes"][0]["shell"] except (KeyError, IndexError): pass @@ -276,7 +276,7 @@ def iter_create_windows(self, session, append=False): window_name=window_name, start_directory=sd, attach=False, # do not move to the new window - window_index=wconf.get('window_index', ''), + window_index=wconf.get("window_index", ""), window_shell=ws, ) @@ -285,11 +285,11 @@ def iter_create_windows(self, session, append=False): assert isinstance(w, Window) session.server._update_windows() - if 'options' in wconf and isinstance(wconf['options'], dict): - for key, val in wconf['options'].items(): + if "options" in wconf and isinstance(wconf["options"], dict): + for key, val in wconf["options"].items(): w.set_window_option(key, val) - if 'focus' in wconf and wconf['focus']: + if "focus" in wconf and wconf["focus"]: w.select_window() session.server._update_windows() @@ -317,30 +317,30 @@ def iter_create_panes(self, w, wconf): """ assert isinstance(w, Window) - pane_base_index = int(w.show_window_option('pane-base-index', g=True)) + pane_base_index = int(w.show_window_option("pane-base-index", g=True)) p = None - for pindex, pconf in enumerate(wconf['panes'], start=pane_base_index): + for pindex, pconf in enumerate(wconf["panes"], start=pane_base_index): if pindex == int(pane_base_index): p = w.attached_pane else: def get_pane_start_directory(): - if 'start_directory' in pconf: - return pconf['start_directory'] - elif 'start_directory' in wconf: - return wconf['start_directory'] + if "start_directory" in pconf: + return pconf["start_directory"] + elif "start_directory" in wconf: + return wconf["start_directory"] else: return None def get_pane_shell(): - if 'shell' in pconf: - return pconf['shell'] - elif 'window_shell' in wconf: - return wconf['window_shell'] + if "shell" in pconf: + return pconf["shell"] + elif "window_shell" in wconf: + return wconf["window_shell"] else: return None @@ -352,21 +352,21 @@ def get_pane_shell(): ) assert isinstance(p, Pane) - if 'layout' in wconf: - w.select_layout(wconf['layout']) + if "layout" in wconf: + w.select_layout(wconf["layout"]) - if 'suppress_history' in pconf: - suppress = pconf['suppress_history'] - elif 'suppress_history' in wconf: - suppress = wconf['suppress_history'] + if "suppress_history" in pconf: + suppress = pconf["suppress_history"] + elif "suppress_history" in wconf: + suppress = wconf["suppress_history"] else: suppress = True - for cmd in pconf['shell_command']: + for cmd in pconf["shell_command"]: p.send_keys(cmd, suppress_history=suppress) - if 'focus' in pconf and pconf['focus']: - w.select_pane(p['pane_id']) + if "focus" in pconf and pconf["focus"]: + w.select_pane(p["pane_id"]) w.server._update_panes() @@ -386,8 +386,8 @@ def config_after_window(self, w, wconf): wconf : dict config section for window """ - if 'options_after' in wconf and isinstance(wconf['options_after'], dict): - for key, val in wconf['options_after'].items(): + if "options_after" in wconf and isinstance(wconf["options_after"], dict): + for key, val in wconf["options_after"].items(): w.set_window_option(key, val) def find_current_attached_session(self): @@ -423,17 +423,17 @@ def freeze(session): dict tmuxp compatible workspace config """ - sconf = {'session_name': session['session_name'], 'windows': []} + sconf = {"session_name": session["session_name"], "windows": []} for w in session.windows: wconf = { - 'options': w.show_window_options(), - 'window_name': w.name, - 'layout': w.layout, - 'panes': [], + "options": w.show_window_options(), + "window_name": w.name, + "layout": w.layout, + "panes": [], } - if w.get('window_active', '0') == '1': - wconf['focus'] = 'true' + if w.get("window_active", "0") == "1": + wconf["focus"] = "true" # If all panes have same path, set 'start_directory' instead # of using 'cd' shell commands. @@ -441,35 +441,35 @@ def pane_has_same_path(p): return w.panes[0].current_path == p.current_path if all(pane_has_same_path(p) for p in w.panes): - wconf['start_directory'] = w.panes[0].current_path + wconf["start_directory"] = w.panes[0].current_path for p in w.panes: - pconf = {'shell_command': []} + pconf = {"shell_command": []} - if 'start_directory' not in wconf: - pconf['shell_command'].append('cd ' + p.current_path) + if "start_directory" not in wconf: + pconf["shell_command"].append("cd " + p.current_path) - if p.get('pane_active', '0') == '1': - pconf['focus'] = 'true' + if p.get("pane_active", "0") == "1": + pconf["focus"] = "true" current_cmd = p.current_command def filter_interpretters_and_shells(): - return current_cmd.startswith('-') or any( - current_cmd.endswith(cmd) for cmd in ['python', 'ruby', 'node'] + return current_cmd.startswith("-") or any( + current_cmd.endswith(cmd) for cmd in ["python", "ruby", "node"] ) if filter_interpretters_and_shells(): current_cmd = None if current_cmd: - pconf['shell_command'].append(current_cmd) + pconf["shell_command"].append(current_cmd) else: - if not len(pconf['shell_command']): - pconf = 'pane' + if not len(pconf["shell_command"]): + pconf = "pane" - wconf['panes'].append(pconf) + wconf["panes"].append(pconf) - sconf['windows'].append(wconf) + sconf["windows"].append(wconf) return sconf From 7fa14f5ed115c7b8c679e713f019e2858232236b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Feb 2022 10:01:13 -0600 Subject: [PATCH 0883/2998] docs(CHANGES): Update to note black format --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index e3e0ae85ca..0dbda33453 100644 --- a/CHANGES +++ b/CHANGES @@ -57,6 +57,11 @@ - Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) +#### Development + +- Run through black + isort with string normalization (#738). This way we can + use black without any configuration. (One-time, big diff) + ## tmuxp 1.9.4 (2022-01-10) #### Packaging From f8f74eccff2656e6603301ff94d42122415627ab Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 26 Feb 2022 13:41:19 -0600 Subject: [PATCH 0884/2998] build(deps[docs]): Update sphinx and related deps --- poetry.lock | 49 +++++++++++++++++++++++++------------------------ pyproject.toml | 6 +++--- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/poetry.lock b/poetry.lock index a4920991cb..97195256b5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -502,11 +502,11 @@ python-versions = "*" [[package]] name = "myst-parser" -version = "0.16.1" +version = "0.17.0" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] docutils = ">=0.15,<0.18" @@ -515,12 +515,13 @@ markdown-it-py = ">=1.0.0,<3.0.0" mdit-py-plugins = ">=0.3.0,<0.4.0" pyyaml = "*" sphinx = ">=3.1,<5" +typing-extensions = "*" [package.extras] code_style = ["pre-commit (>=2.12,<3.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)", "sphinxext-rediraffe (>=0.2,<1.0)", "sphinxcontrib.mermaid (>=0.6.3,<0.7.0)", "sphinxext-opengraph (>=0.4.2,<0.5.0)"] -testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] +testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "packaging" @@ -895,7 +896,7 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] [[package]] name = "sphinx-autodoc-typehints" -version = "1.14.1" +version = "1.17.0" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false @@ -905,24 +906,24 @@ python-versions = ">=3.7" Sphinx = ">=4" [package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] +testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinx-issues" -version = "1.2.0" +version = "3.0.1" description = "A Sphinx extension for linking to your project's issue tracker" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] sphinx = "*" [package.extras] -dev = ["pytest", "flake8 (==3.6.0)", "pre-commit (==1.13.0)", "tox", "mock", "flake8-bugbear (==18.8.0)"] -lint = ["flake8 (==3.6.0)", "pre-commit (==1.13.0)", "flake8-bugbear (==18.8.0)"] -tests = ["pytest", "mock"] +dev = ["pytest (>=6.2.0)", "flake8 (==3.9.2)", "flake8-bugbear (==20.11.1)", "pre-commit (>=2.7,<3.0)", "tox"] +lint = ["flake8 (==3.9.2)", "flake8-bugbear (==20.11.1)", "pre-commit (>=2.7,<3.0)"] +tests = ["pytest (>=6.2.0)"] [[package]] name = "sphinxcontrib-applehelp" @@ -1005,11 +1006,11 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "tomlkit" @@ -1089,7 +1090,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.1" +version = "20.13.2" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1136,7 +1137,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "9f35ce142a569ab9764199828d3653668129d847587f2f89088a8d84c8846fe8" +content-hash = "39a6043ae1172fc1f9e0cc5de7b96680a359367ace2d9793d7e0d84291683d90" [metadata.files] aafigure = [ @@ -1508,8 +1509,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] myst-parser = [ - {file = "myst-parser-0.16.1.tar.gz", hash = "sha256:a6473b9735c8c74959b49b36550725464f4aecc4481340c9a5f9153829191f83"}, - {file = "myst_parser-0.16.1-py3-none-any.whl", hash = "sha256:617a90ceda2162ebf81cd13ad17d879bd4f49e7fb5c4f177bb905272555a2268"}, + {file = "myst-parser-0.17.0.tar.gz", hash = "sha256:d412347a5cacb77ebc03d7f7ffef050cd61957d46f234313d350e84e24972260"}, + {file = "myst_parser-0.17.0-py3-none-any.whl", hash = "sha256:555ec2950aba5ae5dac5c162c7e9a43ad4a7291cfac644d8f5f84da8efa6f356"}, ] packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, @@ -1700,12 +1701,12 @@ sphinx = [ {file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"}, ] sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.14.1-py3-none-any.whl", hash = "sha256:8b3b7da797fa007f7f39c518879a1bdae3a7dab96e170f4cb5a4b96390238369"}, - {file = "sphinx_autodoc_typehints-1.14.1.tar.gz", hash = "sha256:875de815a1ba609a4c0ebc620faecd8eb57183ba1f4cc6f8abba1790c140e960"}, + {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, + {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, ] sphinx-issues = [ - {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, - {file = "sphinx_issues-1.2.0-py2.py3-none-any.whl", hash = "sha256:1208e1869742b7800a45b3c47ab987b87b2ad2024cbc36e0106e8bba3549dd22"}, + {file = "sphinx-issues-3.0.1.tar.gz", hash = "sha256:b7c1dc1f4808563c454d11c1112796f8c176cdecfee95f0fd2302ef98e21e3d6"}, + {file = "sphinx_issues-3.0.1-py3-none-any.whl", hash = "sha256:8b25dc0301159375468f563b3699af7a63720fd84caf81c1442036fcd418b20c"}, ] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, @@ -1736,8 +1737,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ {file = "tomlkit-0.10.0-py3-none-any.whl", hash = "sha256:cac4aeaff42f18fef6e07831c2c2689a51df76cf2ede07a6a4fa5fcb83558870"}, @@ -1786,8 +1787,8 @@ urllib3 = [ {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, ] virtualenv = [ - {file = "virtualenv-20.13.1-py2.py3-none-any.whl", hash = "sha256:45e1d053cad4cd453181ae877c4ffc053546ae99e7dd049b9ff1d9be7491abf7"}, - {file = "virtualenv-20.13.1.tar.gz", hash = "sha256:e0621bcbf4160e4e1030f05065c8834b4e93f4fcc223255db2a823440aca9c14"}, + {file = "virtualenv-20.13.2-py2.py3-none-any.whl", hash = "sha256:e7b34c9474e6476ee208c43a4d9ac1510b041c68347eabfe9a9ea0c86aa0a46b"}, + {file = "virtualenv-20.13.2.tar.gz", hash = "sha256:01f5f80744d24a3743ce61858123488e91cb2dd1d3bdf92adaf1bba39ffdedf0"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, diff --git a/pyproject.toml b/pyproject.toml index 453a16065d..e0a1e791f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,11 +55,11 @@ colorama = ">=0.3.9" ### Docs ### sphinx = "*" alagitpull = "~0.1.0" -sphinx-issues = "^1.2.0" +sphinx-issues = "^3.0.0" aafigure = ">=0.6" pillow = "*" -sphinx-autodoc-typehints = "~1.14.1" -myst_parser = "~0.16.1" +sphinx-autodoc-typehints = "~1.17.0" +myst_parser = "~0.17.0" ### Testing ### pytest = "*" From e66d56605f207eb14967d1a2ed189081c9ca106c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 19:27:01 -0600 Subject: [PATCH 0885/2998] docs(publish-docs): CloudFront file detection --- .github/workflows/publish-docs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index ad8a9eb431..26751b7e21 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -115,7 +115,8 @@ jobs: - name: Generate list of changed files for CloudFront to invalidate if: env.PUBLISH == 'true' run: | - pushd docs/_build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + FILES=$(find docs/_build/html -exec realpath --relative-to docs/_build/html {} \; | awk '{print "/"$0}' | grep "html\|searchindex.js\|custom.css\|.svg"); + for file in $FILES; do echo $file # add bare directory to list of updated paths when we see index.html From ae6c0eb27d6ca34a895a5d0e111be4a453db08a1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 19:23:19 -0600 Subject: [PATCH 0886/2998] docs(logo): Inkscape SVG and filled inside --- docs/_static/img/tmuxp.svg | 88 +++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/docs/_static/img/tmuxp.svg b/docs/_static/img/tmuxp.svg index 12237acbef..be5a1531af 100644 --- a/docs/_static/img/tmuxp.svg +++ b/docs/_static/img/tmuxp.svg @@ -1 +1,87 @@ -tmuxp \ No newline at end of file + + + + + + + tmuxp + + + + + + + + + + + + + tmuxp + + + + From 981a0e0cc72d6eeb56c5ca59697005a327c7f00b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 19:38:46 -0600 Subject: [PATCH 0887/2998] ci(publish-docs): Set versions on actions --- .github/workflows/publish-docs.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 26751b7e21..fc2a2c202d 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -124,7 +124,7 @@ jobs: done | sort | uniq | tr '\n' ' ' > .updated_files - name: Invalidate on CloudFront - uses: chetan/invalidate-cloudfront-action@master + uses: chetan/invalidate-cloudfront-action@v2.3 if: env.PUBLISH == 'true' env: DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION }} @@ -132,3 +132,9 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} PATHS_FROM: .updated_files + + - name: Purge cache on Cloudflare + uses: jakejarvis/cloudflare-purge-action@v0.3.0 + env: + CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }} + CLOUDFLARE_ZONE: ${{ secrets.CLOUDFLARE_ZONE }} From 8dc33007180beb60307a24c697fecdac9e978307 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 19:52:05 -0600 Subject: [PATCH 0888/2998] ci(publish-docs): Update on poetry lock, pyproject.toml --- .github/workflows/publish-docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index fc2a2c202d..a3edff76e1 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -27,6 +27,8 @@ jobs: root_docs: - CHANGES - README.* + - pyproject.toml + - poetry.lock docs: - 'docs/**/*.rst' - 'docs/**/*.md' From 09a22b8781d97407addedf2b029b3f2de70f053f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 19:53:15 -0600 Subject: [PATCH 0889/2998] build(deps): libtmux 0.11.0a0 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 97195256b5..d28b4551bc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -408,7 +408,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.10.3" +version = "0.11.0b0" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1137,7 +1137,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "39a6043ae1172fc1f9e0cc5de7b96680a359367ace2d9793d7e0d84291683d90" +content-hash = "21927f33488d3ccf3b612b03ec68f424083b845ac040610712418d321799224b" [metadata.files] aafigure = [ @@ -1403,8 +1403,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.10.3-py3-none-any.whl", hash = "sha256:ec20f1d9c265ceb2846ef98480c5279985f23eb43fe8f9eded79c03e9d7ae254"}, - {file = "libtmux-0.10.3.tar.gz", hash = "sha256:c7fbd837f0a9e4d33a157523e4ca6ef95e80256842e094ffd766c3dbd78d1957"}, + {file = "libtmux-0.11.0b0-py3-none-any.whl", hash = "sha256:a0c758efce6da2455af8ac8841084488eba47e3e6a1af18bd0e3af4acab796d3"}, + {file = "libtmux-0.11.0b0.tar.gz", hash = "sha256:3883db0ae3f8b59b75598e50db01d4d2eae6fbd217a18f9fc610e075769a8b8a"}, ] lockfile = [ {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, diff --git a/pyproject.toml b/pyproject.toml index e0a1e791f7..d27566a32b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.10.3" +libtmux = "~0.11.0a0" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From fddd607be0c4d13477e928d5e831e2a8d1b18dc1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Feb 2022 20:55:36 -0600 Subject: [PATCH 0890/2998] ci(publish-docs): move poetry files to python_files --- .github/workflows/publish-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index a3edff76e1..2d53157f35 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -27,14 +27,14 @@ jobs: root_docs: - CHANGES - README.* - - pyproject.toml - - poetry.lock docs: - 'docs/**/*.rst' - 'docs/**/*.md' - 'examples/**' python_files: - 'tmuxp/**' + - pyproject.toml + - poetry.lock - name: Should publish if: steps.changes.outputs.docs == 'true' || steps.changes.outputs.root_docs == 'true' || steps.changes.outputs.python_files == 'true' From 51f673ab845eae219145503bb214af1cf8b20fb3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 28 Feb 2022 21:09:39 -0600 Subject: [PATCH 0891/2998] docs(cli): Fix bash completion and link to click's shell completion --- docs/cli.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/cli.md b/docs/cli.md index 4e75b65eaf..7a360aac18 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -8,11 +8,15 @@ ## Completion +```{note} +See the [click library's documentation on shell completion](https://click.palletsprojects.com/en/8.0.x/shell-completion/) for the most up to date way of connecting completion for vcspull. +``` + In bash (`~/.bashrc`): ```{code-block} sh -eval "$(_TMUXP_COMPLETE=source tmuxp)" +eval "$(_TMUXP_COMPLETE=bash_source tmuxp)" ``` From 8fa63930e28dd02238fbcec2054b96f914c6d620 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 1 Mar 2022 22:28:01 -0600 Subject: [PATCH 0892/2998] docs(README): Fix license button positioning --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa54b7aca2..c1faedbb66 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ tmuxp, tmux session manager. built on [![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22Publish+Docs%22) [![Build status](https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22tests%22) [![Code Coverage](https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg)](https://codecov.io/gh/tmux-python/tmuxp) -![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg) +[![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg)](https://github.com/tmux-python/tmuxp/blob/master/LICENSE) **We need help!** tmuxp is a trusted session manager for tmux. If you could lend your time to helping answer issues and QA pull requests, From 15bd0594b84b3654577099795e2f46efff16f3be Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 1 Mar 2022 22:29:38 -0600 Subject: [PATCH 0893/2998] docs: Move to furo theme, add pytest-watcher --- .python-version | 1 + .tool-versions | 1 + Makefile | 9 + docs/Makefile | 7 + docs/_static/css/custom.css | 40 ++++ docs/_templates/sidebar/projects.html | 31 +++ docs/conf.py | 68 ++++--- poetry.lock | 278 ++++++++++++++++++++++++-- pyproject.toml | 14 +- 9 files changed, 396 insertions(+), 53 deletions(-) create mode 100644 .python-version create mode 100644 docs/_static/css/custom.css create mode 100644 docs/_templates/sidebar/projects.html diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..bb57aeee83 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.10.1 3.9.9 3.8.11 3.7.12 diff --git a/.tool-versions b/.tool-versions index 11b8e22ca2..9e962809a8 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1,2 @@ poetry 1.1.12 +python 3.10.1 3.9.9 3.8.11 3.7.12 diff --git a/Makefile b/Makefile index 93a623dc8e..b4ce25c651 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ black: test: poetry run py.test $(test) +start: + $(MAKE) test && poetry run ptw . + watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi @@ -34,6 +37,12 @@ serve_docs: dev_docs: $(MAKE) -j watch_docs serve_docs +start_docs: + $(MAKE) -C docs start + +design_docs: + $(MAKE) -C docs design + flake8: poetry run flake8 diff --git a/docs/Makefile b/docs/Makefile index b5de078873..ac472e62fd 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -175,3 +175,10 @@ serve_py3: dev: $(MAKE) -j watch serve + +start: + poetry run sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) --port ${HTTP_PORT} $(O) + +design: + # This adds additional watch directories (for _static file changes) and disable incremental builds + poetry run sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) --port ${HTTP_PORT} --watch "." -a $(O) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css new file mode 100644 index 0000000000..aefd33b4c9 --- /dev/null +++ b/docs/_static/css/custom.css @@ -0,0 +1,40 @@ +h2 { + font-size: 2rem; + margin-bottom: 1.25rem; + margin-top: 1.25rem; + scroll-margin-top: 0.5rem; +} + +h3 { + font-size: 1.5rem; + margin-bottom: 1.25rem; + margin-top: 1.25rem; + scroll-margin-top: 0.5rem; +} + +h4 { + font-size: 1.25rem; + margin-bottom: 1.25rem; + scroll-margin-top: 0.5rem; +} + +.sidebar-tree p.indented-block { + padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0 var(--sidebar-item-spacing-horizontal); + margin-bottom: 0; +} + +.sidebar-tree p.indented-block span.indent { + margin-left: var(--sidebar-item-spacing-horizontal); + display: block; +} + +.sidebar-tree p.indented-block > :not(.project-name) { + font-size: var(--toc-font-size); +} + +.sidebar-tree p.indented-block .project-name { + font-size: var(--sidebar-item-font-size); + font-weight: bold; + margin-right: calc(var(--sidebar-item-spacing-horizontal) / 2.5); +} + diff --git a/docs/_templates/sidebar/projects.html b/docs/_templates/sidebar/projects.html new file mode 100644 index 0000000000..7e9d6780de --- /dev/null +++ b/docs/_templates/sidebar/projects.html @@ -0,0 +1,31 @@ +

    diff --git a/docs/conf.py b/docs/conf.py index 844c4358c2..3205c3b813 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,10 +1,9 @@ +# flake8: NOQA E5 import inspect import os import sys from os.path import dirname, relpath -import alagitpull - import tmuxp # Get the project root dir, which is the parent dir of this @@ -28,9 +27,13 @@ "sphinx.ext.napoleon", "sphinx.ext.linkcode", "aafig", - "alagitpull", "sphinx_issues", "myst_parser", + "sphinx_click.ext", # sphinx-click + "sphinx_inline_tabs", + "sphinx_copybutton", + "sphinxext.opengraph", + "myst_parser", ] myst_enable_extensions = ["colon_fence"] @@ -51,41 +54,46 @@ exclude_patterns = ["_build"] -pygments_style = "sphinx" +pygments_style = "monokai" +pygments_dark_style = "monokai" -html_theme_path = [alagitpull.get_path()] -html_theme = "alagitpull" +html_css_files = ["css/custom.css"] html_extra_path = ["manifest.json"] html_static_path = ["_static"] +html_theme = "furo" +html_theme_path = [] +html_theme_options = { + "light_logo": "img/tmuxp.svg", + "dark_logo": "img/tmuxp.svg", + "footer_icons": [ + { + "name": "GitHub", + "url": about["__github__"], + "html": """ + + + + """, + "class": "", + }, + ], +} html_sidebars = { "**": [ - "about.html", - "navigation.html", - "relations.html", - "more.html", - "book.html", - "searchbox.html", + "sidebar/scroll-start.html", + "sidebar/brand.html", + "sidebar/search.html", + "sidebar/navigation.html", + "sidebar/projects.html", + "sidebar/scroll-end.html", ] } -html_theme_options = { - "logo": "img/tmuxp.svg", - "github_user": "tmux-python", - "github_repo": "tmuxp", - "github_type": "star", - "github_banner": True, - "projects": alagitpull.projects, - "project_name": about["__title__"], - "project_title": about["__title__"], - "project_description": about["__description__"], - "project_url": about["__docs__"], - "show_meta_manifest_tag": True, - "show_meta_og_tags": True, - "show_meta_app_icon_tags": True, -} - -alagitpull_internal_hosts = ["tmuxp.git-pull.com", "0.0.0.0"] -alagitpull_external_hosts_new_window = True +# sphinxext.opengraph +ogp_site_url = about["__docs__"] +ogp_image = "_static/img/icons/icon-192x192.png" +ogp_desscription_length = about["__description__"] +ogp_site_name = about["__title__"] htmlhelp_basename = "%sdoc" % about["__title__"] diff --git a/poetry.lock b/poetry.lock index d28b4551bc..3c93df87bd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,17 +14,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "alagitpull" -version = "0.1.0" -description = "Cleverly-named alabaster sub-theme for git-pull projects" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -alabaster = "<0.8" - [[package]] name = "atomicwrites" version = "1.4.0" @@ -58,6 +47,21 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] pytz = ">=2015.7" +[[package]] +name = "beautifulsoup4" +version = "4.10.0" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = ">3.0.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "22.1.0" @@ -280,6 +284,19 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" +[[package]] +name = "furo" +version = "2022.2.23" +description = "A clean customisable Sphinx documentation theme." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +beautifulsoup4 = "*" +pygments = ">=2.7,<3.0" +sphinx = ">=4.0,<5.0" + [[package]] name = "html5lib" version = "1.1" @@ -414,6 +431,18 @@ category = "main" optional = false python-versions = ">=3.7,<4.0" +[[package]] +name = "livereload" +version = "2.6.3" +description = "Python LiveReload is an awesome tool for web developers" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" +tornado = {version = "*", markers = "python_version > \"2.7\""} + [[package]] name = "lockfile" version = "0.12.2" @@ -636,7 +665,7 @@ virtualenv = ">=20.0.26,<21.0.0" [[package]] name = "poetry-core" -version = "1.0.7" +version = "1.0.8" description = "Poetry PEP 517 Build Backend" category = "dev" optional = false @@ -774,6 +803,17 @@ python-versions = ">= 3.6" [package.dependencies] pytest = ">=5.3" +[[package]] +name = "pytest-watcher" +version = "0.2.3" +description = "Continiously runs pytest on changes in *.py files" +category = "dev" +optional = false +python-versions = ">=3.6.2,<4.0.0" + +[package.dependencies] +watchdog = ">=2.0.0" + [[package]] name = "pytz" version = "2021.3" @@ -863,6 +903,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "soupsieve" +version = "2.3.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "sphinx" version = "4.3.2" @@ -894,6 +942,22 @@ docs = ["sphinxcontrib-websupport"] lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.920)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] +[[package]] +name = "sphinx-autobuild" +version = "2021.3.14" +description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = "*" +livereload = "*" +sphinx = "*" + +[package.extras] +test = ["pytest", "pytest-cov"] + [[package]] name = "sphinx-autodoc-typehints" version = "1.17.0" @@ -909,6 +973,49 @@ Sphinx = ">=4" testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] type_comments = ["typed-ast (>=1.4.0)"] +[[package]] +name = "sphinx-click" +version = "3.1.0" +description = "Sphinx extension that automatically documents click applications" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7.0" +docutils = "*" +sphinx = ">=2.0" + +[[package]] +name = "sphinx-copybutton" +version = "0.5.0" +description = "Add a copy button to each of your code cells." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code_style = ["pre-commit (==2.12.1)"] +rtd = ["sphinx", "ipython", "myst-nb", "sphinx-book-theme"] + +[[package]] +name = "sphinx-inline-tabs" +version = "2021.4.11b8" +description = "Add inline tabbed content to your Sphinx documentation." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +sphinx = ">=3" + +[package.extras] +doc = ["myst-parser", "furo"] +test = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "sphinx-issues" version = "3.0.1" @@ -996,6 +1103,17 @@ python-versions = ">=3.5" lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] +[[package]] +name = "sphinxext-opengraph" +version = "0.6.1" +description = "Sphinx Extension to enable OGP support" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +sphinx = ">=2.0" + [[package]] name = "toml" version = "0.10.2" @@ -1020,6 +1138,14 @@ category = "dev" optional = false python-versions = ">=3.6,<4.0" +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.5" + [[package]] name = "tox" version = "3.24.5" @@ -1107,6 +1233,17 @@ six = ">=1.9.0,<2" docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] +[[package]] +name = "watchdog" +version = "2.1.6" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "webencodings" version = "0.5.1" @@ -1137,7 +1274,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "21927f33488d3ccf3b612b03ec68f424083b845ac040610712418d321799224b" +content-hash = "0a349017d0cd861e02037345d5146ca9293d6fc50dd1990964fca17eb4db282a" [metadata.files] aafigure = [ @@ -1148,10 +1285,6 @@ alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] -alagitpull = [ - {file = "alagitpull-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b9ed87ee410c6fa40a63a91d2f25919a10e20c6d39e080356b067f3ff6f379b"}, - {file = "alagitpull-0.1.0.tar.gz", hash = "sha256:f6076f81a738c3291b598d8016b248edf5adf25d1d348c2599eff92c1eedaed9"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1164,6 +1297,10 @@ babel = [ {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, + {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, +] black = [ {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, @@ -1363,6 +1500,10 @@ flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] +furo = [ + {file = "furo-2022.2.23-py3-none-any.whl", hash = "sha256:bfed4e6a0511ab7baf211b3195b851914bf11a72e5907e073b1de9296de391f6"}, + {file = "furo-2022.2.23.tar.gz", hash = "sha256:005823b67f6ba00dde03e68dc78d437c72df7bcf816bcc6c111019c8faa7aa3d"}, +] html5lib = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, @@ -1406,6 +1547,9 @@ libtmux = [ {file = "libtmux-0.11.0b0-py3-none-any.whl", hash = "sha256:a0c758efce6da2455af8ac8841084488eba47e3e6a1af18bd0e3af4acab796d3"}, {file = "libtmux-0.11.0b0.tar.gz", hash = "sha256:3883db0ae3f8b59b75598e50db01d4d2eae6fbd217a18f9fc610e075769a8b8a"}, ] +livereload = [ + {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, +] lockfile = [ {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, @@ -1582,8 +1726,8 @@ poetry = [ {file = "poetry-1.1.13.tar.gz", hash = "sha256:b905ed610085f568aa61574e0e09260c02bff9eae12ff672af39e9f399357ac4"}, ] poetry-core = [ - {file = "poetry-core-1.0.7.tar.gz", hash = "sha256:98c11c755a16ef6c5673c22ca94a3802a7df4746a0853a70b6fae8b9f5cac206"}, - {file = "poetry_core-1.0.7-py2.py3-none-any.whl", hash = "sha256:4f8a7f5390d772f42c4c4c3f188e6424b802cb4b57466c6633a1b9ac36f18a43"}, + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1633,6 +1777,10 @@ pytest-rerunfailures = [ {file = "pytest-rerunfailures-10.2.tar.gz", hash = "sha256:9e1e1bad51e07642c5bbab809fc1d4ec8eebcb7de86f90f1a26e6ef9de446697"}, {file = "pytest_rerunfailures-10.2-py3-none-any.whl", hash = "sha256:d31d8e828dfd39363ad99cd390187bf506c7a433a89f15c3126c7d16ab723fe2"}, ] +pytest-watcher = [ + {file = "pytest-watcher-0.2.3.tar.gz", hash = "sha256:1937dd97e72caafd371d8cea7b3d70c88ff4fe35e6cdecb29c41bbdcbf1dcc2b"}, + {file = "pytest_watcher-0.2.3-py3-none-any.whl", hash = "sha256:af935963399509a5b0e855740ba7227852f1a7fccfbb1cbb79fa19a445af02d2"}, +] pytz = [ {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, @@ -1696,14 +1844,34 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] +soupsieve = [ + {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, + {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, +] sphinx = [ {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, {file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"}, ] +sphinx-autobuild = [ + {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, + {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, +] sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, ] +sphinx-click = [ + {file = "sphinx-click-3.1.0.tar.gz", hash = "sha256:36dbf271b1d2600fb05bd598ddeed0b6b6acf35beaf8bc9d507ba7716b232b0e"}, + {file = "sphinx_click-3.1.0-py3-none-any.whl", hash = "sha256:8fb0b048a577d346d741782e44d041d7e908922858273d99746f305870116121"}, +] +sphinx-copybutton = [ + {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"}, + {file = "sphinx_copybutton-0.5.0-py3-none-any.whl", hash = "sha256:9684dec7434bd73f0eea58dda93f9bb879d24bff2d8b187b1f2ec08dfe7b5f48"}, +] +sphinx-inline-tabs = [ + {file = "sphinx_inline_tabs-2021.4.11b8-py3-none-any.whl", hash = "sha256:efd6e7ad576a6bc1c616cbaa9b0e6f6fe2b28a776947069ed8d6037667799808"}, + {file = "sphinx_inline_tabs-2021.4.11b8.tar.gz", hash = "sha256:3c4d7759cbbb7752b7e7acd96ed0ea2c58fcc4ae38891a718544b931a5a4818f"}, +] sphinx-issues = [ {file = "sphinx-issues-3.0.1.tar.gz", hash = "sha256:b7c1dc1f4808563c454d11c1112796f8c176cdecfee95f0fd2302ef98e21e3d6"}, {file = "sphinx_issues-3.0.1-py3-none-any.whl", hash = "sha256:8b25dc0301159375468f563b3699af7a63720fd84caf81c1442036fcd418b20c"}, @@ -1732,6 +1900,10 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] +sphinxext-opengraph = [ + {file = "sphinxext-opengraph-0.6.1.tar.gz", hash = "sha256:d4f6c5ec0d4080503f79a4a9d4dec88c789f7dc6e5688a7c3eccf3c8209f0bc4"}, + {file = "sphinxext_opengraph-0.6.1-py3-none-any.whl", hash = "sha256:116835a5519aa26af4b45e8c17edabe671d6a8aed3c5e20efd808ec7b1ef3c49"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1744,6 +1916,49 @@ tomlkit = [ {file = "tomlkit-0.10.0-py3-none-any.whl", hash = "sha256:cac4aeaff42f18fef6e07831c2c2689a51df76cf2ede07a6a4fa5fcb83558870"}, {file = "tomlkit-0.10.0.tar.gz", hash = "sha256:d99946c6aed3387c98b89d91fb9edff8f901bf9255901081266a84fb5604adcd"}, ] +tornado = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] tox = [ {file = "tox-3.24.5-py2.py3-none-any.whl", hash = "sha256:be3362472a33094bce26727f5f771ca0facf6dafa217f65875314e9a6600c95c"}, {file = "tox-3.24.5.tar.gz", hash = "sha256:67e0e32c90e278251fea45b696d0fef3879089ccbe979b0c556d35d5a70e2993"}, @@ -1790,6 +2005,31 @@ virtualenv = [ {file = "virtualenv-20.13.2-py2.py3-none-any.whl", hash = "sha256:e7b34c9474e6476ee208c43a4d9ac1510b041c68347eabfe9a9ea0c86aa0a46b"}, {file = "virtualenv-20.13.2.tar.gz", hash = "sha256:01f5f80744d24a3743ce61858123488e91cb2dd1d3bdf92adaf1bba39ffdedf0"}, ] +watchdog = [ + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, + {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, + {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, + {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, + {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, + {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, + {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, + {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, +] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, diff --git a/pyproject.toml b/pyproject.toml index d27566a32b..7ddbc4938c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,11 +54,16 @@ colorama = ">=0.3.9" [tool.poetry.dev-dependencies] ### Docs ### sphinx = "*" -alagitpull = "~0.1.0" -sphinx-issues = "^3.0.0" aafigure = ">=0.6" pillow = "*" +furo = "^2022.2.23" +sphinx-autobuild = "^2021.3.14" sphinx-autodoc-typehints = "~1.17.0" +sphinx-click = "*" +sphinx-issues = "^3.0.0" +sphinx-inline-tabs = { version = "*", python = "^3.7" } +sphinxext-opengraph = "*" +sphinx-copybutton = "^0.5.0" myst_parser = "~0.17.0" ### Testing ### @@ -66,6 +71,7 @@ pytest = "*" pytest-rerunfailures = "*" pytest-mock = "*" pytest-cov = "*" +pytest-watcher = "^0.2.3" tox = {version = "^3.24.5", extras = ["test"]} tox-poetry-installer = {extras = ["poetry"], version = "^0.8.3"} @@ -81,8 +87,8 @@ isort = "*" flake8 = "*" [tool.poetry.extras] -docs = ["sphinx", "myst_parser", "sphinx-issues", "alagitpull", "sphinx-autodoc-typehints", "aafigure", "pillow"] -test = ["pytest", "pytest-rerunfailures", "pytest-mock", "tox", "tox-poetry-installer"] +docs = ["sphinx", "sphinx-issues", "sphinx-click", "sphinx-autodoc-typehints", "sphinx-autobuild", "sphinx-copybutton", "sphinxext-opengraph", "sphinx-inline-tabs", "myst_parser", "furo", "aafigure", "pillow"] +test = ["pytest", "pytest-rerunfailures", "pytest-mock", "pytest-watcher", "tox", "tox-poetry-installer"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] From 27bb59c5e270249cea3f4a3387c0ade39fe5814d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 5 Mar 2022 14:09:08 -0600 Subject: [PATCH 0894/2998] chore: Fix typos --- tests/fixtures/script_failed.sh | 2 +- tests/test_workspacebuilder.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/script_failed.sh b/tests/fixtures/script_failed.sh index 2089694277..82d5b6bb97 100755 --- a/tests/fixtures/script_failed.sh +++ b/tests/fixtures/script_failed.sh @@ -2,7 +2,7 @@ echoerr() { echo "$@" 1>&2; } -echoerr An error has occured +echoerr An error has occurred exit 113 # Will return 113 to shell. # To verify this, type "echo $?" after script terminates. diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 03e800ce9d..a0a7e58b92 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -514,7 +514,7 @@ def test_pane_order(session): HOME=os.path.realpath(os.path.expanduser("~")) ) - # test order of `panes` (and pane_index) above aganist pane_dirs + # test order of `panes` (and pane_index) above against pane_dirs pane_paths = [ "/usr/bin", "/usr", From b4922f75dde2e686ac5db8de4592bad0b3130d93 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 5 Mar 2022 15:56:48 -0600 Subject: [PATCH 0895/2998] pyupgrade @ python 3.7 (#745) pip install pyupgrade autoflake; \ pyupgrade --py37 tests/**/*.py docs/**/*.py tmuxp/**/*.py; \ poetry run autoflake tests/**/*.py docs/**/*.py tmuxp/**/*.py -i --ignore-init-module-imports; \ make black isort --- docs/_ext/aafig.py | 8 ++++---- docs/conf.py | 14 +++++++------- tests/conftest.py | 1 - tests/test_cli.py | 6 +++--- tests/test_workspacebuilder.py | 12 ++++++------ tmuxp/_compat.py | 1 - tmuxp/cli.py | 29 +++++++++++++---------------- tmuxp/exc.py | 10 +--------- tmuxp/log.py | 2 +- tmuxp/plugin.py | 5 ----- tmuxp/shell.py | 7 ++++--- tmuxp/workspacebuilder.py | 2 +- 12 files changed, 40 insertions(+), 57 deletions(-) diff --git a/docs/_ext/aafig.py b/docs/_ext/aafig.py index 38e7e5f928..8d4ec5d99f 100644 --- a/docs/_ext/aafig.py +++ b/docs/_ext/aafig.py @@ -48,7 +48,7 @@ def get_basename(text, options, prefix="aafig"): del options["format"] hashkey = text + str(options) id = sha(hashkey.encode("utf-8")).hexdigest() - return "%s-%s" % (prefix, id) + return f"{prefix}-{id}" class AafigError(SphinxError): @@ -135,7 +135,7 @@ def render_aafig_images(app, doctree): img["uri"] = fname # FIXME: find some way to avoid this hack in aafigure if extra: - (width, height) = [x.split('"')[1] for x in extra.split()] + (width, height) = (x.split('"')[1] for x in extra.split()) if "width" not in img: img["width"] = width if "height" not in img: @@ -151,7 +151,7 @@ def render_aafigure(app, text, options): raise AafigError("aafigure module not installed") fname = get_basename(text, options) - fname = "%s.%s" % (get_basename(text, options), options["format"]) + fname = "{}.{}".format(get_basename(text, options), options["format"]) if app.builder.format == "html": # HTML imgpath = relative_uri(app.builder.env.docname, "_images") @@ -177,7 +177,7 @@ def render_aafigure(app, text, options): f = None try: try: - f = open(metadata_fname, "r") + f = open(metadata_fname) extra = f.read() except Exception: raise AafigError() diff --git a/docs/conf.py b/docs/conf.py index 3205c3b813..8d427c8f17 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -100,8 +100,8 @@ latex_documents = [ ( "index", - "{0}.tex".format(about["__package_name__"]), - "{0} Documentation".format(about["__title__"]), + "{}.tex".format(about["__package_name__"]), + "{} Documentation".format(about["__title__"]), about["__author__"], "manual", ) @@ -111,7 +111,7 @@ ( "index", about["__package_name__"], - "{0} Documentation".format(about["__title__"]), + "{} Documentation".format(about["__title__"]), about["__author__"], 1, ) @@ -120,8 +120,8 @@ texinfo_documents = [ ( "index", - "{0}".format(about["__package_name__"]), - "{0} Documentation".format(about["__title__"]), + "{}".format(about["__package_name__"]), + "{} Documentation".format(about["__title__"]), about["__author__"], about["__package_name__"], about["__description__"], @@ -196,14 +196,14 @@ def linkcode_resolve(domain, info): # NOQA: C901 fn = relpath(fn, start=dirname(tmuxp.__file__)) if "dev" in about["__version__"]: - return "%s/blob/master/%s/%s%s" % ( + return "{}/blob/master/{}/{}{}".format( about["__github__"], about["__package_name__"], fn, linespec, ) else: - return "%s/blob/v%s/%s/%s%s" % ( + return "{}/blob/v{}/{}/{}{}".format( about["__github__"], about["__version__"], about["__package_name__"], diff --git a/tests/conftest.py b/tests/conftest.py index 7099fcb895..1685e3929f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -78,7 +78,6 @@ def session(server): """ try: server.switch_client(session.get("session_id")) - pass except exc.LibTmuxException: # server.attach_session(session.get('session_id')) pass diff --git a/tests/test_cli.py b/tests/test_cli.py index 64cfce7593..69ce316417 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -5,7 +5,7 @@ try: from unittest.mock import MagicMock except ImportError: - from mock import MagicMock + from unittest.mock import MagicMock import pytest @@ -435,7 +435,7 @@ def test_load_log_file(cli_args, tmpdir, monkeypatch): monkeypatch.setenv("HOME", str(tmpdir)) with tmpdir.as_cwd(): - print("tmpdir: {0}".format(tmpdir)) + print(f"tmpdir: {tmpdir}") runner = CliRunner() # If autoconfirm (-y) no need to prompt y @@ -1030,7 +1030,7 @@ def test_ls_cli(monkeypatch, tmpdir): stems = [os.path.splitext(f)[0] for f in filenames if f not in ignored_filenames] for filename in filenames: - location = tmpdir.join(".tmuxp/{}".format(filename)) + location = tmpdir.join(f".tmuxp/{filename}") if filename.endswith("/"): location.ensure_dir() else: diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index a0a7e58b92..d2db2b0b2a 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -182,7 +182,7 @@ def assertIsMissing(cmd, hist): if assertCase(sent_cmd, history_cmd): correct = True break - assert correct, "Unknown sent command: [%s] in %s" % (sent_cmd, assertCase) + assert correct, f"Unknown sent command: [{sent_cmd}] in {assertCase}" def test_session_options(session): @@ -215,11 +215,11 @@ def test_global_options(session): def test_global_session_env_options(session, monkeypatch): visual_silence = "on" - monkeypatch.setenv(str("VISUAL_SILENCE"), str(visual_silence)) + monkeypatch.setenv("VISUAL_SILENCE", str(visual_silence)) repeat_time = 738 - monkeypatch.setenv(str("REPEAT_TIME"), str(repeat_time)) + monkeypatch.setenv("REPEAT_TIME", str(repeat_time)) main_pane_height = 8 - monkeypatch.setenv(str("MAIN_PANE_HEIGHT"), str(main_pane_height)) + monkeypatch.setenv("MAIN_PANE_HEIGHT", str(main_pane_height)) yaml_config = loadfixture("workspacebuilder/env_var_options.yaml") s = session @@ -321,14 +321,14 @@ def test_window_shell(session): for w, wconf in builder.iter_create_windows(s): if "window_shell" in wconf: - assert wconf["window_shell"] == str("top") + assert wconf["window_shell"] == "top" while retry(): session.server._update_windows() if w["window_name"] != "top": break - assert w.name != str("top") + assert w.name != "top" def test_environment_variables(session): diff --git a/tmuxp/_compat.py b/tmuxp/_compat.py index 77ed92d740..a69ba4c793 100644 --- a/tmuxp/_compat.py +++ b/tmuxp/_compat.py @@ -1,4 +1,3 @@ -# -*- coding: utf8 -*- # flake8: NOQA import sys diff --git a/tmuxp/cli.py b/tmuxp/cli.py index c457a6fd83..65c5776c57 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -143,7 +143,7 @@ def _validate_choices(options): def func(value): if value not in options: raise click.BadParameter( - "Possible choices are: {0}.".format(", ".join(options)) + "Possible choices are: {}.".format(", ".join(options)) ) return value @@ -188,7 +188,7 @@ def set_layout_hook(session, hook_name): # unfortunately, select-layout won't work unless # we've literally selected the window at least once # with the client - hook_cmd.append("selectw -t {}".format(window.id)) + hook_cmd.append(f"selectw -t {window.id}") # edit: removed -t, or else it won't respect main-pane-w/h hook_cmd.append("selectl") hook_cmd.append("selectw -p") @@ -199,7 +199,7 @@ def set_layout_hook(session, hook_name): target_session=session.id, hook_name=hook_name ) ) - hook_cmd.append("selectw -t {}".format(attached_window.id)) + hook_cmd.append(f"selectw -t {attached_window.id}") # join the hook's commands with semicolons hook_cmd = "{}".format("; ".join(hook_cmd)) @@ -236,7 +236,7 @@ def is_pure_name(path): class ConfigPath(click.Path): def __init__(self, config_dir=None, *args, **kwargs): - super(ConfigPath, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.config_dir = config_dir def convert(self, value, param, ctx): @@ -245,7 +245,7 @@ def convert(self, value, param, ctx): config_dir = config_dir() value = scan_config(value, config_dir=config_dir) - return super(ConfigPath, self).convert(value, param, ctx) + return super().convert(value, param, ctx) def scan_config_argument(ctx, param, value, config_dir=None): @@ -264,7 +264,7 @@ def scan_config_argument(ctx, param, value, config_dir=None): value = scan_config(value, config_dir=config_dir) elif isinstance(value, tuple): - value = tuple([scan_config(v, config_dir=config_dir) for v in value]) + value = tuple(scan_config(v, config_dir=config_dir) for v in value) return value @@ -346,7 +346,7 @@ def scan_config(config, config_dir=None): candidates = [ x for x in [ - "%s%s" % (join(config_dir, config), ext) + f"{join(config_dir, config)}{ext}" for ext in VALID_CONFIG_DIR_FILE_EXTENSIONS ] if exists(x) @@ -421,8 +421,8 @@ def load_plugins(sconf): except Exception as error: click.echo( click.style("[Plugin Error] ", fg="red") - + "Couldn't load {0}\n".format(plugin) - + click.style("{0}".format(error), fg="yellow") + + f"Couldn't load {plugin}\n" + + click.style(f"{error}", fg="yellow") ) sys.exit(1) @@ -985,7 +985,7 @@ def command_freeze( save_to = os.path.abspath( os.path.join( get_config_dir(), - "%s.%s" % (sconf.get("session_name"), config_format or "yaml"), + "{}.{}".format(sconf.get("session_name"), config_format or "yaml"), ) ) dest_prompt = click.prompt( @@ -1135,7 +1135,6 @@ def command_load( @cli.group(name="import") def import_config_cmd(): """Import a teamocil/tmuxinator config.""" - pass def import_config(configfile, importfunc): @@ -1229,7 +1228,7 @@ def command_convert(confirmed, config): to_filetype = "json" else: raise click.BadParameter( - "Unknown filetype: %s (valid: [.json, .yaml, .yml])" % (ext,) + f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])" ) configparser = kaptan.Kaptan() @@ -1240,7 +1239,7 @@ def command_convert(confirmed, config): newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) if not confirmed: - if click.confirm("convert to <%s> to %s?" % (config, to_filetype)): + if click.confirm(f"convert to <{config}> to {to_filetype}?"): if click.confirm("Save config to %s?" % newfile): confirmed = True @@ -1260,9 +1259,7 @@ def command_edit_config(config): call([sys_editor, config]) -@cli.command( - name="ls", short_help="List configured sessions in {}.".format(get_config_dir()) -) +@cli.command(name="ls", short_help=f"List configured sessions in {get_config_dir()}.") def command_ls(): tmuxp_dir = get_config_dir() if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): diff --git a/tmuxp/exc.py b/tmuxp/exc.py index 7f5e38adde..a8d78847a2 100644 --- a/tmuxp/exc.py +++ b/tmuxp/exc.py @@ -11,33 +11,25 @@ class TmuxpException(Exception): """Base Exception for Tmuxp Errors.""" - pass - class ConfigError(TmuxpException): """Error parsing tmuxp configuration dict.""" - pass - class EmptyConfigException(ConfigError): """Configuration is empty.""" - pass - class TmuxpPluginException(TmuxpException): """Base Exception for Tmuxp Errors.""" - pass - class BeforeLoadScriptNotExists(OSError): def __init__(self, *args, **kwargs): - super(BeforeLoadScriptNotExists, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.strerror = "before_script file '%s' doesn't exist." % self.strerror diff --git a/tmuxp/log.py b/tmuxp/log.py index 98db7ec633..37f00503b7 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -94,7 +94,7 @@ def format(self, record): try: record.message = record.getMessage() except Exception as e: - record.message = "Bad message (%r): %r" % (e, record.__dict__) + record.message = f"Bad message ({e!r}): {record.__dict__!r}" date_format = "%H:%m:%S" record.asctime = time.strftime(date_format, self.converter(record.created)) diff --git a/tmuxp/plugin.py b/tmuxp/plugin.py index 58cb500d72..15ab3862cb 100644 --- a/tmuxp/plugin.py +++ b/tmuxp/plugin.py @@ -156,7 +156,6 @@ def before_workspace_builder(self, session): session : :class:`libtmux.Session` session to hook into """ - pass def on_window_create(self, window): """ @@ -169,7 +168,6 @@ def on_window_create(self, window): window: :class:`libtmux.Window` window to hook into """ - pass def after_window_finished(self, window): """ @@ -184,7 +182,6 @@ def after_window_finished(self, window): window: :class:`libtmux.Window` window to hook into """ - pass def before_script(self, session): """ @@ -213,7 +210,6 @@ def before_script(self, session): session : :class:`libtmux.Session` session to hook into """ - pass def reattach(self, session): """ @@ -224,4 +220,3 @@ def reattach(self, session): session : :class:`libtmux.Session` session to hook into """ - pass diff --git a/tmuxp/shell.py b/tmuxp/shell.py index 33936d28f1..0113eb48e1 100644 --- a/tmuxp/shell.py +++ b/tmuxp/shell.py @@ -200,9 +200,10 @@ def get_code(use_pythonrc, imported_objects): # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system # conventions and get $PYTHONSTARTUP first then .pythonrc.py. if use_pythonrc: - for pythonrc in set( - [os.environ.get("PYTHONSTARTUP"), os.path.expanduser("~/.pythonrc.py")] - ): + for pythonrc in { + os.environ.get("PYTHONSTARTUP"), + os.path.expanduser("~/.pythonrc.py"), + }: if not pythonrc: continue if not os.path.isfile(pythonrc): diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 9f60471705..9be5274ceb 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -18,7 +18,7 @@ logger = logging.getLogger(__name__) -class WorkspaceBuilder(object): +class WorkspaceBuilder: """ Load workspace from session :py:obj:`dict`. From 1aa9ec5fb8abdbffb22eb2df034d8e8db01dd3e0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 5 Mar 2022 16:16:57 -0600 Subject: [PATCH 0896/2998] Create codeql-analysis.yml (#742) --- .github/workflows/codeql-analysis.yml | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..91190c8546 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '28 21 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 From 6d80c5ce40ba3141e4edf8d50fc0f3d38ffbba8c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 08:46:53 -0600 Subject: [PATCH 0897/2998] docs(CHANGES): Note pyupgrade and codeql, furo theme --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 0dbda33453..27baa7112b 100644 --- a/CHANGES +++ b/CHANGES @@ -61,6 +61,12 @@ - Run through black + isort with string normalization (#738). This way we can use black without any configuration. (One-time, big diff) +- Run codebase through pyupgrade (#745) +- Add `codeql-analysis.yml` to try it out + +#### Documentation + +- Move to `furo` sphinx theme ## tmuxp 1.9.4 (2022-01-10) From efe37e37ebafa0f051c77efa6bde726215dec65e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 08:49:32 -0600 Subject: [PATCH 0898/2998] build(deps[libtmux]): Bump libtmux 0.11.0 b0 to b1 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3c93df87bd..47c9c85144 100644 --- a/poetry.lock +++ b/poetry.lock @@ -425,7 +425,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.11.0b0" +version = "0.11.0b1" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1274,7 +1274,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "0a349017d0cd861e02037345d5146ca9293d6fc50dd1990964fca17eb4db282a" +content-hash = "48fd7cb07d471dc48474d5a7adb935799d3a108f5d7e89d9079a15e7dcbe772e" [metadata.files] aafigure = [ @@ -1544,8 +1544,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.11.0b0-py3-none-any.whl", hash = "sha256:a0c758efce6da2455af8ac8841084488eba47e3e6a1af18bd0e3af4acab796d3"}, - {file = "libtmux-0.11.0b0.tar.gz", hash = "sha256:3883db0ae3f8b59b75598e50db01d4d2eae6fbd217a18f9fc610e075769a8b8a"}, + {file = "libtmux-0.11.0b1-py3-none-any.whl", hash = "sha256:b972f0ae378cf159c63eb8bfdc2a1e0ffad3ac1f6e7b74000dd95b107e803219"}, + {file = "libtmux-0.11.0b1.tar.gz", hash = "sha256:a497dbb24235c32254e71d501eb45adb6073aa52fbb7ed2bc69afbcc075165a1"}, ] livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, diff --git a/pyproject.toml b/pyproject.toml index 7ddbc4938c..e4ee5fdfee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.11.0a0" +libtmux = "~0.11.0b1" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From d2932df31781f8c420a9b44f61f1dd6cb99e556a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 08:50:13 -0600 Subject: [PATCH 0899/2998] Tag v1.10.0b0 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e4ee5fdfee..5cac3eed6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.9.4" +version = "1.10.0b0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 915b7928cc..28687bcfd3 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.9.4" +__version__ = "1.10.0b0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From db5b67c7bd2d5ad4c8c16d9c5b8bfcb2666a4ff1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 09:36:41 -0600 Subject: [PATCH 0900/2998] tests: tmp_dir (py.path.local) -> tmp_path (pathlib.Path) --- tests/test_workspacebuilder.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index d2db2b0b2a..99d6ce7da1 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1,5 +1,6 @@ """Test for tmuxp workspacebuilder.""" import os +import pathlib import pytest @@ -422,10 +423,11 @@ def test_blank_pane_count(session): assert len(window4._panes) == 2 -def test_start_directory(session, tmpdir): +def test_start_directory(session, tmp_path: pathlib.Path): yaml_config = loadfixture("workspacebuilder/start_directory.yaml") - test_dir = str(tmpdir.mkdir("foo bar")) - test_config = yaml_config.format(TMP_DIR=str(tmpdir), TEST_DIR=test_dir) + test_dir = tmp_path / "foo bar" + test_dir.mkdir() + test_config = yaml_config.format(TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(test_config).get() From 88260b5d7d5d3e64ae59a807e08e7611aa5a7cf4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 09:41:03 -0600 Subject: [PATCH 0901/2998] tests: Remove tmpdir fixture override --- tests/conftest.py | 6 ------ tests/test_workspacebuilder.py | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 1685e3929f..7ab1d4ae72 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -89,9 +89,3 @@ def session(server): assert TEST_SESSION_NAME != "tmuxp" return session - - -@pytest.fixture() -def tmpdir(tmpdir_factory): - fn = tmpdir_factory.mktemp("tmuxp") - return fn diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 99d6ce7da1..ca43da4300 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -438,7 +438,7 @@ def test_start_directory(session, tmp_path: pathlib.Path): builder.build(session=session) assert session == builder.session - dirs = ["/usr/bin", "/dev", test_dir, "/usr", "/usr"] + dirs = ["/usr/bin", "/dev", str(test_dir), "/usr", "/usr"] for path, window in zip(dirs, session.windows): for p in window.panes: From 80a485850b633508dabcf4bce9266151bdd64aaf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 09:43:48 -0600 Subject: [PATCH 0902/2998] chore(test): Fix import --- tests/test_cli.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 69ce316417..7ddeff1186 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,11 +1,7 @@ """Test for tmuxp command line interface.""" import json import os - -try: - from unittest.mock import MagicMock -except ImportError: - from unittest.mock import MagicMock +from unittest.mock import MagicMock import pytest From 39a43156e7521f60f675da6ec8095e5d4930171c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 10:09:20 -0600 Subject: [PATCH 0903/2998] refactor(tests_{cli,workspacebuilder}): Test refactor tmp_dir -> tmp_path --- tests/test_cli.py | 702 ++++++++++++++++++--------------- tests/test_workspacebuilder.py | 10 +- 2 files changed, 392 insertions(+), 320 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 7ddeff1186..8e48820f25 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,6 +1,7 @@ """Test for tmuxp command line interface.""" import json import os +import pathlib from unittest.mock import MagicMock import pytest @@ -30,46 +31,52 @@ from .fixtures._util import curjoin, loadfixture -def test_creates_config_dir_not_exists(tmpdir): +def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): """cli.startup() creates config dir if not exists.""" - cli.startup(str(tmpdir)) - assert os.path.exists(str(tmpdir)) + cli.startup(tmp_path) + assert os.path.exists(tmp_path) -def test_in_dir_from_config_dir(tmpdir): +def test_in_dir_from_config_dir(tmp_path: pathlib.Path): """config.in_dir() finds configs config dir.""" - cli.startup(str(tmpdir)) - tmpdir.join("myconfig.yaml").write("") - tmpdir.join("myconfig.json").write("") - configs_found = config.in_dir(str(tmpdir)) + cli.startup(tmp_path) + yaml_config = tmp_path / "myconfig.yaml" + yaml_config.write_text("", encoding="utf-8") + json_config = tmp_path / "myconfig.json" + json_config.write_text("", encoding="utf-8") + configs_found = config.in_dir(tmp_path) assert len(configs_found) == 2 -def test_ignore_non_configs_from_current_dir(tmpdir): +def test_ignore_non_configs_from_current_dir(tmp_path: pathlib.Path): """cli.in_dir() ignore non-config from config dir.""" - cli.startup(str(tmpdir)) + cli.startup(tmp_path) - tmpdir.join("myconfig.psd").write("") - tmpdir.join("watmyconfig.json").write("") - configs_found = config.in_dir(str(tmpdir)) + junk_config = tmp_path / "myconfig.psd" + junk_config.write_text("", encoding="utf-8") + conf = tmp_path / "watmyconfig.json" + conf.write_text("", encoding="utf-8") + configs_found = config.in_dir(tmp_path) assert len(configs_found) == 1 -def test_get_configs_cwd(tmpdir): +def test_get_configs_cwd(tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch): """config.in_cwd() find config in shell current working directory.""" - confdir = tmpdir.mkdir("tmuxpconf2") - with confdir.as_cwd(): - config1 = open(".tmuxp.json", "w+b") - config1.close() + confdir = tmp_path / "tmuxpconf2" + confdir.mkdir() - configs_found = config.in_cwd() - assert len(configs_found) == 1 - assert ".tmuxp.json" in configs_found + monkeypatch.chdir(confdir) + config1 = open(".tmuxp.json", "w+b") + config1.close() + + configs_found = config.in_cwd() + assert len(configs_found) == 1 + assert ".tmuxp.json" in configs_found @pytest.mark.parametrize( @@ -112,133 +119,150 @@ def test_is_pure_name(path, expect): @pytest.fixture -def homedir(tmpdir): - return tmpdir.join("home").mkdir() +def homedir(tmp_path: pathlib.Path): + home = tmp_path / "home" + home.mkdir() + return home @pytest.fixture def configdir(homedir): - return homedir.join(".tmuxp").mkdir() + conf = homedir / ".tmuxp" + conf.mkdir() + return conf @pytest.fixture def projectdir(homedir): - return homedir.join("work").join("project") + proj = homedir / "work" / "project" + proj.mkdir(parents=True) + return proj -def test_tmuxp_configdir_env_var(tmpdir, monkeypatch): - monkeypatch.setenv("TMUXP_CONFIGDIR", str(tmpdir)) +def test_tmuxp_configdir_env_var(tmp_path: pathlib.Path, monkeypatch): + monkeypatch.setenv("TMUXP_CONFIGDIR", str(tmp_path)) - assert get_config_dir() == tmpdir + assert get_config_dir() == str(tmp_path) -def test_tmuxp_configdir_xdg_config_dir(tmpdir, monkeypatch): - monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir)) - tmux_dir = tmpdir.mkdir("tmuxp") +def test_tmuxp_configdir_xdg_config_dir(tmp_path: pathlib.Path, monkeypatch): + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmp_path)) + tmux_dir = tmp_path / "tmuxp" + tmux_dir.mkdir() assert get_config_dir() == str(tmux_dir) -def test_resolve_dot(tmpdir, homedir, configdir, projectdir, monkeypatch): +def test_resolve_dot( + tmp_path: pathlib.Path, + homedir: pathlib.Path, + configdir: pathlib.Path, + projectdir: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +): monkeypatch.setenv("HOME", str(homedir)) - monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir.join(".config"))) + monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir / ".config")) - projectdir.join(".tmuxp.yaml").ensure() + tmuxp_conf_path = projectdir / ".tmuxp.yaml" + tmuxp_conf_path.write_text("", encoding="utf-8") user_config_name = "myconfig" - user_config = configdir.join("%s.yaml" % user_config_name).ensure() - - project_config = str(projectdir.join(".tmuxp.yaml")) - - with projectdir.as_cwd(): - expect = project_config - assert scan_config(".") == expect - assert scan_config("./") == expect - assert scan_config("") == expect - assert scan_config("../project") == expect - assert scan_config("../project/") == expect - assert scan_config(".tmuxp.yaml") == expect - assert scan_config("../../.tmuxp/%s.yaml" % user_config_name) == str( - user_config - ) - assert scan_config("myconfig") == str(user_config) - assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) - - with pytest.raises(Exception): - scan_config(".tmuxp.json") - with pytest.raises(Exception): - scan_config(".tmuxp.ini") - with pytest.raises(Exception): - scan_config("../") - with pytest.raises(Exception): - scan_config("mooooooo") - - with homedir.as_cwd(): - expect = project_config - assert scan_config("work/project") == expect - assert scan_config("work/project/") == expect - assert scan_config("./work/project") == expect - assert scan_config("./work/project/") == expect - assert scan_config(".tmuxp/%s.yaml" % user_config_name) == str(user_config) - assert scan_config("./.tmuxp/%s.yaml" % user_config_name) == str(user_config) - assert scan_config("myconfig") == str(user_config) - assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) - - with pytest.raises(Exception): - scan_config("") - with pytest.raises(Exception): - scan_config(".") - with pytest.raises(Exception): - scan_config(".tmuxp.yaml") - with pytest.raises(Exception): - scan_config("../") - with pytest.raises(Exception): - scan_config("mooooooo") - - with configdir.as_cwd(): - expect = project_config - assert scan_config("../work/project") == expect - assert scan_config("../../home/work/project") == expect - assert scan_config("../work/project/") == expect - assert scan_config("%s.yaml" % user_config_name) == str(user_config) - assert scan_config("./%s.yaml" % user_config_name) == str(user_config) - assert scan_config("myconfig") == str(user_config) - assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) - - with pytest.raises(Exception): - scan_config("") - with pytest.raises(Exception): - scan_config(".") - with pytest.raises(Exception): - scan_config(".tmuxp.yaml") - with pytest.raises(Exception): - scan_config("../") - with pytest.raises(Exception): - scan_config("mooooooo") - - with tmpdir.as_cwd(): - expect = project_config - assert scan_config("home/work/project") == expect - assert scan_config("./home/work/project/") == expect - assert scan_config("home/.tmuxp/%s.yaml" % user_config_name) == str(user_config) - assert scan_config("./home/.tmuxp/%s.yaml" % user_config_name) == str( - user_config - ) - assert scan_config("myconfig") == str(user_config) - assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) - - with pytest.raises(Exception): - scan_config("") - with pytest.raises(Exception): - scan_config(".") - with pytest.raises(Exception): - scan_config(".tmuxp.yaml") - with pytest.raises(Exception): - scan_config("../") - with pytest.raises(Exception): - scan_config("mooooooo") - - -def test_scan_config_arg(homedir, configdir, projectdir, monkeypatch): + user_config = configdir / f"{user_config_name}.yaml" + user_config.write_text("", encoding="utf-8") + + project_config = tmuxp_conf_path + + monkeypatch.chdir(projectdir) + + expect = str(project_config) + assert scan_config(".") == expect + assert scan_config("./") == expect + assert scan_config("") == expect + assert scan_config("../project") == expect + assert scan_config("../project/") == expect + assert scan_config(".tmuxp.yaml") == expect + assert scan_config("../../.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) + + with pytest.raises(Exception): + scan_config(".tmuxp.json") + with pytest.raises(Exception): + scan_config(".tmuxp.ini") + with pytest.raises(Exception): + scan_config("../") + with pytest.raises(Exception): + scan_config("mooooooo") + + monkeypatch.chdir(homedir) + + expect = str(project_config) + assert scan_config("work/project") == expect + assert scan_config("work/project/") == expect + assert scan_config("./work/project") == expect + assert scan_config("./work/project/") == expect + assert scan_config(".tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) + + with pytest.raises(Exception): + scan_config("") + with pytest.raises(Exception): + scan_config(".") + with pytest.raises(Exception): + scan_config(".tmuxp.yaml") + with pytest.raises(Exception): + scan_config("../") + with pytest.raises(Exception): + scan_config("mooooooo") + + monkeypatch.chdir(configdir) + + expect = str(project_config) + assert scan_config("../work/project") == expect + assert scan_config("../../home/work/project") == expect + assert scan_config("../work/project/") == expect + assert scan_config("%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) + + with pytest.raises(Exception): + scan_config("") + with pytest.raises(Exception): + scan_config(".") + with pytest.raises(Exception): + scan_config(".tmuxp.yaml") + with pytest.raises(Exception): + scan_config("../") + with pytest.raises(Exception): + scan_config("mooooooo") + + monkeypatch.chdir(tmp_path) + + expect = str(project_config) + assert scan_config("home/work/project") == expect + assert scan_config("./home/work/project/") == expect + assert scan_config("home/.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("./home/.tmuxp/%s.yaml" % user_config_name) == str(user_config) + assert scan_config("myconfig") == str(user_config) + assert scan_config("~/.tmuxp/myconfig.yaml") == str(user_config) + + with pytest.raises(Exception): + scan_config("") + with pytest.raises(Exception): + scan_config(".") + with pytest.raises(Exception): + scan_config(".tmuxp.yaml") + with pytest.raises(Exception): + scan_config("../") + with pytest.raises(Exception): + scan_config("mooooooo") + + +def test_scan_config_arg( + homedir, configdir, projectdir, monkeypatch: pytest.MonkeyPatch +): runner = CliRunner() @click.command() @@ -247,31 +271,33 @@ def config_cmd(config): click.echo(config) monkeypatch.setenv("HOME", str(homedir)) - projectdir.join(".tmuxp.yaml").ensure() + tmuxp_config_path = projectdir / ".tmuxp.yaml" + tmuxp_config_path.write_text("", encoding="utf-8") user_config_name = "myconfig" - user_config = configdir.join("%s.yaml" % user_config_name).ensure() + user_config = configdir / f"{user_config_name}.yaml" + user_config.write_text("", encoding="utf-8") - project_config = str(projectdir.join(".tmuxp.yaml")) + project_config = projectdir / ".tmuxp.yaml" def check_cmd(config_arg): return runner.invoke(config_cmd, [config_arg]).output - with projectdir.as_cwd(): - expect = project_config - assert expect in check_cmd(".") - assert expect in check_cmd("./") - assert expect in check_cmd("") - assert expect in check_cmd("../project") - assert expect in check_cmd("../project/") - assert expect in check_cmd(".tmuxp.yaml") - assert str(user_config) in check_cmd("../../.tmuxp/%s.yaml" % user_config_name) - assert user_config.purebasename in check_cmd("myconfig") - assert str(user_config) in check_cmd("~/.tmuxp/myconfig.yaml") + monkeypatch.chdir(projectdir) + expect = str(project_config) + assert expect in check_cmd(".") + assert expect in check_cmd("./") + assert expect in check_cmd("") + assert expect in check_cmd("../project") + assert expect in check_cmd("../project/") + assert expect in check_cmd(".tmuxp.yaml") + assert str(user_config) in check_cmd("../../.tmuxp/%s.yaml" % user_config_name) + assert user_config.stem in check_cmd("myconfig") + assert str(user_config) in check_cmd("~/.tmuxp/myconfig.yaml") - assert "file not found" in check_cmd(".tmuxp.json") - assert "file not found" in check_cmd(".tmuxp.ini") - assert "No tmuxp files found" in check_cmd("../") - assert "config not found in config dir" in check_cmd("moo") + assert "file not found" in check_cmd(".tmuxp.json") + assert "file not found" in check_cmd(".tmuxp.ini") + assert "No tmuxp files found" in check_cmd("../") + assert "config not found in config dir" in check_cmd("moo") def test_load_workspace(server, monkeypatch): @@ -312,7 +338,9 @@ def test_load_workspace_named_session(server, monkeypatch): @pytest.mark.skipif( has_lt_version("2.1"), reason="exact session name matches only tmux >= 2.1" ) -def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): +def test_load_workspace_name_match_regression_252( + tmp_path: pathlib.Path, server, monkeypatch +): monkeypatch.delenv("TMUX", raising=False) session_file = curjoin("workspacebuilder/two_pane.yaml") @@ -324,56 +352,61 @@ def test_load_workspace_name_match_regression_252(tmpdir, server, monkeypatch): assert isinstance(session, libtmux.Session) assert session.name == "sampleconfig" - projfile = tmpdir.join("simple.yaml") + projfile = tmp_path / "simple.yaml" - projfile.write( + projfile.write_text( """ session_name: sampleconfi start_directory: './' windows: - panes: - - echo 'hey'""" + - echo 'hey'""", + encoding="utf-8", ) # open it detached session = load_workspace( - projfile.strpath, socket_name=server.socket_name, detached=True + str(projfile), socket_name=server.socket_name, detached=True ) assert session.name == "sampleconfi" -def test_load_symlinked_workspace(server, tmpdir, monkeypatch): +def test_load_symlinked_workspace(server, tmp_path, monkeypatch): # this is an implementation test. Since this testsuite may be ran within # a tmux session by the developer himself, delete the TMUX variable # temporarily. monkeypatch.delenv("TMUX", raising=False) - realtemp = tmpdir.mkdir("myrealtemp") - linktemp = tmpdir.join("symlinktemp") - linktemp.mksymlinkto(realtemp) - projfile = linktemp.join("simple.yaml") + realtemp = tmp_path / "myrealtemp" + realtemp.mkdir() + linktemp = tmp_path / "symlinktemp" + linktemp.symlink_to(realtemp) + projfile = linktemp / "simple.yaml" - projfile.write( + projfile.write_text( """ session_name: samplesimple start_directory: './' windows: - panes: - - echo 'hey'""" + - echo 'hey'""", + encoding="utf-8", ) # open it detached session = load_workspace( - projfile.strpath, socket_name=server.socket_name, detached=True + str(projfile), socket_name=server.socket_name, detached=True ) pane = session.attached_window.attached_pane assert isinstance(session, libtmux.Session) assert session.name == "samplesimple" - assert pane.current_path == realtemp.strpath + assert pane.current_path == str(realtemp) -def test_regression_00132_session_name_with_dots(tmpdir, server, session): +def test_regression_00132_session_name_with_dots( + tmp_path: pathlib.Path, server, session +): yaml_config = curjoin("workspacebuilder/regression_00132_dots.yaml") cli_args = [yaml_config] inputs = [] @@ -386,32 +419,34 @@ def test_regression_00132_session_name_with_dots(tmpdir, server, session): @pytest.mark.parametrize("cli_args", [(["load", "."]), (["load", ".tmuxp.yaml"])]) -def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): +def test_load_zsh_autotitle_warning(cli_args, tmp_path, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join(".tmuxp.yaml").ensure() - tmpdir.join(".oh-my-zsh").ensure(dir=True) - monkeypatch.setenv("HOME", str(tmpdir)) + yaml_config = tmp_path / ".tmuxp.yaml" + yaml_config.write_text("", encoding="utf-8") + oh_my_zsh_path = tmp_path / ".oh-my-zsh" + oh_my_zsh_path.mkdir() + monkeypatch.setenv("HOME", str(tmp_path)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) - monkeypatch.setenv("SHELL", "zsh") - result = runner.invoke(cli.cli, cli_args) - assert "Please set" in result.output + monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) + monkeypatch.setenv("SHELL", "zsh") + result = runner.invoke(cli.cli, cli_args) + assert "Please set" in result.output - monkeypatch.setenv("DISABLE_AUTO_TITLE", "false") - result = runner.invoke(cli.cli, cli_args) - assert "Please set" in result.output + monkeypatch.setenv("DISABLE_AUTO_TITLE", "false") + result = runner.invoke(cli.cli, cli_args) + assert "Please set" in result.output - monkeypatch.setenv("DISABLE_AUTO_TITLE", "true") - result = runner.invoke(cli.cli, cli_args) - assert "Please set" not in result.output + monkeypatch.setenv("DISABLE_AUTO_TITLE", "true") + result = runner.invoke(cli.cli, cli_args) + assert "Please set" not in result.output - monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) - monkeypatch.setenv("SHELL", "sh") - result = runner.invoke(cli.cli, cli_args) - assert "Please set" not in result.output + monkeypatch.delenv("DISABLE_AUTO_TITLE", raising=False) + monkeypatch.setenv("SHELL", "sh") + result = runner.invoke(cli.cli, cli_args) + assert "Please set" not in result.output @pytest.mark.parametrize( @@ -420,25 +455,29 @@ def test_load_zsh_autotitle_warning(cli_args, tmpdir, monkeypatch): (["load", ".", "--log-file", "log.txt"]), ], ) -def test_load_log_file(cli_args, tmpdir, monkeypatch): +def test_load_log_file(cli_args, tmp_path, monkeypatch): # create dummy tmuxp yaml that breaks to prevent actually loading tmux - tmpdir.join(".tmuxp.yaml").write( + tmuxp_config_path = tmp_path / ".tmuxp.yaml" + tmuxp_config_path.write_text( """ session_name: hello - """ + """, + encoding="utf-8", ) - tmpdir.join(".oh-my-zsh").ensure(dir=True) - monkeypatch.setenv("HOME", str(tmpdir)) + oh_my_zsh_path = tmp_path / ".oh-my-zsh" + oh_my_zsh_path.mkdir() + monkeypatch.setenv("HOME", str(tmp_path)) - with tmpdir.as_cwd(): - print(f"tmpdir: {tmpdir}") - runner = CliRunner() + monkeypatch.chdir(tmp_path) + print(f"tmp_path: {tmp_path}") + runner = CliRunner() - # If autoconfirm (-y) no need to prompt y - input_args = "y\ny\n" if "-y" not in cli_args else "" + # If autoconfirm (-y) no need to prompt y + input_args = "y\ny\n" if "-y" not in cli_args else "" - runner.invoke(cli.cli, cli_args, input=input_args) - assert "Loading" in tmpdir.join("log.txt").open().read() + runner.invoke(cli.cli, cli_args, input=input_args) + log_file_path = tmp_path / "log.txt" + assert "Loading" in log_file_path.open().read() @pytest.mark.parametrize("cli_cmd", ["shell", ("shell", "--pdb")]) @@ -516,12 +555,12 @@ def test_shell( inputs, expected_output, env, - tmpdir, + tmp_path, monkeypatch, server, session, ): - monkeypatch.setenv("HOME", str(tmpdir)) + monkeypatch.setenv("HOME", str(tmp_path)) window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -541,13 +580,13 @@ def test_shell( for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - result = runner.invoke( - cli.cli, cli_args, input="".join(inputs), catch_exceptions=False - ) - assert expected_output.format(**template_ctx) in result.output + result = runner.invoke( + cli.cli, cli_args, input="".join(inputs), catch_exceptions=False + ) + assert expected_output.format(**template_ctx) in result.output @pytest.mark.parametrize( @@ -605,13 +644,13 @@ def test_shell_target_missing( template_ctx, exception, message, - tmpdir, + tmp_path, monkeypatch, socket_name, server, session, ): - monkeypatch.setenv("HOME", str(tmpdir)) + monkeypatch.setenv("HOME", str(tmp_path)) window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -630,19 +669,19 @@ def test_shell_target_missing( for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - if exception is not None: - with pytest.raises(exception, match=message.format(**template_ctx)): - result = runner.invoke( - cli.cli, cli_args, input="".join(inputs), catch_exceptions=False - ) - else: + if exception is not None: + with pytest.raises(exception, match=message.format(**template_ctx)): result = runner.invoke( cli.cli, cli_args, input="".join(inputs), catch_exceptions=False ) - assert message.format(**template_ctx) in result.output + else: + result = runner.invoke( + cli.cli, cli_args, input="".join(inputs), catch_exceptions=False + ) + assert message.format(**template_ctx) in result.output @pytest.mark.parametrize( @@ -684,12 +723,12 @@ def test_shell_plus( inputs, env, message, - tmpdir, + tmp_path, monkeypatch, server, session, ): - monkeypatch.setenv("HOME", str(tmpdir)) + monkeypatch.setenv("HOME", str(tmp_path)) window_name = "my_window" window = session.new_window(window_name=window_name) window.split_window() @@ -709,13 +748,13 @@ def test_shell_plus( for k, v in env.items(): monkeypatch.setenv(k, v.format(**template_ctx)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - result = runner.invoke( - cli.cli, cli_args, input="".join(inputs), catch_exceptions=True - ) - assert message.format(**template_ctx) in result.output + result = runner.invoke( + cli.cli, cli_args, input="".join(inputs), catch_exceptions=True + ) + assert message.format(**template_ctx) in result.output @pytest.mark.parametrize( @@ -728,28 +767,29 @@ def test_shell_plus( (["convert", ".tmuxp.yml", "-y"]), ], ) -def test_convert(cli_args, tmpdir, monkeypatch): +def test_convert(cli_args, tmp_path, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at filename = cli_args[1] if filename == ".": filename = ".tmuxp.yaml" file_ext = filename.rsplit(".", 1)[-1] assert file_ext in ["yaml", "yml"], file_ext - tmpdir.join(filename).write("\nsession_name: hello\n") - tmpdir.join(".oh-my-zsh").ensure(dir=True) - monkeypatch.setenv("HOME", str(tmpdir)) + config_file_path = tmp_path / filename + config_file_path.write_text("\nsession_name: hello\n", encoding="utf-8") + oh_my_zsh_path = tmp_path / ".oh-my-zsh" + oh_my_zsh_path.mkdir() + monkeypatch.setenv("HOME", str(tmp_path)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - # If autoconfirm (-y) no need to prompt y - input_args = "y\ny\n" if "-y" not in cli_args else "" + # If autoconfirm (-y) no need to prompt y + input_args = "y\ny\n" if "-y" not in cli_args else "" - runner.invoke(cli.cli, cli_args, input=input_args) - assert tmpdir.join(".tmuxp.json").check() - assert tmpdir.join(".tmuxp.json").open().read() == json.dumps( - {"session_name": "hello"}, indent=2 - ) + runner.invoke(cli.cli, cli_args, input=input_args) + tmuxp_json = tmp_path / ".tmuxp.json" + assert tmuxp_json.exists() + assert tmuxp_json.open().read() == json.dumps({"session_name": "hello"}, indent=2) @pytest.mark.parametrize( @@ -760,21 +800,24 @@ def test_convert(cli_args, tmpdir, monkeypatch): (["convert", ".tmuxp.json", "-y"]), ], ) -def test_convert_json(cli_args, tmpdir, monkeypatch): +def test_convert_json(cli_args, tmp_path, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at - tmpdir.join(".tmuxp.json").write('{"session_name": "hello"}') - tmpdir.join(".oh-my-zsh").ensure(dir=True) - monkeypatch.setenv("HOME", str(tmpdir)) + json_config = tmp_path / ".tmuxp.json" + json_config.write_text('{"session_name": "hello"}', encoding="utf-8") + oh_my_zsh_path = tmp_path / ".oh-my-zsh" + oh_my_zsh_path.mkdir() + monkeypatch.setenv("HOME", str(tmp_path)) - with tmpdir.as_cwd(): - runner = CliRunner() + monkeypatch.chdir(tmp_path) + runner = CliRunner() - # If autoconfirm (-y) no need to prompt y - input_args = "y\ny\n" if "-y" not in cli_args else "" + # If autoconfirm (-y) no need to prompt y + input_args = "y\ny\n" if "-y" not in cli_args else "" - runner.invoke(cli.cli, cli_args, input=input_args) - assert tmpdir.join(".tmuxp.yaml").check() - assert tmpdir.join(".tmuxp.yaml").open().read() == "session_name: hello\n" + runner.invoke(cli.cli, cli_args, input=input_args) + tmuxp_yaml = tmp_path / ".tmuxp.yaml" + assert tmuxp_yaml.exists() + assert tmuxp_yaml.open().read() == "session_name: hello\n" @pytest.mark.parametrize("cli_args", [(["import"])]) @@ -817,17 +860,26 @@ def test_help(cli_args, monkeypatch): ), ], ) -def test_import_teamocil(cli_args, inputs, tmpdir, monkeypatch): +def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): teamocil_config = loadfixture("config_teamocil/test4.yaml") - teamocil_dir = tmpdir.join(".teamocil").mkdir() - teamocil_dir.join("config.yaml").write(teamocil_config) - tmpdir.join("exists.yaml").ensure() - monkeypatch.setenv("HOME", str(tmpdir)) - with tmpdir.as_cwd(): - runner = CliRunner() - runner.invoke(cli.cli, cli_args, input="".join(inputs)) - assert tmpdir.join("la.yaml").check() + teamocil_path = tmp_path / ".teamocil" + teamocil_path.mkdir() + + teamocil_config_path = teamocil_path / "config.yaml" + teamocil_config_path.write_text(teamocil_config, encoding="utf-8") + + exists_yaml = tmp_path / "exists.yaml" + exists_yaml.write_text("", encoding="utf-8") + + monkeypatch.setenv("HOME", str(tmp_path)) + + monkeypatch.chdir(tmp_path) + runner = CliRunner() + runner.invoke(cli.cli, cli_args, input="".join(inputs)) + + new_config_yaml = tmp_path / "la.yaml" + assert new_config_yaml.exists() @pytest.mark.parametrize( @@ -847,18 +899,26 @@ def test_import_teamocil(cli_args, inputs, tmpdir, monkeypatch): ), ], ) -def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): +def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): tmuxinator_config = loadfixture("config_tmuxinator/test3.yaml") - tmuxinator_dir = tmpdir.join(".tmuxinator").mkdir() - tmuxinator_dir.join("config.yaml").write(tmuxinator_config) - tmpdir.join("exists.yaml").ensure() - monkeypatch.setenv("HOME", str(tmpdir)) - with tmpdir.as_cwd(): - runner = CliRunner() - out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) - print(out.output) - assert tmpdir.join("la.yaml").check() + tmuxinator_path = tmp_path / ".tmuxinator" + tmuxinator_path.mkdir() + + tmuxinator_config_path = tmuxinator_path / "config.yaml" + tmuxinator_config_path.write_text(tmuxinator_config, encoding="utf-8") + + exists_yaml = tmp_path / "exists.yaml" + exists_yaml.write_text("", encoding="utf-8") + + monkeypatch.setenv("HOME", str(tmp_path)) + + monkeypatch.chdir(tmp_path) + runner = CliRunner() + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) + print(out.output) + new_config_yaml = tmp_path / "la.yaml" + assert new_config_yaml.exists() @pytest.mark.parametrize( @@ -876,9 +936,10 @@ def test_import_tmuxinator(cli_args, inputs, tmpdir, monkeypatch): (["freeze"], ["y\n", "./exists.yaml\n", "./la.yaml\n", "y\n"]), # Exists ], ) -def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): - monkeypatch.setenv("HOME", str(tmpdir)) - tmpdir.join("exists.yaml").ensure() +def test_freeze(server, cli_args, inputs, tmp_path, monkeypatch): + monkeypatch.setenv("HOME", str(tmp_path)) + exists_yaml = tmp_path / "exists.yaml" + exists_yaml.write_text("", encoding="utf-8") server.new_session(session_name="myfirstsession") server.new_session(session_name="myfrozensession") @@ -890,18 +951,20 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): ] monkeypatch.setenv("TMUX_PANE", first_pane_on_second_session_id) - with tmpdir.as_cwd(): - runner = CliRunner() - # Use tmux server (socket name) used in the test - cli_args = cli_args + ["-L", server.socket_name] - out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) - print(out.output) - assert tmpdir.join("la.yaml").check() + monkeypatch.chdir(tmp_path) + runner = CliRunner() + # Use tmux server (socket name) used in the test + cli_args = cli_args + ["-L", server.socket_name] + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) + print(out.output) + + yaml_config_path = tmp_path / "la.yaml" + assert yaml_config_path.exists() - yaml_config = tmpdir.join("la.yaml").open().read() - frozen_config = kaptan.Kaptan(handler="yaml").import_config(yaml_config).get() + yaml_config = yaml_config_path.open().read() + frozen_config = kaptan.Kaptan(handler="yaml").import_config(yaml_config).get() - assert frozen_config["session_name"] == "myfrozensession" + assert frozen_config["session_name"] == "myfrozensession" @pytest.mark.parametrize( @@ -917,28 +980,31 @@ def test_freeze(server, cli_args, inputs, tmpdir, monkeypatch): ), ], ) -def test_freeze_overwrite(server, cli_args, inputs, tmpdir, monkeypatch): - monkeypatch.setenv("HOME", str(tmpdir)) - tmpdir.join("exists.yaml").ensure() +def test_freeze_overwrite(server, cli_args, inputs, tmp_path, monkeypatch): + monkeypatch.setenv("HOME", str(tmp_path)) + exists_yaml = tmp_path / "exists.yaml" + exists_yaml.write_text("", encoding="utf-8") server.new_session(session_name="mysession") - with tmpdir.as_cwd(): - runner = CliRunner() - # Use tmux server (socket name) used in the test - cli_args = cli_args + ["-L", server.socket_name] - out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) - print(out.output) - assert tmpdir.join("exists.yaml").check() + monkeypatch.chdir(tmp_path) + runner = CliRunner() + # Use tmux server (socket name) used in the test + cli_args = cli_args + ["-L", server.socket_name] + out = runner.invoke(cli.cli, cli_args, input="".join(inputs)) + print(out.output) + + yaml_config_path = tmp_path / "exists.yaml" + assert yaml_config_path.exists() -def test_get_abs_path(tmpdir): - expect = str(tmpdir) - with tmpdir.as_cwd(): - cli.get_abs_path("../") == os.path.dirname(expect) - cli.get_abs_path(".") == expect - cli.get_abs_path("./") == expect - cli.get_abs_path(expect) == expect +def test_get_abs_path(tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch): + expect = str(tmp_path) + monkeypatch.chdir(tmp_path) + cli.get_abs_path("../") == os.path.dirname(expect) + cli.get_abs_path(".") == expect + cli.get_abs_path("./") == expect + cli.get_abs_path(expect) == expect def test_get_tmuxinator_dir(monkeypatch): @@ -949,15 +1015,14 @@ def test_get_tmuxinator_dir(monkeypatch): assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") -def test_get_cwd(tmpdir): +def test_get_cwd(tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch): + assert cli.get_cwd() == os.getcwd() + monkeypatch.chdir(tmp_path) + assert cli.get_cwd() == str(tmp_path) assert cli.get_cwd() == os.getcwd() - - with tmpdir.as_cwd(): - assert cli.get_cwd() == str(tmpdir) - assert cli.get_cwd() == os.getcwd() -def test_get_teamocil_dir(monkeypatch): +def test_get_teamocil_dir(monkeypatch: pytest.MonkeyPatch): assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") monkeypatch.setenv("HOME", "/moo") @@ -975,13 +1040,17 @@ def test_validate_choices(): assert validate("choice3") -def test_pass_config_dir_ClickPath(tmpdir): - configdir = tmpdir.join("myconfigdir") +def test_pass_config_dir_ClickPath( + tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch +): + + configdir = tmp_path / "myconfigdir" configdir.mkdir() user_config_name = "myconfig" - user_config = configdir.join("%s.yaml" % user_config_name).ensure() + user_config = configdir / f"{user_config_name}.yaml" + user_config.touch() - expect = str(configdir.join("myconfig.yaml")) + expect = str(user_config) runner = CliRunner() @@ -997,18 +1066,19 @@ def config_cmd(config): def check_cmd(config_arg): return runner.invoke(config_cmd, [config_arg]).output - with configdir.as_cwd(): - assert expect in check_cmd("myconfig") - assert expect in check_cmd("myconfig.yaml") - assert expect in check_cmd("./myconfig.yaml") - assert str(user_config) in check_cmd(str(configdir.join("myconfig.yaml"))) + monkeypatch.chdir(configdir) + + assert expect in check_cmd("myconfig") + assert expect in check_cmd("myconfig.yaml") + assert expect in check_cmd("./myconfig.yaml") + assert str(user_config) in check_cmd(str(configdir / "myconfig.yaml")) - assert "file not found" in check_cmd(".tmuxp.json") + assert "file not found" in check_cmd(".tmuxp.json") -def test_ls_cli(monkeypatch, tmpdir): - monkeypatch.setenv("HOME", str(tmpdir)) - monkeypatch.setenv("XDG_CONFIG_HOME", str(tmpdir.join(".config"))) +def test_ls_cli(monkeypatch: pytest.MonkeyPatch, tmp_path: pathlib.Path): + monkeypatch.setenv("HOME", str(tmp_path)) + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmp_path / ".config")) filenames = [ ".git/", @@ -1026,11 +1096,11 @@ def test_ls_cli(monkeypatch, tmpdir): stems = [os.path.splitext(f)[0] for f in filenames if f not in ignored_filenames] for filename in filenames: - location = tmpdir.join(f".tmuxp/{filename}") + location = tmp_path / f".tmuxp/{filename}" if filename.endswith("/"): - location.ensure_dir() + location.mkdir(parents=True) else: - location.ensure() + location.touch() runner = CliRunner() cli_output = runner.invoke(command_ls).output @@ -1246,7 +1316,7 @@ def test_load_append_windows_to_current_session(server, monkeypatch): assert len(server._list_windows()) == 6 -def test_debug_info_cli(monkeypatch, tmpdir): +def test_debug_info_cli(monkeypatch, tmp_path: pathlib.Path): monkeypatch.setenv("SHELL", "/bin/bash") runner = CliRunner() diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index ca43da4300..e1f66d85b9 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -455,7 +455,7 @@ def test_start_directory(session, tmp_path: pathlib.Path): assert result -def test_start_directory_relative(session, tmpdir): +def test_start_directory_relative(session, tmp_path: pathlib.Path): """Same as above test, but with relative start directory, mimicking loading it from a location of project file. Like:: @@ -469,8 +469,10 @@ def test_start_directory_relative(session, tmpdir): """ yaml_config = loadfixture("workspacebuilder/start_directory_relative.yaml") - test_dir = str(tmpdir.mkdir("foo bar")) - config_dir = str(tmpdir.mkdir("testRelConfigDir")) + test_dir = tmp_path / "foo bar" + test_dir.mkdir() + config_dir = tmp_path / "testRelConfigDir" + config_dir.mkdir() test_config = yaml_config.format(TEST_DIR=test_dir) sconfig = kaptan.Kaptan(handler="yaml") @@ -488,7 +490,7 @@ def test_start_directory_relative(session, tmpdir): assert session == builder.session - dirs = ["/usr/bin", "/dev", test_dir, config_dir, config_dir] + dirs = ["/usr/bin", "/dev", str(test_dir), str(config_dir), str(config_dir)] for path, window in zip(dirs, session.windows): for p in window.panes: From aac641d3443fb9f1b297447297cac00b2bd1b2dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 6 Mar 2022 14:31:51 -0600 Subject: [PATCH 0904/2998] chore(tests): Simplify stubbing file --- tests/test_cli.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 8e48820f25..b812d15a74 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -43,9 +43,9 @@ def test_in_dir_from_config_dir(tmp_path: pathlib.Path): cli.startup(tmp_path) yaml_config = tmp_path / "myconfig.yaml" - yaml_config.write_text("", encoding="utf-8") + yaml_config.touch() json_config = tmp_path / "myconfig.json" - json_config.write_text("", encoding="utf-8") + json_config.touch() configs_found = config.in_dir(tmp_path) assert len(configs_found) == 2 @@ -57,9 +57,9 @@ def test_ignore_non_configs_from_current_dir(tmp_path: pathlib.Path): cli.startup(tmp_path) junk_config = tmp_path / "myconfig.psd" - junk_config.write_text("", encoding="utf-8") + junk_config.touch() conf = tmp_path / "watmyconfig.json" - conf.write_text("", encoding="utf-8") + conf.touch() configs_found = config.in_dir(tmp_path) assert len(configs_found) == 1 @@ -164,10 +164,10 @@ def test_resolve_dot( monkeypatch.setenv("XDG_CONFIG_HOME", str(homedir / ".config")) tmuxp_conf_path = projectdir / ".tmuxp.yaml" - tmuxp_conf_path.write_text("", encoding="utf-8") + tmuxp_conf_path.touch() user_config_name = "myconfig" user_config = configdir / f"{user_config_name}.yaml" - user_config.write_text("", encoding="utf-8") + user_config.touch() project_config = tmuxp_conf_path @@ -272,10 +272,10 @@ def config_cmd(config): monkeypatch.setenv("HOME", str(homedir)) tmuxp_config_path = projectdir / ".tmuxp.yaml" - tmuxp_config_path.write_text("", encoding="utf-8") + tmuxp_config_path.touch() user_config_name = "myconfig" user_config = configdir / f"{user_config_name}.yaml" - user_config.write_text("", encoding="utf-8") + user_config.touch() project_config = projectdir / ".tmuxp.yaml" @@ -422,7 +422,7 @@ def test_regression_00132_session_name_with_dots( def test_load_zsh_autotitle_warning(cli_args, tmp_path, monkeypatch): # create dummy tmuxp yaml so we don't get yelled at yaml_config = tmp_path / ".tmuxp.yaml" - yaml_config.write_text("", encoding="utf-8") + yaml_config.touch() oh_my_zsh_path = tmp_path / ".oh-my-zsh" oh_my_zsh_path.mkdir() monkeypatch.setenv("HOME", str(tmp_path)) @@ -870,7 +870,7 @@ def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): teamocil_config_path.write_text(teamocil_config, encoding="utf-8") exists_yaml = tmp_path / "exists.yaml" - exists_yaml.write_text("", encoding="utf-8") + exists_yaml.touch() monkeypatch.setenv("HOME", str(tmp_path)) @@ -909,7 +909,7 @@ def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): tmuxinator_config_path.write_text(tmuxinator_config, encoding="utf-8") exists_yaml = tmp_path / "exists.yaml" - exists_yaml.write_text("", encoding="utf-8") + exists_yaml.touch() monkeypatch.setenv("HOME", str(tmp_path)) @@ -939,7 +939,7 @@ def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): def test_freeze(server, cli_args, inputs, tmp_path, monkeypatch): monkeypatch.setenv("HOME", str(tmp_path)) exists_yaml = tmp_path / "exists.yaml" - exists_yaml.write_text("", encoding="utf-8") + exists_yaml.touch() server.new_session(session_name="myfirstsession") server.new_session(session_name="myfrozensession") @@ -983,7 +983,7 @@ def test_freeze(server, cli_args, inputs, tmp_path, monkeypatch): def test_freeze_overwrite(server, cli_args, inputs, tmp_path, monkeypatch): monkeypatch.setenv("HOME", str(tmp_path)) exists_yaml = tmp_path / "exists.yaml" - exists_yaml.write_text("", encoding="utf-8") + exists_yaml.touch() server.new_session(session_name="mysession") From d4a6078e7682dc9199bca3c9889e139e33984fc1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 8 Mar 2022 05:22:18 -0600 Subject: [PATCH 0905/2998] build(deps): Update dependencies (including furo) --- poetry.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 47c9c85144..dadf88ca8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -286,7 +286,7 @@ pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "furo" -version = "2022.2.23" +version = "2022.3.4" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false @@ -1216,7 +1216,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.2" +version = "20.13.3" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1501,8 +1501,8 @@ flake8 = [ {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] furo = [ - {file = "furo-2022.2.23-py3-none-any.whl", hash = "sha256:bfed4e6a0511ab7baf211b3195b851914bf11a72e5907e073b1de9296de391f6"}, - {file = "furo-2022.2.23.tar.gz", hash = "sha256:005823b67f6ba00dde03e68dc78d437c72df7bcf816bcc6c111019c8faa7aa3d"}, + {file = "furo-2022.3.4-py3-none-any.whl", hash = "sha256:6c718293ebf87755f0b9f148b1e697c9e3aabd7af955644d4bcaee5ce75db781"}, + {file = "furo-2022.3.4.tar.gz", hash = "sha256:7660267cc67b2828fd0e17bc07adeb612c47b2eba5a6de07049a1569e6044aa8"}, ] html5lib = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, @@ -2002,8 +2002,8 @@ urllib3 = [ {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, ] virtualenv = [ - {file = "virtualenv-20.13.2-py2.py3-none-any.whl", hash = "sha256:e7b34c9474e6476ee208c43a4d9ac1510b041c68347eabfe9a9ea0c86aa0a46b"}, - {file = "virtualenv-20.13.2.tar.gz", hash = "sha256:01f5f80744d24a3743ce61858123488e91cb2dd1d3bdf92adaf1bba39ffdedf0"}, + {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"}, + {file = "virtualenv-20.13.3.tar.gz", hash = "sha256:e9dd1a1359d70137559034c0f5433b34caf504af2dc756367be86a5a32967134"}, ] watchdog = [ {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, From 7ac9f9d2f7bb16187c2738f60429d6af51fc7f4c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 8 Mar 2022 21:23:54 -0600 Subject: [PATCH 0906/2998] docs: Changes: pip install --user --- CHANGES | 2 +- docs/cli.md | 3 +-- docs/quickstart.md | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 27baa7112b..29d992c919 100644 --- a/CHANGES +++ b/CHANGES @@ -294,7 +294,7 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python ```{code-block} sh - $ pip install ipdb + $ pip install --user ipdb $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell ``` diff --git a/docs/cli.md b/docs/cli.md index 7a360aac18..282a5bab1a 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -80,9 +80,8 @@ compatible debuggers, for instance [ipdb][ipdb]: ```{code-block} sh -$ pip install ipdb +$ pip install --user ipdb $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell - ``` You can also pass in python code directly, similar to `python -c`, do diff --git a/docs/quickstart.md b/docs/quickstart.md index 0630be4f08..e463f99f6e 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -8,7 +8,7 @@ Assure you have at least tmux **>= 1.8** and python **>= 2.6**. ```{code-block} bash -$ pip install tmuxp +$ pip install --user tmuxp ``` @@ -16,7 +16,7 @@ You can upgrade to the latest release with: ```{code-block} bash -$ pip install tmuxp -U +$ pip install --user tmuxp -U ``` From 3db13fdc6a74f3924b8dc33c45cf1dabfb173b30 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 8 Mar 2022 21:27:24 -0600 Subject: [PATCH 0907/2998] chore(.tmuxp.{json,yaml}): make start --- .tmuxp.json | 4 ++-- .tmuxp.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.tmuxp.json b/.tmuxp.json index 17256e7bcf..ff97a9be40 100644 --- a/.tmuxp.json +++ b/.tmuxp.json @@ -33,8 +33,8 @@ "focus": true }, "pane", - "make serve", - "make SPHINXBUILD='poetry run sphinx-build' watch" + "pane", + "make start", ] } ] diff --git a/.tmuxp.yaml b/.tmuxp.yaml index 28ce7652fa..c44e45b940 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -21,5 +21,5 @@ windows: panes: - focus: true - pane - - make serve - - make SPHINXBUILD='poetry run sphinx-build' watch + - pane + - make start From 8f21249c717bada5c7586777e8d953d28b62c9f3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 8 Mar 2022 21:35:40 -0600 Subject: [PATCH 0908/2998] docs: Console highlighting --- README.md | 26 +++++++++++++------------- docs/about_tmux.md | 8 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c1faedbb66..b8d1e7e009 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ web](https://leanpub.com/the-tao-of-tmux/read). ## Pip -```shell +```console $ pip install --user tmuxp ``` ## Homebrew -```shell +```console $ brew install tmuxp ``` @@ -55,19 +55,19 @@ windows: Save as _mysession.yaml_, and load: -```sh +```console $ tmuxp load ./mysession.yaml ``` Projects with _.tmuxp.yaml_ or _.tmuxp.json_ load via directory: -```sh +```console $ tmuxp load path/to/my/project/ ``` Load multiple at once (in bg, offer to attach last): -```sh +```console $ tmuxp load mysession ./another/project/ ``` @@ -93,7 +93,7 @@ tmuxp checks for configs in user directories: Load your tmuxp config from anywhere by using the filename, assuming _\~/.config/tmuxp/mysession.yaml_ (or _.json_): -```sh +```console $ tmuxp load mysession ``` @@ -109,7 +109,7 @@ _New in 1.6.0_: server, session, and window in [libtmux](https://github.com/tmux-python/libtmux) objects. -```shell +```console $ tmuxp shell (Pdb) server @@ -134,7 +134,7 @@ Python 3.7+ supports [PEP 553](https://www.python.org/dev/peps/pep-0553/) `breakpoint()` (including `PYTHONBREAKPOINT`). Also supports direct commands via `-c`: -```shell +```console $ tmuxp shell -c 'print(window.name)' my_window @@ -166,7 +166,7 @@ You can also load sessions in the background by passing `-d` flag Snapshot your tmux layout, pane paths, and window/session names. -```sh +```console $ tmuxp freeze session-name ``` @@ -177,7 +177,7 @@ tmux](http://tmuxp.git-pull.com/cli.html#freeze-sessions) sessions. Convert a session file from yaml to json and vice versa. -```sh +```console $ tmuxp convert filename ``` @@ -186,7 +186,7 @@ going to be written. You can auto confirm the prompt. In this case no preview will be shown. -```sh +```console $ tmuxp convert -y filename $ tmuxp convert --yes filename ``` @@ -201,13 +201,13 @@ the [Plugin System](http://tmuxp.git-pull.com/plugin_system.html). The `load` command provides a way to log output to a log file for debugging purposes. -```sh +```console $ tmuxp load --log-file . ``` Collect system info to submit with a Github issue: -```sh +```console $ tmuxp debug-info ------------------ environment: diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 0dbaa63d30..7e5a39addd 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -449,7 +449,7 @@ Depending on your tmux version, there is different options available. ### Vi-style copy and paste -```sh +```console # Vi copypaste mode set-window-option -g mode-keys vi bind-key -t vi-copy 'v' begin-selection @@ -458,7 +458,7 @@ bind-key -t vi-copy 'y' copy-selection ### Aggressive resizing for clients -```sh +```console setw -g aggressive-resize on ``` @@ -466,7 +466,7 @@ setw -g aggressive-resize on `` + `r`. -```sh +```console bind r source-file ~/.tmux.conf \; display-message "Config reloaded." ``` @@ -479,7 +479,7 @@ You can use [tmux-mem-cpu-load][tmux-mem-cpu-load] to get stats (requires compil [basic-cpu-and-memory.tmux][basic-cpu-and-memory.tmux]. You can pipe in a bash command to a tmux status line like: -```sh +```console $(shell-command) ``` From 4d3981f7b3f9b3cfe0c6eb67cba6925f66d9df1e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 8 Mar 2022 21:38:35 -0600 Subject: [PATCH 0909/2998] docs: Even more highlighting improvesments --- docs/cli.md | 44 ++++++++++++++++++++++--------------------- docs/developing.md | 34 ++++++++++++++++----------------- docs/examples.md | 2 +- docs/plugin_system.md | 2 +- docs/quickstart.md | 14 +++++++------- 5 files changed, 49 insertions(+), 47 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 282a5bab1a..2746423aed 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -14,7 +14,7 @@ See the [click library's documentation on shell completion](https://click.pallet In bash (`~/.bashrc`): -```{code-block} sh +```console eval "$(_TMUXP_COMPLETE=bash_source tmuxp)" @@ -22,7 +22,7 @@ eval "$(_TMUXP_COMPLETE=bash_source tmuxp)" In zsh (`~/.zshrc`): -```{code-block} sh +```console eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" @@ -78,7 +78,7 @@ Pane(%6 Window(@3 1:your_window, Session($1 your_project))) Python 3.7 supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and supports compatible debuggers, for instance [ipdb][ipdb]: -```{code-block} sh +```console $ pip install --user ipdb $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell @@ -87,7 +87,7 @@ $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell You can also pass in python code directly, similar to `python -c`, do this via `tmuxp -c`: -```{code-block} shell +```consoleell $ tmuxp shell -c 'print(session.name); print(window.name)' my_server @@ -157,25 +157,25 @@ shorthands: 2. The name of the project file in your {}`$HOME/.tmuxp` folder 3. The direct path of the tmuxp file you want to load -``` +```console # path to folder with .tmuxp.{yaml,yml,json} -tmuxp load . -tmuxp load ../ -tmuxp load path/to/folder/ -tmuxp load /path/to/folder/ +$ tmuxp load . +$ tmuxp load ../ +$ tmuxp load path/to/folder/ +$ tmuxp load /path/to/folder/ # name of the config, assume $HOME/.tmuxp/myconfig.yaml -tmuxp load myconfig +$ tmuxp load myconfig # direct path to json/yaml file -tmuxp load ./myfile.yaml -tmuxp load /abs/path/to/myfile.yaml -tmuxp load ~/myfile.yaml +$ tmuxp load ./myfile.yaml +$ tmuxp load /abs/path/to/myfile.yaml +$ tmuxp load ~/myfile.yaml ``` Absolute and relative directory paths are supported. -```{code-block} bash +```console $ tmuxp load @@ -184,7 +184,7 @@ $ tmuxp load Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working directory may be loaded with: -```{code-block} bash +```console $ tmuxp load . @@ -202,15 +202,17 @@ Or (a)ppend windows in the current active session? All of these options can be preselected to skip the prompt: -```{code-block} bash $ tmuxp load -y config # load attached $ tmuxp load -d config # load detached $ tmuxp load -a config # append windows - +```console +$ tmuxp load -y config # load attached +$ tmuxp load -d config # load detached +$ tmuxp load -a config # append windows ``` Multiple sessions can be loaded at once. The first ones will be created without being attached. The last one will be attached if there is no `-d` flag on the command line. -```{code-block} bash +```console $ tmuxp load ... @@ -219,7 +221,7 @@ $ tmuxp load ... A session name can be provided at the terminal. If multiple sessions are created, the last session is named from the terminal. -```{code-block} bash +```console $ tmuxp load -s ... @@ -229,7 +231,7 @@ The output of the `load` command can be logged to a file for debugging purposes. the log level can be controlled with the global `--log-level` option (defaults to INFO). -```{code-block} bash +```console $ tmuxp load --log-file $ tmuxp --log-level load --log-file @@ -243,7 +245,7 @@ $ tmuxp --log-level load --log-file Use to collect all relevant information for submitting an issue to the project. -```{code-block} bash +```console $ tmuxp debug-info -------------------------- diff --git a/docs/developing.md b/docs/developing.md index 005c71dd9f..97557e251a 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -23,7 +23,7 @@ using `$ tmux -L test_case`. To begin developing, check out the code from github: -```{code-block} bash +```console $ git clone git@github.com:tmux-python/tmuxp.git $ cd tmuxp @@ -35,7 +35,7 @@ $ cd tmuxp Now create a virtualenv, if you don't know how to, you can create a virtualenv with: -```{code-block} bash +```console $ virtualenv .venv @@ -43,7 +43,7 @@ $ virtualenv .venv Then activate it to your current tty / terminal session with: -```{code-block} bash +```console $ source .venv/bin/activate @@ -51,7 +51,7 @@ $ source .venv/bin/activate Good! Now let's run this: -```{code-block} bash +```console $ pip install -e . @@ -61,7 +61,7 @@ This has `pip`, a python package manager install the python package in the current directory. `-e` means `--editable`, which means you can adjust the code and the installed software will reflect the changes. -```{code-block} bash +```console $ tmuxp @@ -75,7 +75,7 @@ For information on installing poetry visit the [poetry's documentation][poetry's To begin developing, check out the code from github: -```{code-block} bash +```console $ git clone git@github.com:tmux-python/tmuxp.git $ cd tmuxp @@ -85,7 +85,7 @@ $ cd tmuxp You can create a virtualenv, and install all of the locked packages as listed in poetry.lock: -```{code-block} bash +```console $ poetry install @@ -95,7 +95,7 @@ If you ever need to update packages during your development session, the following command can be used to update all packages as per poetry settings or individual package (second command): -```{code-block} bash +```console $ poetry update $ poetry update requests @@ -104,7 +104,7 @@ $ poetry update requests Then activate it to your current tty / terminal session with: -```{code-block} bash +```console $ poetry shell @@ -122,7 +122,7 @@ since you are in the virtual environment, your {}`PATH` environment was updated to include a special version of `python` inside your `.venv` folder with its own packages. -```{code-block} bash +```console $ make test @@ -139,7 +139,7 @@ If you found a problem or are trying to write a test, you can file an Test only a file: -```{code-block} bash +```console $ py.test tests/test_config.py @@ -147,7 +147,7 @@ $ py.test tests/test_config.py will test the `tests/test_config.py` tests. -```{code-block} bash +```console $ py.test tests/test_config.py::test_export_json @@ -157,7 +157,7 @@ tests `test_export_json` inside of `tests/test_config.py`. Multiple can be separated by spaces: -```{code-block} bash +```console $ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json @@ -200,7 +200,7 @@ variants, including Debian, Ubuntu, FreeBSD, OS X. To run all tests upon editing any `.py` file: -```{code-block} bash +```console $ make watch_test @@ -209,7 +209,7 @@ $ make watch_test You can also re-run a specific test file or any other [py.test usage argument][py.test usage argument]: -```{code-block} bash +```console $ make watch_test test=tests/test_config.py @@ -221,7 +221,7 @@ $ make watch_test test='-x tests/test_config.py tests/test_util.py' Rebuild the documentation when an `.rst` file is edited: -```{code-block} bash +```console $ cd doc $ make watch @@ -242,7 +242,7 @@ $ make SPHINXBUILD='poetry run sphinx-build' watch After you {ref}`install_dev_env`, when inside the tmuxp checkout: -```{code-block} bash +```console $ tmuxp load . diff --git a/docs/examples.md b/docs/examples.md index 432f7e19cb..7ab52f33d7 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -501,7 +501,7 @@ You can load your software project in tmux by placing a `.tmuxp.yaml` or tmuxp supports loading configs via absolute filename with `tmuxp load` and via `$ tmuxp load .` if config is in directory. -```{code-block} bash +```console $ tmuxp load ~/workspaces/myproject.yaml diff --git a/docs/plugin_system.md b/docs/plugin_system.md index fa63b2ff51..72839f41f5 100644 --- a/docs/plugin_system.md +++ b/docs/plugin_system.md @@ -39,7 +39,7 @@ suggested to use it when developing plugins; however, `pip` will work just as well. Only one of the configuration files is needed for the packaging tool that the package developer desides to use. -```{code-block} bash +```console python_module ├── tmuxp_plugin_my_plugin_module diff --git a/docs/quickstart.md b/docs/quickstart.md index e463f99f6e..1ad620bda1 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -6,7 +6,7 @@ Assure you have at least tmux **>= 1.8** and python **>= 2.6**. -```{code-block} bash +```console $ pip install --user tmuxp @@ -14,7 +14,7 @@ $ pip install --user tmuxp You can upgrade to the latest release with: -```{code-block} bash +```console $ pip install --user tmuxp -U @@ -24,7 +24,7 @@ Then install {ref}`completion`. If you are a Homebrew user you can install it with: -```{code-block} bash +```console $ brew install tmuxp @@ -56,7 +56,7 @@ Create a file, `~/.tmuxp/example.yaml`: ``` -```{code-block} bash +```console $ tmuxp load example.yaml @@ -66,7 +66,7 @@ This creates your tmuxp session. Load multiple tmux sessions at once: -```{code-block} bash +```console $ tmuxp load example.yaml anothersession.yaml @@ -79,7 +79,7 @@ the current active session. You can also have a custom tmuxp config directory by setting the `TMUX_CONFIGDIR` in your environment variables. -```{code-block} bash +```console $ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython @@ -87,7 +87,7 @@ $ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython Or in your `~/.bashrc` / `~/.zshrc` you can set: -```{code-block} bash +```console export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp From 05486cc77eb71dac31962d7b3fa2ead3663ec47e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:44:31 -0600 Subject: [PATCH 0910/2998] docs(examples): Use inline-tabs --- docs/examples.md | 160 +++++++++++++++++++++++++++++------------- docs/plugin_system.md | 10 ++- 2 files changed, 114 insertions(+), 56 deletions(-) diff --git a/docs/examples.md b/docs/examples.md index 7ab52f33d7..9437ecb939 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -27,20 +27,25 @@ punctual. :::: -### YAML +````{tab} YAML ```{literalinclude} ../examples/shorthands.yaml :language: yaml ``` -### JSON + +```` + +````{tab} JSON ```{literalinclude} ../examples/shorthands.json :language: json ``` +```` + ## Blank panes No need to repeat `pwd` or a dummy command. A `null`, `'blank'`, @@ -48,20 +53,24 @@ No need to repeat `pwd` or a dummy command. A `null`, `'blank'`, Note `''` counts as an empty carriage return. -### YAML +````{tab} YAML ```{literalinclude} ../examples/blank-panes.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/blank-panes.json :language: json ``` +```` + ## 2 panes ::::{sidebar} 2 pane @@ -82,20 +91,24 @@ Note `''` counts as an empty carriage return. :::: -### YAML +````{tab} YAML ```{literalinclude} ../examples/2-pane-vertical.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/2-pane-vertical.json :language: json ``` +```` + ## 3 panes ::::{sidebar} 3 panes @@ -116,20 +129,24 @@ Note `''` counts as an empty carriage return. :::: -### YAML +````{tab} YAML ```{literalinclude} ../examples/3-pane.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/3-pane.json :language: json ``` +```` + ## 4 panes ::::{sidebar} 4 panes @@ -150,38 +167,46 @@ Note `''` counts as an empty carriage return. :::: -### YAML +````{tab} YAML ```{literalinclude} ../examples/4-pane.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/4-pane.json :language: json ``` +```` + ## Start Directory Equivalent to `tmux new-window -c `. -### YAML +````{tab} YAML ```{literalinclude} ../examples/start-directory.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/start-directory.json :language: json ``` +```` + ## Environment variable replacing tmuxp will replace environment variables wrapped in curly brackets @@ -200,7 +225,7 @@ terminal `tmuxp` invokes in. In this case of this example, assuming the username "user": -``` +```console $ MY_ENV_VAR=foo tmuxp load examples/env-variables.yaml ``` @@ -217,116 +242,139 @@ please make a ticket on the [issue tracker][issue tracker]. [issue tracker]: https://github.com/tmux-python/tmuxp/issues -### YAML +````{tab} YAML ```{literalinclude} ../examples/env-variables.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/env-variables.json :language: json ``` +```` + ## Environment variables tmuxp will set session environment variables. -### YAML +````{tab} YAML ```{literalinclude} ../examples/session-environment.yaml :language: yaml ``` +```` -### JSON +````{tab} JSON ```{literalinclude} ../examples/session-environment.json :language: json ``` +```` + ## Focusing tmuxp allows `focus: true` for assuring windows and panes are attached / selected upon loading. -### YAML +````{tab} YAML ```{literalinclude} ../examples/focus-window-and-panes.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/focus-window-and-panes.json :language: json ``` +```` + ## Terminal History tmuxp allows `suppress_history: false` to override the default command / suppression when building the workspace. This will add the `shell_command` to the bash history in the pane. -### YAML +````{tab} YAML ```{literalinclude} ../examples/suppress-history.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/suppress-history.json :language: json ``` +```` + ## Window Index You can specify a window's index using the `window_index` property. Windows without `window_index` will use the lowest available window index. -### YAML +````{tab} YAML ```{literalinclude} ../examples/window-index.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/window-index.json :language: json ``` +```` + ## Shell per pane Every pane can have its own shell or application started. This allows for usage of the `remain-on-exit` setting to be used properly, but also to have different shells on different panes. -### YAML +````{tab} YAML ```{literalinclude} ../examples/pane-shell.yaml :language: yaml ``` -### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/pane-shell.json :language: json ``` +```` + ## Set tmux options Works with global (server-wide) options, session options @@ -335,19 +383,20 @@ and window options. Including `automatic-rename`, `default-shell`, `default-command`, etc. -### YAML +````{tab} YAML ```{literalinclude} ../examples/options.yaml :language: yaml ``` +```` -### JSON - +````{tab} JSON ```{literalinclude} ../examples/options.json :language: json ``` +```` ## Set window options after pane creation @@ -355,35 +404,35 @@ Apply window options after panes have been created. Useful for `synchronize-panes` option after executing individual commands in each pane during creation. -### YAML - +````{tab} YAML ```{literalinclude} ../examples/2-pane-synchronized.yaml :language: yaml ``` +```` -### JSON - +````{tab} JSON ```{literalinclude} ../examples/2-pane-synchronized.json :language: json ``` +```` ## Main pane height -### YAML - +````{tab} YAML ```{literalinclude} ../examples/main-pane-height.yaml :language: yaml ``` +```` -### JSON - +````{tab} JSON ```{literalinclude} ../examples/main-pane-height.json :language: json ``` +```` ## Super-advanced dev environment @@ -393,27 +442,27 @@ pane during creation. ::: -### YAML - +````{tab} YAML ```{literalinclude} ../.tmuxp.yaml :language: yaml ``` +```` -### JSON - +````{tab} JSON ```{literalinclude} ../.tmuxp.json :language: json ``` +```` ## Multi-line commands You can use YAML's multiline syntax to easily split multiple commands into the same shell command: https://stackoverflow.com/a/21699210 -```{code-block} yaml - +````{tab} YAML +```yaml session_name: my project shell_command_before: - > @@ -435,6 +484,7 @@ windows: options: main-pane-height: 35 ``` +```` ## Bootstrap project before launch @@ -454,42 +504,48 @@ Run a python script (and check for it's return code), the script is _relative to the `.tmuxp.yaml`'s root_ (Windows and panes omitted in this example): -```{code-block} yaml - +````{tab} YAML +```yaml session_name: my session before_script: ./bootstrap.py # ... the rest of your config ``` +```` -```{code-block} json - +````{tab} JSON +```json { "session_name": "my session", "before_script": "./bootstrap.py" } ``` +```` Run a shell script + check for return code on an absolute path. (Windows and panes omitted in this example) -```{code-block} yaml +````{tab} YAML +```yaml session_name: another example before_script: /absolute/path/this.sh # abs path to shell script # ... the rest of your config ``` +```` -```{code-block} json +````{tab} JSON +```json { "session_name": "my session", "before_script": "/absolute/path/this.sh" } ``` +```` [exit status]: http://tldp.org/LDP/abs/html/exit-status.html @@ -529,8 +585,9 @@ the config file / project root. If you use [pipenv][pipenv] / [poetry][poetry], you can use a script like this to ensure your packages are installed: -```{code-block} yaml +````{tab} YAML +```yaml # assuming your .tmuxp.yaml is in your project root directory session_name: my pipenv project start_directory: ./ @@ -543,12 +600,14 @@ windows: - pipenv run ./manage.py runserver ``` +```` You can also source yourself into the virtual environment using `shell_command_before`: -```{code-block} yaml +````{tab} YAML +```yaml # assuming your .tmuxp.yaml is in your project root directory session_name: my pipenv project start_directory: ./ @@ -563,6 +622,7 @@ windows: - ./manage.py runserver ``` +```` [pipenv]: https://docs.pipenv.org/ [poetry]: https://python-poetry.org/ diff --git a/docs/plugin_system.md b/docs/plugin_system.md index 72839f41f5..7893d800a8 100644 --- a/docs/plugin_system.md +++ b/docs/plugin_system.md @@ -55,7 +55,7 @@ When publishing plugins to pypi, tmuxp advocates for standardized naming: module configuration file with poetry, run `poetry init` in the module directory. The resulting file looks something like this: -```{code-block} toml +```toml [tool.poetry] name = "tmuxp-plugin-my-tmuxp-plugin" @@ -77,7 +77,7 @@ build-backend = "poetry.masonry.api" The {}`plugin.py` file could contain something like the following: -```{code-block} python +```python from tmuxp.plugin import TmuxpPlugin import datetime @@ -111,13 +111,11 @@ class MyTmuxpPlugin(TmuxpPlugin): Once this plugin is installed in the local python environment, it can be used in a configuration file like the following: -```{code-block} yaml - +```yaml session_name: plugin example plugins: -- my_plugin_module.plugin.MyTmuxpPlugin + - my_plugin_module.plugin.MyTmuxpPlugin # ... the rest of your config - ``` ## Plugin API From c4bf7329ed6b95251a50d6bf953d2bceb3eb155d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:46:25 -0600 Subject: [PATCH 0911/2998] docs(cli): Highlighting --- docs/cli.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 2746423aed..7849ac5707 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -32,14 +32,14 @@ eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" ## Shell -``` -tmuxp shell +```console +$ tmuxp shell -tmuxp shell +$ tmuxp shell -tmuxp shell +$ tmuxp shell -tmuxp shell -c 'python code' +$ tmuxp shell -c 'python code' ``` Launch into a python console with [libtmux][libtmux] objects. Compare to django's shell. From 4cd5cdcd7798fa366b19d40db50a49cfbb44a83c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:46:50 -0600 Subject: [PATCH 0912/2998] docs: Fix double link --- docs/cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli.md b/docs/cli.md index 7849ac5707..bdf4809f70 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -42,7 +42,7 @@ $ tmuxp shell $ tmuxp shell -c 'python code' ``` -Launch into a python console with [libtmux][libtmux] objects. Compare to django's shell. +Launch into a python console with [libtmux] objects. Compare to django's shell. > > ```{image} _static/tmuxp-shell.gif > > :width: 100% From 7146180b6a3841e1ab8fe95d8e98168c1ebc2098 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:48:10 -0600 Subject: [PATCH 0913/2998] docs: Highlighting fixes --- docs/cli.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index bdf4809f70..6ddafc62d1 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -44,19 +44,16 @@ $ tmuxp shell -c 'python code' Launch into a python console with [libtmux] objects. Compare to django's shell. -> > ```{image} _static/tmuxp-shell.gif -> > :width: 100% -> > ``` -> -> ``` -> -> Automatically preloads current tmux {class}`server `, -> {class}`session `, {class}`window ` -> {class}`pane `. Pass additional arguments to select a -> specific one of your choice: -> ``` - +```{image} _static/tmuxp-shell.gif +:width: 100% ``` + +Automatically preloads current tmux {class}`server `, +{class}`session `, {class}`window ` +{class}`pane `. Pass additional arguments to select a +specific one of your choice: + +```console (Pdb) server (Pdb) server.sessions From f35db5e9f30af23d88797f21440165efc8c4ecba Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:48:39 -0600 Subject: [PATCH 0914/2998] docs(cli): Another shell fix --- docs/cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli.md b/docs/cli.md index 6ddafc62d1..2736d78ebb 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -84,7 +84,7 @@ $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell You can also pass in python code directly, similar to `python -c`, do this via `tmuxp -c`: -```consoleell +```console $ tmuxp shell -c 'print(session.name); print(window.name)' my_server From 97cbbe9f4d43eaf88cc1386702ece2513daa19c0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:49:38 -0600 Subject: [PATCH 0915/2998] docs(cli): More highlighting --- docs/cli.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 2736d78ebb..f81b482cbe 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -35,9 +35,9 @@ eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" ```console $ tmuxp shell -$ tmuxp shell +$ tmuxp shell [session_name] -$ tmuxp shell +$ tmuxp shell [session_name] [window_name] $ tmuxp shell -c 'python code' ``` @@ -129,10 +129,10 @@ my_window ## Freeze sessions -``` -tmuxp freeze -tmuxp freeze -tmuxp freeze --force +```console +$ tmuxp freeze +$ tmuxp freeze [session_name] +$ tmuxp freeze --force [session_name] ``` You can save the state of your tmux session by freezing it. @@ -174,7 +174,7 @@ Absolute and relative directory paths are supported. ```console -$ tmuxp load +$ tmuxp load [filename] ``` @@ -211,7 +211,7 @@ without being attached. The last one will be attached if there is no ```console -$ tmuxp load ... +$ tmuxp load [filename1] [filename2] ... ``` @@ -220,7 +220,7 @@ are created, the last session is named from the terminal. ```console -$ tmuxp load -s ... +$ tmuxp load -s [new_session_name] [filename1] ... ``` @@ -230,8 +230,8 @@ debugging purposes. the log level can be controlled with the global ```console -$ tmuxp load --log-file -$ tmuxp --log-level load --log-file +$ tmuxp load [filename] --log-file [log_filename] +$ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] ``` @@ -261,24 +261,24 @@ environment: ### From teamocil -``` -tmuxp import teamocil /path/to/file.{json,yaml} +```console +$ tmuxp import teamocil /path/to/file.{json,yaml} ``` (import-tmuxinator)= ### From tmuxinator -``` -tmuxp import tmuxinator /path/to/file.{json,yaml} +```console +$ tmuxp import tmuxinator /path/to/file.{json,yaml} ``` (convert-config)= ## Convert between YAML and JSON -``` -tmuxp convert /path/to/file.{json,yaml} +```console +$ tmuxp convert /path/to/file.{json,yaml} ``` tmuxp automatically will prompt to convert `.yaml` to `.json` and From 2f4a907e83fce8fc8dd0715879ca87dd552eede1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 9 Mar 2022 05:54:38 -0600 Subject: [PATCH 0916/2998] docs(about): Fix footnote --- docs/about.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/about.md b/docs/about.md index bfcca7fa39..7b08dac67c 100644 --- a/docs/about.md +++ b/docs/about.md @@ -80,7 +80,8 @@ See {ref}`libtmux's internals `. **Conversion** `$ tmuxp convert ` can convert files to and from JSON and YAML. -[^id4]: +[^id4]: On freezing + While freezing and importing sessions is a great way to save time, tweaking will probably be required - There is no substitute to a config made with love. From cbda16b51c4403cffa955f2c81c24e4d200653d1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 10 Mar 2022 19:00:44 -0600 Subject: [PATCH 0917/2998] ci(publish-docs): publish any time docs/* edited --- .github/workflows/publish-docs.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 2d53157f35..0cf9d73c8e 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -28,8 +28,7 @@ jobs: - CHANGES - README.* docs: - - 'docs/**/*.rst' - - 'docs/**/*.md' + - 'docs/**' - 'examples/**' python_files: - 'tmuxp/**' From 495b55195dac1dd6964eab7ecff82fa817a59667 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 10 Mar 2022 19:03:18 -0600 Subject: [PATCH 0918/2998] docs(conf): use pathlib.Path --- docs/conf.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 8d427c8f17..4438c11cc6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,22 +3,22 @@ import os import sys from os.path import dirname, relpath +from pathlib import Path import tmuxp # Get the project root dir, which is the parent dir of this -cwd = os.getcwd() -project_root = os.path.dirname(cwd) +cwd = Path.cwd() +project_root = cwd.parent -sys.path.insert(0, project_root) -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext"))) +sys.path.insert(0, str(project_root)) +sys.path.insert(0, str(cwd / "_ext")) # package data about = {} with open("../tmuxp/__about__.py") as fp: exec(fp.read(), about) - extensions = [ "sphinx.ext.autodoc", "sphinx.ext.intersphinx", From c626953fa2ddf92041d38c6419d05a305b021c1e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 10 Mar 2022 19:03:48 -0600 Subject: [PATCH 0919/2998] docs(conf): Add copybutton_prompt_text --- docs/conf.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 4438c11cc6..06597aa9d9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -95,6 +95,13 @@ ogp_desscription_length = about["__description__"] ogp_site_name = about["__title__"] +# sphinx-copybutton +copybutton_prompt_text = ( + r">>> |\.\.\. |> |\$ |\# | In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " +) +copybutton_prompt_is_regexp = True +copybutton_remove_prompts = True + htmlhelp_basename = "%sdoc" % about["__title__"] latex_documents = [ From 6dc7d57b31c82df8f5b0be092327d8de8124a3e5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 11 Mar 2022 05:36:34 -0600 Subject: [PATCH 0920/2998] docs(about_tmux): Fix formatting for aafig diagrams --- docs/about_tmux.md | 241 ++++++++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 114 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 7e5a39addd..4379317054 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -40,23 +40,26 @@ inside the text dimension. Inside tmux you can: | Window | Virtual Desktop or applications | A desktop that stores it own screen | | Pane | Application | Performs operations | -:::{aafig} -+----------------------------------------------------------------+ -| +--------+--------+ +-----------------+ +-----------------+ | -| | pane | pane | | pane | | pane | | -| | | | | | | | | -| | | | | | | | | -| +--------+--------+ | | +-----------------+ | -| | pane | pane | | | | pane | | -| | | | | | | | | -| | | | | | | | | -| +--------+--------+ +-----------------+ +-----------------+ | -| | window | | window | | window | | -| \--------+--------/ \-----------------/ \-----------------/ | -+----------------------------------------------------------------+ -| session | -\----------------------------------------------------------------/ -::: +```{eval-rst} +.. aafig:: + :textual: + + +----------------------------------------------------------------+ + | +--------+--------+ +-----------------+ +-----------------+ | + | | pane | pane | | pane | | pane | | + | | | | | | | | | + | | | | | | | | | + | +--------+--------+ | | +-----------------+ | + | | pane | pane | | | | pane | | + | | | | | | | | | + | | | | | | | | | + | +--------+--------+ +-----------------+ +-----------------+ | + | | window | | window | | window | | + | \--------+--------/ \-----------------/ \-----------------/ | + +----------------------------------------------------------------+ + | session | + \----------------------------------------------------------------/ +``` - 1 {term}`Server`. @@ -80,59 +83,66 @@ splitting up 1 terminal into multiple. One screen can be used to edit a file, and another may be used to `$ tail -F` a logfile. -:::{aafig} -+--------+--------+ -| $ bash | $ bash | -| | | -| | | -| | | -| | | -| | | -| | | -+--------+--------+ -::: +```{eval-rst} +.. aafig:: + + +--------+--------+ + | $ bash | $ bash | + | | | + | | | + | | | + | | | + | | | + | | | + +--------+--------+ +``` -:::{aafig} -+--------+--------+ -| $ bash | $ bash | -| | | -| | | -+--------+--------+ -| $ vim | $ bash | -| | | -| | | -+--------+--------+ -::: +```{eval-rst} +.. aafig:: + + +--------+--------+ + | $ bash | $ bash | + | | | + | | | + +--------+--------+ + | $ vim | $ bash | + | | | + | | | + +--------+--------+ +``` tmux supports as manys terminals as you want. -:::{aafig} -+---------+---------+ -| $ bash | $ bash | -| | | -| | | /-----------------\ -+---------+---------+ --> |'switch-window 2'| -| $ bash | $ bash | \-----------------/ -| | | | -| | | | -+---------+---------+ | -| '1:sys* 2:vim' | | -+-------------------+ | -/------------------------/ -| -v -+---------+---------+ -| $ vim | -| | -| | -+-------------------+ -| $ bash | $ bash | -| | | -| | | -+-------------------+ -| '1:sys 2:vim*' | -+-------------------+ -::: +```{eval-rst} +.. aafig:: + :textual: + + +---------+---------+ + | $ bash | $ bash | + | | | + | | | /-----------------\ + +---------+---------+ --> |'switch-window 2'| + | $ bash | $ bash | \-----------------/ + | | | | + | | | | + +---------+---------+ | + | '1:sys* 2:vim' | | + +-------------------+ | + /------------------------/ + | + v + +---------+---------+ + | $ vim | + | | + | | + +-------------------+ + | $ bash | $ bash | + | | | + | | | + +-------------------+ + | '1:sys 2:vim*' | + +-------------------+ +``` You can switch between the windows you create. @@ -141,54 +151,57 @@ You can switch between the windows you create. You can leave tmux and all applications running (detach), log out, make a sandwich, and re-(attach), all applications are still running! -:::{aafig} -+--------+--------+ -| $ bash | $ bash | -| | | -| | | /------------\ -+--------+--------+ --> | detach | -| $ vim | $ bash | | 'Ctrl-b b' | -| | | \------------/ -| | | | -+--------+--------+ | -/------------------/ -| -v -+-----------------------+ -| $ [screen detached] | -| | -| | -| | -| | -| | -| | -+-----------------------+ -v -| -v -+-----------------------+ -| $ [screen detached] | -| $ tmux attach | -| | /------------\ -| | --> | attaching | -| | \------------/ -| | | -| | | -+-----------------------+ | -| -/---------------------------/ -| -v -+--------+--------+ -| $ bash | $ bash | -| | | -| | | -+--------+--------+ -| $ vim | $ bash | -| | | -| | | -+--------+--------+ -::: +```{eval-rst} +.. aafig:: + :textual: + + +--------+--------+ + | $ bash | $ bash | + | | | + | | | /------------\ + +--------+--------+ --> | detach | + | $ vim | $ bash | | 'Ctrl-b b' | + | | | \------------/ + | | | | + +--------+--------+ | + /------------------/ + | + v + +-----------------------+ + | $ [screen detached] | + | | + | | + | | + | | + | | + | | + +-----------------------+ + v + | + v + +-----------------------+ + | $ [screen detached] | + | $ tmux attach | + | | /------------\ + | | --> | attaching | + | | \------------/ + | | | + | | | + +-----------------------+ | + | + /---------------------------/ + | + v + +--------+--------+ + | $ bash | $ bash | + | | | + | | | + +--------+--------+ + | $ vim | $ bash | + | | | + | | | + +--------+--------+ +``` ### Manage workflow From 00c973e6c7587361c97918a0604cf48591696ac9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 06:16:27 -0600 Subject: [PATCH 0921/2998] chore(make start): Continue testing after first fail --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b4ce25c651..9b02c94f1d 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ test: poetry run py.test $(test) start: - $(MAKE) test && poetry run ptw . + $(MAKE) test; poetry run ptw . watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi From 672cced41909bd026317114a525e23083e2ffcac Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 12:23:59 -0600 Subject: [PATCH 0922/2998] ci(stale): Exempt enhancement label --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 7ed957161f..6246268b7a 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,6 +6,7 @@ daysUntilClose: 7 exemptLabels: - pinned - security + - enhancement # Label to use when marking an issue as stale staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable From 7959e22c152abd586dccceb09e54be1034c4e447 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 11:28:40 -0600 Subject: [PATCH 0923/2998] test: Add write_config() --- tests/fixtures/_util.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/fixtures/_util.py b/tests/fixtures/_util.py index 67d2d05e22..607f4c7429 100644 --- a/tests/fixtures/_util.py +++ b/tests/fixtures/_util.py @@ -1,4 +1,5 @@ import os +import pathlib def curjoin(_file): # return filepath relative to __file__ (this file) @@ -7,3 +8,11 @@ def curjoin(_file): # return filepath relative to __file__ (this file) def loadfixture(_file): # return fixture data, relative to __file__ return open(curjoin(_file)).read() + + +def write_config( + config_path: pathlib.Path, filename: str, content: str +) -> pathlib.Path: + config = config_path / filename + config.write_text(content, encoding="utf-8") + return config From 9ecd95bfc2ce5cceb23cbf19456042483fa7108b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 11:34:01 -0600 Subject: [PATCH 0924/2998] test: Add FIXTURE_PATH (pathlib) --- tests/fixtures/_util.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/fixtures/_util.py b/tests/fixtures/_util.py index 607f4c7429..0d751bd2c2 100644 --- a/tests/fixtures/_util.py +++ b/tests/fixtures/_util.py @@ -1,6 +1,8 @@ import os import pathlib +FIXTURE_PATH = pathlib.Path(__file__).parent + def curjoin(_file): # return filepath relative to __file__ (this file) return os.path.join(os.path.dirname(__file__), _file) From 2cb4f39f76377afa60569805ffdaa6674f0a3f73 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 11:59:31 -0600 Subject: [PATCH 0925/2998] refactor(test): Remove curjoin, use FIXTURE_PATH --- tests/fixtures/_util.py | 7 +------ tests/test_cli.py | 14 +++++++------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/tests/fixtures/_util.py b/tests/fixtures/_util.py index 0d751bd2c2..d06aee3a9d 100644 --- a/tests/fixtures/_util.py +++ b/tests/fixtures/_util.py @@ -1,15 +1,10 @@ -import os import pathlib FIXTURE_PATH = pathlib.Path(__file__).parent -def curjoin(_file): # return filepath relative to __file__ (this file) - return os.path.join(os.path.dirname(__file__), _file) - - def loadfixture(_file): # return fixture data, relative to __file__ - return open(curjoin(_file)).read() + return open(FIXTURE_PATH / _file).read() def write_config( diff --git a/tests/test_cli.py b/tests/test_cli.py index b812d15a74..bccfd4af3c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,7 +28,7 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder -from .fixtures._util import curjoin, loadfixture +from .fixtures._util import FIXTURE_PATH, loadfixture def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): @@ -305,7 +305,7 @@ def test_load_workspace(server, monkeypatch): # a tmux session by the developer himself, delete the TMUX variable # temporarily. monkeypatch.delenv("TMUX", raising=False) - session_file = curjoin("workspacebuilder/two_pane.yaml") + session_file = FIXTURE_PATH / "workspacebuilder" / "two_pane.yaml" # open it detached session = load_workspace( @@ -321,7 +321,7 @@ def test_load_workspace_named_session(server, monkeypatch): # a tmux session by the developer himself, delete the TMUX variable # temporarily. monkeypatch.delenv("TMUX", raising=False) - session_file = curjoin("workspacebuilder/two_pane.yaml") + session_file = FIXTURE_PATH / "workspacebuilder" / "two_pane.yaml" # open it detached session = load_workspace( @@ -342,7 +342,7 @@ def test_load_workspace_name_match_regression_252( tmp_path: pathlib.Path, server, monkeypatch ): monkeypatch.delenv("TMUX", raising=False) - session_file = curjoin("workspacebuilder/two_pane.yaml") + session_file = FIXTURE_PATH / "workspacebuilder" / "two_pane.yaml" # open it detached session = load_workspace( @@ -407,8 +407,8 @@ def test_load_symlinked_workspace(server, tmp_path, monkeypatch): def test_regression_00132_session_name_with_dots( tmp_path: pathlib.Path, server, session ): - yaml_config = curjoin("workspacebuilder/regression_00132_dots.yaml") - cli_args = [yaml_config] + yaml_config = FIXTURE_PATH / "workspacebuilder" / "regression_00132_dots.yaml" + cli_args = [str(yaml_config)] inputs = [] runner = CliRunner() result = runner.invoke( @@ -1181,7 +1181,7 @@ def test_plugin_system_before_script( # a tmux session by the developer himself, delete the TMUX variable # temporarily. monkeypatch.delenv("TMUX", raising=False) - session_file = curjoin("workspacebuilder/plugin_bs.yaml") + session_file = FIXTURE_PATH / "workspacebuilder" / "plugin_bs.yaml" # open it detached session = load_workspace( From 1149a5bad134db93e8fbbf227c2669719cd24192 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 12:18:42 -0600 Subject: [PATCH 0926/2998] refactor(tests): loadfixture -> load_fixture --- tests/fixtures/_util.py | 2 +- tests/fixtures/config/expand2.py | 6 +- .../config/shell_command_before_session.py | 6 +- tests/fixtures/config_teamocil/layouts.py | 4 +- tests/fixtures/config_teamocil/test1.py | 4 +- tests/fixtures/config_teamocil/test2.py | 4 +- tests/fixtures/config_teamocil/test3.py | 4 +- tests/fixtures/config_teamocil/test4.py | 4 +- tests/fixtures/config_tmuxinator/test1.py | 4 +- tests/fixtures/config_tmuxinator/test2.py | 4 +- tests/fixtures/config_tmuxinator/test3.py | 4 +- tests/test_cli.py | 20 +++--- tests/test_workspacebuilder.py | 68 +++++++++---------- tests/test_workspacefreezer.py | 4 +- 14 files changed, 69 insertions(+), 69 deletions(-) diff --git a/tests/fixtures/_util.py b/tests/fixtures/_util.py index d06aee3a9d..b0c01c1f93 100644 --- a/tests/fixtures/_util.py +++ b/tests/fixtures/_util.py @@ -3,7 +3,7 @@ FIXTURE_PATH = pathlib.Path(__file__).parent -def loadfixture(_file): # return fixture data, relative to __file__ +def load_fixture(_file): # return fixture data, relative to __file__ return open(FIXTURE_PATH / _file).read() diff --git a/tests/fixtures/config/expand2.py b/tests/fixtures/config/expand2.py index 2673685b61..af00ec9253 100644 --- a/tests/fixtures/config/expand2.py +++ b/tests/fixtures/config/expand2.py @@ -1,8 +1,8 @@ import os -from .._util import loadfixture +from .._util import load_fixture -unexpanded_yaml = loadfixture("config/expand2-unexpanded.yaml") -expanded_yaml = loadfixture("config/expand2-expanded.yaml").format( +unexpanded_yaml = load_fixture("config/expand2-unexpanded.yaml") +expanded_yaml = load_fixture("config/expand2-expanded.yaml").format( HOME=os.path.expanduser("~") ) diff --git a/tests/fixtures/config/shell_command_before_session.py b/tests/fixtures/config/shell_command_before_session.py index ef1e89e60c..d7429097ad 100644 --- a/tests/fixtures/config/shell_command_before_session.py +++ b/tests/fixtures/config/shell_command_before_session.py @@ -1,4 +1,4 @@ -from .._util import loadfixture +from .._util import load_fixture -before = loadfixture("config/shell_command_before_session.yaml") -expected = loadfixture("config/shell_command_before_session-expected.yaml") +before = load_fixture("config/shell_command_before_session.yaml") +expected = load_fixture("config/shell_command_before_session-expected.yaml") diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index 686f8311c9..aaa7de25b2 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -teamocil_yaml = loadfixture("config_teamocil/layouts.yaml") +teamocil_yaml = load_fixture("config_teamocil/layouts.yaml") teamocil_dict = { "two-windows": { diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index 9633095710..4bbf3fe687 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -teamocil_yaml = loadfixture("config_teamocil/test1.yaml") +teamocil_yaml = load_fixture("config_teamocil/test1.yaml") teamocil_conf = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index e9a0f69b6c..bc78e1e0f8 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -teamocil_yaml = loadfixture("config_teamocil/test2.yaml") +teamocil_yaml = load_fixture("config_teamocil/test2.yaml") teamocil_dict = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index 0bc92980f2..7e33fcafc8 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -teamocil_yaml = loadfixture("config_teamocil/test3.yaml") +teamocil_yaml = load_fixture("config_teamocil/test3.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index 5827bfcabd..b734e4b4ca 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -teamocil_yaml = loadfixture("config_teamocil/test4.yaml") +teamocil_yaml = load_fixture("config_teamocil/test4.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index 138671942e..34295c974d 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -tmuxinator_yaml = loadfixture("config_tmuxinator/test1.yaml") +tmuxinator_yaml = load_fixture("config_tmuxinator/test1.yaml") tmuxinator_dict = { "windows": [ {"editor": {"layout": "main-vertical", "panes": ["vim", "guard"]}}, diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index 23273bf7dd..d1c97612b0 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -tmuxinator_yaml = loadfixture("config_tmuxinator/test2.yaml") +tmuxinator_yaml = load_fixture("config_tmuxinator/test2.yaml") tmuxinator_dict = { "project_name": "sample", diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index df2353f5c0..f4f3637076 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,6 +1,6 @@ -from .._util import loadfixture +from .._util import load_fixture -tmuxinator_yaml = loadfixture("config_tmuxinator/test3.yaml") +tmuxinator_yaml = load_fixture("config_tmuxinator/test3.yaml") tmuxinator_dict = { "name": "sample", diff --git a/tests/test_cli.py b/tests/test_cli.py index bccfd4af3c..1412a699de 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,7 +28,7 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder -from .fixtures._util import FIXTURE_PATH, loadfixture +from .fixtures._util import FIXTURE_PATH, load_fixture def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): @@ -861,7 +861,7 @@ def test_help(cli_args, monkeypatch): ], ) def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): - teamocil_config = loadfixture("config_teamocil/test4.yaml") + teamocil_config = load_fixture("config_teamocil/test4.yaml") teamocil_path = tmp_path / ".teamocil" teamocil_path.mkdir() @@ -900,7 +900,7 @@ def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): ], ) def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): - tmuxinator_config = loadfixture("config_tmuxinator/test3.yaml") + tmuxinator_config = load_fixture("config_tmuxinator/test3.yaml") tmuxinator_path = tmp_path / ".tmuxinator" tmuxinator_path.mkdir() @@ -1110,7 +1110,7 @@ def test_ls_cli(monkeypatch: pytest.MonkeyPatch, tmp_path: pathlib.Path): def test_load_plugins(monkeypatch_plugin_test_packages): from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder - plugins_config = loadfixture("workspacebuilder/plugin_bwb.yaml") + plugins_config = load_fixture("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(plugins_config).get() @@ -1193,7 +1193,7 @@ def test_plugin_system_before_script( def test_reattach_plugins(monkeypatch_plugin_test_packages, server): - config_plugins = loadfixture("workspacebuilder/plugin_r.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_r.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -1224,7 +1224,7 @@ def test_load_attached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1244,7 +1244,7 @@ def test_load_attached_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1264,7 +1264,7 @@ def test_load_attached_within_tmux(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1284,7 +1284,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1296,7 +1296,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): def test_load_append_windows_to_current_session(server, monkeypatch): - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e1f66d85b9..42eb0b23dc 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -14,11 +14,11 @@ from tmuxp.workspacebuilder import WorkspaceBuilder from . import example_dir, fixtures_dir -from .fixtures._util import loadfixture +from .fixtures._util import load_fixture def test_split_windows(session): - yaml_config = loadfixture("workspacebuilder/two_pane.yaml") + yaml_config = load_fixture("workspacebuilder/two_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -39,7 +39,7 @@ def test_split_windows(session): def test_split_windows_three_pane(session): - yaml_config = loadfixture("workspacebuilder/three_pane.yaml") + yaml_config = load_fixture("workspacebuilder/three_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") @@ -63,7 +63,7 @@ def test_split_windows_three_pane(session): def test_focus_pane_index(session): - yaml_config = loadfixture("workspacebuilder/focus_and_pane.yaml") + yaml_config = load_fixture("workspacebuilder/focus_and_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -133,7 +133,7 @@ def test_focus_pane_index(session): """.strip() ) def test_suppress_history(session): - yaml_config = loadfixture("workspacebuilder/suppress_history.yaml") + yaml_config = load_fixture("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -187,7 +187,7 @@ def assertIsMissing(cmd, hist): def test_session_options(session): - yaml_config = loadfixture("workspacebuilder/session_options.yaml") + yaml_config = load_fixture("workspacebuilder/session_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -201,7 +201,7 @@ def test_session_options(session): def test_global_options(session): - yaml_config = loadfixture("workspacebuilder/global_options.yaml") + yaml_config = load_fixture("workspacebuilder/global_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -222,7 +222,7 @@ def test_global_session_env_options(session, monkeypatch): main_pane_height = 8 monkeypatch.setenv("MAIN_PANE_HEIGHT", str(main_pane_height)) - yaml_config = loadfixture("workspacebuilder/env_var_options.yaml") + yaml_config = load_fixture("workspacebuilder/env_var_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -237,7 +237,7 @@ def test_global_session_env_options(session, monkeypatch): def test_window_options(session): - yaml_config = loadfixture("workspacebuilder/window_options.yaml") + yaml_config = load_fixture("workspacebuilder/window_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -267,7 +267,7 @@ def test_window_options(session): @pytest.mark.flaky(reruns=5) def test_window_options_after(session): - yaml_config = loadfixture("workspacebuilder/window_options_after.yaml") + yaml_config = load_fixture("workspacebuilder/window_options_after.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -312,7 +312,7 @@ def assert_last_line(p, s): def test_window_shell(session): - yaml_config = loadfixture("workspacebuilder/window_shell.yaml") + yaml_config = load_fixture("workspacebuilder/window_shell.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -333,7 +333,7 @@ def test_window_shell(session): def test_environment_variables(session): - yaml_config = loadfixture("workspacebuilder/environment_vars.yaml") + yaml_config = load_fixture("workspacebuilder/environment_vars.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -347,7 +347,7 @@ def test_environment_variables(session): def test_automatic_rename_option(session): """With option automatic-rename: on.""" - yaml_config = loadfixture("workspacebuilder/window_automatic_rename.yaml") + yaml_config = load_fixture("workspacebuilder/window_automatic_rename.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -424,7 +424,7 @@ def test_blank_pane_count(session): def test_start_directory(session, tmp_path: pathlib.Path): - yaml_config = loadfixture("workspacebuilder/start_directory.yaml") + yaml_config = load_fixture("workspacebuilder/start_directory.yaml") test_dir = tmp_path / "foo bar" test_dir.mkdir() test_config = yaml_config.format(TEST_DIR=test_dir) @@ -467,7 +467,7 @@ def test_start_directory_relative(session, tmp_path: pathlib.Path): $ tmuxp load . """ - yaml_config = loadfixture("workspacebuilder/start_directory_relative.yaml") + yaml_config = load_fixture("workspacebuilder/start_directory_relative.yaml") test_dir = tmp_path / "foo bar" test_dir.mkdir() @@ -514,7 +514,7 @@ def test_pane_order(session): """ - yaml_config = loadfixture("workspacebuilder/pane_ordering.yaml").format( + yaml_config = load_fixture("workspacebuilder/pane_ordering.yaml").format( HOME=os.path.realpath(os.path.expanduser("~")) ) @@ -565,7 +565,7 @@ def test_pane_order(session): def test_window_index(session): - yaml_config = loadfixture("workspacebuilder/window_index.yaml") + yaml_config = load_fixture("workspacebuilder/window_index.yaml") proc = session.cmd("show-option", "-gv", "base-index") base_index = int(proc.stdout[0]) name_index_map = {"zero": 0 + base_index, "one": 1 + base_index, "five": 5} @@ -583,7 +583,7 @@ def test_window_index(session): def test_before_load_throw_error_if_retcode_error(server): - config_script_fails = loadfixture("workspacebuilder/config_script_fails.yaml") + config_script_fails = load_fixture("workspacebuilder/config_script_fails.yaml") sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( fixtures_dir=fixtures_dir, @@ -607,7 +607,7 @@ def test_before_load_throw_error_if_retcode_error(server): def test_before_load_throw_error_if_file_not_exists(server): - config_script_not_exists = loadfixture( + config_script_not_exists = load_fixture( "workspacebuilder/config_script_not_exists.yaml" ) sconfig = kaptan.Kaptan(handler="yaml") @@ -633,7 +633,7 @@ def test_before_load_throw_error_if_file_not_exists(server): def test_before_load_true_if_test_passes(server): - config_script_completes = loadfixture( + config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) assert os.path.exists(os.path.join(fixtures_dir, "script_complete.sh")) @@ -654,7 +654,7 @@ def test_before_load_true_if_test_passes(server): def test_before_load_true_if_test_passes_with_args(server): - config_script_completes = loadfixture( + config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) @@ -678,7 +678,7 @@ def test_before_load_true_if_test_passes_with_args(server): def test_plugin_system_before_workspace_builder( monkeypatch_plugin_test_packages, session ): - config_plugins = loadfixture("workspacebuilder/plugin_bwb.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -694,7 +694,7 @@ def test_plugin_system_before_workspace_builder( def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, session): - config_plugins = loadfixture("workspacebuilder/plugin_owc.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_owc.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -710,7 +710,7 @@ def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, sessio def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, session): - config_plugins = loadfixture("workspacebuilder/plugin_awf.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_awf.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -726,7 +726,7 @@ def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, s def test_plugin_system_on_window_create_multiple_windows(session): - config_plugins = loadfixture("workspacebuilder/plugin_owc_multiple_windows.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_owc_multiple_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -745,7 +745,7 @@ def test_plugin_system_on_window_create_multiple_windows(session): def test_plugin_system_after_window_finished_multiple_windows( monkeypatch_plugin_test_packages, session ): - config_plugins = loadfixture("workspacebuilder/plugin_awf_multiple_windows.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_awf_multiple_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -762,7 +762,7 @@ def test_plugin_system_after_window_finished_multiple_windows( def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, session): - config_plugins = loadfixture("workspacebuilder/plugin_multiple_plugins.yaml") + config_plugins = load_fixture("workspacebuilder/plugin_multiple_plugins.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -785,7 +785,7 @@ def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, sessio def test_load_configs_same_session(server): - yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + yaml_config = load_fixture("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -795,7 +795,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + yaml_config = load_fixture("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -805,7 +805,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 2 assert len(server.sessions[1]._windows) == 2 - yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + yaml_config = load_fixture("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -818,7 +818,7 @@ def test_load_configs_same_session(server): def test_load_configs_separate_sessions(server): - yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + yaml_config = load_fixture("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -828,7 +828,7 @@ def test_load_configs_separate_sessions(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + yaml_config = load_fixture("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -842,14 +842,14 @@ def test_load_configs_separate_sessions(server): def test_find_current_active_pane(server, monkeypatch): - yaml_config = loadfixture("workspacebuilder/three_windows.yaml") + yaml_config = load_fixture("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) builder.build() - yaml_config = loadfixture("workspacebuilder/two_windows.yaml") + yaml_config = load_fixture("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index f85dc5dd24..fb34bc3554 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -6,11 +6,11 @@ from tmuxp import config from tmuxp.workspacebuilder import WorkspaceBuilder, freeze -from .fixtures._util import loadfixture +from .fixtures._util import load_fixture def test_freeze_config(session): - yaml_config = loadfixture("workspacefreezer/sampleconfig.yaml") + yaml_config = load_fixture("workspacefreezer/sampleconfig.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() From fdfb854e27d185f57252f06879af7a9b01abaefd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 13:57:38 -0600 Subject: [PATCH 0927/2998] ci(pytest): --reruns=0 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 91d6b136b4..22b23e6740 100644 --- a/setup.cfg +++ b/setup.cfg @@ -41,7 +41,7 @@ ignore = E111, W503 [tool:pytest] -addopts = --reruns=5 +addopts = --reruns=0 [isort] combine_as_imports= true From 75171817b1509007148f1c974319a59c6136bfe7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 13:59:42 -0600 Subject: [PATCH 0928/2998] ci(pytest): Ignore distutils version warning for now --- setup.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.cfg b/setup.cfg index 22b23e6740..84854c6399 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,6 +42,8 @@ ignore = E111, [tool:pytest] addopts = --reruns=0 +filterwarnings = + ignore:distutils Version classes are deprecated. Use packaging.version instead. [isort] combine_as_imports= true From 2b110450cca5b84ac2111a8ecba0ec2c15d94c16 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 14:04:08 -0600 Subject: [PATCH 0929/2998] Panes: Allow passing enter: false --- tmuxp/workspacebuilder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 9be5274ceb..a470ea07aa 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -362,8 +362,10 @@ def get_pane_shell(): else: suppress = True + enter = pconf.get("enter", True) + for cmd in pconf["shell_command"]: - p.send_keys(cmd, suppress_history=suppress) + p.send_keys(cmd, suppress_history=suppress, enter=enter) if "focus" in pconf and pconf["focus"]: w.select_pane(p["pane_id"]) From 38526e5d8b128a8841773768963f383ca483732a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 14:52:47 -0600 Subject: [PATCH 0930/2998] test: test_loader_workspace_enter --- tests/test_workspacebuilder.py | 99 ++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 42eb0b23dc..c5771a6024 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1,11 +1,14 @@ """Test for tmuxp workspacebuilder.""" import os import pathlib +import textwrap +import time import pytest import kaptan +import libtmux from libtmux import Window from libtmux.common import has_gte_version from libtmux.test import retry, temp_session @@ -869,3 +872,99 @@ def test_find_current_active_pane(server, monkeypatch): builder = WorkspaceBuilder(sconf=sconfig, server=server) assert builder.find_current_attached_session() == second_session + + +@pytest.mark.parametrize( + "yaml,output,should_see", + [ + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: echo "___$((1 + 3))___" + enter: false + """ + ), + "___4___", + False, + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - echo "___$((1 + 3))___" + enter: false + """ + ), + "___4___", + False, + ], + [ + textwrap.dedent( + """ +session_name: Should execute +windows: +- panes: + - shell_command: echo "___$((1 + 3))___" + """ + ), + "___4___", + True, + ], + [ + textwrap.dedent( + """ +session_name: Should execute +windows: +- panes: + - shell_command: + - echo "___$((1 + 3))___" + """ + ), + "___4___", + True, + ], + ], + ids=[ + "pane_enter_false_shortform", + "pane_enter_false_longform", + "pane_enter_default_shortform", + "pane_enter_default_longform", + ], +) +def test_load_workspace_enter( + tmp_path: pathlib.Path, + server: libtmux.Server, + monkeypatch: pytest.MonkeyPatch, + yaml, + output, + should_see, +): + yaml_config = tmp_path / "simple.yaml" + yaml_config.write_text( + yaml, + encoding="utf-8", + ) + sconfig = kaptan.Kaptan(handler="yaml") + sconfig = sconfig.import_config(str(yaml_config)).get() + sconfig = config.expand(sconfig) + sconfig = config.trickle(sconfig) + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + time.sleep(1) + + session = builder.session + pane = session.attached_pane + + captured_pane = "\n".join(pane.capture_pane()) + + if should_see: + assert output in captured_pane + else: + assert output not in captured_pane From eb85821bcf8aa74fea2d736e02034094a2c84905 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 15:52:28 -0600 Subject: [PATCH 0931/2998] docs: `enter: false` Documents and examples for #53 #293 #735 --- CHANGES | 10 ++++++++++ docs/examples.md | 27 +++++++++++++++++++++++++++ examples/skip-send.json | 13 +++++++++++++ examples/skip-send.yaml | 5 +++++ 4 files changed, 55 insertions(+) create mode 100644 examples/skip-send.json create mode 100644 examples/skip-send.yaml diff --git a/CHANGES b/CHANGES index 29d992c919..71ce18513e 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,16 @@ #### What's new +- #747: Skip execution via `enter: false` + + ```yaml + session_name: Should not execute + windows: + - panes: + - shell_command: echo "___$((1 + 3))___" + enter: false + ``` + - #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the `--config-format` and filename (`--save-to`). This means you can do it all in one command: diff --git a/docs/examples.md b/docs/examples.md index 9437ecb939..8da128eab5 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -328,6 +328,33 @@ This will add the `shell_command` to the bash history in the pane. ```` +## Skip command execution + +```{versionadded} 1.10.0b1 +`enter: false` option +``` + +Omit sending {kbd}`enter` to key commands. Equivalent to +[`send_keys(enter=False)`](libtmux.Pane.send_keys). + +````{tab} YAML + +```{literalinclude} ../examples/skip-send.yaml +:language: yaml + +``` + +```` + +````{tab} JSON + +```{literalinclude} ../examples/skip-send.json +:language: json + +``` + +```` + ## Window Index You can specify a window's index using the `window_index` property. Windows diff --git a/examples/skip-send.json b/examples/skip-send.json new file mode 100644 index 0000000000..939fcc36b1 --- /dev/null +++ b/examples/skip-send.json @@ -0,0 +1,13 @@ +{ + "session_name": "Should not execute", + "windows": [ + { + "panes": [ + { + "shell_command": "echo \"___$((1 + 3))___\"", + "enter": false + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/skip-send.yaml b/examples/skip-send.yaml new file mode 100644 index 0000000000..b28c7b7052 --- /dev/null +++ b/examples/skip-send.yaml @@ -0,0 +1,5 @@ +session_name: Should not execute +windows: +- panes: + - shell_command: echo "___$((1 + 3))___" + enter: false From 67013a118d1bcefb31453a9c49f5e66598210119 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 15:54:52 -0600 Subject: [PATCH 0932/2998] Release v1.10.0b1 Includes enter:false support via #747 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5cac3eed6a..41e404f34d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b0" +version = "1.10.0b1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 28687bcfd3..bc79381e2b 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b0" +__version__ = "1.10.0b1" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 633b9adacde063b256bc3a34d3d74b0d243fb6c8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 15:59:12 -0600 Subject: [PATCH 0933/2998] docs: Disable tab synchronization Credit to @kalekundert's snippet. See also: - https://github.com/pradyunsg/sphinx-inline-tabs/issues/29 - https://github.com/pradyunsg/sphinx-inline-tabs/issues/18#issuecomment-1039284736 --- docs/conf.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 06597aa9d9..1eba0e0856 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -217,3 +217,13 @@ def linkcode_resolve(domain, info): # NOQA: C901 fn, linespec, ) + + +def remove_tabs_js(app, exc): + if app.builder.format == "html" and not exc: + tabs_js = Path(app.builder.outdir) / "_static" / "tabs.js" + tabs_js.unlink() + + +def setup(app): + app.connect("build-finished", remove_tabs_js) From a18143d240f5c2b14ba8aef750b5e0373e691382 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 17:33:22 -0600 Subject: [PATCH 0934/2998] docs(cli): Copy-paste improvements --- docs/cli.md | 66 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index f81b482cbe..b9662f39cc 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -34,11 +34,17 @@ eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" ```console $ tmuxp shell +``` +```console $ tmuxp shell [session_name] +``` +```console $ tmuxp shell [session_name] [window_name] +``` +```console $ tmuxp shell -c 'python code' ``` @@ -76,8 +82,10 @@ Python 3.7 supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and supports compatible debuggers, for instance [ipdb][ipdb]: ```console - $ pip install --user ipdb +``` + +```console $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell ``` @@ -85,27 +93,34 @@ You can also pass in python code directly, similar to `python -c`, do this via `tmuxp -c`: ```console - $ tmuxp shell -c 'print(session.name); print(window.name)' my_server my_window +``` +```console $ tmuxp shell my_server -c 'print(session.name); print(window.name)' my_server my_window +``` +```console $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' my_server my_window +``` +```console $ tmuxp shell my_server my_window -c 'print(window.name.upper())' MY_WINDOW +``` + +Assuming inside a tmux pane or one is attached on default server: -# Assuming inside a tmux pane or one is attached on default server +```console $ tmuxp shell -c 'print(pane.id); print(pane.window.name)' %2 my_window - ``` [pep 553]: https://www.python.org/dev/peps/pep-0553/ @@ -154,37 +169,54 @@ shorthands: 2. The name of the project file in your {}`$HOME/.tmuxp` folder 3. The direct path of the tmuxp file you want to load +Path to folder with `.tmuxp.yaml`, `.tmuxp.yml`, `.tmuxp.json`: + ```console -# path to folder with .tmuxp.{yaml,yml,json} $ tmuxp load . +``` + +```console $ tmuxp load ../ +``` + +```console $ tmuxp load path/to/folder/ +``` + +```console $ tmuxp load /path/to/folder/ +``` -# name of the config, assume $HOME/.tmuxp/myconfig.yaml +Name of the config, assume `$HOME/.tmuxp/myconfig.yaml`: +```console $ tmuxp load myconfig +``` + +Direct path to json/yaml file: -# direct path to json/yaml file +```console $ tmuxp load ./myfile.yaml +``` + +```console $ tmuxp load /abs/path/to/myfile.yaml +``` + +```console $ tmuxp load ~/myfile.yaml ``` Absolute and relative directory paths are supported. ```console - $ tmuxp load [filename] - ``` Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working directory may be loaded with: ```console - $ tmuxp load . - ``` If you try to load a config file from within a tmux session, it will ask you @@ -201,7 +233,13 @@ All of these options can be preselected to skip the prompt: ```console $ tmuxp load -y config # load attached +``` + +```console $ tmuxp load -d config # load detached +``` + +```console $ tmuxp load -a config # append windows ``` @@ -210,18 +248,14 @@ without being attached. The last one will be attached if there is no `-d` flag on the command line. ```console - $ tmuxp load [filename1] [filename2] ... - ``` A session name can be provided at the terminal. If multiple sessions are created, the last session is named from the terminal. ```console - $ tmuxp load -s [new_session_name] [filename1] ... - ``` The output of the `load` command can be logged to a file for @@ -229,10 +263,8 @@ debugging purposes. the log level can be controlled with the global `--log-level` option (defaults to INFO). ```console - $ tmuxp load [filename] --log-file [log_filename] $ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] - ``` (cli-debug-info)= From f5518bdb12f534e1da1d6dadd00bf3dd860e899f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 17:42:30 -0600 Subject: [PATCH 0935/2998] docs(cli): More improvements --- docs/cli.md | 67 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index b9662f39cc..332738e447 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -231,17 +231,21 @@ Or (a)ppend windows in the current active session? All of these options can be preselected to skip the prompt: -```console -$ tmuxp load -y config # load attached -``` +- Attach / open client after load: -```console -$ tmuxp load -d config # load detached -``` + ```console + $ tmuxp load -y config + ``` +- Detached / open in background: -```console -$ tmuxp load -a config # append windows -``` + ```console + $ tmuxp load -d config + ``` +- Append windows to existing session + + ```console + $ tmuxp load -a config + ``` Multiple sessions can be loaded at once. The first ones will be created without being attached. The last one will be attached if there is no @@ -264,6 +268,9 @@ debugging purposes. the log level can be controlled with the global ```console $ tmuxp load [filename] --log-file [log_filename] +``` + +```console $ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] ``` @@ -293,25 +300,61 @@ environment: ### From teamocil +````{tab} YAML + +```console +$ tmuxp import teamocil /path/to/file.yaml +``` + +```` + +````{tab} JSON + ```console -$ tmuxp import teamocil /path/to/file.{json,yaml} +$ tmuxp import teamocil /path/to/file.json ``` +```` + (import-tmuxinator)= ### From tmuxinator +````{tab} YAML + +```console +$ tmuxp import tmuxinator /path/to/file.yaml +``` + +```` + +````{tab} JSON + ```console -$ tmuxp import tmuxinator /path/to/file.{json,yaml} +$ tmuxp import tmuxinator /path/to/file.json ``` +```` + (convert-config)= ## Convert between YAML and JSON +````{tab} YAML -> JSON + ```console -$ tmuxp convert /path/to/file.{json,yaml} +$ tmuxp convert /path/to/file.yaml ``` +```` + +````{tab} JSON -> YAML + +```console +$ tmuxp convert /path/to/file.json +``` + +```` + tmuxp automatically will prompt to convert `.yaml` to `.json` and `.json` to `.yaml`. From 6bc6f1a2295660e3080cba2c5b0f5b4278dde2cd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 17:46:01 -0600 Subject: [PATCH 0936/2998] build(deps): libtmux 0.11.0b1 -> 0.11.0b2 (stdout whitelines fixed) --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index dadf88ca8a..8351154aee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -425,7 +425,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.11.0b1" +version = "0.11.0b2" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1274,7 +1274,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "48fd7cb07d471dc48474d5a7adb935799d3a108f5d7e89d9079a15e7dcbe772e" +content-hash = "3c9c801a45aa3d93cb68383a7d10b41cf8287fda06bdcfff6be32d34baf7d84f" [metadata.files] aafigure = [ @@ -1544,8 +1544,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.11.0b1-py3-none-any.whl", hash = "sha256:b972f0ae378cf159c63eb8bfdc2a1e0ffad3ac1f6e7b74000dd95b107e803219"}, - {file = "libtmux-0.11.0b1.tar.gz", hash = "sha256:a497dbb24235c32254e71d501eb45adb6073aa52fbb7ed2bc69afbcc075165a1"}, + {file = "libtmux-0.11.0b2-py3-none-any.whl", hash = "sha256:a5c7f2e399106c861e5eb7e0efafe8668570c9762402922ea19685cb63304ee8"}, + {file = "libtmux-0.11.0b2.tar.gz", hash = "sha256:04e268681d3cff9f01f7f68a0fab33fd2f06c5ecb6e67ef19a630e4a26ba41a3"}, ] livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, diff --git a/pyproject.toml b/pyproject.toml index 41e404f34d..06e555e7cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.11.0b1" +libtmux = "~0.11.0b2" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From ecbc2cf39b2a1be2366f3b0fb4e1c99ae83cf55b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 17:46:50 -0600 Subject: [PATCH 0937/2998] Tag v1.10.0b2 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 06e555e7cf..4c8f452c00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b1" +version = "1.10.0b2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index bc79381e2b..5beebedc98 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b1" +__version__ = "1.10.0b2" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 0e9d4ac79d61439a74eb39974f184cc2a878dccd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 18:18:21 -0600 Subject: [PATCH 0938/2998] docs(README): Fix highlighting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8d1e7e009..2994d49efa 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ $ tmuxp load mysession ./another/project/ Name a session: -```bash +```console $ tmuxp load -s session_name ./mysession.yaml ``` From e07001eeab1f2d7dccc4bac041c69a758ce3a649 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 07:49:15 -0500 Subject: [PATCH 0939/2998] docs(skip command): Leave note about #751 --- docs/examples.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/examples.md b/docs/examples.md index 8da128eab5..d47970321d 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -331,7 +331,8 @@ This will add the `shell_command` to the bash history in the pane. ## Skip command execution ```{versionadded} 1.10.0b1 -`enter: false` option +`enter: false` option. This is only available at the pane (not command level) +until [#751](https://github.com/tmux-python/tmuxp/issues/751) is published. ``` Omit sending {kbd}`enter` to key commands. Equivalent to From 4d558bbb84f9b9ec2729f7fcd934e0e0f2e71e26 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 07:50:30 -0500 Subject: [PATCH 0940/2998] docs(plugins): Just inline tabs --- docs/plugin_system.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/plugin_system.md b/docs/plugin_system.md index 7893d800a8..6552efc597 100644 --- a/docs/plugin_system.md +++ b/docs/plugin_system.md @@ -12,20 +12,24 @@ your tmuxp configuration file. ### Example Configurations -#### YAML +````{tab} YAML ```{literalinclude} ../examples/plugin-system.yaml :language: yaml ``` -#### JSON +```` + +````{tab} JSON ```{literalinclude} ../examples/plugin-system.json :language: json ``` +```` + [poetry]: https://python-poetry.org/ ## Developing a Plugin From 9b5a8c9c336e284d0280c0d9570ee76707444e1e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 08:05:50 -0500 Subject: [PATCH 0941/2998] docs(README): Tweaks --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2994d49efa..0635ae37ae 100644 --- a/README.md +++ b/README.md @@ -19,18 +19,26 @@ web](https://leanpub.com/the-tao-of-tmux/read). # Installation -## Pip +pip: ```console $ pip install --user tmuxp ``` -## Homebrew +Homebrew: ```console $ brew install tmuxp ``` +Debian / ubuntu: + +```console +$ sudo apt install tmuxp +``` + +Find the package for your distro on repology: https://repology.org/project/tmuxp/versions + # Load a tmux session Load tmux sessions via json and YAML, From 8238ddf11a4cf7370cb8e0928c32ebe282079a0d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:15:10 -0500 Subject: [PATCH 0942/2998] config(flake8): Update to latest black formatting suggestion See also: https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html?highlight=compatible#id2 --- setup.cfg | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/setup.cfg b/setup.cfg index 84854c6399..67686ffa91 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,42 +3,7 @@ exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N max-line-length = 88 # Stuff we ignore thanks to black: https://github.com/ambv/black/issues/429 -ignore = E111, - E121, - E122, - E123, - E124, - E125, - E126, - E201, - E202, - E203, - E221, - E222, - E225, - E226, - E227, - E231, - E241, - E251, - E261, - E262, - E265, - E271, - E272, - E302, - E303, - E306, - E502, - E701, - E702, - E703, - E704, - W291, - W292, - W293, - W391, - W503 +extend-ignore = E203 [tool:pytest] addopts = --reruns=0 From 58e426c8d565d30203115fe781235f6ca8968241 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:17:05 -0500 Subject: [PATCH 0943/2998] ci(isort): Use black config See also: https://black.readthedocs.io/en/stable/guides/using_black_with_other_tools.html?highlight=compatible#isort --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index 67686ffa91..c271bb3b4f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -11,6 +11,7 @@ filterwarnings = ignore:distutils Version classes are deprecated. Use packaging.version instead. [isort] +profile = black combine_as_imports= true default_section = THIRDPARTY include_trailing_comma = true From 8f057fd668a31b9841b59b0e1ab9a97be15ae197 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 08:42:41 -0500 Subject: [PATCH 0944/2998] tests(conf): Refactor tmpdir -> tmp_path --- tests/test_config.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 181751684b..61ce2debe7 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,5 +1,6 @@ """Test for tmuxp configuration import, inlining, expanding and export.""" import os +import pathlib import pytest @@ -10,7 +11,7 @@ from . import example_dir from .fixtures import config as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") +TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" def load_yaml(yaml): @@ -21,23 +22,23 @@ def load_config(_file): return kaptan.Kaptan().import_config(_file).get() -def test_export_json(tmpdir): - json_config_file = tmpdir.join("config.json") +def test_export_json(tmp_path: pathlib.Path): + json_config_file = tmp_path / "config.json" configparser = kaptan.Kaptan() configparser.import_config(fixtures.sampleconfig.sampleconfigdict) json_config_data = configparser.export("json", indent=2) - json_config_file.write(json_config_data) + json_config_file.write_text(json_config_data, encoding="utf-8") new_config = kaptan.Kaptan() new_config_data = new_config.import_config(str(json_config_file)).get() assert fixtures.sampleconfig.sampleconfigdict == new_config_data -def test_export_yaml(tmpdir): - yaml_config_file = tmpdir.join("config.yaml") +def test_export_yaml(tmp_path: pathlib.Path): + yaml_config_file = tmp_path / "config.yaml" configparser = kaptan.Kaptan() sampleconfig = config.inline(fixtures.sampleconfig.sampleconfigdict) @@ -45,34 +46,37 @@ def test_export_yaml(tmpdir): yaml_config_data = configparser.export("yaml", indent=2, default_flow_style=False) - yaml_config_file.write(yaml_config_data) + yaml_config_file.write_text(yaml_config_data, encoding="utf-8") new_config_data = load_config(str(yaml_config_file)) assert fixtures.sampleconfig.sampleconfigdict == new_config_data -def test_scan_config(tmpdir): +def test_scan_config(tmp_path: pathlib.Path): configs = [] - garbage_file = tmpdir.join("config.psd") - garbage_file.write("wat") + garbage_file = tmp_path / "config.psd" + garbage_file.write_text("wat", encoding="utf-8") - for r, d, f in os.walk(str(tmpdir)): + for r, d, f in os.walk(str(tmp_path)): for filela in (x for x in f if x.endswith((".json", ".ini", "yaml"))): - configs.append(str(tmpdir.join(filela))) + configs.append(str(tmp_path / filela)) files = 0 - if tmpdir.join("config.json").check(): + config_json = tmp_path / "config.json" + config_yaml = tmp_path / "config.yaml" + config_ini = tmp_path / "config.ini" + if config_json.exists(): files += 1 - assert str(tmpdir.join("config.json")) in configs + assert str(config_json) in configs - if tmpdir.join("config.yaml").check(): + if config_yaml.exists(): files += 1 - assert str(tmpdir.join("config.yaml")) in configs + assert str(config_yaml) in configs - if tmpdir.join("config.ini").check(): + if config_ini.exists(): files += 1 - assert str(tmpdir.join("config.ini")) in configs + assert str(config_ini) in configs assert len(configs) == files From a1d56e3bc2c55ee372c93e2425f0f036f0749693 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:07:57 -0500 Subject: [PATCH 0945/2998] refactor(tests): Move test dir constants to pathlib.Path --- tests/__init__.py | 8 ++++---- tests/test_config.py | 19 ++++++++++++++----- tests/test_util.py | 12 +++++------- tests/test_workspacebuilder.py | 20 ++++++++++---------- 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index 89d3f1684f..1872e36b13 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -4,8 +4,8 @@ ~~~~~~~~~~~ """ -import os +import pathlib -current_dir = os.path.abspath(os.path.dirname(__file__)) -example_dir = os.path.abspath(os.path.join(current_dir, "..", "examples")) -fixtures_dir = os.path.realpath(os.path.join(current_dir, "fixtures")) +tests_dir = pathlib.Path(__file__).parent +example_dir = tests_dir.parent / "examples" +fixtures_dir = tests_dir / "fixtures" diff --git a/tests/test_config.py b/tests/test_config.py index 61ce2debe7..ba175e8bc2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,6 +1,7 @@ """Test for tmuxp configuration import, inlining, expanding and export.""" import os import pathlib +from typing import Union import pytest @@ -14,12 +15,20 @@ TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" -def load_yaml(yaml): - return kaptan.Kaptan(handler="yaml").import_config(yaml).get() +def load_yaml(path: Union[str, pathlib.Path]) -> str: + return ( + kaptan.Kaptan(handler="yaml") + .import_config(str(path) if isinstance(path, pathlib.Path) else path) + .get() + ) -def load_config(_file): - return kaptan.Kaptan().import_config(_file).get() +def load_config(path: Union[str, pathlib.Path]) -> str: + return ( + kaptan.Kaptan() + .import_config(str(path) if isinstance(path, pathlib.Path) else path) + .get() + ) def test_export_json(tmp_path: pathlib.Path): @@ -282,7 +291,7 @@ def test_expands_blank_panes(): """ - yaml_config_file = os.path.join(example_dir, "blank-panes.yaml") + yaml_config_file = example_dir / "blank-panes.yaml" test_config = load_config(yaml_config_file) assert config.expand(test_config) == fixtures.expand_blank.expected diff --git a/tests/test_util.py b/tests/test_util.py index e87c3bf0f9..aa7b79f3f7 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,6 +1,4 @@ """Tests for utility functions in tmux.""" -import os - import pytest from tmuxp import exc @@ -11,7 +9,7 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): - script_file = os.path.join(fixtures_dir, "script_noexists.sh") + script_file = fixtures_dir / "script_noexists.sh" with pytest.raises(BeforeLoadScriptNotExists): run_before_script(script_file) @@ -21,14 +19,14 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): def test_raise_BeforeLoadScriptError_if_retcode(): - script_file = os.path.join(fixtures_dir, "script_failed.sh") + script_file = fixtures_dir / "script_failed.sh" with pytest.raises(BeforeLoadScriptError): run_before_script(script_file) def test_return_stdout_if_ok(capsys): - script_file = os.path.join(fixtures_dir, "script_complete.sh") + script_file = fixtures_dir / "script_complete.sh" run_before_script(script_file) out, err = capsys.readouterr() @@ -36,7 +34,7 @@ def test_return_stdout_if_ok(capsys): def test_beforeload_returncode(): - script_file = os.path.join(fixtures_dir, "script_failed.sh") + script_file = fixtures_dir / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) @@ -44,7 +42,7 @@ def test_beforeload_returncode(): def test_beforeload_returns_stderr_messages(): - script_file = os.path.join(fixtures_dir, "script_failed.sh") + script_file = fixtures_dir / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index c5771a6024..737a59f9d0 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -405,8 +405,8 @@ def test_automatic_rename_option(session): def test_blank_pane_count(session): """:todo: Verify blank panes of various types build into workspaces.""" - yaml_config_file = os.path.join(example_dir, "blank-panes.yaml") - test_config = kaptan.Kaptan().import_config(yaml_config_file).get() + yaml_config_file = example_dir / "blank-panes.yaml" + test_config = kaptan.Kaptan().import_config(str(yaml_config_file)).get() test_config = config.expand(test_config) builder = WorkspaceBuilder(sconf=test_config) builder.build(session=session) @@ -590,7 +590,7 @@ def test_before_load_throw_error_if_retcode_error(server): sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( fixtures_dir=fixtures_dir, - script_failed=os.path.join(fixtures_dir, "script_failed.sh"), + script_failed=fixtures_dir / "script_failed.sh", ) sconfig = sconfig.import_config(yaml).get() @@ -616,7 +616,7 @@ def test_before_load_throw_error_if_file_not_exists(server): sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_not_exists.format( fixtures_dir=fixtures_dir, - script_not_exists=os.path.join(fixtures_dir, "script_not_exists.sh"), + script_not_exists=fixtures_dir / "script_not_exists.sh", ) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) @@ -639,11 +639,12 @@ def test_before_load_true_if_test_passes(server): config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) - assert os.path.exists(os.path.join(fixtures_dir, "script_complete.sh")) + script_complete_sh = fixtures_dir / "script_complete.sh" + assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( fixtures_dir=fixtures_dir, - script_complete=os.path.join(fixtures_dir, "script_complete.sh"), + script_complete=script_complete_sh, ) sconfig = sconfig.import_config(yaml).get() @@ -660,12 +661,11 @@ def test_before_load_true_if_test_passes_with_args(server): config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) - - assert os.path.exists(os.path.join(fixtures_dir, "script_complete.sh")) + script_complete_sh = fixtures_dir / "script_complete.sh" + assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( - fixtures_dir=fixtures_dir, - script_complete=os.path.join(fixtures_dir, "script_complete.sh") + " -v", + fixtures_dir=fixtures_dir, script_complete=script_complete_sh ) sconfig = sconfig.import_config(yaml).get() From 05bb102175e58106f5969ac332f405a568dfc069 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:10:31 -0500 Subject: [PATCH 0946/2998] refactor(tests): Rename constants to _dir -> _PATH and uppercase --- tests/__init__.py | 6 +++--- tests/test_config.py | 4 ++-- tests/test_util.py | 12 ++++++------ tests/test_workspacebuilder.py | 20 ++++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index 1872e36b13..6233b23481 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -6,6 +6,6 @@ """ import pathlib -tests_dir = pathlib.Path(__file__).parent -example_dir = tests_dir.parent / "examples" -fixtures_dir = tests_dir / "fixtures" +TESTS_PATH = pathlib.Path(__file__).parent +EXAMPLE_PATH = TESTS_PATH.parent / "examples" +FIXTURES_PATH = TESTS_PATH / "fixtures" diff --git a/tests/test_config.py b/tests/test_config.py index ba175e8bc2..7e3a0785d0 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -9,7 +9,7 @@ from tmuxp import config, exc -from . import example_dir +from . import EXAMPLE_PATH from .fixtures import config as fixtures TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" @@ -291,7 +291,7 @@ def test_expands_blank_panes(): """ - yaml_config_file = example_dir / "blank-panes.yaml" + yaml_config_file = EXAMPLE_PATH / "blank-panes.yaml" test_config = load_config(yaml_config_file) assert config.expand(test_config) == fixtures.expand_blank.expected diff --git a/tests/test_util.py b/tests/test_util.py index aa7b79f3f7..c5f5b53824 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -5,11 +5,11 @@ from tmuxp.exc import BeforeLoadScriptError, BeforeLoadScriptNotExists from tmuxp.util import get_session, run_before_script -from . import fixtures_dir +from . import FIXTURES_PATH def test_raise_BeforeLoadScriptNotExists_if_not_exists(): - script_file = fixtures_dir / "script_noexists.sh" + script_file = FIXTURES_PATH / "script_noexists.sh" with pytest.raises(BeforeLoadScriptNotExists): run_before_script(script_file) @@ -19,14 +19,14 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): def test_raise_BeforeLoadScriptError_if_retcode(): - script_file = fixtures_dir / "script_failed.sh" + script_file = FIXTURES_PATH / "script_failed.sh" with pytest.raises(BeforeLoadScriptError): run_before_script(script_file) def test_return_stdout_if_ok(capsys): - script_file = fixtures_dir / "script_complete.sh" + script_file = FIXTURES_PATH / "script_complete.sh" run_before_script(script_file) out, err = capsys.readouterr() @@ -34,7 +34,7 @@ def test_return_stdout_if_ok(capsys): def test_beforeload_returncode(): - script_file = fixtures_dir / "script_failed.sh" + script_file = FIXTURES_PATH / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) @@ -42,7 +42,7 @@ def test_beforeload_returncode(): def test_beforeload_returns_stderr_messages(): - script_file = fixtures_dir / "script_failed.sh" + script_file = FIXTURES_PATH / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 737a59f9d0..33c368fbcd 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -16,7 +16,7 @@ from tmuxp.cli import load_plugins from tmuxp.workspacebuilder import WorkspaceBuilder -from . import example_dir, fixtures_dir +from . import EXAMPLE_PATH, FIXTURES_PATH from .fixtures._util import load_fixture @@ -405,7 +405,7 @@ def test_automatic_rename_option(session): def test_blank_pane_count(session): """:todo: Verify blank panes of various types build into workspaces.""" - yaml_config_file = example_dir / "blank-panes.yaml" + yaml_config_file = EXAMPLE_PATH / "blank-panes.yaml" test_config = kaptan.Kaptan().import_config(str(yaml_config_file)).get() test_config = config.expand(test_config) builder = WorkspaceBuilder(sconf=test_config) @@ -589,8 +589,8 @@ def test_before_load_throw_error_if_retcode_error(server): config_script_fails = load_fixture("workspacebuilder/config_script_fails.yaml") sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( - fixtures_dir=fixtures_dir, - script_failed=fixtures_dir / "script_failed.sh", + fixtures_dir=FIXTURES_PATH, + script_failed=FIXTURES_PATH / "script_failed.sh", ) sconfig = sconfig.import_config(yaml).get() @@ -615,8 +615,8 @@ def test_before_load_throw_error_if_file_not_exists(server): ) sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_not_exists.format( - fixtures_dir=fixtures_dir, - script_not_exists=fixtures_dir / "script_not_exists.sh", + fixtures_dir=FIXTURES_PATH, + script_not_exists=FIXTURES_PATH / "script_not_exists.sh", ) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) @@ -639,11 +639,11 @@ def test_before_load_true_if_test_passes(server): config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) - script_complete_sh = fixtures_dir / "script_complete.sh" + script_complete_sh = FIXTURES_PATH / "script_complete.sh" assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( - fixtures_dir=fixtures_dir, + fixtures_dir=FIXTURES_PATH, script_complete=script_complete_sh, ) @@ -661,11 +661,11 @@ def test_before_load_true_if_test_passes_with_args(server): config_script_completes = load_fixture( "workspacebuilder/config_script_completes.yaml" ) - script_complete_sh = fixtures_dir / "script_complete.sh" + script_complete_sh = FIXTURES_PATH / "script_complete.sh" assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( - fixtures_dir=fixtures_dir, script_complete=script_complete_sh + fixtures_dir=FIXTURES_PATH, script_complete=script_complete_sh ) sconfig = sconfig.import_config(yaml).get() From 38c5179ad782653f982263ce2cce13fe9f2129d9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:13:01 -0500 Subject: [PATCH 0947/2998] tests(workspacebuilder): Remove unused formatting --- tests/test_workspacebuilder.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 33c368fbcd..75000050a7 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -589,7 +589,6 @@ def test_before_load_throw_error_if_retcode_error(server): config_script_fails = load_fixture("workspacebuilder/config_script_fails.yaml") sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( - fixtures_dir=FIXTURES_PATH, script_failed=FIXTURES_PATH / "script_failed.sh", ) @@ -615,7 +614,6 @@ def test_before_load_throw_error_if_file_not_exists(server): ) sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_not_exists.format( - fixtures_dir=FIXTURES_PATH, script_not_exists=FIXTURES_PATH / "script_not_exists.sh", ) sconfig = sconfig.import_config(yaml).get() @@ -643,7 +641,6 @@ def test_before_load_true_if_test_passes(server): assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( - fixtures_dir=FIXTURES_PATH, script_complete=script_complete_sh, ) @@ -664,9 +661,7 @@ def test_before_load_true_if_test_passes_with_args(server): script_complete_sh = FIXTURES_PATH / "script_complete.sh" assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") - yaml = config_script_completes.format( - fixtures_dir=FIXTURES_PATH, script_complete=script_complete_sh - ) + yaml = config_script_completes.format(script_complete=script_complete_sh) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) From 8e4411e9a5352dc5d84766979914d5be10b69375 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:50:05 -0500 Subject: [PATCH 0948/2998] tests: Use home default directory --- tests/conftest.py | 19 +++++++++++++++++++ tests/test_config.py | 17 ++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7ab1d4ae72..da5d1713a0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,7 @@ +import getpass import logging import os +import pathlib import pytest @@ -10,6 +12,23 @@ logger = logging.getLogger(__name__) +@pytest.fixture(autouse=True, scope="session") +def home_path(tmp_path_factory: pytest.TempPathFactory): + return tmp_path_factory.mktemp("home") + + +@pytest.fixture(autouse=True, scope="session") +def user_path(home_path: pathlib.Path): + p = home_path / getpass.getuser() + p.mkdir() + return p + + +@pytest.fixture(autouse=True) +def home_path_default(user_path: pathlib.Path): + os.environ["HOME"] = str(user_path) + + @pytest.fixture(scope="function") def monkeypatch_plugin_test_packages(monkeypatch): paths = [ diff --git a/tests/test_config.py b/tests/test_config.py index 7e3a0785d0..1b1b2b9394 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -10,7 +10,6 @@ from tmuxp import config, exc from . import EXAMPLE_PATH -from .fixtures import config as fixtures TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" @@ -32,6 +31,8 @@ def load_config(path: Union[str, pathlib.Path]) -> str: def test_export_json(tmp_path: pathlib.Path): + from .fixtures import config as fixtures + json_config_file = tmp_path / "config.json" configparser = kaptan.Kaptan() @@ -47,6 +48,8 @@ def test_export_json(tmp_path: pathlib.Path): def test_export_yaml(tmp_path: pathlib.Path): + from .fixtures import config as fixtures + yaml_config_file = tmp_path / "config.yaml" configparser = kaptan.Kaptan() @@ -92,17 +95,18 @@ def test_scan_config(tmp_path: pathlib.Path): def test_config_expand1(): """Expand shell commands from string to list.""" + from .fixtures import config as fixtures + test_config = config.expand(fixtures.expand1.before_config) assert test_config == fixtures.expand1.after_config def test_config_expand2(): """Expand shell commands from string to list.""" + from .fixtures import config as fixtures unexpanded_dict = load_yaml(fixtures.expand2.unexpanded_yaml) - expanded_dict = load_yaml(fixtures.expand2.expanded_yaml) - assert config.expand(unexpanded_dict) == expanded_dict @@ -220,6 +224,8 @@ def test_inheritance_config(): def test_shell_command_before(): """Config inheritance for the nested 'start_command'.""" + from .fixtures import config as fixtures + test_config = fixtures.shell_command_before.config_unexpanded test_config = config.expand(test_config) @@ -230,6 +236,8 @@ def test_shell_command_before(): def test_in_session_scope(): + from .fixtures import config as fixtures + sconfig = load_yaml(fixtures.shell_command_before_session.before) config.validate_schema(sconfig) @@ -241,6 +249,8 @@ def test_in_session_scope(): def test_trickle_relative_start_directory(): + from .fixtures import config as fixtures + test_config = config.trickle(fixtures.trickle.before) assert test_config == fixtures.trickle.expected @@ -290,6 +300,7 @@ def test_expands_blank_panes(): 'shell_command': [''] """ + from .fixtures import config as fixtures yaml_config_file = EXAMPLE_PATH / "blank-panes.yaml" test_config = load_config(yaml_config_file) From e2bd17df517d4dba80524b2255197e63e1b6a120 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:55:21 -0500 Subject: [PATCH 0949/2998] refactor(test): Move fixtures to config_fixture fixture (say fixture TEN times) --- tests/test_config.py | 76 +++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 1b1b2b9394..48a11a8d7f 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -14,6 +14,18 @@ TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" +@pytest.fixture +def config_fixture(): + """Deferred import of tmuxp.tests.fixtures.* + + pytest setup (conftest.py) patches os.environ["HOME"], delay execution of + os.path.expanduser until here. + """ + from .fixtures import config as config_fixture + + return config_fixture + + def load_yaml(path: Union[str, pathlib.Path]) -> str: return ( kaptan.Kaptan(handler="yaml") @@ -30,13 +42,11 @@ def load_config(path: Union[str, pathlib.Path]) -> str: ) -def test_export_json(tmp_path: pathlib.Path): - from .fixtures import config as fixtures - +def test_export_json(tmp_path: pathlib.Path, config_fixture): json_config_file = tmp_path / "config.json" configparser = kaptan.Kaptan() - configparser.import_config(fixtures.sampleconfig.sampleconfigdict) + configparser.import_config(config_fixture.sampleconfig.sampleconfigdict) json_config_data = configparser.export("json", indent=2) @@ -44,16 +54,14 @@ def test_export_json(tmp_path: pathlib.Path): new_config = kaptan.Kaptan() new_config_data = new_config.import_config(str(json_config_file)).get() - assert fixtures.sampleconfig.sampleconfigdict == new_config_data - + assert config_fixture.sampleconfig.sampleconfigdict == new_config_data -def test_export_yaml(tmp_path: pathlib.Path): - from .fixtures import config as fixtures +def test_export_yaml(tmp_path: pathlib.Path, config_fixture): yaml_config_file = tmp_path / "config.yaml" configparser = kaptan.Kaptan() - sampleconfig = config.inline(fixtures.sampleconfig.sampleconfigdict) + sampleconfig = config.inline(config_fixture.sampleconfig.sampleconfigdict) configparser.import_config(sampleconfig) yaml_config_data = configparser.export("yaml", indent=2, default_flow_style=False) @@ -61,7 +69,7 @@ def test_export_yaml(tmp_path: pathlib.Path): yaml_config_file.write_text(yaml_config_data, encoding="utf-8") new_config_data = load_config(str(yaml_config_file)) - assert fixtures.sampleconfig.sampleconfigdict == new_config_data + assert config_fixture.sampleconfig.sampleconfigdict == new_config_data def test_scan_config(tmp_path: pathlib.Path): @@ -93,20 +101,16 @@ def test_scan_config(tmp_path: pathlib.Path): assert len(configs) == files -def test_config_expand1(): +def test_config_expand1(config_fixture): """Expand shell commands from string to list.""" - from .fixtures import config as fixtures + test_config = config.expand(config_fixture.expand1.before_config) + assert test_config == config_fixture.expand1.after_config - test_config = config.expand(fixtures.expand1.before_config) - assert test_config == fixtures.expand1.after_config - -def test_config_expand2(): +def test_config_expand2(config_fixture): """Expand shell commands from string to list.""" - from .fixtures import config as fixtures - - unexpanded_dict = load_yaml(fixtures.expand2.unexpanded_yaml) - expanded_dict = load_yaml(fixtures.expand2.expanded_yaml) + unexpanded_dict = load_yaml(config_fixture.expand2.unexpanded_yaml) + expanded_dict = load_yaml(config_fixture.expand2.expanded_yaml) assert config.expand(unexpanded_dict) == expanded_dict @@ -222,37 +226,31 @@ def test_inheritance_config(): assert config == inheritance_config_after -def test_shell_command_before(): +def test_shell_command_before(config_fixture): """Config inheritance for the nested 'start_command'.""" - from .fixtures import config as fixtures - - test_config = fixtures.shell_command_before.config_unexpanded + test_config = config_fixture.shell_command_before.config_unexpanded test_config = config.expand(test_config) - assert test_config == fixtures.shell_command_before.config_expanded + assert test_config == config_fixture.shell_command_before.config_expanded test_config = config.trickle(test_config) - assert test_config == fixtures.shell_command_before.config_after + assert test_config == config_fixture.shell_command_before.config_after -def test_in_session_scope(): - from .fixtures import config as fixtures - - sconfig = load_yaml(fixtures.shell_command_before_session.before) +def test_in_session_scope(config_fixture): + sconfig = load_yaml(config_fixture.shell_command_before_session.before) config.validate_schema(sconfig) assert config.expand(sconfig) == sconfig assert config.expand(config.trickle(sconfig)) == load_yaml( - fixtures.shell_command_before_session.expected + config_fixture.shell_command_before_session.expected ) -def test_trickle_relative_start_directory(): - from .fixtures import config as fixtures - - test_config = config.trickle(fixtures.trickle.before) - assert test_config == fixtures.trickle.expected +def test_trickle_relative_start_directory(config_fixture): + test_config = config.trickle(config_fixture.trickle.before) + assert test_config == config_fixture.trickle.expected def test_trickle_window_with_no_pane_config(): @@ -273,7 +271,7 @@ def test_trickle_window_with_no_pane_config(): } -def test_expands_blank_panes(): +def test_expands_blank_panes(config_fixture): """Expand blank config into full form. Handle ``NoneType`` and 'blank':: @@ -300,11 +298,9 @@ def test_expands_blank_panes(): 'shell_command': [''] """ - from .fixtures import config as fixtures - yaml_config_file = EXAMPLE_PATH / "blank-panes.yaml" test_config = load_config(yaml_config_file) - assert config.expand(test_config) == fixtures.expand_blank.expected + assert config.expand(test_config) == config_fixture.expand_blank.expected def test_no_session_name(): From 4507f6c8f1a359565c90d2ad5a8122fdd45d1a08 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 09:57:53 -0500 Subject: [PATCH 0950/2998] tests: Delete unused constant --- tests/test_config.py | 2 -- tests/test_config_teamocil.py | 4 ---- tests/test_config_tmuxinator.py | 4 ---- 3 files changed, 10 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 48a11a8d7f..032c48589a 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -11,8 +11,6 @@ from . import EXAMPLE_PATH -TMUXP_DIR = pathlib.Path(__file__).parent / ".tmuxp" - @pytest.fixture def config_fixture(): diff --git a/tests/test_config_teamocil.py b/tests/test_config_teamocil.py index 721e3878ab..dc040261c3 100644 --- a/tests/test_config_teamocil.py +++ b/tests/test_config_teamocil.py @@ -1,6 +1,4 @@ """Test for tmuxp teamocil configuration.""" -import os - import pytest import kaptan @@ -9,8 +7,6 @@ from .fixtures import config_teamocil as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") - @pytest.mark.parametrize( "teamocil_yaml,teamocil_dict,tmuxp_dict", diff --git a/tests/test_config_tmuxinator.py b/tests/test_config_tmuxinator.py index 88241c22a9..ddcf34e68a 100644 --- a/tests/test_config_tmuxinator.py +++ b/tests/test_config_tmuxinator.py @@ -1,6 +1,4 @@ """Test for tmuxp tmuxinator configuration.""" -import os - import pytest import kaptan @@ -9,8 +7,6 @@ from .fixtures import config_tmuxinator as fixtures -TMUXP_DIR = os.path.join(os.path.dirname(__file__), ".tmuxp") - @pytest.mark.parametrize( "tmuxinator_yaml,tmuxinator_dict,tmuxp_dict", From 2e16cabee8399e1fe8e616695e2dccd1472f1d88 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 10:23:55 -0500 Subject: [PATCH 0951/2998] Type annotations for module Raises an error in pyright, but completion works as expected. Potentially reach out to: - https://github.com/microsoft/pylance-release - https://github.com/microsoft/pyright about this. --- tests/test_config.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 032c48589a..a89b363154 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,6 +1,7 @@ """Test for tmuxp configuration import, inlining, expanding and export.""" import os import pathlib +import typing from typing import Union import pytest @@ -11,6 +12,9 @@ from . import EXAMPLE_PATH +if typing.TYPE_CHECKING: + from .fixtures import config as ConfigFixture + @pytest.fixture def config_fixture(): @@ -40,7 +44,7 @@ def load_config(path: Union[str, pathlib.Path]) -> str: ) -def test_export_json(tmp_path: pathlib.Path, config_fixture): +def test_export_json(tmp_path: pathlib.Path, config_fixture: "ConfigFixture"): json_config_file = tmp_path / "config.json" configparser = kaptan.Kaptan() @@ -55,7 +59,7 @@ def test_export_json(tmp_path: pathlib.Path, config_fixture): assert config_fixture.sampleconfig.sampleconfigdict == new_config_data -def test_export_yaml(tmp_path: pathlib.Path, config_fixture): +def test_export_yaml(tmp_path: pathlib.Path, config_fixture: "ConfigFixture"): yaml_config_file = tmp_path / "config.yaml" configparser = kaptan.Kaptan() @@ -99,13 +103,13 @@ def test_scan_config(tmp_path: pathlib.Path): assert len(configs) == files -def test_config_expand1(config_fixture): +def test_config_expand1(config_fixture: "ConfigFixture"): """Expand shell commands from string to list.""" test_config = config.expand(config_fixture.expand1.before_config) assert test_config == config_fixture.expand1.after_config -def test_config_expand2(config_fixture): +def test_config_expand2(config_fixture: "ConfigFixture"): """Expand shell commands from string to list.""" unexpanded_dict = load_yaml(config_fixture.expand2.unexpanded_yaml) expanded_dict = load_yaml(config_fixture.expand2.expanded_yaml) @@ -224,7 +228,7 @@ def test_inheritance_config(): assert config == inheritance_config_after -def test_shell_command_before(config_fixture): +def test_shell_command_before(config_fixture: "ConfigFixture"): """Config inheritance for the nested 'start_command'.""" test_config = config_fixture.shell_command_before.config_unexpanded test_config = config.expand(test_config) @@ -235,7 +239,7 @@ def test_shell_command_before(config_fixture): assert test_config == config_fixture.shell_command_before.config_after -def test_in_session_scope(config_fixture): +def test_in_session_scope(config_fixture: "ConfigFixture"): sconfig = load_yaml(config_fixture.shell_command_before_session.before) config.validate_schema(sconfig) @@ -246,7 +250,7 @@ def test_in_session_scope(config_fixture): ) -def test_trickle_relative_start_directory(config_fixture): +def test_trickle_relative_start_directory(config_fixture: "ConfigFixture"): test_config = config.trickle(config_fixture.trickle.before) assert test_config == config_fixture.trickle.expected @@ -269,7 +273,7 @@ def test_trickle_window_with_no_pane_config(): } -def test_expands_blank_panes(config_fixture): +def test_expands_blank_panes(config_fixture: "ConfigFixture"): """Expand blank config into full form. Handle ``NoneType`` and 'blank':: From 44e7670d038e00735aee7b420e55a7a5b9d8d4e1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 12:13:36 -0500 Subject: [PATCH 0952/2998] docs: Format --- CHANGES | 6 +++--- docs/cli.md | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 71ce18513e..ca6b363a9f 100644 --- a/CHANGES +++ b/CHANGES @@ -11,9 +11,9 @@ ```yaml session_name: Should not execute windows: - - panes: - - shell_command: echo "___$((1 + 3))___" - enter: false + - panes: + - shell_command: echo "___$((1 + 3))___" + enter: false ``` - #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the diff --git a/docs/cli.md b/docs/cli.md index 332738e447..01ae725521 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -188,6 +188,7 @@ $ tmuxp load /path/to/folder/ ``` Name of the config, assume `$HOME/.tmuxp/myconfig.yaml`: + ```console $ tmuxp load myconfig ``` @@ -236,11 +237,13 @@ All of these options can be preselected to skip the prompt: ```console $ tmuxp load -y config ``` + - Detached / open in background: ```console $ tmuxp load -d config ``` + - Append windows to existing session ```console From 733d0ed20dd1c8aed0ee7552e71904046e89a9df Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 12:24:52 -0500 Subject: [PATCH 0953/2998] Makefile: Include yaml files in test watching --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9b02c94f1d..811a7aded1 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ PY_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]py$$' 2> /dev/null +TEST_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]\(yaml\|py\)$$' 2> /dev/null DOC_FILES= find . -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.]md\$\|.*[.]css\$\|.*[.]py\$\|mkdocs\.yml\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null SHELL := /bin/bash @@ -23,7 +24,7 @@ start: $(MAKE) test; poetry run ptw . watch_test: - if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi + if command -v entr > /dev/null; then ${TEST_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: $(MAKE) -C docs html From c47f3617f47d2a8bbb2e376099a30bb0f33f270e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 12:54:32 -0500 Subject: [PATCH 0954/2998] chore(test for plugins): Fix typo --- .../pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml index e16a31af38..88a8085212 100644 --- a/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml +++ b/tests/fixtures/pluginsystem/plugins/tmuxp_test_plugin_bs/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Joseph Flinn "] [tool.poetry.dependencies] python = "^3.6" -tmuxp = "^1.7.0." +tmuxp = "^1.7.0" [tool.poetry.dev-dependencies] From e860a191458c786a3ed50ab723272274c157056a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:56:07 -0500 Subject: [PATCH 0955/2998] ci(test): Test the oldest supported python against the oldest and latest tmux --- .github/workflows/tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 036a46a809..1d2b6b9c2d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,6 +12,12 @@ jobs: matrix: python-version: [ '3.10' ] tmux-version: [ '2.6', '2.7', '2.8', '3.0a', '3.1b', '3.2a', 'master' ] + # balance ci coverage across supported python/tmux versions with CI speed + include: + - python-version: '3.7' + tmux-version: '2.6' + - python-version: '3.7' + tmux-version: 'master' steps: - uses: actions/checkout@v1 From 9535fc0204f4c111f7c2b768963889ade2409abb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:29:19 -0500 Subject: [PATCH 0956/2998] chore(config): Variable tweaks --- tmuxp/config.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index 243d644fbb..96358ed87b 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -277,11 +277,11 @@ def expand(sconf, cwd=None, parent=None): if "windows" in sconf: sconf["windows"] = [expand(window, parent=sconf) for window in sconf["windows"]] elif "panes" in sconf: - - for pconf in sconf["panes"]: - p_index = sconf["panes"].index(pconf) + pane_configs = sconf["panes"] + for pconf in pane_configs: + p_index = pane_configs.index(pconf) p = copy.deepcopy(pconf) - pconf = sconf["panes"][p_index] = {} + pconf = pane_configs[p_index] = {} if isinstance(p, str): p = {"shell_command": [p]} @@ -307,7 +307,7 @@ def expand(sconf, cwd=None, parent=None): p["shell_command"] = [] pconf.update(p) - sconf["panes"] = [expand(pane, parent=sconf) for pane in sconf["panes"]] + sconf["panes"] = [expand(pane, parent=sconf) for pane in pane_configs] return sconf From 47e11f8d9e4b98d98b9922ee87b81a5cda8a6be7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:35:46 -0500 Subject: [PATCH 0957/2998] refactor(config): Extract expand_command --- tmuxp/config.py | 60 ++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index 96358ed87b..fcba8e6c46 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -4,9 +4,9 @@ ~~~~~~~~~~~~ """ -import copy import logging import os +from typing import Dict from . import exc @@ -168,6 +168,32 @@ def inline(sconf): return sconf +def expand_cmd(p: Dict) -> Dict: + if isinstance(p, str): + p = {"shell_command": [p]} + elif not p: + p = {"shell_command": []} + + assert isinstance(p, dict) + if "shell_command" in p: + cmd = p["shell_command"] + + if isinstance(p["shell_command"], str): + cmd = [cmd] + + if not cmd or any(a == cmd for a in [None, "blank", "pane"]): + cmd = [] + + if isinstance(cmd, list) and len(cmd) == int(1): + if any(a in cmd for a in [None, "blank", "pane"]): + cmd = [] + + p["shell_command"] = cmd + else: + p["shell_command"] = [] + return p + + def expand(sconf, cwd=None, parent=None): """Return config with shorthand and inline properties expanded. @@ -278,35 +304,9 @@ def expand(sconf, cwd=None, parent=None): sconf["windows"] = [expand(window, parent=sconf) for window in sconf["windows"]] elif "panes" in sconf: pane_configs = sconf["panes"] - for pconf in pane_configs: - p_index = pane_configs.index(pconf) - p = copy.deepcopy(pconf) - pconf = pane_configs[p_index] = {} - - if isinstance(p, str): - p = {"shell_command": [p]} - elif not p: - p = {"shell_command": []} - - assert isinstance(p, dict) - if "shell_command" in p: - cmd = p["shell_command"] - - if isinstance(p["shell_command"], str): - cmd = [cmd] - - if not cmd or any(a == cmd for a in [None, "blank", "pane"]): - cmd = [] - - if isinstance(cmd, list) and len(cmd) == int(1): - if any(a in cmd for a in [None, "blank", "pane"]): - cmd = [] - - p["shell_command"] = cmd - else: - p["shell_command"] = [] - - pconf.update(p) + for pane_idx, pconf in enumerate(pane_configs): + pane_configs[pane_idx] = {} + pane_configs[pane_idx].update(expand_cmd(pconf)) sconf["panes"] = [expand(pane, parent=sconf) for pane in pane_configs] return sconf From daa03f2a87897aa93b745ecf4e90e75b49583bef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:39:47 -0500 Subject: [PATCH 0958/2998] refactor(config): Variable name tweaks - sconf -> session_config - windowconfig -> window_config - paneconfig -> pane_config --- tmuxp/config.py | 289 +++++++++++++++++++++++++----------------------- 1 file changed, 153 insertions(+), 136 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index fcba8e6c46..9ecc83acee 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -13,13 +13,13 @@ logger = logging.getLogger(__name__) -def validate_schema(sconf): +def validate_schema(session_config): """ Return True if config schema is correct. Parameters ---------- - sconf : dict + session_config : dict session configuration Returns @@ -28,18 +28,18 @@ def validate_schema(sconf): """ # verify session_name - if "session_name" not in sconf: + if "session_name" not in session_config: raise exc.ConfigError('config requires "session_name"') - if "windows" not in sconf: + if "windows" not in session_config: raise exc.ConfigError('config requires list of "windows"') - for window in sconf["windows"]: + for window in session_config["windows"]: if "window_name" not in window: raise exc.ConfigError('config window is missing "window_name"') - if "plugins" in sconf: - if not isinstance(sconf["plugins"], list): + if "plugins" in session_config: + if not isinstance(session_config["plugins"], list): raise exc.ConfigError('"plugins" only supports list type') return True @@ -129,13 +129,13 @@ def expandshell(_path): return os.path.expandvars(os.path.expanduser(_path)) -def inline(sconf): +def inline(session_config): """ Return config in inline form, opposite of :meth:`config.expand`. Parameters ---------- - sconf : dict + session_config : dict Returns ------- @@ -144,28 +144,32 @@ def inline(sconf): """ if ( - "shell_command" in sconf - and isinstance(sconf["shell_command"], list) - and len(sconf["shell_command"]) == 1 + "shell_command" in session_config + and isinstance(session_config["shell_command"], list) + and len(session_config["shell_command"]) == 1 ): - sconf["shell_command"] = sconf["shell_command"][0] + session_config["shell_command"] = session_config["shell_command"][0] - if len(sconf.keys()) == int(1): - sconf = sconf["shell_command"] + if len(session_config.keys()) == int(1): + session_config = session_config["shell_command"] if ( - "shell_command_before" in sconf - and isinstance(sconf["shell_command_before"], list) - and len(sconf["shell_command_before"]) == 1 + "shell_command_before" in session_config + and isinstance(session_config["shell_command_before"], list) + and len(session_config["shell_command_before"]) == 1 ): - sconf["shell_command_before"] = sconf["shell_command_before"][0] + session_config["shell_command_before"] = session_config["shell_command_before"][ + 0 + ] # recurse into window and pane config items - if "windows" in sconf: - sconf["windows"] = [inline(window) for window in sconf["windows"]] - if "panes" in sconf: - sconf["panes"] = [inline(pane) for pane in sconf["panes"]] + if "windows" in session_config: + session_config["windows"] = [ + inline(window) for window in session_config["windows"] + ] + if "panes" in session_config: + session_config["panes"] = [inline(pane) for pane in session_config["panes"]] - return sconf + return session_config def expand_cmd(p: Dict) -> Dict: @@ -194,7 +198,7 @@ def expand_cmd(p: Dict) -> Dict: return p -def expand(sconf, cwd=None, parent=None): +def expand(session_config, cwd=None, parent=None): """Return config with shorthand and inline properties expanded. This is necessary to keep the code in the :class:`WorkspaceBuilder` clean @@ -213,7 +217,7 @@ def expand(sconf, cwd=None, parent=None): Parameters ---------- - sconf : dict + session_config : dict the configuration for the session cwd : str directory to expand relative paths against. should be the dir of the @@ -232,39 +236,41 @@ def expand(sconf, cwd=None, parent=None): if not cwd: cwd = os.getcwd() - if "session_name" in sconf: - sconf["session_name"] = expandshell(sconf["session_name"]) - if "window_name" in sconf: - sconf["window_name"] = expandshell(sconf["window_name"]) - if "environment" in sconf: - for key in sconf["environment"]: - val = sconf["environment"][key] + if "session_name" in session_config: + session_config["session_name"] = expandshell(session_config["session_name"]) + if "window_name" in session_config: + session_config["window_name"] = expandshell(session_config["window_name"]) + if "environment" in session_config: + for key in session_config["environment"]: + val = session_config["environment"][key] val = expandshell(val) if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf["environment"][key] = val - if "global_options" in sconf: - for key in sconf["global_options"]: - val = sconf["global_options"][key] + session_config["environment"][key] = val + if "global_options" in session_config: + for key in session_config["global_options"]: + val = session_config["global_options"][key] if isinstance(val, str): val = expandshell(val) if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf["global_options"][key] = val - if "options" in sconf: - for key in sconf["options"]: - val = sconf["options"][key] + session_config["global_options"][key] = val + if "options" in session_config: + for key in session_config["options"]: + val = session_config["options"][key] if isinstance(val, str): val = expandshell(val) if any(val.startswith(a) for a in [".", "./"]): val = os.path.normpath(os.path.join(cwd, val)) - sconf["options"][key] = val + session_config["options"][key] = val # Any config section, session, window, pane that can contain the # 'shell_command' value - if "start_directory" in sconf: - sconf["start_directory"] = expandshell(sconf["start_directory"]) - start_path = sconf["start_directory"] + if "start_directory" in session_config: + session_config["start_directory"] = expandshell( + session_config["start_directory"] + ) + start_path = session_config["start_directory"] if any(start_path.startswith(a) for a in [".", "./"]): # if window has a session, or pane has a window with a # start_directory of . or ./, make sure the start_directory can be @@ -275,44 +281,53 @@ def expand(sconf, cwd=None, parent=None): if parent: cwd = parent["start_directory"] start_path = os.path.normpath(os.path.join(cwd, start_path)) - sconf["start_directory"] = start_path + session_config["start_directory"] = start_path - if "before_script" in sconf: - sconf["before_script"] = expandshell(sconf["before_script"]) - if any(sconf["before_script"].startswith(a) for a in [".", "./"]): - sconf["before_script"] = os.path.normpath( - os.path.join(cwd, sconf["before_script"]) + if "before_script" in session_config: + session_config["before_script"] = expandshell(session_config["before_script"]) + if any(session_config["before_script"].startswith(a) for a in [".", "./"]): + session_config["before_script"] = os.path.normpath( + os.path.join(cwd, session_config["before_script"]) ) - if "shell_command" in sconf and isinstance(sconf["shell_command"], str): - sconf["shell_command"] = [sconf["shell_command"]] + if "shell_command" in session_config and isinstance( + session_config["shell_command"], str + ): + session_config["shell_command"] = [session_config["shell_command"]] - if "shell_command_before" in sconf and isinstance( - sconf["shell_command_before"], str + if "shell_command_before" in session_config and isinstance( + session_config["shell_command_before"], str ): - sconf["shell_command_before"] = [sconf["shell_command_before"]] + session_config["shell_command_before"] = [ + session_config["shell_command_before"] + ] - if "shell_command_before" in sconf and isinstance( - sconf["shell_command_before"], list + if "shell_command_before" in session_config and isinstance( + session_config["shell_command_before"], list ): - sconf["shell_command_before"] = [ - expandshell(scmd) for scmd in sconf["shell_command_before"] + session_config["shell_command_before"] = [ + expandshell(scmd) for scmd in session_config["shell_command_before"] ] # recurse into window and pane config items - if "windows" in sconf: - sconf["windows"] = [expand(window, parent=sconf) for window in sconf["windows"]] - elif "panes" in sconf: - pane_configs = sconf["panes"] - for pane_idx, pconf in enumerate(pane_configs): + if "windows" in session_config: + session_config["windows"] = [ + expand(window, parent=session_config) + for window in session_config["windows"] + ] + elif "panes" in session_config: + pane_configs = session_config["panes"] + for pane_idx, pane_config in enumerate(pane_configs): pane_configs[pane_idx] = {} - pane_configs[pane_idx].update(expand_cmd(pconf)) - sconf["panes"] = [expand(pane, parent=sconf) for pane in pane_configs] + pane_configs[pane_idx].update(expand_cmd(pane_config)) + session_config["panes"] = [ + expand(pane, parent=session_config) for pane in pane_configs + ] - return sconf + return session_config -def trickle(sconf): +def trickle(session_config): """Return a dict with "trickled down" / inherited config values. This will only work if config has been expanded to full form with @@ -324,7 +339,7 @@ def trickle(sconf): Parameters ---------- - sconf : dict + session_config : dict the session configuration. Returns @@ -335,70 +350,70 @@ def trickle(sconf): # prepends a pane's ``shell_command`` list with the window and sessions' # ``shell_command_before``. - if "start_directory" in sconf: - session_start_directory = sconf["start_directory"] + if "start_directory" in session_config: + session_start_directory = session_config["start_directory"] else: session_start_directory = None - if "suppress_history" in sconf: - suppress_history = sconf["suppress_history"] + if "suppress_history" in session_config: + suppress_history = session_config["suppress_history"] else: suppress_history = None - for windowconfig in sconf["windows"]: + for window_config in session_config["windows"]: # Prepend start_directory to relative window commands if session_start_directory: - if "start_directory" not in windowconfig: - windowconfig["start_directory"] = session_start_directory + if "start_directory" not in window_config: + window_config["start_directory"] = session_start_directory else: if not any( - windowconfig["start_directory"].startswith(a) for a in ["~", "/"] + window_config["start_directory"].startswith(a) for a in ["~", "/"] ): window_start_path = os.path.join( - session_start_directory, windowconfig["start_directory"] + session_start_directory, window_config["start_directory"] ) - windowconfig["start_directory"] = window_start_path + window_config["start_directory"] = window_start_path # We only need to trickle to the window, workspace builder checks wconf if suppress_history is not None: - if "suppress_history" not in windowconfig: - windowconfig["suppress_history"] = suppress_history + if "suppress_history" not in window_config: + window_config["suppress_history"] = suppress_history # If panes were NOT specified for a window, assume that a single pane # with no shell commands is desired - if "panes" not in windowconfig: - windowconfig["panes"] = [{"shell_command": []}] + if "panes" not in window_config: + window_config["panes"] = [{"shell_command": []}] - for paneconfig in windowconfig["panes"]: + for pane_config in window_config["panes"]: commands_before = [] # Prepend shell_command_before to commands - if "shell_command_before" in sconf: - commands_before.extend(sconf["shell_command_before"]) - if "shell_command_before" in windowconfig: - commands_before.extend(windowconfig["shell_command_before"]) - if "shell_command_before" in paneconfig: - commands_before.extend(paneconfig["shell_command_before"]) + if "shell_command_before" in session_config: + commands_before.extend(session_config["shell_command_before"]) + if "shell_command_before" in window_config: + commands_before.extend(window_config["shell_command_before"]) + if "shell_command_before" in pane_config: + commands_before.extend(pane_config["shell_command_before"]) - if "shell_command" in paneconfig: - commands_before.extend(paneconfig["shell_command"]) + if "shell_command" in pane_config: + commands_before.extend(pane_config["shell_command"]) - p_index = windowconfig["panes"].index(paneconfig) - windowconfig["panes"][p_index]["shell_command"] = commands_before - # paneconfig['shell_command'] = commands_before + p_index = window_config["panes"].index(pane_config) + window_config["panes"][p_index]["shell_command"] = commands_before + # pane_config['shell_command'] = commands_before - return sconf + return session_config -def import_tmuxinator(sconf): +def import_tmuxinator(session_config): """Return tmuxp config from a `tmuxinator`_ yaml config. .. _tmuxinator: https://github.com/aziz/tmuxinator Parameters ---------- - sconf : dict + session_config : dict python dict for session configuration. Returns @@ -408,56 +423,58 @@ def import_tmuxinator(sconf): tmuxp_config = {} - if "project_name" in sconf: - tmuxp_config["session_name"] = sconf.pop("project_name") - elif "name" in sconf: - tmuxp_config["session_name"] = sconf.pop("name") + if "project_name" in session_config: + tmuxp_config["session_name"] = session_config.pop("project_name") + elif "name" in session_config: + tmuxp_config["session_name"] = session_config.pop("name") else: tmuxp_config["session_name"] = None - if "project_root" in sconf: - tmuxp_config["start_directory"] = sconf.pop("project_root") - elif "root" in sconf: - tmuxp_config["start_directory"] = sconf.pop("root") + if "project_root" in session_config: + tmuxp_config["start_directory"] = session_config.pop("project_root") + elif "root" in session_config: + tmuxp_config["start_directory"] = session_config.pop("root") - if "cli_args" in sconf: - tmuxp_config["config"] = sconf["cli_args"] + if "cli_args" in session_config: + tmuxp_config["config"] = session_config["cli_args"] if "-f" in tmuxp_config["config"]: tmuxp_config["config"] = tmuxp_config["config"].replace("-f", "").strip() - elif "tmux_options" in sconf: - tmuxp_config["config"] = sconf["tmux_options"] + elif "tmux_options" in session_config: + tmuxp_config["config"] = session_config["tmux_options"] if "-f" in tmuxp_config["config"]: tmuxp_config["config"] = tmuxp_config["config"].replace("-f", "").strip() - if "socket_name" in sconf: - tmuxp_config["socket_name"] = sconf["socket_name"] + if "socket_name" in session_config: + tmuxp_config["socket_name"] = session_config["socket_name"] tmuxp_config["windows"] = [] - if "tabs" in sconf: - sconf["windows"] = sconf.pop("tabs") + if "tabs" in session_config: + session_config["windows"] = session_config.pop("tabs") - if "pre" in sconf and "pre_window" in sconf: - tmuxp_config["shell_command"] = sconf["pre"] + if "pre" in session_config and "pre_window" in session_config: + tmuxp_config["shell_command"] = session_config["pre"] - if isinstance(sconf["pre"], str): - tmuxp_config["shell_command_before"] = [sconf["pre_window"]] + if isinstance(session_config["pre"], str): + tmuxp_config["shell_command_before"] = [session_config["pre_window"]] else: - tmuxp_config["shell_command_before"] = sconf["pre_window"] - elif "pre" in sconf: - if isinstance(sconf["pre"], str): - tmuxp_config["shell_command_before"] = [sconf["pre"]] + tmuxp_config["shell_command_before"] = session_config["pre_window"] + elif "pre" in session_config: + if isinstance(session_config["pre"], str): + tmuxp_config["shell_command_before"] = [session_config["pre"]] else: - tmuxp_config["shell_command_before"] = sconf["pre"] + tmuxp_config["shell_command_before"] = session_config["pre"] - if "rbenv" in sconf: + if "rbenv" in session_config: if "shell_command_before" not in tmuxp_config: tmuxp_config["shell_command_before"] = [] - tmuxp_config["shell_command_before"].append("rbenv shell %s" % sconf["rbenv"]) + tmuxp_config["shell_command_before"].append( + "rbenv shell %s" % session_config["rbenv"] + ) - for w in sconf["windows"]: + for w in session_config["windows"]: for k, v in w.items(): windowdict = {"window_name": k} @@ -484,14 +501,14 @@ def import_tmuxinator(sconf): return tmuxp_config -def import_teamocil(sconf): +def import_teamocil(session_config): """Return tmuxp config from a `teamocil`_ yaml config. .. _teamocil: https://github.com/remiprev/teamocil Parameters ---------- - sconf : dict + session_config : dict python dict for session configuration Notes @@ -508,20 +525,20 @@ def import_teamocil(sconf): tmuxp_config = {} - if "session" in sconf: - sconf = sconf["session"] + if "session" in session_config: + session_config = session_config["session"] - if "name" in sconf: - tmuxp_config["session_name"] = sconf["name"] + if "name" in session_config: + tmuxp_config["session_name"] = session_config["name"] else: tmuxp_config["session_name"] = None - if "root" in sconf: - tmuxp_config["start_directory"] = sconf.pop("root") + if "root" in session_config: + tmuxp_config["start_directory"] = session_config.pop("root") tmuxp_config["windows"] = [] - for w in sconf["windows"]: + for w in session_config["windows"]: windowdict = {"window_name": w["name"]} From d34970ddb33ad0355b6c98bed4ca75c170148ee1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:41:52 -0500 Subject: [PATCH 0959/2998] refactor(config): Enumerate for mutation instead of .index() lookup --- tmuxp/config.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index 9ecc83acee..b463dbc0cb 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -385,7 +385,7 @@ def trickle(session_config): if "panes" not in window_config: window_config["panes"] = [{"shell_command": []}] - for pane_config in window_config["panes"]: + for pane_idx, pane_config in enumerate(window_config["panes"]): commands_before = [] # Prepend shell_command_before to commands @@ -399,8 +399,7 @@ def trickle(session_config): if "shell_command" in pane_config: commands_before.extend(pane_config["shell_command"]) - p_index = window_config["panes"].index(pane_config) - window_config["panes"][p_index]["shell_command"] = commands_before + window_config["panes"][pane_idx]["shell_command"] = commands_before # pane_config['shell_command'] = commands_before return session_config From a0157242ed3930950c4476a17a171c2763b800e3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 14:44:38 -0500 Subject: [PATCH 0960/2998] refactor(config): w -> window_config --- tmuxp/config.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index b463dbc0cb..f8b8ec5dea 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -473,30 +473,29 @@ def import_tmuxinator(session_config): "rbenv shell %s" % session_config["rbenv"] ) - for w in session_config["windows"]: - for k, v in w.items(): - - windowdict = {"window_name": k} + for window_config in session_config["windows"]: + for k, v in window_config.items(): + window_config = {"window_name": k} if isinstance(v, str) or v is None: - windowdict["panes"] = [v] - tmuxp_config["windows"].append(windowdict) + window_config["panes"] = [v] + tmuxp_config["windows"].append(window_config) continue elif isinstance(v, list): - windowdict["panes"] = v - tmuxp_config["windows"].append(windowdict) + window_config["panes"] = v + tmuxp_config["windows"].append(window_config) continue if "pre" in v: - windowdict["shell_command_before"] = v["pre"] + window_config["shell_command_before"] = v["pre"] if "panes" in v: - windowdict["panes"] = v["panes"] + window_config["panes"] = v["panes"] if "root" in v: - windowdict["start_directory"] = v["root"] + window_config["start_directory"] = v["root"] if "layout" in v: - windowdict["layout"] = v["layout"] - tmuxp_config["windows"].append(windowdict) + window_config["layout"] = v["layout"] + tmuxp_config["windows"].append(window_config) return tmuxp_config From 46e8bc0a3d70aa224836ccc9ae84f166b1dc481c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 16:47:04 -0500 Subject: [PATCH 0961/2998] docs(api): Note these APIs are unstable --- docs/api.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/api.md b/docs/api.md index 1287d95420..bf0b342573 100644 --- a/docs/api.md +++ b/docs/api.md @@ -3,9 +3,8 @@ # API Reference :::{seealso} - -See {ref}`libtmux's API ` and {ref}`Quickstart ` to see how you can control tmux via python API calls. - +See {ref}`libtmux's API ` and {ref}`Quickstart ` to see how you can control +tmux via python API calls. ::: ```{module} tmuxp @@ -14,6 +13,11 @@ See {ref}`libtmux's API ` and {ref}`Quickstart ## Internals +:::{warning} +These APIs are purely internal not covered by versioning policies, they can and will break between versions. +If you need an internal API stabilized please [file an issue](https://github.com/tmux-python/tmuxp/issues). +::: + ```{eval-rst} .. automethod:: tmuxp.util.run_before_script ``` From 045fbe006b70e9cbb88c1db8274736e798a605ef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 12:34:53 -0500 Subject: [PATCH 0962/2998] feat: Command options Commands are now a different format: Before: "echo hello" After: { "cmd": "echo hello" } This is purely internal. Normal usage should be the same since the configuration emits the equivalent result. --- tests/fixtures/config/expand1.py | 21 +++--- tests/fixtures/config/expand2-expanded.yaml | 18 ++--- tests/fixtures/config/expand_blank.py | 6 +- tests/fixtures/config/shell_command_before.py | 75 +++++++++++++------ ...shell_command_before_session-expected.yaml | 23 +++--- tests/fixtures/config/trickle.py | 14 +++- .../workspacebuilder/focus_and_pane.yaml | 19 ++--- .../fixtures/workspacebuilder/plugin_bs.yaml | 12 +-- .../fixtures/workspacebuilder/three_pane.yaml | 6 +- .../workspacebuilder/three_windows.yaml | 6 +- tests/fixtures/workspacebuilder/two_pane.yaml | 8 +- .../workspacebuilder/two_windows.yaml | 4 +- .../window_automatic_rename.yaml | 6 +- .../workspacefreezer/sampleconfig.yaml | 10 +-- tests/test_config.py | 5 +- tmuxp/config.py | 52 +++++++------ tmuxp/workspacebuilder.py | 2 +- 17 files changed, 167 insertions(+), 120 deletions(-) diff --git a/tests/fixtures/config/expand1.py b/tests/fixtures/config/expand1.py index d431741ef7..71e8e0704f 100644 --- a/tests/fixtures/config/expand1.py +++ b/tests/fixtures/config/expand1.py @@ -36,39 +36,42 @@ { "window_name": "editor", "panes": [ - {"shell_command": ["vim", "top"]}, - {"shell_command": ["vim"]}, - {"shell_command": ['cowsay "hey"']}, + {"shell_command": [{"cmd": "vim"}, {"cmd": "top"}]}, + {"shell_command": [{"cmd": "vim"}]}, + {"shell_command": [{"cmd": 'cowsay "hey"'}]}, ], "layout": "main-verticle", }, { "window_name": "logging", - "panes": [{"shell_command": ["tail -F /var/log/syslog"]}], + "panes": [{"shell_command": [{"cmd": "tail -F /var/log/syslog"}]}], }, { "start_directory": "/var/log", "options": {"automatic-rename": True}, - "panes": [{"shell_command": ["htop"]}, {"shell_command": ["vim"]}], + "panes": [ + {"shell_command": [{"cmd": "htop"}]}, + {"shell_command": [{"cmd": "vim"}]}, + ], }, { "start_directory": os.path.normpath( os.path.join(os.path.expanduser("~"), "./") ), - "panes": [{"shell_command": ["pwd"]}], + "panes": [{"shell_command": [{"cmd": "pwd"}]}], }, { "start_directory": os.path.normpath( os.path.join(os.path.expanduser("~"), "./asdf") ), - "panes": [{"shell_command": ["pwd"]}], + "panes": [{"shell_command": [{"cmd": "pwd"}]}], }, { "start_directory": os.path.normpath( os.path.join(os.path.expanduser("~"), "../") ), - "panes": [{"shell_command": ["pwd"]}], + "panes": [{"shell_command": [{"cmd": "pwd"}]}], }, - {"panes": [{"shell_command": ["top"]}]}, + {"panes": [{"shell_command": [{"cmd": "top"}]}]}, ], } diff --git a/tests/fixtures/config/expand2-expanded.yaml b/tests/fixtures/config/expand2-expanded.yaml index 0fe5bbd3d9..e407146427 100644 --- a/tests/fixtures/config/expand2-expanded.yaml +++ b/tests/fixtures/config/expand2-expanded.yaml @@ -6,27 +6,27 @@ windows: focus: true panes: - shell_command: - - cd ~ + - cmd: cd ~ - shell_command: - - cd /usr + - cmd: cd /usr focus: true - shell_command: - - cd ~ - - echo "moo" - - top + - cmd: cd ~ + - cmd: echo "moo" + - cmd: top - window_name: window 2 panes: - shell_command: - - top + - cmd: top focus: true - shell_command: - - echo "hey" + - cmd: echo "hey" - shell_command: - - echo "moo" + - cmd: echo "moo" - window_name: window 3 panes: - shell_command: - - cd / + - cmd: cd / focus: true - shell_command: [] - shell_command: [] diff --git a/tests/fixtures/config/expand_blank.py b/tests/fixtures/config/expand_blank.py index 78343ca711..4d0dad3b49 100644 --- a/tests/fixtures/config/expand_blank.py +++ b/tests/fixtures/config/expand_blank.py @@ -20,9 +20,9 @@ { "window_name": "Empty string (return)", "panes": [ - {"shell_command": [""]}, - {"shell_command": [""]}, - {"shell_command": [""]}, + {"shell_command": [{"cmd": ""}]}, + {"shell_command": [{"cmd": ""}]}, + {"shell_command": [{"cmd": ""}]}, ], }, { diff --git a/tests/fixtures/config/shell_command_before.py b/tests/fixtures/config/shell_command_before.py index 2f0b1a6966..0f5725e2ee 100644 --- a/tests/fixtures/config/shell_command_before.py +++ b/tests/fixtures/config/shell_command_before.py @@ -43,21 +43,27 @@ { "window_name": "editor", "start_directory": os.path.expanduser("~"), - "shell_command_before": ["source .venv/bin/activate"], + "shell_command_before": { + "shell_command": [{"cmd": "source .venv/bin/activate"}] + }, "panes": [ - {"shell_command": ["vim"]}, + {"shell_command": [{"cmd": "vim"}]}, { - "shell_command_before": ["rbenv local 2.0.0-p0"], - "shell_command": ['cowsay "hey"'], + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, + "shell_command": [{"cmd": 'cowsay "hey"'}], }, ], "layout": "main-verticle", }, { - "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, "window_name": "logging", "panes": [ - {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": [{"cmd": "tail -F /var/log/syslog"}]}, {"shell_command": []}, ], }, @@ -65,13 +71,18 @@ "window_name": "shufu", "panes": [ { - "shell_command_before": ["rbenv local 2.0.0-p0"], - "shell_command": ["htop"], + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, + "shell_command": [{"cmd": "htop"}], } ], }, - {"options": {"automatic-rename": True}, "panes": [{"shell_command": ["htop"]}]}, - {"panes": [{"shell_command": ["top"]}]}, + { + "options": {"automatic-rename": True}, + "panes": [{"shell_command": [{"cmd": "htop"}]}], + }, + {"panes": [{"shell_command": [{"cmd": "top"}]}]}, ], } @@ -82,27 +93,43 @@ { "window_name": "editor", "start_directory": os.path.expanduser("~"), - "shell_command_before": ["source .venv/bin/activate"], + "shell_command_before": { + "shell_command": [{"cmd": "source .venv/bin/activate"}] + }, "panes": [ - {"shell_command": ["source .venv/bin/activate", "vim"]}, { - "shell_command_before": ["rbenv local 2.0.0-p0"], "shell_command": [ - "source .venv/bin/activate", - "rbenv local 2.0.0-p0", - 'cowsay "hey"', + {"cmd": "source .venv/bin/activate"}, + {"cmd": "vim"}, + ] + }, + { + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, + "shell_command": [ + {"cmd": "source .venv/bin/activate"}, + {"cmd": "rbenv local 2.0.0-p0"}, + {"cmd": 'cowsay "hey"'}, ], }, ], "layout": "main-verticle", }, { - "shell_command_before": ["rbenv local 2.0.0-p0"], + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, "start_directory": "/", "window_name": "logging", "panes": [ - {"shell_command": ["rbenv local 2.0.0-p0", "tail -F /var/log/syslog"]}, - {"shell_command": ["rbenv local 2.0.0-p0"]}, + { + "shell_command": [ + {"cmd": "rbenv local 2.0.0-p0"}, + {"cmd": "tail -F /var/log/syslog"}, + ] + }, + {"shell_command": [{"cmd": "rbenv local 2.0.0-p0"}]}, ], }, { @@ -110,16 +137,18 @@ "window_name": "shufu", "panes": [ { - "shell_command_before": ["rbenv local 2.0.0-p0"], - "shell_command": ["rbenv local 2.0.0-p0", "htop"], + "shell_command_before": { + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}] + }, + "shell_command": [{"cmd": "rbenv local 2.0.0-p0"}, {"cmd": "htop"}], } ], }, { "start_directory": "/", "options": {"automatic-rename": True}, - "panes": [{"shell_command": ["htop"]}], + "panes": [{"shell_command": [{"cmd": "htop"}]}], }, - {"start_directory": "/", "panes": [{"shell_command": ["top"]}]}, + {"start_directory": "/", "panes": [{"shell_command": [{"cmd": "top"}]}]}, ], } diff --git a/tests/fixtures/config/shell_command_before_session-expected.yaml b/tests/fixtures/config/shell_command_before_session-expected.yaml index 4e1e3eb49a..dd55247c88 100644 --- a/tests/fixtures/config/shell_command_before_session-expected.yaml +++ b/tests/fixtures/config/shell_command_before_session-expected.yaml @@ -1,23 +1,24 @@ shell_command_before: - - 'echo "hi"' + shell_command: + - cmd: 'echo "hi"' session_name: 'test' windows: - window_name: editor panes: - shell_command: - - 'echo "hi"' - - vim - - :Ex + - cmd: 'echo "hi"' + - cmd: vim + - cmd: :Ex - shell_command: - - 'echo "hi"' + - cmd: 'echo "hi"' - shell_command: - - 'echo "hi"' - - cd /usr + - cmd: 'echo "hi"' + - cmd: cd /usr - window_name: logging panes: - shell_command: - - 'echo "hi"' + - cmd: 'echo "hi"' - shell_command: - - 'echo "hi"' - - top - - emacs + - cmd: 'echo "hi"' + - cmd: top + - cmd: emacs diff --git a/tests/fixtures/config/trickle.py b/tests/fixtures/config/trickle.py index 7792ba425a..595ee56360 100644 --- a/tests/fixtures/config/trickle.py +++ b/tests/fixtures/config/trickle.py @@ -5,14 +5,17 @@ { "window_name": "editor", "start_directory": "log", - "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "panes": [ + {"shell_command": [{"cmd": "vim"}]}, + {"shell_command": [{"cmd": 'cowsay "hey"'}]}, + ], "layout": "main-verticle", }, { "window_name": "logging", "start_directory": "~", "panes": [ - {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": [{"cmd": "tail -F /var/log/syslog"}]}, {"shell_command": []}, ], }, @@ -26,14 +29,17 @@ { "window_name": "editor", "start_directory": "/var/log", - "panes": [{"shell_command": ["vim"]}, {"shell_command": ['cowsay "hey"']}], + "panes": [ + {"shell_command": [{"cmd": "vim"}]}, + {"shell_command": [{"cmd": 'cowsay "hey"'}]}, + ], "layout": "main-verticle", }, { "start_directory": "~", "window_name": "logging", "panes": [ - {"shell_command": ["tail -F /var/log/syslog"]}, + {"shell_command": [{"cmd": "tail -F /var/log/syslog"}]}, {"shell_command": []}, ], }, diff --git a/tests/fixtures/workspacebuilder/focus_and_pane.yaml b/tests/fixtures/workspacebuilder/focus_and_pane.yaml index e6917c3ff1..d7e9b5d990 100644 --- a/tests/fixtures/workspacebuilder/focus_and_pane.yaml +++ b/tests/fixtures/workspacebuilder/focus_and_pane.yaml @@ -5,26 +5,27 @@ windows: focus: true panes: - shell_command: - - cd ~ + - cmd: cd ~ - shell_command: - - cd /usr + - cmd: cd /usr focus: true - shell_command: - - cd ~ - - echo "moo" - - top + - cmd: cd ~ + - cmd: echo "moo" + - cmd: top - window_name: window 2 panes: - shell_command: - - top + - cmd: top focus: true - shell_command: - - echo "hey" + - cmd: echo "hey" - shell_command: - - echo "moo" + - cmd: echo "moo" - window_name: window 3 panes: - - shell_command: cd / + - shell_command: + - cmd: cd / focus: true - pane - pane diff --git a/tests/fixtures/workspacebuilder/plugin_bs.yaml b/tests/fixtures/workspacebuilder/plugin_bs.yaml index a04d6eb3f3..5785afb420 100644 --- a/tests/fixtures/workspacebuilder/plugin_bs.yaml +++ b/tests/fixtures/workspacebuilder/plugin_bs.yaml @@ -5,11 +5,11 @@ windows: - window_name: editor layout: tiled shell_command_before: - - cd ~/ + - cmd: cd ~/ panes: - shell_command: - - cd /var/log - - ls -al | grep \.log - - echo hello - - echo hello - - echo hello + - cmd: cd /var/log + - cmd: ls -al | grep \.log + - cmd: echo hello + - cmd: echo hello + - cmd: echo hello diff --git a/tests/fixtures/workspacebuilder/three_pane.yaml b/tests/fixtures/workspacebuilder/three_pane.yaml index f883fc2b36..0899525325 100644 --- a/tests/fixtures/workspacebuilder/three_pane.yaml +++ b/tests/fixtures/workspacebuilder/three_pane.yaml @@ -5,8 +5,8 @@ windows: layout: main-horizontal panes: - shell_command: - - vim + - cmd: vim - shell_command: - - echo "hey" + - cmd: echo "hey" - shell_command: - - echo "moo" + - cmd: echo "moo" diff --git a/tests/fixtures/workspacebuilder/three_windows.yaml b/tests/fixtures/workspacebuilder/three_windows.yaml index e0c8286f85..b883a7da57 100644 --- a/tests/fixtures/workspacebuilder/three_windows.yaml +++ b/tests/fixtures/workspacebuilder/three_windows.yaml @@ -3,12 +3,12 @@ windows: - window_name: first panes: - shell_command: - - echo 'first window' + - cmd: echo 'first window' - window_name: second panes: - shell_command: - - echo 'second window' + - cmd: echo 'second window' - window_name: third panes: - shell_command: - - echo 'third window' + - cmd: echo 'third window' diff --git a/tests/fixtures/workspacebuilder/two_pane.yaml b/tests/fixtures/workspacebuilder/two_pane.yaml index be083ff48b..9bb96e70f3 100644 --- a/tests/fixtures/workspacebuilder/two_pane.yaml +++ b/tests/fixtures/workspacebuilder/two_pane.yaml @@ -4,15 +4,15 @@ windows: - layout: main-vertical panes: - shell_command: - - vim + - cmd: vim - shell_command: - - echo "hey" + - cmd: echo "hey" window_name: editor - panes: - shell_command: - - tail | echo 'hi' + - cmd: tail | echo 'hi' window_name: logging - window_name: test panes: - shell_command: - - htop + - cmd: htop diff --git a/tests/fixtures/workspacebuilder/two_windows.yaml b/tests/fixtures/workspacebuilder/two_windows.yaml index 0f1d40f34a..490382fe5f 100644 --- a/tests/fixtures/workspacebuilder/two_windows.yaml +++ b/tests/fixtures/workspacebuilder/two_windows.yaml @@ -3,8 +3,8 @@ windows: - window_name: first panes: - shell_command: - - echo 'first window' + - cmd: echo 'first window' - window_name: second panes: - shell_command: - - echo 'second window' + - cmd: echo 'second window' diff --git a/tests/fixtures/workspacebuilder/window_automatic_rename.yaml b/tests/fixtures/workspacebuilder/window_automatic_rename.yaml index 9b74b4fe7f..08329afcfe 100644 --- a/tests/fixtures/workspacebuilder/window_automatic_rename.yaml +++ b/tests/fixtures/workspacebuilder/window_automatic_rename.yaml @@ -6,9 +6,9 @@ windows: automatic-rename: on panes: - shell_command: - - sh + - cmd: sh start_directory: '~' - shell_command: - - echo "hey" + - cmd: echo "hey" - shell_command: - - echo "moo" + - cmd: echo "moo" diff --git a/tests/fixtures/workspacefreezer/sampleconfig.yaml b/tests/fixtures/workspacefreezer/sampleconfig.yaml index b7a6d01070..fb8b11e3e2 100644 --- a/tests/fixtures/workspacefreezer/sampleconfig.yaml +++ b/tests/fixtures/workspacefreezer/sampleconfig.yaml @@ -4,18 +4,18 @@ windows: - layout: main-vertical panes: - shell_command: - - vim + - cmd: vim start_directory: '~' - shell_command: - - echo "hey" - - cd ../ + - cmd: echo "hey" + - cmd: cd ../ window_name: editor - panes: - shell_command: - - pane + - cmd: pane start_directory: /usr/bin window_name: logging - window_name: test panes: - shell_command: - - top + - cmd: top diff --git a/tests/test_config.py b/tests/test_config.py index a89b363154..1352d0034c 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -395,7 +395,10 @@ def test_replaces_env_variables(monkeypatch): monkeypatch.setenv(str(env_key), str(env_val)) sconfig = config.expand(sconfig) assert "%s/test" % env_val == sconfig["start_directory"] - assert "%s/test2" % env_val in sconfig["shell_command_before"] + assert ( + "%s/test2" % env_val + in sconfig["shell_command_before"]["shell_command"][0]["cmd"] + ) assert "%s/test3" % env_val == sconfig["before_script"] assert "hi - %s" % env_val == sconfig["session_name"] assert "%s/moo" % env_val == sconfig["global_options"]["default-shell"] diff --git a/tmuxp/config.py b/tmuxp/config.py index f8b8ec5dea..7d5cb2cae0 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -114,7 +114,7 @@ def expandshell(_path): """ Return expanded path based on user's ``$HOME`` and ``env``. - :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars` + :py:func:`os.path.expanduser` and :py:func:`os.path.expandvar`s Parameters ---------- @@ -175,24 +175,31 @@ def inline(session_config): def expand_cmd(p: Dict) -> Dict: if isinstance(p, str): p = {"shell_command": [p]} + elif isinstance(p, list): + p = {"shell_command": p} elif not p: p = {"shell_command": []} assert isinstance(p, dict) if "shell_command" in p: - cmd = p["shell_command"] + cmds = p["shell_command"] if isinstance(p["shell_command"], str): - cmd = [cmd] + cmds = [cmds] - if not cmd or any(a == cmd for a in [None, "blank", "pane"]): - cmd = [] + if not cmds or any(a == cmds for a in [None, "blank", "pane"]): + cmds = [] - if isinstance(cmd, list) and len(cmd) == int(1): - if any(a in cmd for a in [None, "blank", "pane"]): - cmd = [] + if isinstance(cmds, list) and len(cmds) == int(1): + if any(a in cmds for a in [None, "blank", "pane"]): + cmds = [] - p["shell_command"] = cmd + for cmd_idx, cmd in enumerate(cmds): + if isinstance(cmd, str): + cmds[cmd_idx] = {"cmd": cmd} + cmds[cmd_idx]["cmd"] = expandshell(cmds[cmd_idx]["cmd"]) + + p["shell_command"] = cmds else: p["shell_command"] = [] return p @@ -295,19 +302,10 @@ def expand(session_config, cwd=None, parent=None): ): session_config["shell_command"] = [session_config["shell_command"]] - if "shell_command_before" in session_config and isinstance( - session_config["shell_command_before"], str - ): - session_config["shell_command_before"] = [ - session_config["shell_command_before"] - ] + if "shell_command_before" in session_config: + shell_command_before = session_config["shell_command_before"] - if "shell_command_before" in session_config and isinstance( - session_config["shell_command_before"], list - ): - session_config["shell_command_before"] = [ - expandshell(scmd) for scmd in session_config["shell_command_before"] - ] + session_config["shell_command_before"] = expand_cmd(shell_command_before) # recurse into window and pane config items if "windows" in session_config: @@ -390,11 +388,17 @@ def trickle(session_config): # Prepend shell_command_before to commands if "shell_command_before" in session_config: - commands_before.extend(session_config["shell_command_before"]) + commands_before.extend( + session_config["shell_command_before"]["shell_command"] + ) if "shell_command_before" in window_config: - commands_before.extend(window_config["shell_command_before"]) + commands_before.extend( + window_config["shell_command_before"]["shell_command"] + ) if "shell_command_before" in pane_config: - commands_before.extend(pane_config["shell_command_before"]) + commands_before.extend( + pane_config["shell_command_before"]["shell_command"] + ) if "shell_command" in pane_config: commands_before.extend(pane_config["shell_command"]) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index a470ea07aa..a51e13209b 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -365,7 +365,7 @@ def get_pane_shell(): enter = pconf.get("enter", True) for cmd in pconf["shell_command"]: - p.send_keys(cmd, suppress_history=suppress, enter=enter) + p.send_keys(cmd["cmd"], suppress_history=suppress, enter=enter) if "focus" in pconf and pconf["focus"]: w.select_pane(p["pane_id"]) From 8dd1954e9ef14f9bb8450f2e4f1689d7ac1466d2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 16:41:49 -0500 Subject: [PATCH 0963/2998] docs(CHANGES): Update for command options change --- CHANGES | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGES b/CHANGES index ca6b363a9f..159640a049 100644 --- a/CHANGES +++ b/CHANGES @@ -67,6 +67,31 @@ - Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) +#### Internal API + +- #752: Command structure (internal API) + + To pave the way for per-command options such as `enter: false` (#52), commands are now a different format: + + Before, [`str`](str): + + ```python + "echo hello" + ``` + + After, [`dict`](dict): + + ```python + { + "cmd": "echo hello" + } + ``` + + This is purely internal. Normal usage should be the same since the + configuration emits the equivalent result. + +- #752: Configuration parsing refactorings + #### Development - Run through black + isort with string normalization (#738). This way we can From 6c9c249243f07b0f63c185ffada369bca56838cf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:38:16 -0500 Subject: [PATCH 0964/2998] feat: Pass enter: false (skip command) at command-level --- tmuxp/workspacebuilder.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index a51e13209b..3bb8f49970 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -363,8 +363,9 @@ def get_pane_shell(): suppress = True enter = pconf.get("enter", True) - for cmd in pconf["shell_command"]: + enter = cmd.get("enter", enter) + p.send_keys(cmd["cmd"], suppress_history=suppress, enter=enter) if "focus" in pconf and pconf["focus"]: From 0470408b638a887767c8e4b90a692da617a39a25 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:38:35 -0500 Subject: [PATCH 0965/2998] test(enter: false): Test command-level skipping --- tests/test_workspacebuilder.py | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 75000050a7..158f9f6875 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -919,6 +919,60 @@ def test_find_current_active_pane(server, monkeypatch): - panes: - shell_command: - echo "___$((1 + 3))___" + """ + ), + "___4___", + True, + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 3))___" + enter: false + """ + ), + "___4___", + False, + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 3))___" + enter: false + """ + ), + "___4___", + False, + ], + [ + textwrap.dedent( + """ +session_name: Should execute +windows: +- panes: + - shell_command: echo "___$((1 + 3))___" + """ + ), + "___4___", + True, + ], + [ + textwrap.dedent( + """ +session_name: Should execute +windows: +- panes: + - shell_command: + - cmd: echo "other command" + - cmd: echo "___$((1 + 3))___" """ ), "___4___", @@ -930,6 +984,10 @@ def test_find_current_active_pane(server, monkeypatch): "pane_enter_false_longform", "pane_enter_default_shortform", "pane_enter_default_longform", + "pane_command_enter_false_shortform", + "pane_command_enter_false_longform", + "pane_command_enter_default_shortform", + "pane_command_enter_default_longform", ], ) def test_load_workspace_enter( From 9cb81b559bd90d7fe923b4411fc2760b571e81ca Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:51:42 -0500 Subject: [PATCH 0966/2998] docs(examples): Show command and pane-level enter --- docs/examples.md | 24 ++++++++++++++++++++++-- examples/skip-send-pane-level.json | 20 ++++++++++++++++++++ examples/skip-send-pane-level.yaml | 9 +++++++++ examples/skip-send.json | 11 ++++++++--- examples/skip-send.yaml | 10 +++++++--- 5 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 examples/skip-send-pane-level.json create mode 100644 examples/skip-send-pane-level.yaml diff --git a/docs/examples.md b/docs/examples.md index d47970321d..70c8ba3c4a 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -331,8 +331,9 @@ This will add the `shell_command` to the bash history in the pane. ## Skip command execution ```{versionadded} 1.10.0b1 -`enter: false` option. This is only available at the pane (not command level) -until [#751](https://github.com/tmux-python/tmuxp/issues/751) is published. +`enter: false` option. Pane-level support. +```{versionadded} 1.10.0b3 +Support command-level skipping. ``` Omit sending {kbd}`enter` to key commands. Equivalent to @@ -356,6 +357,25 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ```` +````{tab} YAML (pane-level) + +```{literalinclude} ../examples/skip-send-pane-level.yaml +:language: yaml + +``` + +```` + +````{tab} JSON (pane-level) + +```{literalinclude} ../examples/skip-send-pane-level.json +:language: json + +``` + +```` + + ## Window Index You can specify a window's index using the `window_index` property. Windows diff --git a/examples/skip-send-pane-level.json b/examples/skip-send-pane-level.json new file mode 100644 index 0000000000..43a88fa299 --- /dev/null +++ b/examples/skip-send-pane-level.json @@ -0,0 +1,20 @@ +{ + "session_name": "Skip all pane commands", + "windows": [ + { + "panes": [ + { + "shell_command": "echo \"___$((1 + 3))___\"", + "enter": false + }, + { + "shell_command": [ + "echo \"___$((1 + 3))___\"\\;", + "echo \"___$((1 + 3))___\"" + ], + "enter": false + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/skip-send-pane-level.yaml b/examples/skip-send-pane-level.yaml new file mode 100644 index 0000000000..cbc9d77ebb --- /dev/null +++ b/examples/skip-send-pane-level.yaml @@ -0,0 +1,9 @@ +session_name: Skip all pane commands +windows: +- panes: + - shell_command: echo "___$((1 + 3))___" + enter: false + - shell_command: + - echo "___$((1 + 3))___"\; + - echo "___$((1 + 3))___" + enter: false diff --git a/examples/skip-send.json b/examples/skip-send.json index 939fcc36b1..db97609d7a 100644 --- a/examples/skip-send.json +++ b/examples/skip-send.json @@ -1,11 +1,16 @@ { - "session_name": "Should not execute", + "session_name": "Skip command execution (command-level)", "windows": [ { "panes": [ { - "shell_command": "echo \"___$((1 + 3))___\"", - "enter": false + "shell_command": [ + "echo \"___$((11 + 1))___\"", + { + "cmd": "echo \"___$((1 + 3))___\"", + "enter": false + } + ] } ] } diff --git a/examples/skip-send.yaml b/examples/skip-send.yaml index b28c7b7052..96d1100348 100644 --- a/examples/skip-send.yaml +++ b/examples/skip-send.yaml @@ -1,5 +1,9 @@ -session_name: Should not execute +session_name: Skip command execution (command-level) windows: - panes: - - shell_command: echo "___$((1 + 3))___" - enter: false + - shell_command: + # You can see this + - echo "___$((11 + 1))___" + # This is skipped + - cmd: echo "___$((1 + 3))___" + enter: false From 803903b64a8ce6072198fcde068b306050fda1d4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:52:11 -0500 Subject: [PATCH 0967/2998] docs(CHANGES): Update to show command-level enter: false --- CHANGES | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 159640a049..73193ec887 100644 --- a/CHANGES +++ b/CHANGES @@ -12,7 +12,13 @@ session_name: Should not execute windows: - panes: - - shell_command: echo "___$((1 + 3))___" + - shell_command: + - cmd: echo "___$((1 + 3))___" + enter: false + + # pane-wide skip + - shell_command: + - echo "___$((1 + 3))___" enter: false ``` From 177dd18042061affb62d4fa58162786e6a581ec9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:54:13 -0500 Subject: [PATCH 0968/2998] docs(CHANGES): Fix issue number --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 73193ec887..03d66a7bd2 100644 --- a/CHANGES +++ b/CHANGES @@ -77,7 +77,7 @@ - #752: Command structure (internal API) - To pave the way for per-command options such as `enter: false` (#52), commands are now a different format: + To pave the way for per-command options such as `enter: false` (#53), commands are now a different format: Before, [`str`](str): From 5bfb779afbf1a4505bc5a1bce3f638e2ed0a4c4d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 17:56:18 -0500 Subject: [PATCH 0969/2998] Tag v1.10.0b3: command-level option support, enter: false - command-level options - `enter: false` and command level - test improvements --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4c8f452c00..a4a09e309a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b2" +version = "1.10.0b3" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 5beebedc98..96f8df7e38 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b2" +__version__ = "1.10.0b3" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From fbcc49d1ddeceb03f71d61691188d4960da61632 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:08:15 -0500 Subject: [PATCH 0970/2998] feat: Allow passing sleep_before / sleep_after to commands For those trying to get the timing of commands just right. --- tmuxp/workspacebuilder.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 3bb8f49970..4f085b1e15 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -5,6 +5,7 @@ """ import logging +import time from libtmux.exc import TmuxSessionExists from libtmux.pane import Pane @@ -363,11 +364,21 @@ def get_pane_shell(): suppress = True enter = pconf.get("enter", True) + sleep_before = pconf.get("sleep_before", None) + sleep_after = pconf.get("sleep_after", None) for cmd in pconf["shell_command"]: enter = cmd.get("enter", enter) + sleep_before = cmd.get("sleep_before", sleep_before) + sleep_after = cmd.get("sleep_after", sleep_after) + + if sleep_before is not None: + time.sleep(sleep_before) p.send_keys(cmd["cmd"], suppress_history=suppress, enter=enter) + if sleep_after is not None: + time.sleep(sleep_after) + if "focus" in pconf and pconf["focus"]: w.select_pane(p["pane_id"]) From bd0c85fc087556d72a0b57ad0e668929063e4fcd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 12 Mar 2022 16:46:25 -0600 Subject: [PATCH 0971/2998] test(workspacebuilder): sleep_before and sleep_after --- tests/test_workspacebuilder.py | 106 +++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 158f9f6875..933de7017c 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1021,3 +1021,109 @@ def test_load_workspace_enter( assert output in captured_pane else: assert output not in captured_pane + + +@pytest.mark.parametrize( + "yaml,sleep,output", + [ + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 5))___" + sleep_before: 2 + - cmd: echo "___$((1 + 3))___" + sleep_before: 1 + """ + ), + 1.5, + "___4___", + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 5))___" + sleep_before: 2 + - cmd: echo "___$((1 + 3))___" + sleep_before: 1 + """ + ), + 3, + "___4___", + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 3))___" + sleep_before: 2 + """ + ), + 2, + "___4___", + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +windows: +- panes: + - shell_command: + - cmd: echo "___$((1 + 3))___" + sleep_before: 2 + """ + ), + 2, + "___4___", + ], + ], + ids=[ + "command_level_sleep_3_shortform", + "command_level_pane_sleep_3_longform", + "pane_sleep_2_shortform", + "pane_sleep_2_longform", + ], +) +def test_load_workspace_sleep( + tmp_path: pathlib.Path, + server: libtmux.Server, + monkeypatch: pytest.MonkeyPatch, + yaml, + sleep: int, + output, +): + yaml_config = tmp_path / "simple.yaml" + yaml_config.write_text( + yaml, + encoding="utf-8", + ) + sconfig = kaptan.Kaptan(handler="yaml") + sconfig = sconfig.import_config(str(yaml_config)).get() + sconfig = config.expand(sconfig) + sconfig = config.trickle(sconfig) + builder = WorkspaceBuilder(sconf=sconfig, server=server) + builder.build() + + t = time.process_time() + + time.sleep(1) + session = builder.session + pane = session.attached_pane + + while (time.process_time() - t) * 1000 < sleep: + captured_pane = "\n".join(pane.capture_pane()) + + assert output not in captured_pane + time.sleep(0.1) + captured_pane = "\n".join(pane.capture_pane()) + assert output in captured_pane From 18f8bc465475af9f5c126c31e921308f2e68fbc1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:27:43 -0500 Subject: [PATCH 0972/2998] docs(examples): Add pausing examples --- examples/sleep-pane-level.json | 27 +++++++++++++++++++++++++++ examples/sleep-pane-level.yaml | 13 +++++++++++++ examples/sleep.json | 28 ++++++++++++++++++++++++++++ examples/sleep.yaml | 16 ++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 examples/sleep-pane-level.json create mode 100644 examples/sleep-pane-level.yaml create mode 100644 examples/sleep.json create mode 100644 examples/sleep.yaml diff --git a/examples/sleep-pane-level.json b/examples/sleep-pane-level.json new file mode 100644 index 0000000000..92daeeab77 --- /dev/null +++ b/examples/sleep-pane-level.json @@ -0,0 +1,27 @@ +{ + "session_name": "Pause / skip command execution (pane-level)", + "windows": [ + { + "panes": [ + { + "sleep_before": 2, + "shell_command": [ + "echo \"___$((11 + 1))___\"", + { + "cmd": "echo \"___$((1 + 3))___\"" + }, + { + "cmd": "echo \"___$((1 + 3))___\"" + }, + { + "cmd": "echo \"Stuff rendering here!\"" + }, + { + "cmd": "echo \"2 seconds later\"" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/sleep-pane-level.yaml b/examples/sleep-pane-level.yaml new file mode 100644 index 0000000000..eb64e0fd7e --- /dev/null +++ b/examples/sleep-pane-level.yaml @@ -0,0 +1,13 @@ +session_name: Pause / skip command execution (pane-level) +windows: +- panes: + - + # Wait 2 seconds before sending all commands in this pane + sleep_before: 2 + shell_command: + - echo "___$((11 + 1))___" + - cmd: echo "___$((1 + 3))___" + - cmd: echo "___$((1 + 3))___" + - cmd: echo "Stuff rendering here!" + - cmd: echo "2 seconds later" + diff --git a/examples/sleep.json b/examples/sleep.json new file mode 100644 index 0000000000..2136cab086 --- /dev/null +++ b/examples/sleep.json @@ -0,0 +1,28 @@ +{ + "session_name": "Pause / skip command execution (command-level)", + "windows": [ + { + "panes": [ + { + "shell_command": [ + "echo \"___$((11 + 1))___\"", + { + "cmd": "echo \"___$((1 + 3))___\"", + "sleep_before": 2 + }, + { + "cmd": "echo \"___$((1 + 3))___\"" + }, + { + "cmd": "echo \"Stuff rendering here!\"", + "sleep_after": 2 + }, + { + "cmd": "echo \"2 seconds later\"" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/sleep.yaml b/examples/sleep.yaml new file mode 100644 index 0000000000..ae90586b7a --- /dev/null +++ b/examples/sleep.yaml @@ -0,0 +1,16 @@ +session_name: Pause / skip command execution (command-level) +windows: +- panes: + - shell_command: + # Executes immediately + - echo "___$((11 + 1))___" + # Delays before sending 2 seconds + - cmd: echo "___$((1 + 3))___" + sleep_before: 2 + # Executes immediately + - cmd: echo "___$((1 + 3))___" + # Pauses 2 seconds after + - cmd: echo "Stuff rendering here!" + sleep_after: 2 + # Executes after earlier commands (after 2 sec) + - cmd: echo "2 seconds later" From 87dec20ffb2fc5d512946062ae8b7baa061185de Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:27:56 -0500 Subject: [PATCH 0973/2998] docs(examples): Add examples to page --- docs/examples.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 70c8ba3c4a..268190b018 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -375,6 +375,50 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ```` +## Pausing commands + +```{versionadded} 1.10.0b4 +`sleep_before` and `sleep_after` options added. Pane and command-level support. +``` + +Omit sending {kbd}`enter` to key commands. Equivalent to having +a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). + +````{tab} YAML + +```{literalinclude} ../examples/sleep.yaml +:language: yaml + +``` + +```` + +````{tab} JSON + +```{literalinclude} ../examples/sleep.json +:language: json + +``` + +```` + +````{tab} YAML (pane-level) + +```{literalinclude} ../examples/sleep-pane-level.yaml +:language: yaml + +``` + +```` + +````{tab} JSON (pane-level) + +```{literalinclude} ../examples/sleep-pane-level.json +:language: json + +``` + +```` ## Window Index From 06a85102758e17254581d18d65fb4cd07295d405 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:28:06 -0500 Subject: [PATCH 0974/2998] docs(CHANGES): Update for pausing --- CHANGES | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGES b/CHANGES index 03d66a7bd2..be470b649d 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,27 @@ enter: false ``` +- #750: Pause execution via `sleep_before: [int]` and `sleep_after: [int]` + + ```yaml + session_name: Pause / skip command execution (command-level) + windows: + - panes: + - shell_command: + # Executes immediately + - echo "___$((11 + 1))___" + # Delays before sending 2 seconds + - cmd: echo "___$((1 + 3))___" + sleep_before: 2 + # Executes immediately + - cmd: echo "___$((1 + 3))___" + # Pauses 2 seconds after + - cmd: echo "Stuff rendering here!" + sleep_after: 2 + # Executes after earlier commands (after 2 sec) + - cmd: echo "2 seconds later" + ``` + - #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the `--config-format` and filename (`--save-to`). This means you can do it all in one command: From f63cf6dae91099cc20585611ce20a8b4e312ce13 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:28:56 -0500 Subject: [PATCH 0975/2998] docs: Fix typo in skip command execution --- docs/examples.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 268190b018..f171468909 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -332,6 +332,8 @@ This will add the `shell_command` to the bash history in the pane. ```{versionadded} 1.10.0b1 `enter: false` option. Pane-level support. +``` + ```{versionadded} 1.10.0b3 Support command-level skipping. ``` From e04360854bceffc0c2daf6b53c10157663ee63c8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 18:30:24 -0500 Subject: [PATCH 0976/2998] docs(examples): Synchronize titles --- examples/skip-send-pane-level.json | 4 ++-- examples/skip-send-pane-level.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/skip-send-pane-level.json b/examples/skip-send-pane-level.json index 43a88fa299..2fa8a2535c 100644 --- a/examples/skip-send-pane-level.json +++ b/examples/skip-send-pane-level.json @@ -1,5 +1,5 @@ { - "session_name": "Skip all pane commands", + "session_name": "Skip command execution (pane-level)", "windows": [ { "panes": [ @@ -17,4 +17,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/examples/skip-send-pane-level.yaml b/examples/skip-send-pane-level.yaml index cbc9d77ebb..03628f7691 100644 --- a/examples/skip-send-pane-level.yaml +++ b/examples/skip-send-pane-level.yaml @@ -1,4 +1,4 @@ -session_name: Skip all pane commands +session_name: Skip command execution (pane-level) windows: - panes: - shell_command: echo "___$((1 + 3))___" From f59c57aff3e4c444c16a191d423be62ca066d326 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:08:47 -0500 Subject: [PATCH 0977/2998] tests(sleep): Test shell_command_before --- tests/test_workspacebuilder.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 933de7017c..c22998d80e 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1081,6 +1081,21 @@ def test_load_workspace_enter( - shell_command: - cmd: echo "___$((1 + 3))___" sleep_before: 2 + """ + ), + 2, + "___4___", + ], + [ + textwrap.dedent( + """ +session_name: Should not execute +shell_command_before: + - cmd: echo "sleeping before" + sleep_before: 2 +windows: +- panes: + - echo "___$((1 + 3))___" """ ), 2, @@ -1092,6 +1107,7 @@ def test_load_workspace_enter( "command_level_pane_sleep_3_longform", "pane_sleep_2_shortform", "pane_sleep_2_longform", + "shell_before_before_command_level", ], ) def test_load_workspace_sleep( From 05918f8deeb7e17c7bf1d1537b4f9f9aaca487aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:11:49 -0500 Subject: [PATCH 0978/2998] tests(sleep): 3 reruns --- tests/test_workspacebuilder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index c22998d80e..fdcf63c3e9 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1110,6 +1110,7 @@ def test_load_workspace_enter( "shell_before_before_command_level", ], ) +@pytest.mark.flaky(reruns=3) def test_load_workspace_sleep( tmp_path: pathlib.Path, server: libtmux.Server, From 98717d736ca0548100065ea933e9e3b2cfc7b949 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:15:54 -0500 Subject: [PATCH 0979/2998] docs(sleep): Add virtualenv example --- examples/sleep-virtualenv.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 examples/sleep-virtualenv.yaml diff --git a/examples/sleep-virtualenv.yaml b/examples/sleep-virtualenv.yaml new file mode 100644 index 0000000000..5370fa34c7 --- /dev/null +++ b/examples/sleep-virtualenv.yaml @@ -0,0 +1,11 @@ +session_name: virtualenv +shell_command_before: +# - cmd: source $(poetry env info --path)/bin/activate +# - cmd: source `pipenv --venv`/bin/activate +- cmd: source .venv/bin/activate + sleep_before: 1 + sleep_after: 1 +windows: +- panes: + - shell_command: + - ./manage.py runserver From e841edbc657e9f5958098a9698b89f622239824e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:25:27 -0500 Subject: [PATCH 0980/2998] docs(example): Add virtualenv + sleep example --- docs/examples.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index f171468909..23b72d1518 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -386,6 +386,16 @@ Omit sending {kbd}`enter` to key commands. Equivalent to Omit sending {kbd}`enter` to key commands. Equivalent to having a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). +This is especially useful for expensive commands where the terminal needs some breathing room (virtualenv, poetry, pipenv, sourcing a configuration, launching a tui app, etc). + +````{tab} Virtualenv + +```{literalinclude} ../examples/sleep-virtualenv.yaml +:language: yaml + +``` +```` + ````{tab} YAML ```{literalinclude} ../examples/sleep.yaml From 89bfa9ea11d77dd23603d34aeec160354d728e46 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:33:24 -0500 Subject: [PATCH 0981/2998] docs(sleep): Add note about it being blocking --- docs/examples.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 23b72d1518..e84376744f 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -383,6 +383,10 @@ Omit sending {kbd}`enter` to key commands. Equivalent to `sleep_before` and `sleep_after` options added. Pane and command-level support. ``` +```{warning} +This will delay loading as it runs synchronously for each pane. In future version asynchronous support, (i.e. [`asyncio`](asyncio)) will speed up this up. +``` + Omit sending {kbd}`enter` to key commands. Equivalent to having a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). From bbd8cbc36d00b0106317114862d352a1bb943b73 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 19:44:14 -0500 Subject: [PATCH 0982/2998] Tag v1.10.0v4 (sleep_before, sleep_after) --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a4a09e309a..13ab9e1f5e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b3" +version = "1.10.0b4" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 96f8df7e38..3ef111ead9 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b3" +__version__ = "1.10.0b4" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 6f6ed733a76c5e7bea9f457fc3819bb17d6bf78a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 20:47:14 -0500 Subject: [PATCH 0983/2998] chore: make format_markdown via npx --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 811a7aded1..1638d15821 100644 --- a/Makefile +++ b/Makefile @@ -51,4 +51,4 @@ watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi format_markdown: - prettier --parser=markdown -w *.md docs/*.md docs/**/*.md CHANGES + npx prettier --parser=markdown -w *.md docs/*.md docs/**/*.md CHANGES From 032068c85ec3935aec19a7fa3228b1dccf62e1f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 20:56:26 -0500 Subject: [PATCH 0984/2998] docs(examples): Fix link, format --- docs/examples.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples.md b/docs/examples.md index e84376744f..6f7fd8c041 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -388,7 +388,7 @@ This will delay loading as it runs synchronously for each pane. In future versio ``` Omit sending {kbd}`enter` to key commands. Equivalent to having -a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). +a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). This is especially useful for expensive commands where the terminal needs some breathing room (virtualenv, poetry, pipenv, sourcing a configuration, launching a tui app, etc). @@ -546,7 +546,7 @@ pane during creation. :::{seealso} -{ref}`tmuxp developer config` in the {ref}`developing` section. +{ref}`tmuxp-developer-config` in the {ref}`developing` section. ::: From 9e4708ac9b9ce404393131d61c3437241dd862dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 20:58:35 -0500 Subject: [PATCH 0985/2998] docs(about tmux): Fix link --- docs/about_tmux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 4379317054..3066305ed3 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -518,7 +518,7 @@ line. The interval is determined by the `status-interval`: :::{tip} -{ref}`Prefix key` is pressed before a short cut! +{ref}`prefix-key` is pressed before a short cut! ::: From 6051bc22c14d4bdaba3c9bd8b5a6d14750a0cec7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 20:59:10 -0500 Subject: [PATCH 0986/2998] docs(about tmux): Highlighting fixes --- docs/about_tmux.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 3066305ed3..7cb0930c39 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -239,7 +239,7 @@ If **compiling from source**, the dependencies are ### Start a new session -```bash +```console $ tmux ``` @@ -281,7 +281,7 @@ press `o`. Sessions can be _named upon creation_. -```bash +```console $ tmux new-session [-s session-name] ``` @@ -301,7 +301,7 @@ Short cut ``Prefix`` + ``$`` Windows can be _named upon creation_. -```bash +```console $ tmux new-window [-n window-name] ``` @@ -335,25 +335,25 @@ Short cut ``Prefix`` + ``c`` By number -```bash +```console $ tmux select-window ``` Next -```bash +```console $ tmux next-window ``` Previous -```bash +```console $ tmux previous-window ``` Last-window -```bash +```console $ tmux last-window ``` @@ -370,13 +370,13 @@ $ tmux last-window Move window -```bash +```console $ tmux move-window [-t dst-window] ``` Swap the window -```bash +```console $ tmux swap-window [-t dst-window] ``` @@ -386,7 +386,7 @@ $ tmux swap-window [-t dst-window] ### Move panes -```bash +```console $ tmux move-pane [-t dst-pane] ``` @@ -400,11 +400,11 @@ $ tmux move-pane [-t dst-pane] Shortcut to move between panes. -```bash +```console $ tmux last-window ``` -```bash +```console $ tmux next-window ``` @@ -423,7 +423,7 @@ Recipe: tmux conf to `hjkl` commands, add this to your `~/.tmux.conf`: ### Kill window -```bash +```console $ tmux kill-window [-t target-window] ``` @@ -433,7 +433,7 @@ $ tmux kill-window [-t target-window] ### Kill pane -```bash +```console $ tmux kill-pane [-t target-pane] ``` @@ -443,7 +443,7 @@ $ tmux kill-pane [-t target-pane] ### Splitting windows into panes -```bash +```console $ tmux split-window [-c start-directory] ``` @@ -577,7 +577,7 @@ Source: tmux manpage[1]. To get the text documentation of a `.1` manual file: -```bash +```console $ nroff -mdoc tmux.1|less ``` From 3d31f34e7f3fa2733274231270af763fd25cb4af Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 21:07:58 -0500 Subject: [PATCH 0987/2998] docs: Fix footnote --- tmuxp/cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 65c5776c57..99c91625d3 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -638,6 +638,7 @@ def load_workspace( References ---------- .. [1] cmd-switch-client.c hook. GitHub repo for tmux. + https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132. Accessed April 8th, 2018. """ From e7a191f2b2c44043ccc1a0e62d1bfe2c752fe545 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 22:40:27 -0500 Subject: [PATCH 0988/2998] docs: Misc. link fixes --- CHANGES | 48 +++++++++++++++++++++++----------------------- docs/about.md | 6 +++--- docs/api.md | 4 ---- docs/developing.md | 2 +- docs/index.md | 2 +- 5 files changed, 29 insertions(+), 33 deletions(-) diff --git a/CHANGES b/CHANGES index be470b649d..ebbc51647b 100644 --- a/CHANGES +++ b/CHANGES @@ -13,12 +13,12 @@ windows: - panes: - shell_command: - - cmd: echo "___$((1 + 3))___" - enter: false - - # pane-wide skip + - echo "this sends" + - cmd: echo "___$((1 + 3))___" + enter: false + # pane-wide skip - shell_command: - - echo "___$((1 + 3))___" + - echo "___$((1 + 3))___" enter: false ``` @@ -27,20 +27,20 @@ ```yaml session_name: Pause / skip command execution (command-level) windows: - - panes: - - shell_command: - # Executes immediately - - echo "___$((11 + 1))___" - # Delays before sending 2 seconds - - cmd: echo "___$((1 + 3))___" - sleep_before: 2 - # Executes immediately - - cmd: echo "___$((1 + 3))___" - # Pauses 2 seconds after - - cmd: echo "Stuff rendering here!" - sleep_after: 2 - # Executes after earlier commands (after 2 sec) - - cmd: echo "2 seconds later" + - panes: + - shell_command: + # Executes immediately + - echo "___$((11 + 1))___" + # Delays before sending 2 seconds + - cmd: echo "___$((1 + 3))___" + sleep_before: 2 + # Executes immediately + - cmd: echo "___$((1 + 3))___" + # Pauses 2 seconds after + - cmd: echo "Stuff rendering here!" + sleep_after: 2 + # Executes after earlier commands (after 2 sec) + - cmd: echo "2 seconds later" ``` - #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the @@ -347,7 +347,7 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python ``` - As of {ref}`1.6.1 (above) `, `tmuxp shell` will find the most + As of {ref}`1.6.1 (above) `, `tmuxp shell` will find the most feature-rich shell available. If you have [ipython][ipython], [ptpython][ptpython], or [bpython][bpython] available, it will be selected automatically. Pass `--pdb` to use standard library pdb, or `--code` to use `code.interact`. @@ -925,12 +925,12 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python - {issue}`19` accept `-y` argument to answer yes to questions. - {meth}`cli.SessionCompleter` no longer allows a duplicate session after one is added. -- ongoing work on {ref}`about_tmux`. +- ongoing work on {ref}`about-tmux`. ## tmuxp 0.1-dev (2013-11-09) - [translation] [documentation in Chinese][documentation in chinese] from [wrongwaycn][wrongwaycn]. -- More work done on the {ref}`about_tmux` page. +- More work done on the {ref}`about-tmux` page. - {meth}`Pane.split_window()` for splitting {class}`Window` at `target-pane` location. @@ -978,7 +978,7 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python - Support for `[-L socket-name]` and `[-S socket-path]` in autocompletion and when loading. Note, switching client into another socket may cause an error. -- Documentation tweaking to {ref}`API`, {ref}`about_tmux`. +- Documentation tweaking to {ref}`API`, {ref}`about-tmux`. - [pep257][pep257], [pep8][pep8]. ## tmuxp 0.1-dev (2013-11-04) @@ -1190,7 +1190,7 @@ This will be the last Python 2.7 release of tmuxp. Bug fixes for python install because missing file - bash / zsh completion. - New page on {ref}`internals`. -- Updates to {ref}`about_tmux` page. +- Updates to {ref}`about-tmux` page. - add vim modeline for rst to bottom of this page - Server is now a subclass of `util.TmuxObject`. - subclasses of {class}`util.TmuxRelationalObject`, diff --git a/docs/about.md b/docs/about.md index 7b08dac67c..cae2e0797b 100644 --- a/docs/about.md +++ b/docs/about.md @@ -64,10 +64,10 @@ directly shell commands. tmuxp processes configuration via ORM layer. support. See {ref}`commands`. **Import config** import configs from Teamocil / Tmuxinator [^id4]. See -{ref}`cli_import`. +{ref}`cli-import`. **Session freezing** Supports session freezing into YAML and JSON -format [^id4]. See {ref}`cli_freeze`. +format [^id4]. See {ref}`cli-freeze`. **JSON config** JSON config support. See {ref}`Examples`. @@ -91,7 +91,7 @@ from JSON and YAML. ## Minor tweaks - Unit tests against live tmux version to test statefulness of tmux - sessions, windows and panes. See {ref}`travis`. + sessions, windows and panes. See {ref}`gh-actions`. - Load + switch to new session from inside tmux. - Resume session if config loaded. - Pre-commands virtualenv / rvm / any other commands. diff --git a/docs/api.md b/docs/api.md index bf0b342573..1141ba77ed 100644 --- a/docs/api.md +++ b/docs/api.md @@ -7,10 +7,6 @@ See {ref}`libtmux's API ` and {ref}`Quickstart tmux via python API calls. ::: -```{module} tmuxp - -``` - ## Internals :::{warning} diff --git a/docs/developing.md b/docs/developing.md index 97557e251a..76f3f846cd 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -240,7 +240,7 @@ $ make SPHINXBUILD='poetry run sphinx-build' watch ``` -After you {ref}`install_dev_env`, when inside the tmuxp checkout: +After you {ref}`install-dev-env`, when inside the tmuxp checkout: ```console diff --git a/docs/index.md b/docs/index.md index 439004a44b..c97b9da60a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,7 +19,7 @@ :start-after: "# Freeze a tmux session" ``` -### Table of Contents +## Table of Contents ```{toctree} :maxdepth: 2 From ca7800e4a9314b33ea70b0c71448e82cf816b20a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 13 Mar 2022 22:43:53 -0500 Subject: [PATCH 0989/2998] docs(CHANGES): Heading fixes --- CHANGES | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index ebbc51647b..93472bc781 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,7 @@ - _Insert changes/features/fixes for next release here_ -#### What's new +### What's new - #747: Skip execution via `enter: false` @@ -84,17 +84,17 @@ Credit: @jerri -#### Improvements +### Improvements - Improve `tmuxp freeze` UX flow, credit @joseph-flinn (#657, in re: #627) - `tmuxp freeze` will now detect the attached session if no session name is specified. Credit: @will-ockmore. (#660) -#### Bugs +### Bugs - Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) -#### Internal API +### Internal API - #752: Command structure (internal API) @@ -119,20 +119,20 @@ - #752: Configuration parsing refactorings -#### Development +### Development - Run through black + isort with string normalization (#738). This way we can use black without any configuration. (One-time, big diff) - Run codebase through pyupgrade (#745) - Add `codeql-analysis.yml` to try it out -#### Documentation +### Documentation - Move to `furo` sphinx theme ## tmuxp 1.9.4 (2022-01-10) -#### Packaging +### Packaging - `poetry build` used to package in place of `python setup.py build` (#729) @@ -147,7 +147,7 @@ Similar to the above, reach out to the #625 issue if you bump into problems. -#### What's new +### What's new - `tmuxp edit` for configuration changes (#707, @GlebPoljakov) From b720667b41afb77a4f42a2d3241c5edb11c0e2e2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:05:41 -0500 Subject: [PATCH 0990/2998] docs: Fix comment --- tmuxp/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/config.py b/tmuxp/config.py index 7d5cb2cae0..702c12de7d 100644 --- a/tmuxp/config.py +++ b/tmuxp/config.py @@ -114,7 +114,7 @@ def expandshell(_path): """ Return expanded path based on user's ``$HOME`` and ``env``. - :py:func:`os.path.expanduser` and :py:func:`os.path.expandvar`s + :py:func:`os.path.expanduser` and :py:func:`os.path.expandvars`. Parameters ---------- From 407dd0438ed41105c6237770f5513b19afe64663 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:07:41 -0500 Subject: [PATCH 0991/2998] docs(glossary): Fix link --- docs/glossary.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/glossary.md b/docs/glossary.md index 3a24d8c450..c90c9d918a 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -61,6 +61,6 @@ Target A target, cited in the manual as ``[-t target]`` can be a session, window or pane. -``` -[kaptan on github]: https://github.com/emre/kaptan +.. _kaptan on github: https://github.com/emre/kaptan +``` From bd26e4a0731b65d622ad6a30bff47bb2da7908ed Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:08:03 -0500 Subject: [PATCH 0992/2998] docs(history): Fix module link --- docs/history.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/history.md b/docs/history.md index 7fba9cc2ee..9ac69866a3 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,9 +1,5 @@ (history)= -```{module} tmuxp - -``` - ```{include} ../CHANGES ``` From 32cd70e1248dba29388f5dcc4d91482f9e4ed470 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:13:59 -0500 Subject: [PATCH 0993/2998] docs(README): Link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0635ae37ae..a298062434 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Debian / ubuntu: $ sudo apt install tmuxp ``` -Find the package for your distro on repology: https://repology.org/project/tmuxp/versions +Find the package for your distro on repology: # Load a tmux session From 4253756764a26edd1821ef4a81a0dff67e817e84 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:20:22 -0500 Subject: [PATCH 0994/2998] docs(README): Note experimental releases --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index a298062434..f9453b96e9 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,22 @@ $ sudo apt install tmuxp Find the package for your distro on repology: +Developmental releases: + +- [pip](https://pip.pypa.io/en/stable/): + + ```console + $ pip install --user --upgrade --pre tmuxp + ``` + +- [pipx](https://pypa.github.io/pipx/docs/): + + ```console + $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force + ``` + + Then use `tmuxp@next load [session]`. + # Load a tmux session Load tmux sessions via json and YAML, From d4d195fc86f7ee4048bd65d93c9c2fd7a80e85bc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:21:14 -0500 Subject: [PATCH 0995/2998] docs(quickstart): Note developmental releases --- docs/quickstart.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 1ad620bda1..f5dfdca00f 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -7,17 +7,13 @@ Assure you have at least tmux **>= 1.8** and python **>= 2.6**. ```console - $ pip install --user tmuxp - ``` You can upgrade to the latest release with: ```console - $ pip install --user tmuxp -U - ``` Then install {ref}`completion`. @@ -25,11 +21,25 @@ Then install {ref}`completion`. If you are a Homebrew user you can install it with: ```console - $ brew install tmuxp - ``` +### Developmental releases + +- [pip](https://pip.pypa.io/en/stable/): + + ```console + $ pip install --user --upgrade --pre tmuxp + ``` + +- [pipx](https://pypa.github.io/pipx/docs/): + + ```console + $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force + ``` + + Then use `tmuxp@next load [session]`. + ## CLI :::{seealso} From 9cbed99edf9df7f0d2c5604be7a23f5417eb0c5d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:24:16 -0500 Subject: [PATCH 0996/2998] docs(quickstart): Note on general availability --- docs/quickstart.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/quickstart.md b/docs/quickstart.md index f5dfdca00f..dc3961f1f6 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -24,8 +24,14 @@ If you are a Homebrew user you can install it with: $ brew install tmuxp ``` +(developmental-releases)= + ### Developmental releases +New versions of tmuxp are published to PyPI as alpha, beta, or release candidates. +In their versions you will see notfication like `a1`, `b1`, and `rc1`, respectively. +`1.10.0b4` would mean the 4th beta release of `1.10.0` before general availability. + - [pip](https://pip.pypa.io/en/stable/): ```console From f0e08def81d2e3120a40ffe68e14e9eb59ac144b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 06:29:51 -0500 Subject: [PATCH 0997/2998] docs(CHANGES): Note installing the latest version --- CHANGES | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 93472bc781..32616280fe 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,21 @@ # Changelog -## current +To install the unreleased tmuxp version, see [developmental releases](https://tmuxp.git-pull.com/quickstart.html#developmental-releases). + +[pip](https://pip.pypa.io/en/stable/): + +```console +$ pip install --user --upgrade --pre tmuxp +``` + +[pipx](https://pypa.github.io/pipx/docs/): + +```console +$ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force +// Usage: tmuxp@next load yoursession +``` + +## 0.10 - unreleased - _Insert changes/features/fixes for next release here_ From 993aeb6c8676c2593c9baa1d4e778ae097dc7ddb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 07:18:51 -0500 Subject: [PATCH 0998/2998] docs(quickstart): Install via git --- docs/quickstart.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index dc3961f1f6..39315577ce 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -32,13 +32,13 @@ New versions of tmuxp are published to PyPI as alpha, beta, or release candidate In their versions you will see notfication like `a1`, `b1`, and `rc1`, respectively. `1.10.0b4` would mean the 4th beta release of `1.10.0` before general availability. -- [pip](https://pip.pypa.io/en/stable/): +- [pip]\: ```console $ pip install --user --upgrade --pre tmuxp ``` -- [pipx](https://pypa.github.io/pipx/docs/): +- [pipx]\: ```console $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force @@ -46,6 +46,23 @@ In their versions you will see notfication like `a1`, `b1`, and `rc1`, respectiv Then use `tmuxp@next load [session]`. +via trunk (can break easily): + +- [pip]\: + + ```console + $ pip install --user -e git+https://github.com/tmux-python/tmuxp.git#egg=tmuxp + ``` + +- [pipx]\: + + ```console + $ pipx install --suffix=@master 'tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master' --force + ``` + +[pip]: https://pip.pypa.io/en/stable/ +[pipx]: https://pypa.github.io/pipx/docs/ + ## CLI :::{seealso} From d1524be31b9eb787797e1fd474b5023e3efde49f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 14 Mar 2022 21:55:16 -0500 Subject: [PATCH 0999/2998] build(deps): pytest 7.1.0, sphinxext-opengraph 0.6.2 --- poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8351154aee..3fce83249e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -743,11 +743,11 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.0.1" +version = "7.1.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -1105,7 +1105,7 @@ test = ["pytest"] [[package]] name = "sphinxext-opengraph" -version = "0.6.1" +version = "0.6.2" description = "Sphinx Extension to enable OGP support" category = "dev" optional = false @@ -1762,8 +1762,8 @@ pyparsing = [ {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ - {file = "pytest-7.0.1-py3-none-any.whl", hash = "sha256:9ce3ff477af913ecf6321fe337b93a2c0dcf2a0a1439c43f5452112c1e4280db"}, - {file = "pytest-7.0.1.tar.gz", hash = "sha256:e30905a0c131d3d94b89624a1cc5afec3e0ba2fbdb151867d8e0ebd49850f171"}, + {file = "pytest-7.1.0-py3-none-any.whl", hash = "sha256:b555252a95bbb2a37a97b5ac2eb050c436f7989993565f5e0c9128fcaacadd0e"}, + {file = "pytest-7.1.0.tar.gz", hash = "sha256:f1089d218cfcc63a212c42896f1b7fbf096874d045e1988186861a1a87d27b47"}, ] pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, @@ -1901,8 +1901,8 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sphinxext-opengraph = [ - {file = "sphinxext-opengraph-0.6.1.tar.gz", hash = "sha256:d4f6c5ec0d4080503f79a4a9d4dec88c789f7dc6e5688a7c3eccf3c8209f0bc4"}, - {file = "sphinxext_opengraph-0.6.1-py3-none-any.whl", hash = "sha256:116835a5519aa26af4b45e8c17edabe671d6a8aed3c5e20efd808ec7b1ef3c49"}, + {file = "sphinxext-opengraph-0.6.2.tar.gz", hash = "sha256:30d4dbe345da991c210626795c05918c3f9ad9f7d14d9c48812ccfa7a1ec4bab"}, + {file = "sphinxext_opengraph-0.6.2-py3-none-any.whl", hash = "sha256:bed3df675b0717b294e274fc59602ee43ccfb758418d5f194d2908c3592605e9"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, From 1d2e95a2475a6b9f54c8fa358f5c14b400f4fb1e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 18:06:08 -0500 Subject: [PATCH 1000/2998] docs(README): Link updates --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f9453b96e9..953c0c6562 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ tmuxp, tmux session manager. built on [libtmux](https://github.com/tmux-python/libtmux). -[![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](http://badge.fury.io/py/tmuxp) -[![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22Publish+Docs%22) +[![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](https://pypi.org/project/tmuxp/) +[![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://tmuxp.git-pull.com/) [![Build status](https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22tests%22) [![Code Coverage](https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg)](https://codecov.io/gh/tmux-python/tmuxp) [![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg)](https://github.com/tmux-python/tmuxp/blob/master/LICENSE) @@ -10,7 +10,7 @@ tmuxp, tmux session manager. built on **We need help!** tmuxp is a trusted session manager for tmux. If you could lend your time to helping answer issues and QA pull requests, please do! See [issue -#290](https://github.com/tmux-python/tmuxp/issues/290)! +#290](https://github.com/tmux-python/tmuxp/discussions/290)! **New to tmux?** [The Tao of tmux](https://leanpub.com/the-tao-of-tmux) is available on Leanpub and [Amazon Kindle](http://amzn.to/2gPfRhC). From 244b2e94db64d7bdf7470d3e5a0d1d23177e341c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 19:31:14 -0500 Subject: [PATCH 1001/2998] docs: Title update --- README.md | 5 +++-- docs/index.md | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 953c0c6562..4857954234 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -tmuxp, tmux session manager. built on -[libtmux](https://github.com/tmux-python/libtmux). +# tmuxp, a session manager for tmux. + +Built on [libtmux](https://github.com/tmux-python/libtmux). [![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](https://pypi.org/project/tmuxp/) [![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://tmuxp.git-pull.com/) diff --git a/docs/index.md b/docs/index.md index c97b9da60a..73b9938579 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,9 +1,5 @@ (index)= -# tmuxp - -## tmux session manager - ```{include} ../README.md :end-before: Date: Thu, 17 Mar 2022 19:31:54 -0500 Subject: [PATCH 1002/2998] docs(css): Remove font size tweaks --- docs/_static/css/custom.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index aefd33b4c9..8f5cc76cc6 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -1,19 +1,16 @@ h2 { - font-size: 2rem; margin-bottom: 1.25rem; margin-top: 1.25rem; scroll-margin-top: 0.5rem; } h3 { - font-size: 1.5rem; margin-bottom: 1.25rem; margin-top: 1.25rem; scroll-margin-top: 0.5rem; } h4 { - font-size: 1.25rem; margin-bottom: 1.25rem; scroll-margin-top: 0.5rem; } From 4e89cd39805b5a073f75a1fe4541247cbfc596e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 19:34:42 -0500 Subject: [PATCH 1003/2998] docs(README): title update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4857954234..1266ff8923 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# tmuxp, a session manager for tmux. +# tmuxp -Built on [libtmux](https://github.com/tmux-python/libtmux). +A session manager for tmux. Built on [libtmux](https://github.com/tmux-python/libtmux). [![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](https://pypi.org/project/tmuxp/) [![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://tmuxp.git-pull.com/) From e6f1e1a4e111f4d6b81645e8f8dfa122d49ef9fd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 19:35:35 -0500 Subject: [PATCH 1004/2998] docs(README): Tweak readme --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1266ff8923..1bdcec9f24 100644 --- a/README.md +++ b/README.md @@ -8,16 +8,14 @@ A session manager for tmux. Built on [libtmux](https://github.com/tmux-python/li [![Code Coverage](https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg)](https://codecov.io/gh/tmux-python/tmuxp) [![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg)](https://github.com/tmux-python/tmuxp/blob/master/LICENSE) -**We need help!** tmuxp is a trusted session manager for tmux. If you -could lend your time to helping answer issues and QA pull requests, -please do! See [issue -#290](https://github.com/tmux-python/tmuxp/discussions/290)! - **New to tmux?** [The Tao of tmux](https://leanpub.com/the-tao-of-tmux) is available on Leanpub and [Amazon Kindle](http://amzn.to/2gPfRhC). Read and browse the book for free [on the web](https://leanpub.com/the-tao-of-tmux/read). +**Have some spare time?** Help us triage and code review and the tracker. See [issue +#290](https://github.com/tmux-python/tmuxp/discussions/290)! + # Installation pip: From 341230e31f86eb892a9369543cc946d22fb1c0fa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 19:44:18 -0500 Subject: [PATCH 1005/2998] build(deps): Add sphinxext-rediraffe See also: https://github.com/wpilibsuite/sphinxext-rediraffe --- poetry.lock | 155 +++++++++++++++++++++++++++---------------------- pyproject.toml | 3 +- 2 files changed, 87 insertions(+), 71 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3fce83249e..d0cf741ec9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -225,7 +225,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "cryptography" -version = "36.0.1" +version = "36.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "dev" optional = false @@ -475,7 +475,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.0" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false @@ -743,7 +743,7 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.1.0" +version = "7.1.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -1114,6 +1114,17 @@ python-versions = ">=3.6" [package.dependencies] sphinx = ">=2.0" +[[package]] +name = "sphinxext-rediraffe" +version = "0.2.7" +description = "Sphinx Extension that redirects non-existent pages to working pages." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +sphinx = ">=2.0" + [[package]] name = "toml" version = "0.10.2" @@ -1203,14 +1214,14 @@ python-versions = ">=3.6" [[package]] name = "urllib3" -version = "1.26.8" +version = "1.26.9" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] @@ -1274,7 +1285,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "3c9c801a45aa3d93cb68383a7d10b41cf8287fda06bdcfff6be32d34baf7d84f" +content-hash = "a1f3dcf451664b20e031c672df348ef29ce5d2c8111c8fcaae40952c866def71" [metadata.files] aafigure = [ @@ -1463,26 +1474,26 @@ crashtest = [ {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, ] cryptography = [ - {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b"}, - {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:2d87cdcb378d3cfed944dac30596da1968f88fb96d7fc34fdae30a99054b2e31"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74d6c7e80609c0f4c2434b97b80c7f8fdfaa072ca4baab7e239a15d6d70ed73a"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:6c0c021f35b421ebf5976abf2daacc47e235f8b6082d3396a2fe3ccd537ab173"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59a9d55027a8b88fd9fd2826c4392bd487d74bf628bb9d39beecc62a644c12"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a817b961b46894c5ca8a66b599c745b9a3d9f822725221f0e0fe49dc043a3a3"}, - {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:94ae132f0e40fe48f310bba63f477f14a43116f05ddb69d6fa31e93f05848ae2"}, - {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7be0eec337359c155df191d6ae00a5e8bbb63933883f4f5dffc439dac5348c3f"}, - {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e0344c14c9cb89e76eb6a060e67980c9e35b3f36691e15e1b7a9e58a0a6c6dc3"}, - {file = "cryptography-36.0.1-cp36-abi3-win32.whl", hash = "sha256:4caa4b893d8fad33cf1964d3e51842cd78ba87401ab1d2e44556826df849a8ca"}, - {file = "cryptography-36.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:391432971a66cfaf94b21c24ab465a4cc3e8bf4a939c1ca5c3e3a6e0abebdbcf"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb5829d027ff82aa872d76158919045a7c1e91fbf241aec32cb07956e9ebd3c9"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc15b1c22e55c4d5566e3ca4db8689470a0ca2babef8e3a9ee057a8b82ce4b1"}, - {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:596f3cd67e1b950bc372c33f1a28a0692080625592ea6392987dba7f09f17a94"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:30ee1eb3ebe1644d1c3f183d115a8c04e4e603ed6ce8e394ed39eea4a98469ac"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec63da4e7e4a5f924b90af42eddf20b698a70e58d86a72d943857c4c6045b3ee"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca238ceb7ba0bdf6ce88c1b74a87bffcee5afbfa1e41e173b1ceb095b39add46"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:ca28641954f767f9822c24e927ad894d45d5a1e501767599647259cbf030b903"}, - {file = "cryptography-36.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:39bdf8e70eee6b1c7b289ec6e5d84d49a6bfa11f8b8646b5b3dfe41219153316"}, - {file = "cryptography-36.0.1.tar.gz", hash = "sha256:53e5c1dc3d7a953de055d77bef2ff607ceef7a2aac0353b5d630ab67f7423638"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, + {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, + {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, + {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, + {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, + {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, + {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, + {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, + {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, @@ -1559,46 +1570,46 @@ markdown-it-py = [ {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, ] markupsafe = [ - {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-win32.whl", hash = "sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-win32.whl", hash = "sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-win32.whl", hash = "sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-win32.whl", hash = "sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7"}, - {file = "MarkupSafe-2.1.0.tar.gz", hash = "sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, @@ -1762,8 +1773,8 @@ pyparsing = [ {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] pytest = [ - {file = "pytest-7.1.0-py3-none-any.whl", hash = "sha256:b555252a95bbb2a37a97b5ac2eb050c436f7989993565f5e0c9128fcaacadd0e"}, - {file = "pytest-7.1.0.tar.gz", hash = "sha256:f1089d218cfcc63a212c42896f1b7fbf096874d045e1988186861a1a87d27b47"}, + {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, + {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, ] pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, @@ -1904,6 +1915,10 @@ sphinxext-opengraph = [ {file = "sphinxext-opengraph-0.6.2.tar.gz", hash = "sha256:30d4dbe345da991c210626795c05918c3f9ad9f7d14d9c48812ccfa7a1ec4bab"}, {file = "sphinxext_opengraph-0.6.2-py3-none-any.whl", hash = "sha256:bed3df675b0717b294e274fc59602ee43ccfb758418d5f194d2908c3592605e9"}, ] +sphinxext-rediraffe = [ + {file = "sphinxext-rediraffe-0.2.7.tar.gz", hash = "sha256:651dcbfae5ffda9ffd534dfb8025f36120e5efb6ea1a33f5420023862b9f725d"}, + {file = "sphinxext_rediraffe-0.2.7-py3-none-any.whl", hash = "sha256:9e430a52d4403847f4ffb3a8dd6dfc34a9fe43525305131f52ed899743a5fd8c"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1998,8 +2013,8 @@ typing-extensions = [ {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, ] urllib3 = [ - {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, - {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] virtualenv = [ {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"}, diff --git a/pyproject.toml b/pyproject.toml index 13ab9e1f5e..728c717c6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,6 +64,7 @@ sphinx-issues = "^3.0.0" sphinx-inline-tabs = { version = "*", python = "^3.7" } sphinxext-opengraph = "*" sphinx-copybutton = "^0.5.0" +sphinxext-rediraffe = "*" myst_parser = "~0.17.0" ### Testing ### @@ -87,7 +88,7 @@ isort = "*" flake8 = "*" [tool.poetry.extras] -docs = ["sphinx", "sphinx-issues", "sphinx-click", "sphinx-autodoc-typehints", "sphinx-autobuild", "sphinx-copybutton", "sphinxext-opengraph", "sphinx-inline-tabs", "myst_parser", "furo", "aafigure", "pillow"] +docs = ["sphinx", "sphinx-issues", "sphinx-click", "sphinx-autodoc-typehints", "sphinx-autobuild", "sphinx-copybutton", "sphinxext-opengraph", "sphinx-inline-tabs", "sphinxext-rediraffe", "myst_parser", "furo", "aafigure", "pillow"] test = ["pytest", "pytest-rerunfailures", "pytest-mock", "pytest-watcher", "tox", "tox-poetry-installer"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] From 704f26e62383e28c86f00da7d50a572f89f7e85a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 20:01:28 -0500 Subject: [PATCH 1006/2998] docs(conf): Add sphinxext-rediraffe to config --- docs/conf.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 1eba0e0856..6fa2757174 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,6 +33,7 @@ "sphinx_inline_tabs", "sphinx_copybutton", "sphinxext.opengraph", + "sphinxext.rediraffe", "myst_parser", ] @@ -102,6 +103,10 @@ copybutton_prompt_is_regexp = True copybutton_remove_prompts = True +# sphinxext-rediraffe +rediraffe_redirects = "redirects.txt" +rediraffe_branch = "master~1" + htmlhelp_basename = "%sdoc" % about["__title__"] latex_documents = [ From a384e907b29d38a43e53f95957e2952f526e917d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 20:08:15 -0500 Subject: [PATCH 1007/2998] docs(redirects): Stub out sphinxext-rediraffe direct file --- docs/redirects.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/redirects.txt diff --git a/docs/redirects.txt b/docs/redirects.txt new file mode 100644 index 0000000000..e69de29bb2 From fc7918e9849dcbcc8aecd8da321e3867984ffa99 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 20:20:50 -0500 Subject: [PATCH 1008/2998] docs(makefile): Add redirects command --- docs/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/Makefile b/docs/Makefile index ac472e62fd..75fd97121a 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -155,6 +155,11 @@ doctest: @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." +redirects: + $(SPHINXBUILD) -b rediraffewritediff $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The redirects are in rediraffe_redirects." + checkbuild: rm -rf $(BUILDDIR) $(SPHINXBUILD) -n -q ./ $(BUILDDIR) From 123a8cfec1f6233c778f12d04caa1f1ee281d9c9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 21:27:49 -0500 Subject: [PATCH 1009/2998] docs(index): Remove ToC --- docs/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 73b9938579..5f6c42a7a4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,10 +15,9 @@ :start-after: "# Freeze a tmux session" ``` -## Table of Contents - ```{toctree} :maxdepth: 2 +:hidden: about quickstart From bf1c5afc6677a2db428813cce9514c870e99a44d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 21:29:25 -0500 Subject: [PATCH 1010/2998] docs: Organize sidebar --- docs/index.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 5f6c42a7a4..90a6c8438c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,10 +24,17 @@ quickstart examples cli plugin_system -developing -api -history + +``` + +```{toctree} +:caption: Project +:hidden: + about_tmux glossary - +api +developing +history +GitHub ``` From 219af2e64e9a2ff2f93ce77f062661afffaba080 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 21:46:40 -0500 Subject: [PATCH 1011/2998] chore: Another fix for makefile command --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 75fd97121a..38e6bf8ea8 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -156,7 +156,7 @@ doctest: "results in $(BUILDDIR)/doctest/output.txt." redirects: - $(SPHINXBUILD) -b rediraffewritediff $(ALLSPHINXOPTS) $(BUILDDIR)/html + $(SPHINXBUILD) -b rediraffewritediff $(ALLSPHINXOPTS) $(BUILDDIR)/redirects @echo @echo "Build finished. The redirects are in rediraffe_redirects." From 844c0d1cf41f92c7e9be5eb236d088fca229c863 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 17 Mar 2022 22:08:05 -0500 Subject: [PATCH 1012/2998] docs: cli -> commands/ --- README.md | 4 ++-- docs/{cli.md => commands/index.md} | 2 +- docs/index.md | 2 +- docs/quickstart.md | 6 +++--- docs/redirects.txt | 1 + 5 files changed, 8 insertions(+), 7 deletions(-) rename docs/{cli.md => commands/index.md} (99%) diff --git a/README.md b/README.md index 1bdcec9f24..7ef70ce9a7 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ $ tmuxp shell -c 'print(window.name.upper())' MY_WINDOW ``` -Read more on [tmuxp shell](https://tmuxp.git-pull.com/cli.html#shell) in +Read more on [tmuxp shell](https://tmuxp.git-pull.com/commands/#shell) in the CLI docs. # Pre-load hook @@ -194,7 +194,7 @@ $ tmuxp freeze session-name ``` See more about [freezing -tmux](http://tmuxp.git-pull.com/cli.html#freeze-sessions) sessions. +tmux](http://tmuxp.git-pull.com/commands/#freeze-sessions) sessions. # Convert a session file diff --git a/docs/cli.md b/docs/commands/index.md similarity index 99% rename from docs/cli.md rename to docs/commands/index.md index 01ae725521..4bba3ef42e 100644 --- a/docs/cli.md +++ b/docs/commands/index.md @@ -2,7 +2,7 @@ (commands)= -# Command Line Interface +# Commands (completion)= diff --git a/docs/index.md b/docs/index.md index 90a6c8438c..cf2b5781fb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -22,7 +22,7 @@ about quickstart examples -cli +commands/index plugin_system ``` diff --git a/docs/quickstart.md b/docs/quickstart.md index 39315577ce..c3395084b0 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -63,11 +63,11 @@ via trunk (can break easily): [pip]: https://pip.pypa.io/en/stable/ [pipx]: https://pypa.github.io/pipx/docs/ -## CLI +## Commands :::{seealso} -{ref}`examples`, {ref}`cli`, {ref}`completion`. +{ref}`examples`, {ref}`commands`, {ref}`completion`. ::: @@ -153,7 +153,7 @@ AL - [Abstraction Layer][abstraction layer] | {meth}`libtmux.Window.split_window` | `$ tmux split-window` | | {meth}`libtmux.Pane.send_keys` | `$ tmux send-keys` | -[import]: http://tmuxp.git-pull.com/cli.html#import +[import]: http://tmuxp.git-pull.com/commands/#import [tmuxinator]: https://github.com/aziz/tmuxinator [teamocil]: https://github.com/remiprev/teamocil [abstraction layer]: http://en.wikipedia.org/wiki/Abstraction_layer diff --git a/docs/redirects.txt b/docs/redirects.txt index e69de29bb2..36313d1a38 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -0,0 +1 @@ +"cli.md" "commands/index.md" From 843a68a78f09bf82bfa023f3e87edbc246a77f49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 17:50:07 -0500 Subject: [PATCH 1013/2998] build(deps): 0.11.0b2 -> 0.11.0b3 --- poetry.lock | 14 +++++++------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index d0cf741ec9..ced09b4e4d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -425,7 +425,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.11.0b2" +version = "0.11.0b3" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1227,7 +1227,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.3" +version = "20.13.4" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1285,7 +1285,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "a1f3dcf451664b20e031c672df348ef29ce5d2c8111c8fcaae40952c866def71" +content-hash = "7d9b83497473321bd6a6100d29b854c8dd4a8f10ad016714b35d1eac94d8c499" [metadata.files] aafigure = [ @@ -1555,8 +1555,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.11.0b2-py3-none-any.whl", hash = "sha256:a5c7f2e399106c861e5eb7e0efafe8668570c9762402922ea19685cb63304ee8"}, - {file = "libtmux-0.11.0b2.tar.gz", hash = "sha256:04e268681d3cff9f01f7f68a0fab33fd2f06c5ecb6e67ef19a630e4a26ba41a3"}, + {file = "libtmux-0.11.0b3-py3-none-any.whl", hash = "sha256:16e435769aad8ea50fe0120eca38afb6fe03010312e6173da21953c334ceeb72"}, + {file = "libtmux-0.11.0b3.tar.gz", hash = "sha256:a75ed9180b80b9c599971c028711ff20b75682752b20147aa5b153f47243dfc0"}, ] livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, @@ -2017,8 +2017,8 @@ urllib3 = [ {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] virtualenv = [ - {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"}, - {file = "virtualenv-20.13.3.tar.gz", hash = "sha256:e9dd1a1359d70137559034c0f5433b34caf504af2dc756367be86a5a32967134"}, + {file = "virtualenv-20.13.4-py2.py3-none-any.whl", hash = "sha256:c3e01300fb8495bc00ed70741f5271fc95fed067eb7106297be73d30879af60c"}, + {file = "virtualenv-20.13.4.tar.gz", hash = "sha256:ce8901d3bbf3b90393498187f2d56797a8a452fb2d0d7efc6fd837554d6f679c"}, ] watchdog = [ {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, diff --git a/pyproject.toml b/pyproject.toml index 728c717c6b..68b04249dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.11.0b2" +libtmux = "~0.11.0b3" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From adb0c1bd47ef2c37802d1d7a7fc0c7e04d2fbcf7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 17:58:06 -0500 Subject: [PATCH 1014/2998] Tag v1.10.0b5 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 68b04249dd..9d2e937bf3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b4" +version = "1.10.0b5" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 3ef111ead9..8adce74a42 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b4" +__version__ = "1.10.0b5" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From ae52343cb1b9f405298d623b4443bf0f4c2a1560 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 19:06:09 -0500 Subject: [PATCH 1015/2998] build: Tag 1.10.0b6 (libtmux @ 0.11.0b4) --- poetry.lock | 8 ++++---- pyproject.toml | 4 ++-- tmuxp/__about__.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index ced09b4e4d..cd6d62ab3a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -425,7 +425,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.11.0b3" +version = "0.11.0b4" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1285,7 +1285,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "7d9b83497473321bd6a6100d29b854c8dd4a8f10ad016714b35d1eac94d8c499" +content-hash = "bfe80127219ae86a1900d3f364e8d129657ed7521ee0ccb0d1ee38bc1cf20b36" [metadata.files] aafigure = [ @@ -1555,8 +1555,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.11.0b3-py3-none-any.whl", hash = "sha256:16e435769aad8ea50fe0120eca38afb6fe03010312e6173da21953c334ceeb72"}, - {file = "libtmux-0.11.0b3.tar.gz", hash = "sha256:a75ed9180b80b9c599971c028711ff20b75682752b20147aa5b153f47243dfc0"}, + {file = "libtmux-0.11.0b4-py3-none-any.whl", hash = "sha256:9031bfd2eb645fd9d04a571b4a17068f5d1aa0c8d5e1f0741d7b41ea7180a87e"}, + {file = "libtmux-0.11.0b4.tar.gz", hash = "sha256:9da93087e5ae6eb54f974ceec778389c4036ca6393aeff1e87e5977583f92867"}, ] livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, diff --git a/pyproject.toml b/pyproject.toml index 9d2e937bf3..ad984a75d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b5" +version = "1.10.0b6" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.11.0b3" +libtmux = "~0.11.0b4" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8adce74a42..6313b07ba0 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b5" +__version__ = "1.10.0b6" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 12322d8697a213c0258bc6cb5e7fe3efa9d5ace7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 19:14:21 -0500 Subject: [PATCH 1016/2998] docs: Remove unused link --- docs/about.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/about.md b/docs/about.md index cae2e0797b..9a27866996 100644 --- a/docs/about.md +++ b/docs/about.md @@ -27,13 +27,6 @@ Interested in some kung-fu or joining the effort? {ref}`api` and ## Differences from tmuxinator / teamocil -:::{note} - -If you use teamocil / tmuxinator and can clarify or add differences, -please free to [edit this page][edit this page] on github. - -::: - ### Similarities **Load sessions** Loads tmux sessions from config From 6125686216dd3414611a9e0ca27b2c52efca0541 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 22:14:23 -0500 Subject: [PATCH 1017/2998] docs(CHANGES): Note documentation updates --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 32616280fe..6813b43ed0 100644 --- a/CHANGES +++ b/CHANGES @@ -144,6 +144,8 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### Documentation - Move to `furo` sphinx theme +- Reorganize documentation into sections +- Added examples for `enter: false` and `sleep: [second]` ## tmuxp 1.9.4 (2022-01-10) From 5c554776a8d959c170656e41a9a8661f8111a073 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 22:24:41 -0500 Subject: [PATCH 1018/2998] docs(CHANGES,examples): Note that enter and sleep is experimental --- docs/examples.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/docs/examples.md b/docs/examples.md index 6f7fd8c041..262adaa734 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -328,14 +328,20 @@ This will add the `shell_command` to the bash history in the pane. ```` +(enter)= + ## Skip command execution -```{versionadded} 1.10.0b1 -`enter: false` option. Pane-level support. -``` +See more at {ref}`enter`. + +:::{note} + +_Experimental setting_: behavior and api is subject to change until stable. + +::: -```{versionadded} 1.10.0b3 -Support command-level skipping. +```{versionadded} 1.10.0 +`enter: false` option. Pane-level support. ``` Omit sending {kbd}`enter` to key commands. Equivalent to @@ -377,14 +383,22 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ```` +(sleep)= + ## Pausing commands -```{versionadded} 1.10.0b4 +:::{note} + +_Experimental setting_: behavior and api is subject to change until stable. + +::: + +```{versionadded} 1.10.0 `sleep_before` and `sleep_after` options added. Pane and command-level support. ``` ```{warning} -This will delay loading as it runs synchronously for each pane. In future version asynchronous support, (i.e. [`asyncio`](asyncio)) will speed up this up. +**Blocking.** This will delay loading as it runs synchronously for each pane as [`asyncio`](asyncio)) is not implemented yet. ``` Omit sending {kbd}`enter` to key commands. Equivalent to having From 1ddf1f02bbc672d1597ab2db571986a687a6515b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 22:40:58 -0500 Subject: [PATCH 1019/2998] docs(CHANGES): Linkify issues and note the settings are experimental --- CHANGES | 67 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/CHANGES b/CHANGES index 6813b43ed0..f592a75050 100644 --- a/CHANGES +++ b/CHANGES @@ -21,7 +21,15 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### What's new -- #747: Skip execution via `enter: false` +- {issue}`747`: Skip execution via `enter: false` + + See {ref}`enter`. + + :::{note} + + _Experimental setting_: behavior and api is subject to change until stable. + + ::: ```yaml session_name: Should not execute @@ -37,7 +45,15 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force enter: false ``` -- #750: Pause execution via `sleep_before: [int]` and `sleep_after: [int]` +- {issue}`750`: Pause execution via `sleep_before: [int]` and `sleep_after: [int]` + + See {ref}`sleep`. + + :::{note} + + _Experimental setting_: behavior and api is subject to change until stable. + + ::: ```yaml session_name: Pause / skip command execution (command-level) @@ -58,7 +74,7 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - cmd: echo "2 seconds later" ``` -- #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the +- {issue}`701`: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the `--config-format` and filename (`--save-to`). This means you can do it all in one command: @@ -68,7 +84,7 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force Credit: [@davidatbu](https://github.com/davidatbu) -- #672: Panes now accept `shell` for their initial command. +- {issue}`672`: Panes now accept `shell` for their initial command. Equivalent to `tmux split-windows`'s `[shell-command]` @@ -101,19 +117,19 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### Improvements -- Improve `tmuxp freeze` UX flow, credit @joseph-flinn (#657, in re: #627) +- Improve `tmuxp freeze` UX flow, credit @joseph-flinn ({issue}`657`, in re: {issue}`627`) - `tmuxp freeze` will now detect the attached session if no session name - is specified. Credit: @will-ockmore. (#660) + is specified. Credit: @will-ockmore. ({issue}`660`) ### Bugs -- Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) +- Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! ({issue}`725`) ### Internal API -- #752: Command structure (internal API) +- {issue}`752`: Command structure (internal API) - To pave the way for per-command options such as `enter: false` (#53), commands are now a different format: + To pave the way for per-command options such as `enter: false` ({issue}`53`), commands are now a different format: Before, [`str`](str): @@ -132,13 +148,13 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force This is purely internal. Normal usage should be the same since the configuration emits the equivalent result. -- #752: Configuration parsing refactorings +- {issue}`752`: Configuration parsing refactorings ### Development -- Run through black + isort with string normalization (#738). This way we can +- Run through black + isort with string normalization ({issue}`738`). This way we can use black without any configuration. (One-time, big diff) -- Run codebase through pyupgrade (#745) +- Run codebase through pyupgrade ({issue}`745`) - Add `codeql-analysis.yml` to try it out ### Documentation @@ -151,22 +167,21 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### Packaging -- `poetry build` used to package in place of `python setup.py build` (#729) +- `poetry build` used to package in place of `python setup.py build` ({issue}`729`) - Package maintainers: If you run into any issues check in at - [#625](https://github.com/tmux-python/tmuxp/issues/625) and file an issue. + Package maintainers: If you run into any issues check in at {issue}`625` and file an issue. Additionally, `libtmux` has been pinned to a similar release at [0.10.3](https://pypi.org/project/libtmux/0.10.3/) which has used the new build process. -- `poetry publish` instead of `twine upload dist/*` (#729) +- `poetry publish` instead of `twine upload dist/*` ({issue}`729`) - Similar to the above, reach out to the #625 issue if you bump into problems. + Similar to the above, reach out to the {issue}`625` issue if you bump into problems. ### What's new -- `tmuxp edit` for configuration changes (#707, @GlebPoljakov) +- `tmuxp edit` for configuration changes ({issue}`707`, @GlebPoljakov) Inside of configuration directory: `tmuxp edit yourconfig` @@ -174,26 +189,26 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### Removed support -- Python 3.6 support has been removed (#726) +- Python 3.6 support has been removed ({issue}`726`) ### Development - We are trying `.pre-commit-config.yaml` in pull requests to automate - black, isort and flake8 for those who forget (#726) -- Poetry update 1.1.7 -> 1.1.12 and use new installer URL (#726) -- Black updated 21.9b0 -> 21.12b0 (#726) + black, isort and flake8 for those who forget ({issue}`726`) +- Poetry update 1.1.7 -> 1.1.12 and use new installer URL ({issue}`726`) +- Black updated 21.9b0 -> 21.12b0 ({issue}`726`) ## tmuxp 1.9.3 (2021-10-30) -- #700: Add `-h` / `--help` option, thanks @GHPS -- #689: Update poetry to 1.1 +- {issue}`700`: Add `-h` / `--help` option, thanks @GHPS +- {issue}`689`: Update poetry to 1.1 - CI: Use poetry 1.1.7 and `install-poetry.py` installer - Relock poetry.lock at 1.1 (w/ 1.1.7's fix) -- #696: Typo fix, thanks @inkch +- {issue}`696`: Typo fix, thanks @inkch ## tmuxp 1.9.2 (2021-06-17) -- #686: Allow click 8.0.x +- {issue}`686`: Allow click 8.0.x - Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals ## tmuxp 1.9.1 (2021-06-16) From 87a90f69a2d4d140b64a9165058452d0e1ad5a90 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 23:15:35 -0500 Subject: [PATCH 1020/2998] build: libtmux 0.11.0 See also: https://libtmux.git-pull.com/history.html#libtmux-0-11-0-2022-03-10 --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index cd6d62ab3a..d014220052 100644 --- a/poetry.lock +++ b/poetry.lock @@ -425,7 +425,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [[package]] name = "libtmux" -version = "0.11.0b4" +version = "0.11.0" description = "scripting library / orm for tmux" category = "main" optional = false @@ -1285,7 +1285,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "bfe80127219ae86a1900d3f364e8d129657ed7521ee0ccb0d1ee38bc1cf20b36" +content-hash = "301084095b8b593af4d0924c66952293d05f9dbdb7babda954a5c7344d50b3b6" [metadata.files] aafigure = [ @@ -1555,8 +1555,8 @@ keyring = [ {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] libtmux = [ - {file = "libtmux-0.11.0b4-py3-none-any.whl", hash = "sha256:9031bfd2eb645fd9d04a571b4a17068f5d1aa0c8d5e1f0741d7b41ea7180a87e"}, - {file = "libtmux-0.11.0b4.tar.gz", hash = "sha256:9da93087e5ae6eb54f974ceec778389c4036ca6393aeff1e87e5977583f92867"}, + {file = "libtmux-0.11.0-py3-none-any.whl", hash = "sha256:f2b3fd683cd1bcb416efe311315991e80b6038209b9693b58baff5f0b0ed9a50"}, + {file = "libtmux-0.11.0.tar.gz", hash = "sha256:d82cf391097eb69d784d889d482bb99284b984aa6225276a3dc1af8c1460dd3c"}, ] livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, diff --git a/pyproject.toml b/pyproject.toml index ad984a75d7..e3561d848c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ tmuxp = 'tmuxp:cli.cli' python = "^3.7" click = ">7,<8.1" kaptan = ">=0.5.10" -libtmux = "~0.11.0b4" +libtmux = "~0.11.0" colorama = ">=0.3.9" [tool.poetry.dev-dependencies] From 875c7f14813c7c7c917e21dc962b0e4eb28b3141 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 18 Mar 2022 23:50:16 -0500 Subject: [PATCH 1021/2998] docs(CHANGES): Note v1.10.x python 3.7 and 3.8 service branch --- CHANGES | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index f592a75050..9e4810e83e 100644 --- a/CHANGES +++ b/CHANGES @@ -15,10 +15,17 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force // Usage: tmuxp@next load yoursession ``` -## 0.10 - unreleased +## 1.10 - unreleased - _Insert changes/features/fixes for next release here_ +### Compatibility + +- Final python 3.7 and 3.8 release + + Bug fixes and security updates will go to + [`v1.10.x`](https://github.com/tmux-python/tmuxp/tree/v1.10.x) + ### What's new - {issue}`747`: Skip execution via `enter: false` From f2315210950c7bc5226d595b2f093d27f12a4fbb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 07:09:17 -0500 Subject: [PATCH 1022/2998] Release 1.10.0 --- CHANGES | 4 +++- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 9e4810e83e..4c7b28d755 100644 --- a/CHANGES +++ b/CHANGES @@ -15,10 +15,12 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force // Usage: tmuxp@next load yoursession ``` -## 1.10 - unreleased +## 1.11 - unreleased - _Insert changes/features/fixes for next release here_ +## tmuxp 1.10.0 (2022-03-19) + ### Compatibility - Final python 3.7 and 3.8 release diff --git a/pyproject.toml b/pyproject.toml index e3561d848c..7bd28bd407 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0b6" +version = "1.10.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 6313b07ba0..8f87c969c5 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0b6" +__version__ = "1.10.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 9912e8b1141e5fc46d2f0e2d55304e74e0cc3f26 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 07:44:14 -0500 Subject: [PATCH 1023/2998] ci(publish-docs): Remove configure git step --- .github/workflows/publish-docs.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 0cf9d73c8e..e7d1f83fae 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -14,11 +14,6 @@ jobs: python-version: [ '3.10' ] steps: - uses: actions/checkout@v1 - - name: Configure git - run: | - git config --global user.name 'travis-ci' - git config --global user.email 'travis@nowhere.edu' - - name: Filter changed file paths to outputs uses: dorny/paths-filter@v2.7.0 id: changes From 8d8760112b03db10b572b7367f3874c852a278f0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 07:44:36 -0500 Subject: [PATCH 1024/2998] ci(publish-docs,tests): Remove unused pip upgrade step --- .github/workflows/publish-docs.yml | 5 ----- .github/workflows/tests.yml | 4 ---- 2 files changed, 9 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index e7d1f83fae..7b047ea227 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -82,11 +82,6 @@ jobs: shell: bash run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv - - name: Upgrade pip - shell: bash - if: env.PUBLISH == 'true' - run: poetry run python -m pip install pip -U - - name: Install dependencies [w/ docs] if: env.PUBLISH == 'true' run: poetry install --extras "docs lint" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1d2b6b9c2d..fcf8bd1607 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -87,10 +87,6 @@ jobs: cd ~ tmux -V - - name: Upgrade pip - shell: bash - run: poetry run python -m pip install pip -U - - name: Install python dependencies run: | poetry install -E "test coverage lint" From cd79ad7ce4bbf1e9cc165e7e167c6db896335273 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 07:46:58 -0500 Subject: [PATCH 1025/2998] ci: publish-docs -> docs --- .github/workflows/{publish-docs.yml => docs.yml} | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{publish-docs.yml => docs.yml} (99%) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/docs.yml similarity index 99% rename from .github/workflows/publish-docs.yml rename to .github/workflows/docs.yml index 7b047ea227..b6132772f3 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/docs.yml @@ -1,4 +1,4 @@ -name: Publish Docs +name: docs on: push: diff --git a/README.md b/README.md index 7ef70ce9a7..ea100fc628 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A session manager for tmux. Built on [libtmux](https://github.com/tmux-python/libtmux). [![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](https://pypi.org/project/tmuxp/) -[![Docs](https://github.com/tmux-python/tmuxp/workflows/Publish%20Docs/badge.svg)](https://tmuxp.git-pull.com/) +[![Docs](https://github.com/tmux-python/tmuxp/workflows/docs/badge.svg)](https://tmuxp.git-pull.com/) [![Build status](https://github.com/tmux-python/tmuxp/workflows/tests/badge.svg)](https://github.com/tmux-python/tmuxp/actions?query=workflow%3A%22tests%22) [![Code Coverage](https://codecov.io/gh/tmux-python/tmuxp/branch/master/graph/badge.svg)](https://codecov.io/gh/tmux-python/tmuxp) [![License](https://img.shields.io/github/license/tmux-python/tmuxp.svg)](https://github.com/tmux-python/tmuxp/blob/master/LICENSE) From a3bc770e988acf1febd1b7b5f2933359277ca4f4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 08:09:09 -0500 Subject: [PATCH 1026/2998] tests(workspacebuilder): Try to stabilize test --- tests/test_workspacebuilder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index fdcf63c3e9..c10fa7268f 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1129,11 +1129,11 @@ def test_load_workspace_sleep( sconfig = config.expand(sconfig) sconfig = config.trickle(sconfig) builder = WorkspaceBuilder(sconf=sconfig, server=server) - builder.build() t = time.process_time() - time.sleep(1) + builder.build() + time.sleep(0.5) session = builder.session pane = session.attached_pane From 9a38ec4198975928316d04aee9bd91fab74b3643 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 08:17:43 -0500 Subject: [PATCH 1027/2998] chore: Remove unused function --- tests/test_cli.py | 7 ------- tmuxp/cli.py | 4 ---- 2 files changed, 11 deletions(-) diff --git a/tests/test_cli.py b/tests/test_cli.py index 1412a699de..90ad5c155a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1015,13 +1015,6 @@ def test_get_tmuxinator_dir(monkeypatch): assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") -def test_get_cwd(tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch): - assert cli.get_cwd() == os.getcwd() - monkeypatch.chdir(tmp_path) - assert cli.get_cwd() == str(tmp_path) - assert cli.get_cwd() == os.getcwd() - - def test_get_teamocil_dir(monkeypatch: pytest.MonkeyPatch): assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") diff --git a/tmuxp/cli.py b/tmuxp/cli.py index 99c91625d3..af49c807c0 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -36,10 +36,6 @@ VALID_CONFIG_DIR_FILE_EXTENSIONS = [".yaml", ".yml", ".json"] -def get_cwd(): - return os.getcwd() - - def tmuxp_echo(message=None, log_level="INFO", style_log=False, **click_kwargs): """ Combines logging.log and click.echo From 7ad43acf3f813fbc49ea3dc1769e39eeadeb6bbe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 08:55:10 -0500 Subject: [PATCH 1028/2998] docs(quickstart): Typo --- docs/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index c3395084b0..a460374d7e 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -110,7 +110,7 @@ session. You can also load a configuration, and append the windows to the current active session. You can also have a custom tmuxp config directory by setting the -`TMUX_CONFIGDIR` in your environment variables. +`TMUXP_CONFIGDIR` in your environment variables. ```console From 6d54410f6ff4fc2149b4cd2b7df809947ea2bbd1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 08:55:43 -0500 Subject: [PATCH 1029/2998] docs(quickstart): Remove unused link --- docs/quickstart.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index a460374d7e..bae73b6d99 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -132,8 +132,7 @@ You can also [Import][import] configs [teamocil][teamocil] and [tmuxinator][tmux :::{seealso} -{ref}`libtmux python API documentation ` and {ref}`developing`, -{ref}`internals`. +{ref}`libtmux python API documentation ` and {ref}`developing`. ::: From 1df6cf09072e4016cb079d29c2412eb5a0109e93 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:09:47 -0500 Subject: [PATCH 1030/2998] docs(configuration): Add section --- docs/configuration/environmental-variables.md | 11 +++++++++++ docs/configuration/index.md | 7 +++++++ docs/index.md | 1 + 3 files changed, 19 insertions(+) create mode 100644 docs/configuration/environmental-variables.md create mode 100644 docs/configuration/index.md diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md new file mode 100644 index 0000000000..48d1f9dfc5 --- /dev/null +++ b/docs/configuration/environmental-variables.md @@ -0,0 +1,11 @@ +(environmental-variables)= + +# Environmental variables + +## `TMUXP_CONFIGDIR` + +Example: `TMUXP_CONFIGDIR=$HOME/.mytmuxpconfigdir tmuxp load cpython` + +## `LIBTMUX_TMUX_FORMAT_SEPARATOR` + +See [`LIBTMUX_TMUX_FORMAT_SEPARATOR`](https://libtmux.git-pull.com/api.html#tmux-format-separator) in libtmux API. diff --git a/docs/configuration/index.md b/docs/configuration/index.md new file mode 100644 index 0000000000..a0dd805e0e --- /dev/null +++ b/docs/configuration/index.md @@ -0,0 +1,7 @@ +# Reference + +```{toctree} + +environmental-variables + +``` diff --git a/docs/index.md b/docs/index.md index cf2b5781fb..a8cc40d63c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,6 +23,7 @@ about quickstart examples commands/index +configuration/index plugin_system ``` From b416e5d2f84c0b4509861e1fc136a120e9ba25a0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:20:48 -0500 Subject: [PATCH 1031/2998] docs(configuratio): Move examples to configuration --- docs/configuration/environmental-variables.md | 13 +++- docs/{ => configuration}/examples.md | 78 +++++++++---------- docs/configuration/index.md | 3 +- docs/index.md | 1 - docs/redirects.txt | 1 + 5 files changed, 54 insertions(+), 42 deletions(-) rename docs/{ => configuration}/examples.md (84%) diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md index 48d1f9dfc5..29dc84d8f2 100644 --- a/docs/configuration/environmental-variables.md +++ b/docs/configuration/environmental-variables.md @@ -8,4 +8,15 @@ Example: `TMUXP_CONFIGDIR=$HOME/.mytmuxpconfigdir tmuxp load cpython` ## `LIBTMUX_TMUX_FORMAT_SEPARATOR` -See [`LIBTMUX_TMUX_FORMAT_SEPARATOR`](https://libtmux.git-pull.com/api.html#tmux-format-separator) in libtmux API. +:::{seealso} + +[`LIBTMUX_TMUX_FORMAT_SEPARATOR`](https://libtmux.git-pull.com/api.html#tmux-format-separator) in libtmux API. + +::: + +In rare circumstances the `tmux -F` separator under the hood may cause issues +building sessions. For this case you can override it here. + +```console +$ env LIBTMUX_TMUX_FORMAT_SEPARATOR='__SEP__' tmuxp load [session] +``` diff --git a/docs/examples.md b/docs/configuration/examples.md similarity index 84% rename from docs/examples.md rename to docs/configuration/examples.md index 262adaa734..0ea54fbf9b 100644 --- a/docs/examples.md +++ b/docs/configuration/examples.md @@ -29,7 +29,7 @@ punctual. ````{tab} YAML -```{literalinclude} ../examples/shorthands.yaml +```{literalinclude} ../../examples/shorthands.yaml :language: yaml ``` @@ -39,7 +39,7 @@ punctual. ````{tab} JSON -```{literalinclude} ../examples/shorthands.json +```{literalinclude} ../../examples/shorthands.json :language: json ``` @@ -55,7 +55,7 @@ Note `''` counts as an empty carriage return. ````{tab} YAML -```{literalinclude} ../examples/blank-panes.yaml +```{literalinclude} ../../examples/blank-panes.yaml :language: yaml ``` @@ -64,7 +64,7 @@ Note `''` counts as an empty carriage return. ````{tab} JSON -```{literalinclude} ../examples/blank-panes.json +```{literalinclude} ../../examples/blank-panes.json :language: json ``` @@ -93,7 +93,7 @@ Note `''` counts as an empty carriage return. ````{tab} YAML -```{literalinclude} ../examples/2-pane-vertical.yaml +```{literalinclude} ../../examples/2-pane-vertical.yaml :language: yaml ``` @@ -102,7 +102,7 @@ Note `''` counts as an empty carriage return. ````{tab} JSON -```{literalinclude} ../examples/2-pane-vertical.json +```{literalinclude} ../../examples/2-pane-vertical.json :language: json ``` @@ -131,7 +131,7 @@ Note `''` counts as an empty carriage return. ````{tab} YAML -```{literalinclude} ../examples/3-pane.yaml +```{literalinclude} ../../examples/3-pane.yaml :language: yaml ``` @@ -140,7 +140,7 @@ Note `''` counts as an empty carriage return. ````{tab} JSON -```{literalinclude} ../examples/3-pane.json +```{literalinclude} ../../examples/3-pane.json :language: json ``` @@ -169,7 +169,7 @@ Note `''` counts as an empty carriage return. ````{tab} YAML -```{literalinclude} ../examples/4-pane.yaml +```{literalinclude} ../../examples/4-pane.yaml :language: yaml ``` @@ -178,7 +178,7 @@ Note `''` counts as an empty carriage return. ````{tab} JSON -```{literalinclude} ../examples/4-pane.json +```{literalinclude} ../../examples/4-pane.json :language: json ``` @@ -191,7 +191,7 @@ Equivalent to `tmux new-window -c `. ````{tab} YAML -```{literalinclude} ../examples/start-directory.yaml +```{literalinclude} ../../examples/start-directory.yaml :language: yaml ``` @@ -200,7 +200,7 @@ Equivalent to `tmux new-window -c `. ````{tab} JSON -```{literalinclude} ../examples/start-directory.json +```{literalinclude} ../../examples/start-directory.json :language: json ``` @@ -244,7 +244,7 @@ please make a ticket on the [issue tracker][issue tracker]. ````{tab} YAML -```{literalinclude} ../examples/env-variables.yaml +```{literalinclude} ../../examples/env-variables.yaml :language: yaml ``` @@ -253,7 +253,7 @@ please make a ticket on the [issue tracker][issue tracker]. ````{tab} JSON -```{literalinclude} ../examples/env-variables.json +```{literalinclude} ../../examples/env-variables.json :language: json ``` @@ -266,7 +266,7 @@ tmuxp will set session environment variables. ````{tab} YAML -```{literalinclude} ../examples/session-environment.yaml +```{literalinclude} ../../examples/session-environment.yaml :language: yaml ``` @@ -274,7 +274,7 @@ tmuxp will set session environment variables. ````{tab} JSON -```{literalinclude} ../examples/session-environment.json +```{literalinclude} ../../examples/session-environment.json :language: json ``` @@ -288,7 +288,7 @@ selected upon loading. ````{tab} YAML -```{literalinclude} ../examples/focus-window-and-panes.yaml +```{literalinclude} ../../examples/focus-window-and-panes.yaml :language: yaml ``` @@ -297,7 +297,7 @@ selected upon loading. ````{tab} JSON -```{literalinclude} ../examples/focus-window-and-panes.json +```{literalinclude} ../../examples/focus-window-and-panes.json :language: json ``` @@ -312,7 +312,7 @@ This will add the `shell_command` to the bash history in the pane. ````{tab} YAML -```{literalinclude} ../examples/suppress-history.yaml +```{literalinclude} ../../examples/suppress-history.yaml :language: yaml ``` @@ -321,7 +321,7 @@ This will add the `shell_command` to the bash history in the pane. ````{tab} JSON -```{literalinclude} ../examples/suppress-history.json +```{literalinclude} ../../examples/suppress-history.json :language: json ``` @@ -349,7 +349,7 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ````{tab} YAML -```{literalinclude} ../examples/skip-send.yaml +```{literalinclude} ../../examples/skip-send.yaml :language: yaml ``` @@ -358,7 +358,7 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ````{tab} JSON -```{literalinclude} ../examples/skip-send.json +```{literalinclude} ../../examples/skip-send.json :language: json ``` @@ -367,7 +367,7 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ````{tab} YAML (pane-level) -```{literalinclude} ../examples/skip-send-pane-level.yaml +```{literalinclude} ../../examples/skip-send-pane-level.yaml :language: yaml ``` @@ -376,7 +376,7 @@ Omit sending {kbd}`enter` to key commands. Equivalent to ````{tab} JSON (pane-level) -```{literalinclude} ../examples/skip-send-pane-level.json +```{literalinclude} ../../examples/skip-send-pane-level.json :language: json ``` @@ -408,7 +408,7 @@ This is especially useful for expensive commands where the terminal needs some b ````{tab} Virtualenv -```{literalinclude} ../examples/sleep-virtualenv.yaml +```{literalinclude} ../../examples/sleep-virtualenv.yaml :language: yaml ``` @@ -416,7 +416,7 @@ This is especially useful for expensive commands where the terminal needs some b ````{tab} YAML -```{literalinclude} ../examples/sleep.yaml +```{literalinclude} ../../examples/sleep.yaml :language: yaml ``` @@ -425,7 +425,7 @@ This is especially useful for expensive commands where the terminal needs some b ````{tab} JSON -```{literalinclude} ../examples/sleep.json +```{literalinclude} ../../examples/sleep.json :language: json ``` @@ -434,7 +434,7 @@ This is especially useful for expensive commands where the terminal needs some b ````{tab} YAML (pane-level) -```{literalinclude} ../examples/sleep-pane-level.yaml +```{literalinclude} ../../examples/sleep-pane-level.yaml :language: yaml ``` @@ -443,7 +443,7 @@ This is especially useful for expensive commands where the terminal needs some b ````{tab} JSON (pane-level) -```{literalinclude} ../examples/sleep-pane-level.json +```{literalinclude} ../../examples/sleep-pane-level.json :language: json ``` @@ -457,7 +457,7 @@ without `window_index` will use the lowest available window index. ````{tab} YAML -```{literalinclude} ../examples/window-index.yaml +```{literalinclude} ../../examples/window-index.yaml :language: yaml ``` @@ -466,7 +466,7 @@ without `window_index` will use the lowest available window index. ````{tab} JSON -```{literalinclude} ../examples/window-index.json +```{literalinclude} ../../examples/window-index.json :language: json ``` @@ -481,7 +481,7 @@ different shells on different panes. ````{tab} YAML -```{literalinclude} ../examples/pane-shell.yaml +```{literalinclude} ../../examples/pane-shell.yaml :language: yaml ``` @@ -490,7 +490,7 @@ different shells on different panes. ````{tab} JSON -```{literalinclude} ../examples/pane-shell.json +```{literalinclude} ../../examples/pane-shell.json :language: json ``` @@ -507,14 +507,14 @@ Including `automatic-rename`, `default-shell`, ````{tab} YAML -```{literalinclude} ../examples/options.yaml +```{literalinclude} ../../examples/options.yaml :language: yaml ``` ```` ````{tab} JSON -```{literalinclude} ../examples/options.json +```{literalinclude} ../../examples/options.json :language: json ``` @@ -527,14 +527,14 @@ Apply window options after panes have been created. Useful for pane during creation. ````{tab} YAML -```{literalinclude} ../examples/2-pane-synchronized.yaml +```{literalinclude} ../../examples/2-pane-synchronized.yaml :language: yaml ``` ```` ````{tab} JSON -```{literalinclude} ../examples/2-pane-synchronized.json +```{literalinclude} ../../examples/2-pane-synchronized.json :language: json ``` @@ -543,14 +543,14 @@ pane during creation. ## Main pane height ````{tab} YAML -```{literalinclude} ../examples/main-pane-height.yaml +```{literalinclude} ../../examples/main-pane-height.yaml :language: yaml ``` ```` ````{tab} JSON -```{literalinclude} ../examples/main-pane-height.json +```{literalinclude} ../../examples/main-pane-height.json :language: json ``` diff --git a/docs/configuration/index.md b/docs/configuration/index.md index a0dd805e0e..10194adf0f 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -1,7 +1,8 @@ -# Reference +# Configuration ```{toctree} environmental-variables +examples ``` diff --git a/docs/index.md b/docs/index.md index a8cc40d63c..36921d3e71 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,6 @@ about quickstart -examples commands/index configuration/index plugin_system diff --git a/docs/redirects.txt b/docs/redirects.txt index 36313d1a38..42af93f4db 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1 +1,2 @@ "cli.md" "commands/index.md" +"examples.md" "configuration/examples.md" From db2b160532782140c74a55436fe9a874bbdda25a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:22:19 -0500 Subject: [PATCH 1032/2998] docs: Note the before_script --- docs/developing.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/developing.md b/docs/developing.md index 76f3f846cd..fdfba36f10 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -255,6 +255,13 @@ this will load the `.tmuxp.yaml` in the root of the project. ``` +`.tmuxp-before-script.sh` ran by `before_script`: + +```{literalinclude} ../.tmuxp-before-script.sh +:language: console + +``` + (gh-actions)= ## Github Actions From df22582e71f40e7a5bfd465c0e7d3e0516d3bd37 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:24:37 -0500 Subject: [PATCH 1033/2998] docs: Move plugin_system -> plugins/ --- docs/index.md | 2 +- docs/{plugin_system.md => plugins/index.md} | 4 ++-- docs/redirects.txt | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) rename docs/{plugin_system.md => plugins/index.md} (99%) diff --git a/docs/index.md b/docs/index.md index 36921d3e71..a5b75c43bc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,7 +23,7 @@ about quickstart commands/index configuration/index -plugin_system +plugins/index ``` diff --git a/docs/plugin_system.md b/docs/plugins/index.md similarity index 99% rename from docs/plugin_system.md rename to docs/plugins/index.md index 6552efc597..92ce67a500 100644 --- a/docs/plugin_system.md +++ b/docs/plugins/index.md @@ -1,6 +1,6 @@ -(plugin-system)= +(plugins)= -# Plugin System +# Plugins The plugin system allows users to customize and extend different aspects of tmuxp without the need to change tmuxp itself. diff --git a/docs/redirects.txt b/docs/redirects.txt index 42af93f4db..a8d8f8af56 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1,2 +1,3 @@ "cli.md" "commands/index.md" "examples.md" "configuration/examples.md" +"plugin_system.md" "plugins/index.md" From 0e1366b9a3cde02a8d1ccd2fa2c05428eac13f1d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:51:40 -0500 Subject: [PATCH 1034/2998] docs: Minimum example --- examples/minimal.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 examples/minimal.yaml diff --git a/examples/minimal.yaml b/examples/minimal.yaml new file mode 100644 index 0000000000..0efa773049 --- /dev/null +++ b/examples/minimal.yaml @@ -0,0 +1,4 @@ +session_name: My tmux session +windows: + - panes: + - From 075472f50927c2bbafe6802335ee92e55442c313 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:53:46 -0500 Subject: [PATCH 1035/2998] docs(configuration): Basic configuration page --- docs/configuration/index.md | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 10194adf0f..908bde97c1 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -1,5 +1,62 @@ +(config)= + +(configuration)= + # Configuration +The configuration syntax is declarative and based on tmux's Session, Window and +Panes hierarchy. Both JSON and YAML is accepted. + +## Launching your session + +When you have `tmuxp` installed in your environment alongside tmux, you can use: + +```console +$ tmuxp load ./path/to/file +``` + +to load your workspace and launch directly into tmux. + +In certain cases, tmuxp will try help you when: + +- _If your session already exists_: tmuxp will prompt you to re-attach. It does this + by checking if the configuration's `session_name` matches a session already + running on the same server. +- _If you're inside a tmux client already_, `tmuxp` will let you create a new session and switch to it, or append the windows to your existing + session. + +## What's in a config? + +1. A session name: `session_name: your session` +2. A list of _windows_ +3. A list of _panes_ for each window + +````{tab} Basics + +```yaml +session_name: My session +windows: +- window_name: Window 1 + panes: + - echo "pane 1" + - echo "pane 2" +``` + +```` + +````{tab} Smallest possible + +```{literalinclude} ../../examples/minimal.yaml +:language: yaml + +``` + +As of 1.11.x. + +```` + +## Reference and usage + ```{toctree} environmental-variables From 1b82384c5fbcf8d87b9f55453d9c38a7718805f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:54:27 -0500 Subject: [PATCH 1036/2998] docs: Rename example configurations to examples --- docs/configuration/examples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 0ea54fbf9b..90340cb0d8 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -1,6 +1,6 @@ (examples)= -# Example Configurations +# Examples ## Short hand / inline style From b6ddb2c26df43c16e5075b463ec719cf27cad243 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 09:55:11 -0500 Subject: [PATCH 1037/2998] docs(configuration): Note commands inside of panes --- docs/configuration/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 908bde97c1..dea60190d9 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -30,6 +30,7 @@ In certain cases, tmuxp will try help you when: 1. A session name: `session_name: your session` 2. A list of _windows_ 3. A list of _panes_ for each window +4. A list of _commands_ for each pane ````{tab} Basics From 22de9fc58c893330cbce4994d8f9bae21ab7d4a1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 10:07:14 -0500 Subject: [PATCH 1038/2998] docs(quickstart): Tweak command --- docs/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index bae73b6d99..0549e84e47 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -13,7 +13,7 @@ $ pip install --user tmuxp You can upgrade to the latest release with: ```console -$ pip install --user tmuxp -U +$ pip install --user --upgrade tmuxp ``` Then install {ref}`completion`. From 27911434ffe96e39cea2287b9835a0d20455e231 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 10:12:14 -0500 Subject: [PATCH 1039/2998] docs(about): Title tweak --- docs/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.md b/docs/about.md index 9a27866996..74d770e375 100644 --- a/docs/about.md +++ b/docs/about.md @@ -25,7 +25,7 @@ Interested in some kung-fu or joining the effort? {ref}`api` and [bugsnag]: https://blog.bugsnag.com/benefits-of-using-tmux/ [pragmatic coders]: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ -## Differences from tmuxinator / teamocil +## Compared to tmuxinator / teamocil ### Similarities From a6272bc485a07e98a96de0b2350f25576d742a22 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 10:27:51 -0500 Subject: [PATCH 1040/2998] docs: Configuration walkthrough --- docs/configuration/index.md | 58 +++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index dea60190d9..9fbe2c2761 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -9,25 +9,24 @@ Panes hierarchy. Both JSON and YAML is accepted. ## Launching your session -When you have `tmuxp` installed in your environment alongside tmux, you can use: +When you have `tmuxp` installed in your environment alongside tmux, you can load +a workspace with: ```console $ tmuxp load ./path/to/file ``` -to load your workspace and launch directly into tmux. +tmuxp will offers to assist when: -In certain cases, tmuxp will try help you when: - -- _If your session already exists_: tmuxp will prompt you to re-attach. It does this +- _Session already exists_: tmuxp will prompt you to re-attach. It does this by checking if the configuration's `session_name` matches a session already running on the same server. -- _If you're inside a tmux client already_, `tmuxp` will let you create a new session and switch to it, or append the windows to your existing +- _When inside a tmux client_, `tmuxp` will let you create a new session and switch to it, or append the windows to your existing session. ## What's in a config? -1. A session name: `session_name: your session` +1. A session name 2. A list of _windows_ 3. A list of _panes_ for each window 4. A list of _commands_ for each pane @@ -39,8 +38,10 @@ session_name: My session windows: - window_name: Window 1 panes: - - echo "pane 1" - - echo "pane 2" + - shell_commands: + - cmd: echo "pane 1" + - shell_commands: + - cmd: echo "pane 2" ``` ```` @@ -56,6 +57,45 @@ As of 1.11.x. ```` +Breaking down the basic configuration into sections: + +1. A session name + + ```yaml + session_name: My session + ``` + +2. A list of _windows_ + + ```yaml + windows: + - window_name: Window 1 + panes: ... + # window settings + - window_name: Window 2 + panes: ... + # window settings + ``` +3. A list of _panes_ for each window + + ```yaml + windows: + panes: + - # pane settings + - # pane settings + ``` +4. A list of _commands_ for each pane + + ```yaml + windows: + panes: + - shell_commands: + - cmd: echo "pane 1 - cmd 1" + # command options + - cmd: echo "pane 1 - cmd 2" + # command options + ``` + ## Reference and usage ```{toctree} From 25c2de0573bbe368856c8ac94901b47326515ed0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:31:06 -0500 Subject: [PATCH 1041/2998] docs(configuration): More info on files --- docs/configuration/index.md | 97 ++++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 9fbe2c2761..af71096b66 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -4,13 +4,13 @@ # Configuration -The configuration syntax is declarative and based on tmux's Session, Window and -Panes hierarchy. Both JSON and YAML is accepted. +tmuxp loads your terminal workspace into tmux using config files. + +The configuration file can be JSON or YAML. It's declarative style resembles tmux's object hierarchy: session, window and wanes. ## Launching your session -When you have `tmuxp` installed in your environment alongside tmux, you can load -a workspace with: +Once you have `tmuxp` installed alongside tmux, you can load a workspace with: ```console $ tmuxp load ./path/to/file @@ -24,7 +24,7 @@ tmuxp will offers to assist when: - _When inside a tmux client_, `tmuxp` will let you create a new session and switch to it, or append the windows to your existing session. -## What's in a config? +## What's in a config file? 1. A session name 2. A list of _windows_ @@ -69,33 +69,94 @@ Breaking down the basic configuration into sections: ```yaml windows: - - window_name: Window 1 - panes: ... - # window settings - - window_name: Window 2 - panes: ... - # window settings + - window_name: Window 1 + panes: ... + # window settings + - window_name: Window 2 + panes: ... + # window settings ``` + 3. A list of _panes_ for each window ```yaml windows: panes: - - # pane settings - - # pane settings + - # pane settings + - # pane settings ``` + 4. A list of _commands_ for each pane ```yaml windows: panes: - - shell_commands: - - cmd: echo "pane 1 - cmd 1" - # command options - - cmd: echo "pane 1 - cmd 2" - # command options + - shell_commands: + - cmd: echo "pane 1 - cmd 1" + # command options + - cmd: echo "pane 1 - cmd 2" + # command options ``` +## Where do I store config files? + +### Direct + +You can create a configuration and load it from anywhere in your file system. + +```console +$ tmuxp load [config_file] +``` + +````{tab} Relative +```console +$ tmuxp load ./favorites.yaml +``` +```` + +````{tab} Absolute +```console +$ tmuxp load /opt/myapp/favorites.yaml +``` +```` + +### User-based configurations + +tmuxp uses the [XDG Base Directory] specification. + +Often on POSIX machines, you will store them in `~/.config/tmuxp`. + +Assume you store `apple.yaml` in `$XDG_CONFIG_HOME/tmuxp/apple.yaml`, you can +then use: + +```console +$ tmuxp load apple +``` + +[xdg base directory]: https://specifications.freedesktop.org/basedir-spec/latest/ + +### Project-specific + +You can store a configuration in your project's root directory as `.tmuxp.yaml` or `.tmuxp.json`, then: + +Assume `.tmuxp.yaml` inside `/opt/myapp` + +```console +$ tmuxp load [config_path] +``` + +````{tab} In project root +```console +$ tmuxp load ./ +``` +```` + +````{tab} Absolute +```console +$ tmuxp load /opt/myapp +``` +```` + ## Reference and usage ```{toctree} From c5096e27f14046ec1d023cfc7cb26615bbf033e8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:36:28 -0500 Subject: [PATCH 1042/2998] docs(environmental variables): Make referable --- docs/configuration/environmental-variables.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md index 29dc84d8f2..d485da4574 100644 --- a/docs/configuration/environmental-variables.md +++ b/docs/configuration/environmental-variables.md @@ -2,10 +2,14 @@ # Environmental variables +(TMUXP_CONFIGDIR)= + ## `TMUXP_CONFIGDIR` Example: `TMUXP_CONFIGDIR=$HOME/.mytmuxpconfigdir tmuxp load cpython` +(LIBTMUX_TMUX_FORMAT_SEPARATOR)= + ## `LIBTMUX_TMUX_FORMAT_SEPARATOR` :::{seealso} From 337203ad9f7f0fae485d259ee27b7122bbcf1fe2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:36:45 -0500 Subject: [PATCH 1043/2998] docs(configuration): Note TMUXP_CONFIGDIR --- docs/configuration/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index af71096b66..1e4cd4c6fd 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -133,6 +133,12 @@ then use: $ tmuxp load apple ``` +:::{seealso} + +This path can be overridden by {ref}`TMUXP_CONFIGDIR` + +::: + [xdg base directory]: https://specifications.freedesktop.org/basedir-spec/latest/ ### Project-specific From a5b2cf85bf84ea9bbbbc077e72882cfa9a20587b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:37:24 -0500 Subject: [PATCH 1044/2998] docs(configuration): stub out top-level config --- docs/configuration/top-level.md | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/configuration/top-level.md diff --git a/docs/configuration/top-level.md b/docs/configuration/top-level.md new file mode 100644 index 0000000000..6009177f31 --- /dev/null +++ b/docs/configuration/top-level.md @@ -0,0 +1,42 @@ +(top-level)= +(top-level-config)= + +# Top-level configuration + +## `session_name` + +Used for: + +- tmux session name +- checking for existing sessions + +Notes: + +- May differ from the config filename + + e.g. _apple.yaml_: + + ```yaml + session_name: banana + windows: + - panes: + - + ``` + + Load detached: + + ```console + $ tmuxp load ./apple.yaml -d + ``` + + Above: + + - tmuxp loads a file named _apple.yaml_ from a current directory + - tmuxp built a tmux session called _banana_. + - `-d` means _detached_, loading in background + + ```console + $ tmux attach -t banana + ``` + + Above: Use `tmux` directly to attach _banana_. From 28ff2a0b07a32ff86970a44f42f821cadb5d12da Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:37:39 -0500 Subject: [PATCH 1045/2998] docs(config): Link to top-level config --- docs/configuration/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 1e4cd4c6fd..97282aae66 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -167,6 +167,7 @@ $ tmuxp load /opt/myapp ```{toctree} +top-level environmental-variables examples From 199046518b0b9f2db12ff9506aad99b26bb13430 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:42:19 -0500 Subject: [PATCH 1046/2998] docs(configuration): Touchup --- docs/configuration/top-level.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/configuration/top-level.md b/docs/configuration/top-level.md index 6009177f31..7976c6605c 100644 --- a/docs/configuration/top-level.md +++ b/docs/configuration/top-level.md @@ -12,7 +12,7 @@ Used for: Notes: -- May differ from the config filename +- Session names may differ from config filename. e.g. _apple.yaml_: @@ -31,9 +31,9 @@ Notes: Above: - - tmuxp loads a file named _apple.yaml_ from a current directory + - tmuxp loads a file named _apple.yaml_ from the current directory. - tmuxp built a tmux session called _banana_. - - `-d` means _detached_, loading in background + - `-d` means _detached_, loading in background. ```console $ tmux attach -t banana From 491b6c45525836647fe4e398d482da6070bd3ac1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 12:46:21 -0500 Subject: [PATCH 1047/2998] docs(configuration): Fix naming --- docs/configuration/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 97282aae66..3fbc09dcde 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -38,9 +38,9 @@ session_name: My session windows: - window_name: Window 1 panes: - - shell_commands: + - shell_command: - cmd: echo "pane 1" - - shell_commands: + - shell_command: - cmd: echo "pane 2" ``` @@ -91,7 +91,7 @@ Breaking down the basic configuration into sections: ```yaml windows: panes: - - shell_commands: + - shell_command: - cmd: echo "pane 1 - cmd 1" # command options - cmd: echo "pane 1 - cmd 2" From 704556cc6768f2e917dea04851e18b690b0c94c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:40:53 -0500 Subject: [PATCH 1048/2998] docs: commands/ -> cli --- README.md | 2 +- docs/{commands => cli}/index.md | 0 docs/index.md | 2 +- docs/redirects.txt | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) rename docs/{commands => cli}/index.md (100%) diff --git a/README.md b/README.md index ea100fc628..3558787915 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ $ tmuxp shell -c 'print(window.name.upper())' MY_WINDOW ``` -Read more on [tmuxp shell](https://tmuxp.git-pull.com/commands/#shell) in +Read more on [tmuxp shell](https://tmuxp.git-pull.com/cli/#shell) in the CLI docs. # Pre-load hook diff --git a/docs/commands/index.md b/docs/cli/index.md similarity index 100% rename from docs/commands/index.md rename to docs/cli/index.md diff --git a/docs/index.md b/docs/index.md index a5b75c43bc..fcf989dcb8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,7 @@ about quickstart -commands/index +cli/index configuration/index plugins/index diff --git a/docs/redirects.txt b/docs/redirects.txt index a8d8f8af56..31f280ec09 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1,3 +1,4 @@ "cli.md" "commands/index.md" "examples.md" "configuration/examples.md" "plugin_system.md" "plugins/index.md" +"commands/index.md" "cli/index.md" From e68d45fa4a45a346c6bf49d09a50f3fa18fdd31c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:41:53 -0500 Subject: [PATCH 1049/2998] docs: Fix include file paths --- docs/cli/index.md | 2 +- docs/configuration/examples.md | 4 ++-- docs/plugins/index.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/cli/index.md b/docs/cli/index.md index 4bba3ef42e..e13943f70b 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -50,7 +50,7 @@ $ tmuxp shell -c 'python code' Launch into a python console with [libtmux] objects. Compare to django's shell. -```{image} _static/tmuxp-shell.gif +```{image} ../_static/tmuxp-shell.gif :width: 100% ``` diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 90340cb0d8..8ecb287bf5 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -565,14 +565,14 @@ pane during creation. ::: ````{tab} YAML -```{literalinclude} ../.tmuxp.yaml +```{literalinclude} ../../.tmuxp.yaml :language: yaml ``` ```` ````{tab} JSON -```{literalinclude} ../.tmuxp.json +```{literalinclude} ../../.tmuxp.json :language: json ``` diff --git a/docs/plugins/index.md b/docs/plugins/index.md index 92ce67a500..f9225a21a7 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -14,7 +14,7 @@ your tmuxp configuration file. ````{tab} YAML -```{literalinclude} ../examples/plugin-system.yaml +```{literalinclude} ../../examples/plugin-system.yaml :language: yaml ``` @@ -23,7 +23,7 @@ your tmuxp configuration file. ````{tab} JSON -```{literalinclude} ../examples/plugin-system.json +```{literalinclude} ../../examples/plugin-system.json :language: json ``` From 5389a1dd0bbe8a4afcfa9f97f6a442c54600ecee Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:55:03 -0500 Subject: [PATCH 1050/2998] refactor(docs): Split commands up --- docs/cli/completion.md | 31 ++++ docs/cli/convert.md | 26 +++ docs/cli/debug-info.md | 19 +++ docs/cli/freeze.md | 25 +++ docs/cli/import.md | 43 +++++ docs/cli/index.md | 363 +++-------------------------------------- docs/cli/load.md | 120 ++++++++++++++ docs/cli/shell.md | 113 +++++++++++++ 8 files changed, 396 insertions(+), 344 deletions(-) create mode 100644 docs/cli/completion.md create mode 100644 docs/cli/convert.md create mode 100644 docs/cli/debug-info.md create mode 100644 docs/cli/freeze.md create mode 100644 docs/cli/import.md create mode 100644 docs/cli/load.md create mode 100644 docs/cli/shell.md diff --git a/docs/cli/completion.md b/docs/cli/completion.md new file mode 100644 index 0000000000..b25e799634 --- /dev/null +++ b/docs/cli/completion.md @@ -0,0 +1,31 @@ +(completion)= + +# Completion + +```{note} +See the [click library's documentation on shell completion](https://click.palletsprojects.com/en/8.0.x/shell-completion/) for the most up to date way of connecting completion for vcspull. +``` + +:::{tab} Bash + +_~/.bashrc_: + +```bash + +eval "$(_TMUXP_COMPLETE=bash_source tmuxp)" + +``` + +::: + +:::{tab} Zsh + +_~/.zshrc_: + +```zsh + +eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" + +``` + +::: diff --git a/docs/cli/convert.md b/docs/cli/convert.md new file mode 100644 index 0000000000..7fb5a692a3 --- /dev/null +++ b/docs/cli/convert.md @@ -0,0 +1,26 @@ +(convert-config)= + +(tmuxp-config)= + +# tmuxp convert + +Convert between YAML and JSON + +````{tab} YAML -> JSON + +```console +$ tmuxp convert /path/to/file.yaml +``` + +```` + +````{tab} JSON -> YAML + +```console +$ tmuxp convert /path/to/file.json +``` + +```` + +tmuxp automatically will prompt to convert `.yaml` to `.json` and +`.json` to `.yaml`. diff --git a/docs/cli/debug-info.md b/docs/cli/debug-info.md new file mode 100644 index 0000000000..3bf17a4ccb --- /dev/null +++ b/docs/cli/debug-info.md @@ -0,0 +1,19 @@ +(cli-debug-info)= + +(tmuxp-debug-info)= + +# tmuxp debug-info + +Use to collect all relevant information for submitting an issue to +the project. + +```console + +$ tmuxp debug-info +-------------------------- +environment: + system: Linux + arch: x86_64 +... + +``` diff --git a/docs/cli/freeze.md b/docs/cli/freeze.md new file mode 100644 index 0000000000..db3bfcc2a5 --- /dev/null +++ b/docs/cli/freeze.md @@ -0,0 +1,25 @@ +(cli-freeze)= + +# tmuxp freeze + +Freeze sessions + +```console +$ tmuxp freeze +``` + +```console +$ tmuxp freeze [session_name] +``` + +```console +$ tmuxp freeze --force [session_name] +``` + +You can save the state of your tmux session by freezing it. + +Tmuxp will offer to save your session state to `.json` or `.yaml`. + +If no session is specified, it will default to the attached session. + +If the `--force` argument is passed, it will overwrite any existing config file with the same name. diff --git a/docs/cli/import.md b/docs/cli/import.md new file mode 100644 index 0000000000..d087660153 --- /dev/null +++ b/docs/cli/import.md @@ -0,0 +1,43 @@ +(cli-import)= + +# tmuxp import + +(import-teamocil)= + +## From teamocil + +````{tab} YAML + +```console +$ tmuxp import teamocil /path/to/file.yaml +``` + +```` + +````{tab} JSON + +```console +$ tmuxp import teamocil /path/to/file.json +``` + +```` + +(import-tmuxinator)= + +## From tmuxinator + +````{tab} YAML + +```console +$ tmuxp import tmuxinator /path/to/file.yaml +``` + +```` + +````{tab} JSON + +```console +$ tmuxp import tmuxinator /path/to/file.json +``` + +```` diff --git a/docs/cli/index.md b/docs/cli/index.md index e13943f70b..dd8612a61a 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -4,360 +4,35 @@ # Commands -(completion)= +```{toctree} +:caption: General commands +:maxdepth: 1 -## Completion - -```{note} -See the [click library's documentation on shell completion](https://click.palletsprojects.com/en/8.0.x/shell-completion/) for the most up to date way of connecting completion for vcspull. -``` - -In bash (`~/.bashrc`): - -```console - -eval "$(_TMUXP_COMPLETE=bash_source tmuxp)" - -``` - -In zsh (`~/.zshrc`): - -```console - -eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" - -``` - -(cli-shell)= - -## Shell - -```console -$ tmuxp shell -``` - -```console -$ tmuxp shell [session_name] -``` - -```console -$ tmuxp shell [session_name] [window_name] -``` - -```console -$ tmuxp shell -c 'python code' -``` - -Launch into a python console with [libtmux] objects. Compare to django's shell. - -```{image} ../_static/tmuxp-shell.gif -:width: 100% -``` - -Automatically preloads current tmux {class}`server `, -{class}`session `, {class}`window ` -{class}`pane `. Pass additional arguments to select a -specific one of your choice: - -```console -(Pdb) server - -(Pdb) server.sessions -[Session($1 your_project)] -(Pdb) session -Session($1 your_project) -(Pdb) session.name -'your_project' -(Pdb) window -Window(@3 1:your_window, Session($1 your_project)) -(Pdb) window.name -'your_window' -(Pdb) window.panes -[Pane(%6 Window(@3 1:your_window, Session($1 your_project))) -(Pdb) pane -Pane(%6 Window(@3 1:your_window, Session($1 your_project))) -``` - -Python 3.7 supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and supports -compatible debuggers, for instance [ipdb][ipdb]: - -```console -$ pip install --user ipdb -``` - -```console -$ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell -``` - -You can also pass in python code directly, similar to `python -c`, do -this via `tmuxp -c`: - -```console -$ tmuxp shell -c 'print(session.name); print(window.name)' -my_server -my_window -``` - -```console -$ tmuxp shell my_server -c 'print(session.name); print(window.name)' -my_server -my_window -``` - -```console -$ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' -my_server -my_window -``` - -```console -$ tmuxp shell my_server my_window -c 'print(window.name.upper())' -MY_WINDOW -``` - -Assuming inside a tmux pane or one is attached on default server: - -```console -$ tmuxp shell -c 'print(pane.id); print(pane.window.name)' -%2 -my_window -``` - -[pep 553]: https://www.python.org/dev/peps/pep-0553/ -[ipdb]: https://pypi.org/project/ipdb/ -[libtmux]: https://libtmux.git-pull.com - -### Shell detection - -`tmuxp shell` detects the richest shell available in your _site packages_, you can also pick your shell via args: - -- `--pdb`: Use plain old `breakpoint()` (python 3.7+) or - `pdb.set_trace` -- `--code`: Drop into `code.interact`, accepts `--use-pythonrc` -- `--bpython`: Drop into bpython -- `--ipython`: Drop into ipython -- `--ptpython`: Drop into ptpython, accepts `--use-vi-mode` -- `--ptipython`: Drop into ipython + ptpython, accepts - `--use-vi-mode` - -(cli-freeze)= - -## Freeze sessions - -```console -$ tmuxp freeze -$ tmuxp freeze [session_name] -$ tmuxp freeze --force [session_name] -``` - -You can save the state of your tmux session by freezing it. - -Tmuxp will offer to save your session state to `.json` or `.yaml`. - -If no session is specified, it will default to the attached session. - -If the `--force` argument is passed, it will overwrite any existing config file with the same name. - -(cli-load)= - -## Load session - -You can load your tmuxp file and attach the vim session via a few -shorthands: - -1. The directory with a `.tmuxp.{yaml,yml,json}` file in it -2. The name of the project file in your {}`$HOME/.tmuxp` folder -3. The direct path of the tmuxp file you want to load - -Path to folder with `.tmuxp.yaml`, `.tmuxp.yml`, `.tmuxp.json`: - -```console -$ tmuxp load . -``` - -```console -$ tmuxp load ../ -``` - -```console -$ tmuxp load path/to/folder/ -``` - -```console -$ tmuxp load /path/to/folder/ -``` - -Name of the config, assume `$HOME/.tmuxp/myconfig.yaml`: - -```console -$ tmuxp load myconfig -``` - -Direct path to json/yaml file: - -```console -$ tmuxp load ./myfile.yaml -``` - -```console -$ tmuxp load /abs/path/to/myfile.yaml -``` - -```console -$ tmuxp load ~/myfile.yaml -``` - -Absolute and relative directory paths are supported. - -```console -$ tmuxp load [filename] -``` - -Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working -directory may be loaded with: - -```console -$ tmuxp load . -``` - -If you try to load a config file from within a tmux session, it will ask you -if you want to load and attach to the new session, or just load detached. -You can also load a config file and append the windows to the current active session. - -``` -Already inside TMUX, switch to session? yes/no -Or (a)ppend windows in the current active session? -[y/n/a]: -``` - -All of these options can be preselected to skip the prompt: - -- Attach / open client after load: - - ```console - $ tmuxp load -y config - ``` - -- Detached / open in background: - - ```console - $ tmuxp load -d config - ``` - -- Append windows to existing session - - ```console - $ tmuxp load -a config - ``` - -Multiple sessions can be loaded at once. The first ones will be created -without being attached. The last one will be attached if there is no -`-d` flag on the command line. - -```console -$ tmuxp load [filename1] [filename2] ... -``` - -A session name can be provided at the terminal. If multiple sessions -are created, the last session is named from the terminal. - -```console -$ tmuxp load -s [new_session_name] [filename1] ... +load +shell ``` -The output of the `load` command can be logged to a file for -debugging purposes. the log level can be controlled with the global -`--log-level` option (defaults to INFO). +```{toctree} +:caption: Configuration +:maxdepth: 1 -```console -$ tmuxp load [filename] --log-file [log_filename] -``` - -```console -$ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] -``` - -(cli-debug-info)= - -## Debug Info - -Use to collect all relevant information for submitting an issue to -the project. - -```console - -$ tmuxp debug-info --------------------------- -environment: - system: Linux - arch: x86_64 -... - -``` - -(cli-import)= - -## Import - -(import-teamocil)= - -### From teamocil - -````{tab} YAML - -```console -$ tmuxp import teamocil /path/to/file.yaml -``` +import +convert +freeze -```` - -````{tab} JSON - -```console -$ tmuxp import teamocil /path/to/file.json ``` -```` - -(import-tmuxinator)= +```{toctree} +:caption: Diagnostic +:maxdepth: 1 -### From tmuxinator +debug-info -````{tab} YAML - -```console -$ tmuxp import tmuxinator /path/to/file.yaml ``` -```` - -````{tab} JSON +```{toctree} +:caption: More +:maxdepth: 1 -```console -$ tmuxp import tmuxinator /path/to/file.json +completion ``` - -```` - -(convert-config)= - -## Convert between YAML and JSON - -````{tab} YAML -> JSON - -```console -$ tmuxp convert /path/to/file.yaml -``` - -```` - -````{tab} JSON -> YAML - -```console -$ tmuxp convert /path/to/file.json -``` - -```` - -tmuxp automatically will prompt to convert `.yaml` to `.json` and -`.json` to `.yaml`. diff --git a/docs/cli/load.md b/docs/cli/load.md new file mode 100644 index 0000000000..a04240cc96 --- /dev/null +++ b/docs/cli/load.md @@ -0,0 +1,120 @@ +(cli-load)= + +(tmuxp-load)= + +# tmuxp load + +You can load your tmuxp file and attach the vim session via a few +shorthands: + +1. The directory with a `.tmuxp.{yaml,yml,json}` file in it +2. The name of the project file in your {}`$HOME/.tmuxp` folder +3. The direct path of the tmuxp file you want to load + +Path to folder with `.tmuxp.yaml`, `.tmuxp.yml`, `.tmuxp.json`: + +```console +$ tmuxp load . +``` + +```console +$ tmuxp load ../ +``` + +```console +$ tmuxp load path/to/folder/ +``` + +```console +$ tmuxp load /path/to/folder/ +``` + +Name of the config, assume `$HOME/.tmuxp/myconfig.yaml`: + +```console +$ tmuxp load myconfig +``` + +Direct path to json/yaml file: + +```console +$ tmuxp load ./myfile.yaml +``` + +```console +$ tmuxp load /abs/path/to/myfile.yaml +``` + +```console +$ tmuxp load ~/myfile.yaml +``` + +Absolute and relative directory paths are supported. + +```console +$ tmuxp load [filename] +``` + +Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working +directory may be loaded with: + +```console +$ tmuxp load . +``` + +If you try to load a config file from within a tmux session, it will ask you +if you want to load and attach to the new session, or just load detached. +You can also load a config file and append the windows to the current active session. + +``` +Already inside TMUX, switch to session? yes/no +Or (a)ppend windows in the current active session? +[y/n/a]: +``` + +All of these options can be preselected to skip the prompt: + +- Attach / open client after load: + + ```console + $ tmuxp load -y config + ``` + +- Detached / open in background: + + ```console + $ tmuxp load -d config + ``` + +- Append windows to existing session + + ```console + $ tmuxp load -a config + ``` + +Multiple sessions can be loaded at once. The first ones will be created +without being attached. The last one will be attached if there is no +`-d` flag on the command line. + +```console +$ tmuxp load [filename1] [filename2] ... +``` + +A session name can be provided at the terminal. If multiple sessions +are created, the last session is named from the terminal. + +```console +$ tmuxp load -s [new_session_name] [filename1] ... +``` + +The output of the `load` command can be logged to a file for +debugging purposes. the log level can be controlled with the global +`--log-level` option (defaults to INFO). + +```console +$ tmuxp load [filename] --log-file [log_filename] +``` + +```console +$ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] +``` diff --git a/docs/cli/shell.md b/docs/cli/shell.md new file mode 100644 index 0000000000..5a0e8a8da7 --- /dev/null +++ b/docs/cli/shell.md @@ -0,0 +1,113 @@ +(cli-shell)= + +(tmuxp-shell)= + +# tmuxp shell + +```console +$ tmuxp shell +``` + +```console +$ tmuxp shell [session_name] +``` + +```console +$ tmuxp shell [session_name] [window_name] +``` + +```console +$ tmuxp shell -c 'python code' +``` + +Launch into a python console with [libtmux] objects. Compare to django's shell. + +```{image} ../_static/tmuxp-shell.gif +:width: 100% +``` + +Automatically preloads current tmux {class}`server `, +{class}`session `, {class}`window ` +{class}`pane `. Pass additional arguments to select a +specific one of your choice: + +```console +(Pdb) server + +(Pdb) server.sessions +[Session($1 your_project)] +(Pdb) session +Session($1 your_project) +(Pdb) session.name +'your_project' +(Pdb) window +Window(@3 1:your_window, Session($1 your_project)) +(Pdb) window.name +'your_window' +(Pdb) window.panes +[Pane(%6 Window(@3 1:your_window, Session($1 your_project))) +(Pdb) pane +Pane(%6 Window(@3 1:your_window, Session($1 your_project))) +``` + +Supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and +compatible debuggers, for instance [ipdb][ipdb]: + +```console +$ pip install --user ipdb +``` + +```console +$ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell +``` + +You can also pass in python code directly, similar to `python -c`, do +this via `tmuxp -c`: + +```console +$ tmuxp shell -c 'print(session.name); print(window.name)' +my_server +my_window +``` + +```console +$ tmuxp shell my_server -c 'print(session.name); print(window.name)' +my_server +my_window +``` + +```console +$ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' +my_server +my_window +``` + +```console +$ tmuxp shell my_server my_window -c 'print(window.name.upper())' +MY_WINDOW +``` + +Assuming inside a tmux pane or one is attached on default server: + +```console +$ tmuxp shell -c 'print(pane.id); print(pane.window.name)' +%2 +my_window +``` + +[pep 553]: https://www.python.org/dev/peps/pep-0553/ +[ipdb]: https://pypi.org/project/ipdb/ +[libtmux]: https://libtmux.git-pull.com + +## Shell detection + +`tmuxp shell` detects the richest shell available in your _site packages_, you can also pick your shell via args: + +- `--pdb`: Use plain old `breakpoint()` (python 3.7+) or + `pdb.set_trace` +- `--code`: Drop into `code.interact`, accepts `--use-pythonrc` +- `--bpython`: Drop into bpython +- `--ipython`: Drop into ipython +- `--ptpython`: Drop into ptpython, accepts `--use-vi-mode` +- `--ptipython`: Drop into ipython + ptpython, accepts + `--use-vi-mode` From 93ee3b04afb4f72d11e9c13f5c83169fcd06471d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 17:48:39 -0500 Subject: [PATCH 1051/2998] docs(cli): Link shell command --- tmuxp/cli.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli.py b/tmuxp/cli.py index af49c807c0..5443e933ba 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli.py @@ -858,10 +858,11 @@ def command_shell( """Launch python shell for tmux server, session, window and pane. Priority given to loaded session/wndow/pane objects: + - session_name and window_name arguments - - current shell: environmental variable of TMUX_PANE (which gives us window and - session) - - ``server.attached_session``, ``session.attached_window``, ``window.attached_pane`` + - current shell: envvar ``TMUX_PANE`` for determing window and session + - :attr:`libtmux.Server.attached_sessions`, :attr:`libtmux.Session.attached_window`, + :attr:`libtmux.Window.attached_pane` """ server = Server(socket_name=socket_name, socket_path=socket_path) From 4437632f875b2cf226afa6d341eb7bff0a64adcf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 18:03:15 -0500 Subject: [PATCH 1052/2998] docs: Command documentation --- docs/cli/convert.md | 11 +++++++++-- docs/cli/debug-info.md | 9 +++++++++ docs/cli/freeze.md | 9 +++++++++ docs/cli/import.md | 12 ++++++++++++ docs/cli/load.md | 9 +++++++++ docs/cli/shell.md | 23 +++++++++++------------ 6 files changed, 59 insertions(+), 14 deletions(-) diff --git a/docs/cli/convert.md b/docs/cli/convert.md index 7fb5a692a3..cc2ff0c9f8 100644 --- a/docs/cli/convert.md +++ b/docs/cli/convert.md @@ -1,7 +1,5 @@ (convert-config)= -(tmuxp-config)= - # tmuxp convert Convert between YAML and JSON @@ -24,3 +22,12 @@ $ tmuxp convert /path/to/file.json tmuxp automatically will prompt to convert `.yaml` to `.json` and `.json` to `.yaml`. + +## Reference + +```{eval-rst} +.. click:: tmuxp.cli:cli + :prog: tmuxp convert + :commands: convert + :nested: full +``` diff --git a/docs/cli/debug-info.md b/docs/cli/debug-info.md index 3bf17a4ccb..d8ef196ca2 100644 --- a/docs/cli/debug-info.md +++ b/docs/cli/debug-info.md @@ -17,3 +17,12 @@ environment: ... ``` + +## Reference + +```{eval-rst} +.. click:: tmuxp.cli:cli + :prog: tmuxp debug-info + :commands: debug-info + :nested: full +``` diff --git a/docs/cli/freeze.md b/docs/cli/freeze.md index db3bfcc2a5..9c413eb635 100644 --- a/docs/cli/freeze.md +++ b/docs/cli/freeze.md @@ -23,3 +23,12 @@ Tmuxp will offer to save your session state to `.json` or `.yaml`. If no session is specified, it will default to the attached session. If the `--force` argument is passed, it will overwrite any existing config file with the same name. + +(cli-freeze-reference)= + +```{eval-rst} +.. click:: tmuxp.cli:cli + :prog: tmuxp freeze + :commands: freeze + :nested: full +``` diff --git a/docs/cli/import.md b/docs/cli/import.md index d087660153..5cf25c6e0b 100644 --- a/docs/cli/import.md +++ b/docs/cli/import.md @@ -6,6 +6,12 @@ ## From teamocil +```{eval-rst} +.. click:: tmuxp.cli:command_import_teamocil + :prog: tmuxp import teamocil + :nested: full +``` + ````{tab} YAML ```console @@ -26,6 +32,12 @@ $ tmuxp import teamocil /path/to/file.json ## From tmuxinator +```{eval-rst} +.. click:: tmuxp.cli:command_import_tmuxinator + :prog: tmuxp import tmuxinator + :nested: short +``` + ````{tab} YAML ```console diff --git a/docs/cli/load.md b/docs/cli/load.md index a04240cc96..5c8d85cf78 100644 --- a/docs/cli/load.md +++ b/docs/cli/load.md @@ -118,3 +118,12 @@ $ tmuxp load [filename] --log-file [log_filename] ```console $ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] ``` + +(tmuxp-load-reference)= + +```{eval-rst} +.. click:: tmuxp.cli:cli + :prog: tmuxp load + :commands: load + :nested: full +``` diff --git a/docs/cli/shell.md b/docs/cli/shell.md index 5a0e8a8da7..a047881e07 100644 --- a/docs/cli/shell.md +++ b/docs/cli/shell.md @@ -1,31 +1,30 @@ (cli-shell)= -(tmuxp-shell)= - # tmuxp shell -```console -$ tmuxp shell +```{eval-rst} +.. click:: tmuxp.cli:command_shell + :prog: tmuxp shell + :commands: shell + :nested: none ``` -```console -$ tmuxp shell [session_name] -``` - -```console -$ tmuxp shell [session_name] [window_name] -``` +## Directly enter commands ```console $ tmuxp shell -c 'python code' ``` -Launch into a python console with [libtmux] objects. Compare to django's shell. +## Example ```{image} ../_static/tmuxp-shell.gif :width: 100% ``` +## Guide + +Launch into a python console with [libtmux] objects. Compare to django's shell. + Automatically preloads current tmux {class}`server `, {class}`session `, {class}`window ` {class}`pane `. Pass additional arguments to select a From e10761371c35218ebbf5fbfd676c3d00cc9f227c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 13:56:39 -0500 Subject: [PATCH 1053/2998] refactor(test): load_fixture -> read_config_file Less ambiguity --- tests/fixtures/_util.py | 2 +- tests/fixtures/config/expand2.py | 6 +- .../config/shell_command_before_session.py | 6 +- tests/fixtures/config_teamocil/layouts.py | 4 +- tests/fixtures/config_teamocil/test1.py | 4 +- tests/fixtures/config_teamocil/test2.py | 4 +- tests/fixtures/config_teamocil/test3.py | 4 +- tests/fixtures/config_teamocil/test4.py | 4 +- tests/fixtures/config_tmuxinator/test1.py | 4 +- tests/fixtures/config_tmuxinator/test2.py | 4 +- tests/fixtures/config_tmuxinator/test3.py | 4 +- tests/test_cli.py | 20 +++--- tests/test_workspacebuilder.py | 72 ++++++++++--------- tests/test_workspacefreezer.py | 4 +- 14 files changed, 73 insertions(+), 69 deletions(-) diff --git a/tests/fixtures/_util.py b/tests/fixtures/_util.py index b0c01c1f93..90eb61661b 100644 --- a/tests/fixtures/_util.py +++ b/tests/fixtures/_util.py @@ -3,7 +3,7 @@ FIXTURE_PATH = pathlib.Path(__file__).parent -def load_fixture(_file): # return fixture data, relative to __file__ +def read_config_file(_file): # return fixture data, relative to __file__ return open(FIXTURE_PATH / _file).read() diff --git a/tests/fixtures/config/expand2.py b/tests/fixtures/config/expand2.py index af00ec9253..bd71f31fe9 100644 --- a/tests/fixtures/config/expand2.py +++ b/tests/fixtures/config/expand2.py @@ -1,8 +1,8 @@ import os -from .._util import load_fixture +from .._util import read_config_file -unexpanded_yaml = load_fixture("config/expand2-unexpanded.yaml") -expanded_yaml = load_fixture("config/expand2-expanded.yaml").format( +unexpanded_yaml = read_config_file("config/expand2-unexpanded.yaml") +expanded_yaml = read_config_file("config/expand2-expanded.yaml").format( HOME=os.path.expanduser("~") ) diff --git a/tests/fixtures/config/shell_command_before_session.py b/tests/fixtures/config/shell_command_before_session.py index d7429097ad..72a423ca6d 100644 --- a/tests/fixtures/config/shell_command_before_session.py +++ b/tests/fixtures/config/shell_command_before_session.py @@ -1,4 +1,4 @@ -from .._util import load_fixture +from .._util import read_config_file -before = load_fixture("config/shell_command_before_session.yaml") -expected = load_fixture("config/shell_command_before_session-expected.yaml") +before = read_config_file("config/shell_command_before_session.yaml") +expected = read_config_file("config/shell_command_before_session-expected.yaml") diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index aaa7de25b2..ba5e63a962 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -teamocil_yaml = load_fixture("config_teamocil/layouts.yaml") +teamocil_yaml = read_config_file("config_teamocil/layouts.yaml") teamocil_dict = { "two-windows": { diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index 4bbf3fe687..634052efd7 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -teamocil_yaml = load_fixture("config_teamocil/test1.yaml") +teamocil_yaml = read_config_file("config_teamocil/test1.yaml") teamocil_conf = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index bc78e1e0f8..a1ea738e31 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -teamocil_yaml = load_fixture("config_teamocil/test2.yaml") +teamocil_yaml = read_config_file("config_teamocil/test2.yaml") teamocil_dict = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index 7e33fcafc8..6176c9132c 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -teamocil_yaml = load_fixture("config_teamocil/test3.yaml") +teamocil_yaml = read_config_file("config_teamocil/test3.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index b734e4b4ca..58c21d5d26 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -teamocil_yaml = load_fixture("config_teamocil/test4.yaml") +teamocil_yaml = read_config_file("config_teamocil/test4.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index 34295c974d..fa8362dfbd 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -tmuxinator_yaml = load_fixture("config_tmuxinator/test1.yaml") +tmuxinator_yaml = read_config_file("config_tmuxinator/test1.yaml") tmuxinator_dict = { "windows": [ {"editor": {"layout": "main-vertical", "panes": ["vim", "guard"]}}, diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index d1c97612b0..58b1401d7e 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -tmuxinator_yaml = load_fixture("config_tmuxinator/test2.yaml") +tmuxinator_yaml = read_config_file("config_tmuxinator/test2.yaml") tmuxinator_dict = { "project_name": "sample", diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index f4f3637076..9e7174d9b8 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,6 +1,6 @@ -from .._util import load_fixture +from .._util import read_config_file -tmuxinator_yaml = load_fixture("config_tmuxinator/test3.yaml") +tmuxinator_yaml = read_config_file("config_tmuxinator/test3.yaml") tmuxinator_dict = { "name": "sample", diff --git a/tests/test_cli.py b/tests/test_cli.py index 90ad5c155a..9453bb03c9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,7 +28,7 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder -from .fixtures._util import FIXTURE_PATH, load_fixture +from .fixtures._util import FIXTURE_PATH, read_config_file def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): @@ -861,7 +861,7 @@ def test_help(cli_args, monkeypatch): ], ) def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): - teamocil_config = load_fixture("config_teamocil/test4.yaml") + teamocil_config = read_config_file("config_teamocil/test4.yaml") teamocil_path = tmp_path / ".teamocil" teamocil_path.mkdir() @@ -900,7 +900,7 @@ def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): ], ) def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): - tmuxinator_config = load_fixture("config_tmuxinator/test3.yaml") + tmuxinator_config = read_config_file("config_tmuxinator/test3.yaml") tmuxinator_path = tmp_path / ".tmuxinator" tmuxinator_path.mkdir() @@ -1103,7 +1103,7 @@ def test_ls_cli(monkeypatch: pytest.MonkeyPatch, tmp_path: pathlib.Path): def test_load_plugins(monkeypatch_plugin_test_packages): from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder - plugins_config = load_fixture("workspacebuilder/plugin_bwb.yaml") + plugins_config = read_config_file("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(plugins_config).get() @@ -1186,7 +1186,7 @@ def test_plugin_system_before_script( def test_reattach_plugins(monkeypatch_plugin_test_packages, server): - config_plugins = load_fixture("workspacebuilder/plugin_r.yaml") + config_plugins = read_config_file("workspacebuilder/plugin_r.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -1217,7 +1217,7 @@ def test_load_attached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1237,7 +1237,7 @@ def test_load_attached_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1257,7 +1257,7 @@ def test_load_attached_within_tmux(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1277,7 +1277,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1289,7 +1289,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): def test_load_append_windows_to_current_session(server, monkeypatch): - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index c10fa7268f..7b1af02ffd 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -17,11 +17,11 @@ from tmuxp.workspacebuilder import WorkspaceBuilder from . import EXAMPLE_PATH, FIXTURES_PATH -from .fixtures._util import load_fixture +from .fixtures._util import read_config_file def test_split_windows(session): - yaml_config = load_fixture("workspacebuilder/two_pane.yaml") + yaml_config = read_config_file("workspacebuilder/two_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -42,7 +42,7 @@ def test_split_windows(session): def test_split_windows_three_pane(session): - yaml_config = load_fixture("workspacebuilder/three_pane.yaml") + yaml_config = read_config_file("workspacebuilder/three_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") @@ -66,7 +66,7 @@ def test_split_windows_three_pane(session): def test_focus_pane_index(session): - yaml_config = load_fixture("workspacebuilder/focus_and_pane.yaml") + yaml_config = read_config_file("workspacebuilder/focus_and_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -136,7 +136,7 @@ def test_focus_pane_index(session): """.strip() ) def test_suppress_history(session): - yaml_config = load_fixture("workspacebuilder/suppress_history.yaml") + yaml_config = read_config_file("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -190,7 +190,7 @@ def assertIsMissing(cmd, hist): def test_session_options(session): - yaml_config = load_fixture("workspacebuilder/session_options.yaml") + yaml_config = read_config_file("workspacebuilder/session_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -204,7 +204,7 @@ def test_session_options(session): def test_global_options(session): - yaml_config = load_fixture("workspacebuilder/global_options.yaml") + yaml_config = read_config_file("workspacebuilder/global_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -225,7 +225,7 @@ def test_global_session_env_options(session, monkeypatch): main_pane_height = 8 monkeypatch.setenv("MAIN_PANE_HEIGHT", str(main_pane_height)) - yaml_config = load_fixture("workspacebuilder/env_var_options.yaml") + yaml_config = read_config_file("workspacebuilder/env_var_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -240,7 +240,7 @@ def test_global_session_env_options(session, monkeypatch): def test_window_options(session): - yaml_config = load_fixture("workspacebuilder/window_options.yaml") + yaml_config = read_config_file("workspacebuilder/window_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -270,7 +270,7 @@ def test_window_options(session): @pytest.mark.flaky(reruns=5) def test_window_options_after(session): - yaml_config = load_fixture("workspacebuilder/window_options_after.yaml") + yaml_config = read_config_file("workspacebuilder/window_options_after.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -315,7 +315,7 @@ def assert_last_line(p, s): def test_window_shell(session): - yaml_config = load_fixture("workspacebuilder/window_shell.yaml") + yaml_config = read_config_file("workspacebuilder/window_shell.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -336,7 +336,7 @@ def test_window_shell(session): def test_environment_variables(session): - yaml_config = load_fixture("workspacebuilder/environment_vars.yaml") + yaml_config = read_config_file("workspacebuilder/environment_vars.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -350,7 +350,7 @@ def test_environment_variables(session): def test_automatic_rename_option(session): """With option automatic-rename: on.""" - yaml_config = load_fixture("workspacebuilder/window_automatic_rename.yaml") + yaml_config = read_config_file("workspacebuilder/window_automatic_rename.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -427,7 +427,7 @@ def test_blank_pane_count(session): def test_start_directory(session, tmp_path: pathlib.Path): - yaml_config = load_fixture("workspacebuilder/start_directory.yaml") + yaml_config = read_config_file("workspacebuilder/start_directory.yaml") test_dir = tmp_path / "foo bar" test_dir.mkdir() test_config = yaml_config.format(TEST_DIR=test_dir) @@ -470,7 +470,7 @@ def test_start_directory_relative(session, tmp_path: pathlib.Path): $ tmuxp load . """ - yaml_config = load_fixture("workspacebuilder/start_directory_relative.yaml") + yaml_config = read_config_file("workspacebuilder/start_directory_relative.yaml") test_dir = tmp_path / "foo bar" test_dir.mkdir() @@ -517,7 +517,7 @@ def test_pane_order(session): """ - yaml_config = load_fixture("workspacebuilder/pane_ordering.yaml").format( + yaml_config = read_config_file("workspacebuilder/pane_ordering.yaml").format( HOME=os.path.realpath(os.path.expanduser("~")) ) @@ -568,7 +568,7 @@ def test_pane_order(session): def test_window_index(session): - yaml_config = load_fixture("workspacebuilder/window_index.yaml") + yaml_config = read_config_file("workspacebuilder/window_index.yaml") proc = session.cmd("show-option", "-gv", "base-index") base_index = int(proc.stdout[0]) name_index_map = {"zero": 0 + base_index, "one": 1 + base_index, "five": 5} @@ -586,7 +586,7 @@ def test_window_index(session): def test_before_load_throw_error_if_retcode_error(server): - config_script_fails = load_fixture("workspacebuilder/config_script_fails.yaml") + config_script_fails = read_config_file("workspacebuilder/config_script_fails.yaml") sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( script_failed=FIXTURES_PATH / "script_failed.sh", @@ -609,7 +609,7 @@ def test_before_load_throw_error_if_retcode_error(server): def test_before_load_throw_error_if_file_not_exists(server): - config_script_not_exists = load_fixture( + config_script_not_exists = read_config_file( "workspacebuilder/config_script_not_exists.yaml" ) sconfig = kaptan.Kaptan(handler="yaml") @@ -634,7 +634,7 @@ def test_before_load_throw_error_if_file_not_exists(server): def test_before_load_true_if_test_passes(server): - config_script_completes = load_fixture( + config_script_completes = read_config_file( "workspacebuilder/config_script_completes.yaml" ) script_complete_sh = FIXTURES_PATH / "script_complete.sh" @@ -655,7 +655,7 @@ def test_before_load_true_if_test_passes(server): def test_before_load_true_if_test_passes_with_args(server): - config_script_completes = load_fixture( + config_script_completes = read_config_file( "workspacebuilder/config_script_completes.yaml" ) script_complete_sh = FIXTURES_PATH / "script_complete.sh" @@ -676,7 +676,7 @@ def test_before_load_true_if_test_passes_with_args(server): def test_plugin_system_before_workspace_builder( monkeypatch_plugin_test_packages, session ): - config_plugins = load_fixture("workspacebuilder/plugin_bwb.yaml") + config_plugins = read_config_file("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -692,7 +692,7 @@ def test_plugin_system_before_workspace_builder( def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, session): - config_plugins = load_fixture("workspacebuilder/plugin_owc.yaml") + config_plugins = read_config_file("workspacebuilder/plugin_owc.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -708,7 +708,7 @@ def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, sessio def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, session): - config_plugins = load_fixture("workspacebuilder/plugin_awf.yaml") + config_plugins = read_config_file("workspacebuilder/plugin_awf.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -724,7 +724,9 @@ def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, s def test_plugin_system_on_window_create_multiple_windows(session): - config_plugins = load_fixture("workspacebuilder/plugin_owc_multiple_windows.yaml") + config_plugins = read_config_file( + "workspacebuilder/plugin_owc_multiple_windows.yaml" + ) sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -743,7 +745,9 @@ def test_plugin_system_on_window_create_multiple_windows(session): def test_plugin_system_after_window_finished_multiple_windows( monkeypatch_plugin_test_packages, session ): - config_plugins = load_fixture("workspacebuilder/plugin_awf_multiple_windows.yaml") + config_plugins = read_config_file( + "workspacebuilder/plugin_awf_multiple_windows.yaml" + ) sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -760,7 +764,7 @@ def test_plugin_system_after_window_finished_multiple_windows( def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, session): - config_plugins = load_fixture("workspacebuilder/plugin_multiple_plugins.yaml") + config_plugins = read_config_file("workspacebuilder/plugin_multiple_plugins.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -783,7 +787,7 @@ def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, sessio def test_load_configs_same_session(server): - yaml_config = load_fixture("workspacebuilder/three_windows.yaml") + yaml_config = read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -793,7 +797,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = load_fixture("workspacebuilder/two_windows.yaml") + yaml_config = read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -803,7 +807,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 2 assert len(server.sessions[1]._windows) == 2 - yaml_config = load_fixture("workspacebuilder/two_windows.yaml") + yaml_config = read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -816,7 +820,7 @@ def test_load_configs_same_session(server): def test_load_configs_separate_sessions(server): - yaml_config = load_fixture("workspacebuilder/three_windows.yaml") + yaml_config = read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -826,7 +830,7 @@ def test_load_configs_separate_sessions(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = load_fixture("workspacebuilder/two_windows.yaml") + yaml_config = read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -840,14 +844,14 @@ def test_load_configs_separate_sessions(server): def test_find_current_active_pane(server, monkeypatch): - yaml_config = load_fixture("workspacebuilder/three_windows.yaml") + yaml_config = read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) builder.build() - yaml_config = load_fixture("workspacebuilder/two_windows.yaml") + yaml_config = read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index fb34bc3554..5e93afe9e6 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -6,11 +6,11 @@ from tmuxp import config from tmuxp.workspacebuilder import WorkspaceBuilder, freeze -from .fixtures._util import load_fixture +from .fixtures._util import read_config_file def test_freeze_config(session): - yaml_config = load_fixture("workspacefreezer/sampleconfig.yaml") + yaml_config = read_config_file("workspacefreezer/sampleconfig.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() From 723c9b93c787513052942128a8f83ae9c7d9b3d4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:06:07 -0500 Subject: [PATCH 1054/2998] tests: Add util via namespace --- tests/fixtures/config/expand2.py | 6 +- .../config/shell_command_before_session.py | 8 +- tests/fixtures/config_teamocil/layouts.py | 4 +- tests/fixtures/config_teamocil/test1.py | 4 +- tests/fixtures/config_teamocil/test2.py | 4 +- tests/fixtures/config_teamocil/test3.py | 4 +- tests/fixtures/config_teamocil/test4.py | 4 +- tests/fixtures/config_tmuxinator/test1.py | 4 +- tests/fixtures/config_tmuxinator/test2.py | 4 +- tests/fixtures/config_tmuxinator/test3.py | 4 +- tests/test_cli.py | 21 ++--- tests/test_workspacebuilder.py | 82 +++++++++++-------- tests/test_workspacefreezer.py | 4 +- 13 files changed, 83 insertions(+), 70 deletions(-) diff --git a/tests/fixtures/config/expand2.py b/tests/fixtures/config/expand2.py index bd71f31fe9..17b066053f 100644 --- a/tests/fixtures/config/expand2.py +++ b/tests/fixtures/config/expand2.py @@ -1,8 +1,8 @@ import os -from .._util import read_config_file +from .. import _util as test_utils -unexpanded_yaml = read_config_file("config/expand2-unexpanded.yaml") -expanded_yaml = read_config_file("config/expand2-expanded.yaml").format( +unexpanded_yaml = test_utils.read_config_file("config/expand2-unexpanded.yaml") +expanded_yaml = test_utils.read_config_file("config/expand2-expanded.yaml").format( HOME=os.path.expanduser("~") ) diff --git a/tests/fixtures/config/shell_command_before_session.py b/tests/fixtures/config/shell_command_before_session.py index 72a423ca6d..64181027ae 100644 --- a/tests/fixtures/config/shell_command_before_session.py +++ b/tests/fixtures/config/shell_command_before_session.py @@ -1,4 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -before = read_config_file("config/shell_command_before_session.yaml") -expected = read_config_file("config/shell_command_before_session-expected.yaml") +before = test_utils.read_config_file("config/shell_command_before_session.yaml") +expected = test_utils.read_config_file( + "config/shell_command_before_session-expected.yaml" +) diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index ba5e63a962..404c419277 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -teamocil_yaml = read_config_file("config_teamocil/layouts.yaml") +teamocil_yaml = test_utils.read_config_file("config_teamocil/layouts.yaml") teamocil_dict = { "two-windows": { diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index 634052efd7..de3cccb981 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -teamocil_yaml = read_config_file("config_teamocil/test1.yaml") +teamocil_yaml = test_utils.read_config_file("config_teamocil/test1.yaml") teamocil_conf = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index a1ea738e31..7519046982 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -teamocil_yaml = read_config_file("config_teamocil/test2.yaml") +teamocil_yaml = test_utils.read_config_file("config_teamocil/test2.yaml") teamocil_dict = { "windows": [ { diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index 6176c9132c..cc550b8fee 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -teamocil_yaml = read_config_file("config_teamocil/test3.yaml") +teamocil_yaml = test_utils.read_config_file("config_teamocil/test3.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index 58c21d5d26..ca59f958e0 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -teamocil_yaml = read_config_file("config_teamocil/test4.yaml") +teamocil_yaml = test_utils.read_config_file("config_teamocil/test4.yaml") teamocil_dict = { "windows": [ diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index fa8362dfbd..6fa8260432 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -tmuxinator_yaml = read_config_file("config_tmuxinator/test1.yaml") +tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test1.yaml") tmuxinator_dict = { "windows": [ {"editor": {"layout": "main-vertical", "panes": ["vim", "guard"]}}, diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index 58b1401d7e..c1eb5c0f42 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -tmuxinator_yaml = read_config_file("config_tmuxinator/test2.yaml") +tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test2.yaml") tmuxinator_dict = { "project_name": "sample", diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index 9e7174d9b8..9551f2db6a 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,6 +1,6 @@ -from .._util import read_config_file +from .. import _util as test_utils -tmuxinator_yaml = read_config_file("config_tmuxinator/test3.yaml") +tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test3.yaml") tmuxinator_dict = { "name": "sample", diff --git a/tests/test_cli.py b/tests/test_cli.py index 9453bb03c9..1a59c3422c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,7 +28,8 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder -from .fixtures._util import FIXTURE_PATH, read_config_file +from .fixtures import _util as test_utils +from .fixtures._util import FIXTURE_PATH def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): @@ -861,7 +862,7 @@ def test_help(cli_args, monkeypatch): ], ) def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): - teamocil_config = read_config_file("config_teamocil/test4.yaml") + teamocil_config = test_utils.read_config_file("config_teamocil/test4.yaml") teamocil_path = tmp_path / ".teamocil" teamocil_path.mkdir() @@ -900,7 +901,7 @@ def test_import_teamocil(cli_args, inputs, tmp_path, monkeypatch): ], ) def test_import_tmuxinator(cli_args, inputs, tmp_path, monkeypatch): - tmuxinator_config = read_config_file("config_tmuxinator/test3.yaml") + tmuxinator_config = test_utils.read_config_file("config_tmuxinator/test3.yaml") tmuxinator_path = tmp_path / ".tmuxinator" tmuxinator_path.mkdir() @@ -1103,7 +1104,7 @@ def test_ls_cli(monkeypatch: pytest.MonkeyPatch, tmp_path: pathlib.Path): def test_load_plugins(monkeypatch_plugin_test_packages): from tmuxp_test_plugin_bwb.plugin import PluginBeforeWorkspaceBuilder - plugins_config = read_config_file("workspacebuilder/plugin_bwb.yaml") + plugins_config = test_utils.read_config_file("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(plugins_config).get() @@ -1186,7 +1187,7 @@ def test_plugin_system_before_script( def test_reattach_plugins(monkeypatch_plugin_test_packages, server): - config_plugins = read_config_file("workspacebuilder/plugin_r.yaml") + config_plugins = test_utils.read_config_file("workspacebuilder/plugin_r.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -1217,7 +1218,7 @@ def test_load_attached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1237,7 +1238,7 @@ def test_load_attached_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.attach_session", attach_session_mock) - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1257,7 +1258,7 @@ def test_load_attached_within_tmux(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1277,7 +1278,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): monkeypatch.setattr("libtmux.session.Session.switch_client", switch_client_mock) - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -1289,7 +1290,7 @@ def test_load_attached_within_tmux_detached(server, monkeypatch): def test_load_append_windows_to_current_session(server, monkeypatch): - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 7b1af02ffd..456cd44f6e 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -17,11 +17,11 @@ from tmuxp.workspacebuilder import WorkspaceBuilder from . import EXAMPLE_PATH, FIXTURES_PATH -from .fixtures._util import read_config_file +from .fixtures import _util as test_utils def test_split_windows(session): - yaml_config = read_config_file("workspacebuilder/two_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -42,7 +42,7 @@ def test_split_windows(session): def test_split_windows_three_pane(session): - yaml_config = read_config_file("workspacebuilder/three_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/three_pane.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") @@ -66,7 +66,7 @@ def test_split_windows_three_pane(session): def test_focus_pane_index(session): - yaml_config = read_config_file("workspacebuilder/focus_and_pane.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/focus_and_pane.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -136,7 +136,7 @@ def test_focus_pane_index(session): """.strip() ) def test_suppress_history(session): - yaml_config = read_config_file("workspacebuilder/suppress_history.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/suppress_history.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -190,7 +190,7 @@ def assertIsMissing(cmd, hist): def test_session_options(session): - yaml_config = read_config_file("workspacebuilder/session_options.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/session_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -204,7 +204,7 @@ def test_session_options(session): def test_global_options(session): - yaml_config = read_config_file("workspacebuilder/global_options.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/global_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -225,7 +225,7 @@ def test_global_session_env_options(session, monkeypatch): main_pane_height = 8 monkeypatch.setenv("MAIN_PANE_HEIGHT", str(main_pane_height)) - yaml_config = read_config_file("workspacebuilder/env_var_options.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/env_var_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -240,7 +240,7 @@ def test_global_session_env_options(session, monkeypatch): def test_window_options(session): - yaml_config = read_config_file("workspacebuilder/window_options.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/window_options.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -270,7 +270,9 @@ def test_window_options(session): @pytest.mark.flaky(reruns=5) def test_window_options_after(session): - yaml_config = read_config_file("workspacebuilder/window_options_after.yaml") + yaml_config = test_utils.read_config_file( + "workspacebuilder/window_options_after.yaml" + ) sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -315,7 +317,7 @@ def assert_last_line(p, s): def test_window_shell(session): - yaml_config = read_config_file("workspacebuilder/window_shell.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/window_shell.yaml") s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -336,7 +338,7 @@ def test_window_shell(session): def test_environment_variables(session): - yaml_config = read_config_file("workspacebuilder/environment_vars.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/environment_vars.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() sconfig = config.expand(sconfig) @@ -350,7 +352,9 @@ def test_environment_variables(session): def test_automatic_rename_option(session): """With option automatic-rename: on.""" - yaml_config = read_config_file("workspacebuilder/window_automatic_rename.yaml") + yaml_config = test_utils.read_config_file( + "workspacebuilder/window_automatic_rename.yaml" + ) s = session sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -427,7 +431,7 @@ def test_blank_pane_count(session): def test_start_directory(session, tmp_path: pathlib.Path): - yaml_config = read_config_file("workspacebuilder/start_directory.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/start_directory.yaml") test_dir = tmp_path / "foo bar" test_dir.mkdir() test_config = yaml_config.format(TEST_DIR=test_dir) @@ -470,7 +474,9 @@ def test_start_directory_relative(session, tmp_path: pathlib.Path): $ tmuxp load . """ - yaml_config = read_config_file("workspacebuilder/start_directory_relative.yaml") + yaml_config = test_utils.read_config_file( + "workspacebuilder/start_directory_relative.yaml" + ) test_dir = tmp_path / "foo bar" test_dir.mkdir() @@ -517,9 +523,9 @@ def test_pane_order(session): """ - yaml_config = read_config_file("workspacebuilder/pane_ordering.yaml").format( - HOME=os.path.realpath(os.path.expanduser("~")) - ) + yaml_config = test_utils.read_config_file( + "workspacebuilder/pane_ordering.yaml" + ).format(HOME=os.path.realpath(os.path.expanduser("~"))) # test order of `panes` (and pane_index) above against pane_dirs pane_paths = [ @@ -568,7 +574,7 @@ def test_pane_order(session): def test_window_index(session): - yaml_config = read_config_file("workspacebuilder/window_index.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/window_index.yaml") proc = session.cmd("show-option", "-gv", "base-index") base_index = int(proc.stdout[0]) name_index_map = {"zero": 0 + base_index, "one": 1 + base_index, "five": 5} @@ -586,7 +592,9 @@ def test_window_index(session): def test_before_load_throw_error_if_retcode_error(server): - config_script_fails = read_config_file("workspacebuilder/config_script_fails.yaml") + config_script_fails = test_utils.read_config_file( + "workspacebuilder/config_script_fails.yaml" + ) sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( script_failed=FIXTURES_PATH / "script_failed.sh", @@ -609,7 +617,7 @@ def test_before_load_throw_error_if_retcode_error(server): def test_before_load_throw_error_if_file_not_exists(server): - config_script_not_exists = read_config_file( + config_script_not_exists = test_utils.read_config_file( "workspacebuilder/config_script_not_exists.yaml" ) sconfig = kaptan.Kaptan(handler="yaml") @@ -634,7 +642,7 @@ def test_before_load_throw_error_if_file_not_exists(server): def test_before_load_true_if_test_passes(server): - config_script_completes = read_config_file( + config_script_completes = test_utils.read_config_file( "workspacebuilder/config_script_completes.yaml" ) script_complete_sh = FIXTURES_PATH / "script_complete.sh" @@ -655,7 +663,7 @@ def test_before_load_true_if_test_passes(server): def test_before_load_true_if_test_passes_with_args(server): - config_script_completes = read_config_file( + config_script_completes = test_utils.read_config_file( "workspacebuilder/config_script_completes.yaml" ) script_complete_sh = FIXTURES_PATH / "script_complete.sh" @@ -676,7 +684,7 @@ def test_before_load_true_if_test_passes_with_args(server): def test_plugin_system_before_workspace_builder( monkeypatch_plugin_test_packages, session ): - config_plugins = read_config_file("workspacebuilder/plugin_bwb.yaml") + config_plugins = test_utils.read_config_file("workspacebuilder/plugin_bwb.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -692,7 +700,7 @@ def test_plugin_system_before_workspace_builder( def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, session): - config_plugins = read_config_file("workspacebuilder/plugin_owc.yaml") + config_plugins = test_utils.read_config_file("workspacebuilder/plugin_owc.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -708,7 +716,7 @@ def test_plugin_system_on_window_create(monkeypatch_plugin_test_packages, sessio def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, session): - config_plugins = read_config_file("workspacebuilder/plugin_awf.yaml") + config_plugins = test_utils.read_config_file("workspacebuilder/plugin_awf.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -724,7 +732,7 @@ def test_plugin_system_after_window_finished(monkeypatch_plugin_test_packages, s def test_plugin_system_on_window_create_multiple_windows(session): - config_plugins = read_config_file( + config_plugins = test_utils.read_config_file( "workspacebuilder/plugin_owc_multiple_windows.yaml" ) @@ -745,7 +753,7 @@ def test_plugin_system_on_window_create_multiple_windows(session): def test_plugin_system_after_window_finished_multiple_windows( monkeypatch_plugin_test_packages, session ): - config_plugins = read_config_file( + config_plugins = test_utils.read_config_file( "workspacebuilder/plugin_awf_multiple_windows.yaml" ) @@ -764,7 +772,9 @@ def test_plugin_system_after_window_finished_multiple_windows( def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, session): - config_plugins = read_config_file("workspacebuilder/plugin_multiple_plugins.yaml") + config_plugins = test_utils.read_config_file( + "workspacebuilder/plugin_multiple_plugins.yaml" + ) sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(config_plugins).get() @@ -787,7 +797,7 @@ def test_plugin_system_multiple_plugins(monkeypatch_plugin_test_packages, sessio def test_load_configs_same_session(server): - yaml_config = read_config_file("workspacebuilder/three_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -797,7 +807,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = read_config_file("workspacebuilder/two_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -807,7 +817,7 @@ def test_load_configs_same_session(server): assert len(server.sessions) == 2 assert len(server.sessions[1]._windows) == 2 - yaml_config = read_config_file("workspacebuilder/two_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -820,7 +830,7 @@ def test_load_configs_same_session(server): def test_load_configs_separate_sessions(server): - yaml_config = read_config_file("workspacebuilder/three_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -830,7 +840,7 @@ def test_load_configs_separate_sessions(server): assert len(server.sessions) == 1 assert len(server.sessions[0]._windows) == 3 - yaml_config = read_config_file("workspacebuilder/two_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() @@ -844,14 +854,14 @@ def test_load_configs_separate_sessions(server): def test_find_current_active_pane(server, monkeypatch): - yaml_config = read_config_file("workspacebuilder/three_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/three_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() builder = WorkspaceBuilder(sconf=sconfig, server=server) builder.build() - yaml_config = read_config_file("workspacebuilder/two_windows.yaml") + yaml_config = test_utils.read_config_file("workspacebuilder/two_windows.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 5e93afe9e6..5ef8a34de7 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -6,11 +6,11 @@ from tmuxp import config from tmuxp.workspacebuilder import WorkspaceBuilder, freeze -from .fixtures._util import read_config_file +from .fixtures import _util as test_utils def test_freeze_config(session): - yaml_config = read_config_file("workspacefreezer/sampleconfig.yaml") + yaml_config = test_utils.read_config_file("workspacefreezer/sampleconfig.yaml") sconfig = kaptan.Kaptan(handler="yaml") sconfig = sconfig.import_config(yaml_config).get() From efb3bc286b778ef2b0940ebfe011ac62f318874b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:08:23 -0500 Subject: [PATCH 1055/2998] refactor(tests): _util -> utils --- tests/fixtures/__init__.py | 2 +- tests/fixtures/config/expand2.py | 2 +- tests/fixtures/config/shell_command_before_session.py | 2 +- tests/fixtures/config_teamocil/layouts.py | 2 +- tests/fixtures/config_teamocil/test1.py | 2 +- tests/fixtures/config_teamocil/test2.py | 2 +- tests/fixtures/config_teamocil/test3.py | 2 +- tests/fixtures/config_teamocil/test4.py | 2 +- tests/fixtures/config_tmuxinator/test1.py | 2 +- tests/fixtures/config_tmuxinator/test2.py | 2 +- tests/fixtures/config_tmuxinator/test3.py | 2 +- tests/fixtures/{_util.py => utils.py} | 0 tests/test_cli.py | 2 +- tests/test_workspacebuilder.py | 2 +- tests/test_workspacefreezer.py | 2 +- 15 files changed, 14 insertions(+), 14 deletions(-) rename tests/fixtures/{_util.py => utils.py} (100%) diff --git a/tests/fixtures/__init__.py b/tests/fixtures/__init__.py index 3e227e3c07..a81b5f2914 100644 --- a/tests/fixtures/__init__.py +++ b/tests/fixtures/__init__.py @@ -1 +1 @@ -from . import _util # noqa +from . import utils # noqa diff --git a/tests/fixtures/config/expand2.py b/tests/fixtures/config/expand2.py index 17b066053f..4cd49336dd 100644 --- a/tests/fixtures/config/expand2.py +++ b/tests/fixtures/config/expand2.py @@ -1,6 +1,6 @@ import os -from .. import _util as test_utils +from .. import utils as test_utils unexpanded_yaml = test_utils.read_config_file("config/expand2-unexpanded.yaml") expanded_yaml = test_utils.read_config_file("config/expand2-expanded.yaml").format( diff --git a/tests/fixtures/config/shell_command_before_session.py b/tests/fixtures/config/shell_command_before_session.py index 64181027ae..c4f260f7a0 100644 --- a/tests/fixtures/config/shell_command_before_session.py +++ b/tests/fixtures/config/shell_command_before_session.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils before = test_utils.read_config_file("config/shell_command_before_session.yaml") expected = test_utils.read_config_file( diff --git a/tests/fixtures/config_teamocil/layouts.py b/tests/fixtures/config_teamocil/layouts.py index 404c419277..c61373fd8a 100644 --- a/tests/fixtures/config_teamocil/layouts.py +++ b/tests/fixtures/config_teamocil/layouts.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils teamocil_yaml = test_utils.read_config_file("config_teamocil/layouts.yaml") diff --git a/tests/fixtures/config_teamocil/test1.py b/tests/fixtures/config_teamocil/test1.py index de3cccb981..ee329c0661 100644 --- a/tests/fixtures/config_teamocil/test1.py +++ b/tests/fixtures/config_teamocil/test1.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils teamocil_yaml = test_utils.read_config_file("config_teamocil/test1.yaml") teamocil_conf = { diff --git a/tests/fixtures/config_teamocil/test2.py b/tests/fixtures/config_teamocil/test2.py index 7519046982..dd68433b05 100644 --- a/tests/fixtures/config_teamocil/test2.py +++ b/tests/fixtures/config_teamocil/test2.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils teamocil_yaml = test_utils.read_config_file("config_teamocil/test2.yaml") teamocil_dict = { diff --git a/tests/fixtures/config_teamocil/test3.py b/tests/fixtures/config_teamocil/test3.py index cc550b8fee..436e9e4a73 100644 --- a/tests/fixtures/config_teamocil/test3.py +++ b/tests/fixtures/config_teamocil/test3.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils teamocil_yaml = test_utils.read_config_file("config_teamocil/test3.yaml") diff --git a/tests/fixtures/config_teamocil/test4.py b/tests/fixtures/config_teamocil/test4.py index ca59f958e0..293fb958fb 100644 --- a/tests/fixtures/config_teamocil/test4.py +++ b/tests/fixtures/config_teamocil/test4.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils teamocil_yaml = test_utils.read_config_file("config_teamocil/test4.yaml") diff --git a/tests/fixtures/config_tmuxinator/test1.py b/tests/fixtures/config_tmuxinator/test1.py index 6fa8260432..b149971743 100644 --- a/tests/fixtures/config_tmuxinator/test1.py +++ b/tests/fixtures/config_tmuxinator/test1.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test1.yaml") tmuxinator_dict = { diff --git a/tests/fixtures/config_tmuxinator/test2.py b/tests/fixtures/config_tmuxinator/test2.py index c1eb5c0f42..f90caa8cd9 100644 --- a/tests/fixtures/config_tmuxinator/test2.py +++ b/tests/fixtures/config_tmuxinator/test2.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test2.yaml") diff --git a/tests/fixtures/config_tmuxinator/test3.py b/tests/fixtures/config_tmuxinator/test3.py index 9551f2db6a..ce8a8b93f4 100644 --- a/tests/fixtures/config_tmuxinator/test3.py +++ b/tests/fixtures/config_tmuxinator/test3.py @@ -1,4 +1,4 @@ -from .. import _util as test_utils +from .. import utils as test_utils tmuxinator_yaml = test_utils.read_config_file("config_tmuxinator/test3.yaml") diff --git a/tests/fixtures/_util.py b/tests/fixtures/utils.py similarity index 100% rename from tests/fixtures/_util.py rename to tests/fixtures/utils.py diff --git a/tests/test_cli.py b/tests/test_cli.py index 1a59c3422c..09271db9e1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,7 +28,7 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder -from .fixtures import _util as test_utils +from .fixtures import utils as test_utils from .fixtures._util import FIXTURE_PATH diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 456cd44f6e..e496721c00 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -17,7 +17,7 @@ from tmuxp.workspacebuilder import WorkspaceBuilder from . import EXAMPLE_PATH, FIXTURES_PATH -from .fixtures import _util as test_utils +from .fixtures import utils as test_utils def test_split_windows(session): diff --git a/tests/test_workspacefreezer.py b/tests/test_workspacefreezer.py index 5ef8a34de7..659295ae84 100644 --- a/tests/test_workspacefreezer.py +++ b/tests/test_workspacefreezer.py @@ -6,7 +6,7 @@ from tmuxp import config from tmuxp.workspacebuilder import WorkspaceBuilder, freeze -from .fixtures import _util as test_utils +from .fixtures import utils as test_utils def test_freeze_config(session): From 745f6f199a37e3434121dea944b577d664860c23 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 14:15:50 -0500 Subject: [PATCH 1056/2998] refactor(tests): Move constants to tests.constants --- tests/__init__.py | 11 ----------- tests/constants.py | 5 +++++ tests/fixtures/utils.py | 2 +- tests/test_cli.py | 2 +- tests/test_config.py | 2 +- tests/test_util.py | 12 ++++++------ tests/test_workspacebuilder.py | 10 +++++----- 7 files changed, 19 insertions(+), 25 deletions(-) create mode 100644 tests/constants.py diff --git a/tests/__init__.py b/tests/__init__.py index 6233b23481..e69de29bb2 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,11 +0,0 @@ -"""Tests for tmuxp. - -tmuxp.tests -~~~~~~~~~~~ - -""" -import pathlib - -TESTS_PATH = pathlib.Path(__file__).parent -EXAMPLE_PATH = TESTS_PATH.parent / "examples" -FIXTURES_PATH = TESTS_PATH / "fixtures" diff --git a/tests/constants.py b/tests/constants.py new file mode 100644 index 0000000000..9fa14e00f0 --- /dev/null +++ b/tests/constants.py @@ -0,0 +1,5 @@ +import pathlib + +TESTS_PATH = pathlib.Path(__file__).parent +EXAMPLE_PATH = TESTS_PATH.parent / "examples" +FIXTURE_PATH = TESTS_PATH / "fixtures" diff --git a/tests/fixtures/utils.py b/tests/fixtures/utils.py index 90eb61661b..5d1ec63230 100644 --- a/tests/fixtures/utils.py +++ b/tests/fixtures/utils.py @@ -1,6 +1,6 @@ import pathlib -FIXTURE_PATH = pathlib.Path(__file__).parent +from ..constants import FIXTURE_PATH def read_config_file(_file): # return fixture data, relative to __file__ diff --git a/tests/test_cli.py b/tests/test_cli.py index 09271db9e1..db8b1f84fa 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -28,8 +28,8 @@ ) from tmuxp.workspacebuilder import WorkspaceBuilder +from .constants import FIXTURE_PATH from .fixtures import utils as test_utils -from .fixtures._util import FIXTURE_PATH def test_creates_config_dir_not_exists(tmp_path: pathlib.Path): diff --git a/tests/test_config.py b/tests/test_config.py index 1352d0034c..de776b35bf 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -10,7 +10,7 @@ from tmuxp import config, exc -from . import EXAMPLE_PATH +from .constants import EXAMPLE_PATH if typing.TYPE_CHECKING: from .fixtures import config as ConfigFixture diff --git a/tests/test_util.py b/tests/test_util.py index c5f5b53824..2dbe5c1904 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -5,11 +5,11 @@ from tmuxp.exc import BeforeLoadScriptError, BeforeLoadScriptNotExists from tmuxp.util import get_session, run_before_script -from . import FIXTURES_PATH +from .constants import FIXTURE_PATH def test_raise_BeforeLoadScriptNotExists_if_not_exists(): - script_file = FIXTURES_PATH / "script_noexists.sh" + script_file = FIXTURE_PATH / "script_noexists.sh" with pytest.raises(BeforeLoadScriptNotExists): run_before_script(script_file) @@ -19,14 +19,14 @@ def test_raise_BeforeLoadScriptNotExists_if_not_exists(): def test_raise_BeforeLoadScriptError_if_retcode(): - script_file = FIXTURES_PATH / "script_failed.sh" + script_file = FIXTURE_PATH / "script_failed.sh" with pytest.raises(BeforeLoadScriptError): run_before_script(script_file) def test_return_stdout_if_ok(capsys): - script_file = FIXTURES_PATH / "script_complete.sh" + script_file = FIXTURE_PATH / "script_complete.sh" run_before_script(script_file) out, err = capsys.readouterr() @@ -34,7 +34,7 @@ def test_return_stdout_if_ok(capsys): def test_beforeload_returncode(): - script_file = FIXTURES_PATH / "script_failed.sh" + script_file = FIXTURE_PATH / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) @@ -42,7 +42,7 @@ def test_beforeload_returncode(): def test_beforeload_returns_stderr_messages(): - script_file = FIXTURES_PATH / "script_failed.sh" + script_file = FIXTURE_PATH / "script_failed.sh" with pytest.raises(exc.BeforeLoadScriptError) as excinfo: run_before_script(script_file) diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index e496721c00..52cb3f6705 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -16,7 +16,7 @@ from tmuxp.cli import load_plugins from tmuxp.workspacebuilder import WorkspaceBuilder -from . import EXAMPLE_PATH, FIXTURES_PATH +from .constants import EXAMPLE_PATH, FIXTURE_PATH from .fixtures import utils as test_utils @@ -597,7 +597,7 @@ def test_before_load_throw_error_if_retcode_error(server): ) sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_fails.format( - script_failed=FIXTURES_PATH / "script_failed.sh", + script_failed=FIXTURE_PATH / "script_failed.sh", ) sconfig = sconfig.import_config(yaml).get() @@ -622,7 +622,7 @@ def test_before_load_throw_error_if_file_not_exists(server): ) sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_not_exists.format( - script_not_exists=FIXTURES_PATH / "script_not_exists.sh", + script_not_exists=FIXTURE_PATH / "script_not_exists.sh", ) sconfig = sconfig.import_config(yaml).get() sconfig = config.expand(sconfig) @@ -645,7 +645,7 @@ def test_before_load_true_if_test_passes(server): config_script_completes = test_utils.read_config_file( "workspacebuilder/config_script_completes.yaml" ) - script_complete_sh = FIXTURES_PATH / "script_complete.sh" + script_complete_sh = FIXTURE_PATH / "script_complete.sh" assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format( @@ -666,7 +666,7 @@ def test_before_load_true_if_test_passes_with_args(server): config_script_completes = test_utils.read_config_file( "workspacebuilder/config_script_completes.yaml" ) - script_complete_sh = FIXTURES_PATH / "script_complete.sh" + script_complete_sh = FIXTURE_PATH / "script_complete.sh" assert script_complete_sh.exists() sconfig = kaptan.Kaptan(handler="yaml") yaml = config_script_completes.format(script_complete=script_complete_sh) From 385da9f1e99c2b364f2c215e6eb88a89be86af28 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 18:32:34 -0500 Subject: [PATCH 1057/2998] refactor(cli): Move to directory --- tmuxp/{cli.py => cli/__init__.py} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename tmuxp/{cli.py => cli/__init__.py} (99%) diff --git a/tmuxp/cli.py b/tmuxp/cli/__init__.py similarity index 99% rename from tmuxp/cli.py rename to tmuxp/cli/__init__.py index 5443e933ba..a7239fe32a 100644 --- a/tmuxp/cli.py +++ b/tmuxp/cli/__init__.py @@ -26,10 +26,10 @@ from libtmux.exc import TmuxCommandNotFound from libtmux.server import Server -from . import __file__ as tmuxp_path, config, exc, log, util -from .__about__ import __version__ -from ._compat import PY3, PYMINOR -from .workspacebuilder import WorkspaceBuilder, freeze +from .. import __file__ as tmuxp_path, config, exc, log, util +from ..__about__ import __version__ +from .._compat import PY3, PYMINOR +from ..workspacebuilder import WorkspaceBuilder, freeze logger = logging.getLogger(__name__) @@ -889,7 +889,7 @@ def command_shell( tmuxp_breakpoint() return else: - from .shell import launch + from ..shell import launch launch( shell=shell, From 2e19bdeeb2521bf9af79168b2f346987890f34f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 20:12:26 -0500 Subject: [PATCH 1058/2998] refactor!: setup_logger to log --- tmuxp/cli/__init__.py | 26 +------------------------- tmuxp/log.py | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tmuxp/cli/__init__.py b/tmuxp/cli/__init__.py index a7239fe32a..c46ece1be2 100644 --- a/tmuxp/cli/__init__.py +++ b/tmuxp/cli/__init__.py @@ -768,31 +768,7 @@ def cli(log_level): except exc.TmuxpException as e: tmuxp_echo(e, err=True) sys.exit() - setup_logger(logger=logger, level=log_level.upper()) - - -def setup_logger(logger=None, level="INFO"): - """ - Setup logging for CLI use. - - Tries to do some conditionals to prevent handlers from being added twice. - Just to be safe. - - Parameters - ---------- - logger : :py:class:`Logger` - logger instance for tmuxp - """ - if not logger: # if no logger exists, make one - logger = logging.getLogger() - - if not logger.handlers: # setup logger handlers - # channel = logging.StreamHandler() - # channel.setFormatter(log.DebugLogFormatter()) - # channel.setFormatter(log.LogFormatter()) - - logger.setLevel(level) - # logger.addHandler(channel) + log.setup_logger(logger=logger, level=log_level.upper()) def startup(config_dir): diff --git a/tmuxp/log.py b/tmuxp/log.py index 37f00503b7..312320f9b8 100644 --- a/tmuxp/log.py +++ b/tmuxp/log.py @@ -28,6 +28,30 @@ } +def setup_logger(logger=None, level="INFO"): + """ + Setup logging for CLI use. + + Tries to do some conditionals to prevent handlers from being added twice. + Just to be safe. + + Parameters + ---------- + logger : :py:class:`Logger` + logger instance for tmuxp + """ + if not logger: # if no logger exists, make one + logger = logging.getLogger() + + if not logger.handlers: # setup logger handlers + # channel = logging.StreamHandler() + # channel.setFormatter(log.DebugLogFormatter()) + # channel.setFormatter(log.LogFormatter()) + + logger.setLevel(level) + # logger.addHandler(channel) + + def set_style( message, stylized, style_before=None, style_after=None, prefix="", suffix="" ): From 8fc6c01fe9d47cc85481d493c28173f54c44bd04 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 19 Mar 2022 21:12:47 -0500 Subject: [PATCH 1059/2998] refactor!(cli): Split commands --- tests/test_cli.py | 46 +- tests/test_workspacebuilder.py | 2 +- tmuxp/cli/__init__.py | 1276 +------------------------------- tmuxp/cli/constants.py | 1 + tmuxp/cli/convert.py | 44 ++ tmuxp/cli/debug_info.py | 77 ++ tmuxp/cli/edit.py | 15 + tmuxp/cli/freeze.py | 136 ++++ tmuxp/cli/import_config.py | 170 +++++ tmuxp/cli/load.py | 544 ++++++++++++++ tmuxp/cli/ls.py | 17 + tmuxp/cli/shell.py | 103 +++ tmuxp/cli/utils.py | 259 +++++++ 13 files changed, 1416 insertions(+), 1274 deletions(-) create mode 100644 tmuxp/cli/constants.py create mode 100644 tmuxp/cli/convert.py create mode 100644 tmuxp/cli/debug_info.py create mode 100644 tmuxp/cli/edit.py create mode 100644 tmuxp/cli/freeze.py create mode 100644 tmuxp/cli/import_config.py create mode 100644 tmuxp/cli/load.py create mode 100644 tmuxp/cli/ls.py create mode 100644 tmuxp/cli/shell.py create mode 100644 tmuxp/cli/utils.py diff --git a/tests/test_cli.py b/tests/test_cli.py index db8b1f84fa..2be26d0e23 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -14,16 +14,22 @@ from libtmux.common import has_lt_version from libtmux.exc import LibTmuxException from tmuxp import cli, config, exc -from tmuxp.cli import ( +from tmuxp.cli.debug_info import command_debug_info +from tmuxp.cli.import_config import get_teamocil_dir, get_tmuxinator_dir +from tmuxp.cli.load import ( _load_append_windows_to_current_session, _load_attached, _reattach, - command_debug_info, - command_ls, - get_config_dir, - is_pure_name, load_plugins, load_workspace, +) +from tmuxp.cli.ls import command_ls +from tmuxp.cli.utils import ( + ConfigPath, + _validate_choices, + get_abs_path, + get_config_dir, + is_pure_name, scan_config, ) from tmuxp.workspacebuilder import WorkspaceBuilder @@ -267,7 +273,7 @@ def test_scan_config_arg( runner = CliRunner() @click.command() - @click.argument("config", type=cli.ConfigPath(exists=True), nargs=-1) + @click.argument("config", type=ConfigPath(exists=True), nargs=-1) def config_cmd(config): click.echo(config) @@ -470,15 +476,15 @@ def test_load_log_file(cli_args, tmp_path, monkeypatch): monkeypatch.setenv("HOME", str(tmp_path)) monkeypatch.chdir(tmp_path) - print(f"tmp_path: {tmp_path}") runner = CliRunner() # If autoconfirm (-y) no need to prompt y input_args = "y\ny\n" if "-y" not in cli_args else "" - runner.invoke(cli.cli, cli_args, input=input_args) + result = runner.invoke(cli.cli, cli_args, input=input_args) log_file_path = tmp_path / "log.txt" assert "Loading" in log_file_path.open().read() + assert result is not None @pytest.mark.parametrize("cli_cmd", ["shell", ("shell", "--pdb")]) @@ -1002,30 +1008,30 @@ def test_freeze_overwrite(server, cli_args, inputs, tmp_path, monkeypatch): def test_get_abs_path(tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch): expect = str(tmp_path) monkeypatch.chdir(tmp_path) - cli.get_abs_path("../") == os.path.dirname(expect) - cli.get_abs_path(".") == expect - cli.get_abs_path("./") == expect - cli.get_abs_path(expect) == expect + get_abs_path("../") == os.path.dirname(expect) + get_abs_path(".") == expect + get_abs_path("./") == expect + get_abs_path(expect) == expect def test_get_tmuxinator_dir(monkeypatch): - assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") + assert get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") monkeypatch.setenv("HOME", "/moo") - assert cli.get_tmuxinator_dir() == "/moo/.tmuxinator/" - assert cli.get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") + assert get_tmuxinator_dir() == "/moo/.tmuxinator/" + assert get_tmuxinator_dir() == os.path.expanduser("~/.tmuxinator/") def test_get_teamocil_dir(monkeypatch: pytest.MonkeyPatch): - assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") + assert get_teamocil_dir() == os.path.expanduser("~/.teamocil/") monkeypatch.setenv("HOME", "/moo") - assert cli.get_teamocil_dir() == "/moo/.teamocil/" - assert cli.get_teamocil_dir() == os.path.expanduser("~/.teamocil/") + assert get_teamocil_dir() == "/moo/.teamocil/" + assert get_teamocil_dir() == os.path.expanduser("~/.teamocil/") def test_validate_choices(): - validate = cli._validate_choices(["choice1", "choice2"]) + validate = _validate_choices(["choice1", "choice2"]) assert validate("choice1") assert validate("choice2") @@ -1051,7 +1057,7 @@ def test_pass_config_dir_ClickPath( @click.command() @click.argument( "config", - type=cli.ConfigPath(exists=True, config_dir=(str(configdir))), + type=ConfigPath(exists=True, config_dir=(str(configdir))), nargs=-1, ) def config_cmd(config): diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 52cb3f6705..2ab04a9363 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -13,7 +13,7 @@ from libtmux.common import has_gte_version from libtmux.test import retry, temp_session from tmuxp import config, exc -from tmuxp.cli import load_plugins +from tmuxp.cli.load import load_plugins from tmuxp.workspacebuilder import WorkspaceBuilder from .constants import EXAMPLE_PATH, FIXTURE_PATH diff --git a/tmuxp/cli/__init__.py b/tmuxp/cli/__init__.py index c46ece1be2..a60d387151 100644 --- a/tmuxp/cli/__init__.py +++ b/tmuxp/cli/__init__.py @@ -1,751 +1,33 @@ -"""Command line tool for managing tmux workspaces and tmuxp configurations. +"""CLI utilities for tmuxp. tmuxp.cli ~~~~~~~~~ """ -import importlib import logging import os -import platform import sys -from subprocess import call import click -import kaptan -from click.exceptions import FileError -from libtmux import __version__ as libtmux_version -from libtmux.common import ( - get_version, - has_gte_version, - has_minimum_version, - tmux_cmd, - which, -) +from libtmux.common import has_minimum_version from libtmux.exc import TmuxCommandNotFound -from libtmux.server import Server +from tmuxp.cli.ls import command_ls -from .. import __file__ as tmuxp_path, config, exc, log, util +from .. import exc from ..__about__ import __version__ -from .._compat import PY3, PYMINOR -from ..workspacebuilder import WorkspaceBuilder, freeze +from ..log import setup_logger +from .convert import command_convert +from .debug_info import command_debug_info +from .edit import command_edit_config +from .freeze import command_freeze +from .import_config import import_config_cmd +from .load import command_load +from .shell import command_shell +from .utils import tmuxp_echo logger = logging.getLogger(__name__) -VALID_CONFIG_DIR_FILE_EXTENSIONS = [".yaml", ".yml", ".json"] - - -def tmuxp_echo(message=None, log_level="INFO", style_log=False, **click_kwargs): - """ - Combines logging.log and click.echo - """ - if style_log: - logger.log(log.LOG_LEVELS[log_level], message) - else: - logger.log(log.LOG_LEVELS[log_level], click.unstyle(message)) - - click.echo(message, **click_kwargs) - - -def get_config_dir(): - """ - Return tmuxp configuration directory. - - ``TMUXP_CONFIGDIR`` environmental variable has precedence if set. We also - evaluate XDG default directory from XDG_CONFIG_HOME environmental variable - if set or its default. Then the old default ~/.tmuxp is returned for - compatibility. - - Returns - ------- - str : - absolute path to tmuxp config directory - """ - - paths = [] - if "TMUXP_CONFIGDIR" in os.environ: - paths.append(os.environ["TMUXP_CONFIGDIR"]) - if "XDG_CONFIG_HOME" in os.environ: - paths.append(os.path.join(os.environ["XDG_CONFIG_HOME"], "tmuxp")) - else: - paths.append("~/.config/tmuxp/") - paths.append("~/.tmuxp") - - for path in paths: - path = os.path.expanduser(path) - if os.path.isdir(path): - return path - # Return last path as default if none of the previous ones matched - return path - - -def get_tmuxinator_dir(): - """ - Return tmuxinator configuration directory. - - Checks for ``TMUXINATOR_CONFIG`` environmental variable. - - Returns - ------- - str : - absolute path to tmuxinator config directory - - See Also - -------- - :meth:`tmuxp.config.import_tmuxinator` - """ - if "TMUXINATOR_CONFIG" in os.environ: - return os.path.expanduser(os.environ["TMUXINATOR_CONFIG"]) - - return os.path.expanduser("~/.tmuxinator/") - - -def get_teamocil_dir(): - """ - Return teamocil configuration directory. - - Returns - ------- - str : - absolute path to teamocil config directory - - See Also - -------- - :meth:`tmuxp.config.import_teamocil` - """ - return os.path.expanduser("~/.teamocil/") - - -def _validate_choices(options): - """ - Callback wrapper for validating click.prompt input. - - Parameters - ---------- - options : list - List of allowed choices - - Returns - ------- - :func:`callable` - callback function for value_proc in :func:`click.prompt`. - - Raises - ------ - :class:`click.BadParameter` - """ - - def func(value): - if value not in options: - raise click.BadParameter( - "Possible choices are: {}.".format(", ".join(options)) - ) - return value - - return func - - -def set_layout_hook(session, hook_name): - """Set layout hooks to normalize layout. - - References: - - - tmuxp issue: https://github.com/tmux-python/tmuxp/issues/309 - - tmux issue: https://github.com/tmux/tmux/issues/1106 - - tmux 2.6+ requires that the window be viewed with the client before - select-layout adjustments can take effect. - - To handle this, this function creates temporary hook for this session to - iterate through all windows and select the layout. - - In order for layout changes to take effect, a client must at the very - least be attached to the window (not just the session). - - hook_name is provided to allow this to set to multiple scenarios, such - as 'client-attached' (which the user attaches the session). You may - also want 'after-switch-client' for cases where the user loads tmuxp - sessions inside tmux since tmuxp offers to switch for them. - - Also, the hooks are set immediately unbind after they're invoked via -u. - - Parameters - ---------- - session : :class:`libtmux.session.Session` - session to bind hook to - hook_name : str - hook name to bind to, e.g. 'client-attached' - """ - cmd = ["set-hook", "-t", session.id, hook_name] - hook_cmd = [] - attached_window = session.attached_window - for window in session.windows: - # unfortunately, select-layout won't work unless - # we've literally selected the window at least once - # with the client - hook_cmd.append(f"selectw -t {window.id}") - # edit: removed -t, or else it won't respect main-pane-w/h - hook_cmd.append("selectl") - hook_cmd.append("selectw -p") - - # unset the hook immediately after executing - hook_cmd.append( - "set-hook -u -t {target_session} {hook_name}".format( - target_session=session.id, hook_name=hook_name - ) - ) - hook_cmd.append(f"selectw -t {attached_window.id}") - - # join the hook's commands with semicolons - hook_cmd = "{}".format("; ".join(hook_cmd)) - - # append the hook command - cmd.append(hook_cmd) - - # create the hook - session.cmd(*cmd) - - -def is_pure_name(path): - """ - Return True if path is a name and not a file path. - - Parameters - ---------- - path : str - Path (can be absolute, relative, etc.) - - Returns - ------- - bool - True if path is a name of config in config dir, not file path. - """ - return ( - not os.path.isabs(path) - and len(os.path.dirname(path)) == 0 - and not os.path.splitext(path)[1] - and path != "." - and path != "" - ) - - -class ConfigPath(click.Path): - def __init__(self, config_dir=None, *args, **kwargs): - super().__init__(*args, **kwargs) - self.config_dir = config_dir - - def convert(self, value, param, ctx): - config_dir = self.config_dir - if callable(config_dir): - config_dir = config_dir() - - value = scan_config(value, config_dir=config_dir) - return super().convert(value, param, ctx) - - -def scan_config_argument(ctx, param, value, config_dir=None): - """Validate / translate config name/path values for click config arg. - - Wrapper on top of :func:`cli.scan_config`.""" - if callable(config_dir): - config_dir = config_dir() - - if not config: - tmuxp_echo("Enter at least one CONFIG") - tmuxp_echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if isinstance(value, str): - value = scan_config(value, config_dir=config_dir) - - elif isinstance(value, tuple): - value = tuple(scan_config(v, config_dir=config_dir) for v in value) - - return value - - -def get_abs_path(config): - path = os.path - join, isabs = path.join, path.isabs - dirname, normpath = path.dirname, path.normpath - cwd = os.getcwd() - - config = os.path.expanduser(config) - if not isabs(config) or len(dirname(config)) > 1: - config = normpath(join(cwd, config)) - - return config - - -def _resolve_path_no_overwrite(config): - path = get_abs_path(config) - if os.path.exists(path): - raise click.exceptions.UsageError("%s exists. Pick a new filename." % path) - return path - - -def scan_config(config, config_dir=None): - """ - Return the real config path or raise an exception. - - If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If - one or more found, it will warn and pick the first. - - If config is ".", "./" or None, it will scan current directory. - - If config is has no path and only a filename, e.g. "myconfig.yaml" it will - search config dir. - - If config has no path and only a name with no extension, e.g. "myconfig", - it will scan for file name with yaml, yml and json. If multiple exist, it - will warn and pick the first. - - Parameters - ---------- - config : str - config file, valid examples: - - - a file name, myconfig.yaml - - relative path, ../config.yaml or ../project - - a period, . - - Raises - ------ - :class:`click.exceptions.FileError` - """ - if not config_dir: - config_dir = get_config_dir() - path = os.path - exists, join, isabs = path.exists, path.join, path.isabs - dirname, normpath, splitext = path.dirname, path.normpath, path.splitext - cwd = os.getcwd() - is_name = False - file_error = None - - config = os.path.expanduser(config) - # if purename, resolve to confg dir - if is_pure_name(config): - is_name = True - elif ( - not isabs(config) - or len(dirname(config)) > 1 - or config == "." - or config == "" - or config == "./" - ): # if relative, fill in full path - config = normpath(join(cwd, config)) - - # no extension, scan - if path.isdir(config) or not splitext(config)[1]: - if is_name: - candidates = [ - x - for x in [ - f"{join(config_dir, config)}{ext}" - for ext in VALID_CONFIG_DIR_FILE_EXTENSIONS - ] - if exists(x) - ] - if not len(candidates): - file_error = ( - "config not found in config dir (yaml/yml/json) %s " - "for name" % (config_dir) - ) - else: - candidates = [ - x - for x in [ - join(config, ext) - for ext in [".tmuxp.yaml", ".tmuxp.yml", ".tmuxp.json"] - ] - if exists(x) - ] - - if len(candidates) > 1: - tmuxp_echo( - click.style( - "Multiple .tmuxp.{yml,yaml,json} configs in %s" - % dirname(config), - fg="red", - ) - ) - tmuxp_echo( - click.wrap_text( - "This is undefined behavior, use only one. " - "Use file names e.g. myproject.json, coolproject.yaml. " - "You can load them by filename." - ) - ) - elif not len(candidates): - file_error = "No tmuxp files found in directory" - if len(candidates): - config = candidates[0] - elif not exists(config): - file_error = "file not found" - - if file_error: - raise FileError(file_error, config) - - return config - - -def load_plugins(sconf): - """ - Load and return plugins in config - """ - plugins = [] - if "plugins" in sconf: - for plugin in sconf["plugins"]: - try: - module_name = plugin.split(".") - module_name = ".".join(module_name[:-1]) - plugin_name = plugin.split(".")[-1] - plugin = getattr(importlib.import_module(module_name), plugin_name) - plugins.append(plugin()) - except exc.TmuxpPluginException as error: - if not click.confirm( - "%sSkip loading %s?" - % (click.style(str(error), fg="yellow"), plugin_name), - default=True, - ): - click.echo( - click.style("[Not Skipping] ", fg="yellow") - + "Plugin versions constraint not met. Exiting..." - ) - sys.exit(1) - except Exception as error: - click.echo( - click.style("[Plugin Error] ", fg="red") - + f"Couldn't load {plugin}\n" - + click.style(f"{error}", fg="yellow") - ) - sys.exit(1) - - return plugins - - -def _reattach(builder): - """ - Reattach session (depending on env being inside tmux already or not) - - Parameters - ---------- - builder: :class:`workspacebuilder.WorkspaceBuilder` - - Notes - ----- - If ``TMUX`` environmental variable exists in the environment this script is - running, that means we're in a tmux client. So ``tmux switch-client`` will - load the session. - - If not, ``tmux attach-session`` loads the client to the target session. - """ - for plugin in builder.plugins: - plugin.reattach(builder.session) - proc = builder.session.cmd("display-message", "-p", "'#S'") - for line in proc.stdout: - print(line) - - if "TMUX" in os.environ: - builder.session.switch_client() - - else: - builder.session.attach_session() - - -def _load_attached(builder, detached): - """ - Load config in new session - - Parameters - ---------- - builder: :class:`workspacebuilder.WorkspaceBuilder` - detached : bool - """ - builder.build() - - if "TMUX" in os.environ: # tmuxp ran from inside tmux - # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' - tmux_env = os.environ.pop("TMUX") - - if has_gte_version("2.6"): - set_layout_hook(builder.session, "client-session-changed") - - builder.session.switch_client() # switch client to new session - - os.environ["TMUX"] = tmux_env # set TMUX back again - else: - if has_gte_version("2.6"): - # if attaching for first time - set_layout_hook(builder.session, "client-attached") - - # for cases where user switches client for first time - set_layout_hook(builder.session, "client-session-changed") - - if not detached: - builder.session.attach_session() - - -def _load_detached(builder): - """ - Load config in new session but don't attach - - Parameters - ---------- - builder: :class:`workspacebuilder.WorkspaceBuilder` - """ - builder.build() - - if has_gte_version("2.6"): # prepare for both cases - set_layout_hook(builder.session, "client-attached") - set_layout_hook(builder.session, "client-session-changed") - - print("Session created in detached state.") - - -def _load_append_windows_to_current_session(builder): - """ - Load config as new windows in current session - - Parameters - ---------- - builder: :class:`workspacebuilder.WorkspaceBuilder` - """ - current_attached_session = builder.find_current_attached_session() - builder.build(current_attached_session, append=True) - if has_gte_version("2.6"): # prepare for both cases - set_layout_hook(builder.session, "client-attached") - set_layout_hook(builder.session, "client-session-changed") - - -def _setup_plugins(builder): - """ - Runs after before_script - - Parameters - ---------- - builder: :class:`workspacebuilder.WorkspaceBuilder` - """ - for plugin in builder.plugins: - plugin.before_script(builder.session) - - return builder.session - - -def load_workspace( - config_file, - socket_name=None, - socket_path=None, - tmux_config_file=None, - new_session_name=None, - colors=None, - detached=False, - answer_yes=False, - append=False, -): - """ - Load a tmux "workspace" session via tmuxp file. - - Parameters - ---------- - config_file : str - absolute path to config file - socket_name : str, optional - ``tmux -L `` - socket_path: str, optional - ``tmux -S `` - new_session_name: str, options - ``tmux new -s `` - colors : str, optional - '-2' - Force tmux to support 256 colors - detached : bool - Force detached state. default False. - answer_yes : bool - Assume yes when given prompt to attach in new session. - Default False. - append : bool - Assume current when given prompt to append windows in same session. - Default False. - - Notes - ----- - - tmuxp will check and load a configuration file. The file will use kaptan - to load a JSON/YAML into a :py:obj:`dict`. Then :func:`config.expand` and - :func:`config.trickle` will be used to expand any shorthands, template - variables, or file paths relative to where the config/script is executed - from. - - :func:`config.expand` accepts the directory of the config file, so the - user's configuration can resolve absolute paths relative to where the - config file is. In otherwords, if a config file at */var/moo/hi.yaml* - has *./* in its configs, we want to be sure any file path with *./* is - relative to */var/moo*, not the user's PWD. - - A :class:`libtmux.Server` object is created. No tmux server is started yet, - just the object. - - The prepared configuration and the server object is passed into an instance - of :class:`~tmuxp.workspacebuilder.WorkspaceBuilder`. - - A sanity check against :meth:`libtmux.common.which` is ran. It will raise - an exception if tmux isn't found. - - If a tmux session under the same name as ``session_name`` in the tmuxp - configuration exists, tmuxp offers to attach the session. Currently, tmuxp - does not allow appending a workspace / incremental building on top of a - current session (pull requests are welcome!). - - :meth:`~tmuxp.workspacebuilder.WorkspaceBuilder.build` will build the session in - the background via using tmux's detached state (``-d``). - - After the session (workspace) is built, unless the user decided to load - the session in the background via ``tmuxp -d`` (which is in the spirit - of tmux's ``-d``), we need to prompt the user to attach the session. - - If the user is already inside a tmux client, which we detect via the - ``TMUX`` environment variable bring present, we will prompt the user to - switch their current client to it. - - If they're outside of tmux client - in a plain-old PTY - we will - automatically ``attach``. - - If an exception is raised during the building of the workspace, tmuxp will - prompt to cleanup (``$ tmux kill-session``) the session on the user's - behalf. An exception raised during this process means it's not easy to - predict how broken the session is. - - .. versionchanged:: tmux 2.6+ - - In tmux 2.6, the way layout and proportion's work when interfacing - with tmux in a detached state (outside of a client) changed. Since - tmuxp builds workspaces in a detached state, the WorkspaceBuilder isn't - able to rely on functionality requiring awarness of session geometry, - e.g. ``set-layout``. - - Thankfully, tmux is able to defer commands to run after the user - performs certain actions, such as loading a client via - ``attach-session`` or ``switch-client``. - - Upon client switch, ``client-session-changed`` is triggered [1]_. - - References - ---------- - .. [1] cmd-switch-client.c hook. GitHub repo for tmux. - - https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132. - Accessed April 8th, 2018. - """ - # get the canonical path, eliminating any symlinks - config_file = os.path.realpath(config_file) - - tmuxp_echo( - click.style("[Loading] ", fg="green") - + click.style(config_file, fg="blue", bold=True) - ) - - # kaptan allows us to open a yaml or json file as a dict - sconfig = kaptan.Kaptan() - sconfig = sconfig.import_config(config_file).get() - # shapes configurations relative to config / profile file location - sconfig = config.expand(sconfig, os.path.dirname(config_file)) - # Overwrite session name - if new_session_name: - sconfig["session_name"] = new_session_name - # propagate config inheritance (e.g. session -> window, window -> pane) - sconfig = config.trickle(sconfig) - - t = Server( # create tmux server object - socket_name=socket_name, - socket_path=socket_path, - config_file=tmux_config_file, - colors=colors, - ) - - which("tmux") # raise exception if tmux not found - - try: # load WorkspaceBuilder object for tmuxp config / tmux server - builder = WorkspaceBuilder( - sconf=sconfig, plugins=load_plugins(sconfig), server=t - ) - except exc.EmptyConfigException: - tmuxp_echo("%s is empty or parsed no config data" % config_file, err=True) - return - - session_name = sconfig["session_name"] - - # if the session already exists, prompt the user to attach - if builder.session_exists(session_name) and not append: - if not detached and ( - answer_yes - or click.confirm( - "%s is already running. Attach?" - % click.style(session_name, fg="green"), - default=True, - ) - ): - _reattach(builder) - return - - try: - if detached: - _load_detached(builder) - return _setup_plugins(builder) - - if append: - if "TMUX" in os.environ: # tmuxp ran from inside tmux - _load_append_windows_to_current_session(builder) - else: - _load_attached(builder, detached) - - return _setup_plugins(builder) - - # append and answer_yes have no meaning if specified together - elif answer_yes: - _load_attached(builder, detached) - return _setup_plugins(builder) - - if "TMUX" in os.environ: # tmuxp ran from inside tmux - msg = ( - "Already inside TMUX, switch to session? yes/no\n" - "Or (a)ppend windows in the current active session?\n[y/n/a]" - ) - options = ["y", "n", "a"] - choice = click.prompt(msg, value_proc=_validate_choices(options)) - - if choice == "y": - _load_attached(builder, detached) - elif choice == "a": - _load_append_windows_to_current_session(builder) - else: - _load_detached(builder) - else: - _load_attached(builder, detached) - - except exc.TmuxpException as e: - import traceback - - tmuxp_echo(traceback.format_exc(), err=True) - tmuxp_echo(e, err=True) - - choice = click.prompt( - "Error loading workspace. (k)ill, (a)ttach, (d)etach?", - value_proc=_validate_choices(["k", "a", "d"]), - default="k", - ) - - if choice == "k": - builder.session.kill_session() - tmuxp_echo("Session killed.") - elif choice == "a": - _reattach(builder) - else: - sys.exit() - - return _setup_plugins(builder) - @click.group(context_settings={"obj": {}, "help_option_names": ["-h", "--help"]}) @click.version_option(__version__, "-V", "--version", message="%(prog)s %(version)s") @@ -768,7 +50,7 @@ def cli(log_level): except exc.TmuxpException as e: tmuxp_echo(e, err=True) sys.exit() - log.setup_logger(logger=logger, level=log_level.upper()) + setup_logger(logger=logger, level=log_level.upper()) def startup(config_dir): @@ -784,524 +66,12 @@ def startup(config_dir): os.makedirs(config_dir) -@cli.command(name="shell") -@click.argument("session_name", nargs=1, required=False) -@click.argument("window_name", nargs=1, required=False) -@click.option("-S", "socket_path", help="pass-through for tmux -S") -@click.option("-L", "socket_name", help="pass-through for tmux -L") -@click.option( - "-c", - "command", - help="Instead of opening shell, execute python code in libtmux and exit", -) -@click.option( - "--best", - "shell", - flag_value="best", - help="Use best shell available in site packages", - default=True, -) -@click.option("--pdb", "shell", flag_value="pdb", help="Use plain pdb") -@click.option("--code", "shell", flag_value="code", help="Use stdlib's code.interact()") -@click.option( - "--ptipython", "shell", flag_value="ptipython", help="Use ptpython + ipython" -) -@click.option("--ptpython", "shell", flag_value="ptpython", help="Use ptpython") -@click.option("--ipython", "shell", flag_value="ipython", help="Use ipython") -@click.option("--bpython", "shell", flag_value="bpython", help="Use bpython") -@click.option( - "--use-pythonrc/--no-startup", - "use_pythonrc", - help="Load PYTHONSTARTUP env var and ~/.pythonrc.py script in --code", - default=False, -) -@click.option( - "--use-vi-mode/--no-vi-mode", - "use_vi_mode", - help="Use vi-mode in ptpython/ptipython", - default=False, -) -def command_shell( - session_name, - window_name, - socket_name, - socket_path, - command, - shell, - use_pythonrc, - use_vi_mode, -): - """Launch python shell for tmux server, session, window and pane. - - Priority given to loaded session/wndow/pane objects: - - - session_name and window_name arguments - - current shell: envvar ``TMUX_PANE`` for determing window and session - - :attr:`libtmux.Server.attached_sessions`, :attr:`libtmux.Session.attached_window`, - :attr:`libtmux.Window.attached_pane` - """ - server = Server(socket_name=socket_name, socket_path=socket_path) - - util.raise_if_tmux_not_running(server=server) - - current_pane = util.get_current_pane(server=server) - - session = util.get_session( - server=server, session_name=session_name, current_pane=current_pane - ) - - window = util.get_window( - session=session, window_name=window_name, current_pane=current_pane - ) - - pane = util.get_pane(window=window, current_pane=current_pane) # NOQA: F841 - - if command is not None: - exec(command) - else: - if shell == "pdb" or (os.getenv("PYTHONBREAKPOINT") and PY3 and PYMINOR >= 7): - from ._compat import breakpoint as tmuxp_breakpoint - - tmuxp_breakpoint() - return - else: - from ..shell import launch - - launch( - shell=shell, - use_pythonrc=use_pythonrc, # shell: code - use_vi_mode=use_vi_mode, # shell: ptpython, ptipython - # tmux environment / libtmux variables - server=server, - session=session, - window=window, - pane=pane, - ) - - -@cli.command(name="freeze") -@click.argument("session_name", nargs=1, required=False) -@click.option("-S", "socket_path", help="pass-through for tmux -S") -@click.option("-L", "socket_name", help="pass-through for tmux -L") -@click.option( - "-f", - "--config-format", - type=click.Choice(["yaml", "json"]), - help="format to save in", -) -@click.option("-o", "--save-to", type=click.Path(exists=False), help="file to save to") -@click.option( - "-y", - "--yes", - type=bool, - is_flag=True, - default=False, - help="Don't prompt for confirmation", -) -@click.option( - "-q", - "--quiet", - type=bool, - is_flag=True, - default=False, - help="Don't prompt for confirmation", -) -@click.option("--force", "force", help="overwrite the config file", is_flag=True) -def command_freeze( - session_name, socket_name, config_format, save_to, socket_path, yes, quiet, force -): - """Snapshot a session into a config. - - If SESSION_NAME is provided, snapshot that session. Otherwise, use the - current session.""" - - t = Server(socket_name=socket_name, socket_path=socket_path) - - try: - if session_name: - session = t.find_where({"session_name": session_name}) - else: - session = util.get_session(t) - - if not session: - raise exc.TmuxpException("Session not found.") - except exc.TmuxpException as e: - print(e) - return - - sconf = freeze(session) - configparser = kaptan.Kaptan() - newconfig = config.inline(sconf) - configparser.import_config(newconfig) - - if not quiet: - print( - "---------------------------------------------------------------" - "\n" - "Freeze does its best to snapshot live tmux sessions.\n" - ) - if not ( - yes - or click.confirm( - "The new config *WILL* require adjusting afterwards. Save config?" - ) - ): - if not quiet: - print( - "tmuxp has examples in JSON and YAML format at " - "\n" - "View tmuxp docs at ." - ) - sys.exit() - - dest = save_to - while not dest: - save_to = os.path.abspath( - os.path.join( - get_config_dir(), - "{}.{}".format(sconf.get("session_name"), config_format or "yaml"), - ) - ) - dest_prompt = click.prompt( - "Save to: %s" % save_to, value_proc=get_abs_path, default=save_to - ) - if not force and os.path.exists(dest_prompt): - print("%s exists. Pick a new filename." % dest_prompt) - continue - - dest = dest_prompt - dest = os.path.abspath(os.path.relpath(os.path.expanduser(dest))) - - if config_format is None: - valid_config_formats = ["json", "yaml"] - _, config_format = os.path.splitext(dest) - config_format = config_format[1:].lower() - if config_format not in valid_config_formats: - config_format = click.prompt( - "Couldn't ascertain one of [%s] from file name. Convert to" - % ", ".join(valid_config_formats), - value_proc=_validate_choices(["yaml", "json"]), - default="yaml", - ) - - if config_format == "yaml": - newconfig = configparser.export( - "yaml", indent=2, default_flow_style=False, safe=True - ) - elif config_format == "json": - newconfig = configparser.export("json", indent=2) - - if yes or click.confirm("Save to %s?" % dest): - destdir = os.path.dirname(dest) - if not os.path.isdir(destdir): - os.makedirs(destdir) - buf = open(dest, "w") - buf.write(newconfig) - buf.close() - - if not quiet: - print("Saved to %s." % dest) - - -@cli.command(name="load", short_help="Load tmuxp workspaces.") -@click.pass_context -@click.argument("config", type=ConfigPath(exists=True), nargs=-1) -@click.option("-S", "socket_path", help="pass-through for tmux -S") -@click.option("-L", "socket_name", help="pass-through for tmux -L") -@click.option("-f", "tmux_config_file", help="pass-through for tmux -f") -@click.option("-s", "new_session_name", help="start new session with new session name") -@click.option("--yes", "-y", "answer_yes", help="yes", is_flag=True) -@click.option( - "-d", "detached", help="Load the session without attaching it", is_flag=True -) -@click.option( - "-a", - "append", - help="Load configuration, appending windows to the current session", - is_flag=True, -) -@click.option( - "colors", - "-2", - flag_value=256, - default=True, - help="Force tmux to assume the terminal supports 256 colours.", -) -@click.option( - "colors", - "-8", - flag_value=88, - help="Like -2, but indicates that the terminal supports 88 colours.", -) -@click.option("--log-file", help="File to log errors/output to") -def command_load( - ctx, - config, - socket_name, - socket_path, - tmux_config_file, - new_session_name, - answer_yes, - detached, - append, - colors, - log_file, -): - """Load a tmux workspace from each CONFIG. - - CONFIG is a specifier for a configuration file. - - If CONFIG is a path to a directory, tmuxp will search it for - ".tmuxp.{yaml,yml,json}". - - If CONFIG is has no directory component and only a filename, e.g. - "myconfig.yaml", tmuxp will search the users's config directory for that - file. - - If CONFIG has no directory component, and only a name with no extension, - e.g. "myconfig", tmuxp will search the users's config directory for any - file with the extension ".yaml", ".yml", or ".json" that matches that name. - - If multiple configuration files that match a given CONFIG are found, tmuxp - will warn and pick the first one found. - - If multiple CONFIGs are provided, workspaces will be created for all of - them. The last one provided will be attached. The others will be created in - detached mode. - """ - util.oh_my_zsh_auto_title() - if log_file: - logfile_handler = logging.FileHandler(log_file) - logfile_handler.setFormatter(log.LogFormatter()) - logger.addHandler(logfile_handler) - - tmux_options = { - "socket_name": socket_name, - "socket_path": socket_path, - "tmux_config_file": tmux_config_file, - "new_session_name": new_session_name, - "answer_yes": answer_yes, - "colors": colors, - "detached": detached, - "append": append, - } - - if not config: - tmuxp_echo("Enter at least one CONFIG") - tmuxp_echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if isinstance(config, str): - load_workspace(config, **tmux_options) - - elif isinstance(config, tuple): - config = list(config) - # Load each configuration but the last to the background - for cfg in config[:-1]: - opt = tmux_options.copy() - opt.update({"detached": True, "new_session_name": None}) - load_workspace(cfg, **opt) - - # todo: obey the -d in the cli args only if user specifies - load_workspace(config[-1], **tmux_options) - - -@cli.group(name="import") -def import_config_cmd(): - """Import a teamocil/tmuxinator config.""" - - -def import_config(configfile, importfunc): - configparser = kaptan.Kaptan(handler="yaml") - - configparser.import_config(configfile) - newconfig = importfunc(configparser.get()) - configparser.import_config(newconfig) - - config_format = click.prompt( - "Convert to", value_proc=_validate_choices(["yaml", "json"]), default="yaml" - ) - - if config_format == "yaml": - newconfig = configparser.export("yaml", indent=2, default_flow_style=False) - elif config_format == "json": - newconfig = configparser.export("json", indent=2) - else: - sys.exit("Unknown config format.") - - tmuxp_echo( - newconfig + "---------------------------------------------------------------" - "\n" - "Configuration import does its best to convert files.\n" - ) - if click.confirm( - "The new config *WILL* require adjusting afterwards. Save config?" - ): - dest = None - while not dest: - dest_path = click.prompt( - "Save to [%s]" % os.getcwd(), value_proc=_resolve_path_no_overwrite - ) - - # dest = dest_prompt - if click.confirm("Save to %s?" % dest_path): - dest = dest_path - - buf = open(dest, "w") - buf.write(newconfig) - buf.close() - - tmuxp_echo("Saved to %s." % dest) - else: - tmuxp_echo( - "tmuxp has examples in JSON and YAML format at " - "\n" - "View tmuxp docs at " - ) - sys.exit() - - -@import_config_cmd.command( - name="teamocil", short_help="Convert and import a teamocil config." -) -@click.argument( - "configfile", type=ConfigPath(exists=True, config_dir=get_teamocil_dir), nargs=1 -) -def command_import_teamocil(configfile): - """Convert a teamocil config from CONFIGFILE to tmuxp format and import - it into tmuxp.""" - - import_config(configfile, config.import_teamocil) - - -@import_config_cmd.command( - name="tmuxinator", short_help="Convert and import a tmuxinator config." -) -@click.argument( - "configfile", type=ConfigPath(exists=True, config_dir=get_tmuxinator_dir), nargs=1 -) -def command_import_tmuxinator(configfile): - """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import - it into tmuxp.""" - import_config(configfile, config.import_tmuxinator) - - -@cli.command(name="convert") -@click.option( - "--yes", "-y", "confirmed", help='Auto confirms with "yes".', is_flag=True -) -@click.argument("config", type=ConfigPath(exists=True), nargs=1) -def command_convert(confirmed, config): - """Convert a tmuxp config between JSON and YAML.""" - - _, ext = os.path.splitext(config) - ext = ext.lower() - if ext == ".json": - to_filetype = "yaml" - elif ext in [".yaml", ".yml"]: - to_filetype = "json" - else: - raise click.BadParameter( - f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])" - ) - - configparser = kaptan.Kaptan() - configparser.import_config(config) - newfile = config.replace(ext, ".%s" % to_filetype) - - export_kwargs = {"default_flow_style": False} if to_filetype == "yaml" else {} - newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) - - if not confirmed: - if click.confirm(f"convert to <{config}> to {to_filetype}?"): - if click.confirm("Save config to %s?" % newfile): - confirmed = True - - if confirmed: - buf = open(newfile, "w") - buf.write(newconfig) - buf.close() - print("New config saved to <%s>." % newfile) - - -@cli.command(name="edit", short_help="Run $EDITOR on config.") -@click.argument("config", type=ConfigPath(exists=True), nargs=1) -def command_edit_config(config): - config = scan_config(config) - - sys_editor = os.environ.get("EDITOR", "vim") - call([sys_editor, config]) - - -@cli.command(name="ls", short_help=f"List configured sessions in {get_config_dir()}.") -def command_ls(): - tmuxp_dir = get_config_dir() - if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): - for f in sorted(os.listdir(tmuxp_dir)): - stem, ext = os.path.splitext(f) - if os.path.isdir(f) or ext not in VALID_CONFIG_DIR_FILE_EXTENSIONS: - continue - print(stem) - - -@cli.command(name="debug-info", short_help="Print out all diagnostic info") -def command_debug_info(): - """ - Print debug info to submit with Issues. - """ - - def prepend_tab(strings): - """ - Prepend tab to strings in list. - """ - return list(map(lambda x: "\t%s" % x, strings)) - - def output_break(): - """ - Generate output break. - """ - return "-" * 25 - - def format_tmux_resp(std_resp): - """ - Format tmux command response for tmuxp stdout. - """ - return "\n".join( - [ - "\n".join(prepend_tab(std_resp.stdout)), - click.style("\n".join(prepend_tab(std_resp.stderr)), fg="red"), - ] - ) - - output = [ - output_break(), - "environment:\n%s" - % "\n".join( - prepend_tab( - [ - "dist: %s" % platform.platform(), - "arch: %s" % platform.machine(), - "uname: %s" % "; ".join(platform.uname()[:3]), - "version: %s" % platform.version(), - ] - ) - ), - output_break(), - "python version: %s" % " ".join(sys.version.split("\n")), - "system PATH: %s" % os.environ["PATH"], - "tmux version: %s" % get_version(), - "libtmux version: %s" % libtmux_version, - "tmuxp version: %s" % __version__, - "tmux path: %s" % which("tmux"), - "tmuxp path: %s" % tmuxp_path, - "shell: %s" % os.environ["SHELL"], - output_break(), - "tmux sessions:\n%s" % format_tmux_resp(tmux_cmd("list-sessions")), - "tmux windows:\n%s" % format_tmux_resp(tmux_cmd("list-windows")), - "tmux panes:\n%s" % format_tmux_resp(tmux_cmd("list-panes")), - "tmux global options:\n%s" % format_tmux_resp(tmux_cmd("show-options", "-g")), - "tmux window options:\n%s" - % format_tmux_resp(tmux_cmd("show-window-options", "-g")), - ] - - tmuxp_echo("\n".join(output)) +# Register sub-commands here +cli.add_command(command_convert) +cli.add_command(command_edit_config) +cli.add_command(command_debug_info) +cli.add_command(command_load) +cli.add_command(command_ls) +cli.add_command(command_freeze) +cli.add_command(command_shell) +cli.add_command(import_config_cmd) diff --git a/tmuxp/cli/constants.py b/tmuxp/cli/constants.py new file mode 100644 index 0000000000..c5abebb7b1 --- /dev/null +++ b/tmuxp/cli/constants.py @@ -0,0 +1 @@ +VALID_CONFIG_DIR_FILE_EXTENSIONS = [".yaml", ".yml", ".json"] diff --git a/tmuxp/cli/convert.py b/tmuxp/cli/convert.py new file mode 100644 index 0000000000..6ee78eb287 --- /dev/null +++ b/tmuxp/cli/convert.py @@ -0,0 +1,44 @@ +import os + +import click +import kaptan + +from .utils import ConfigPath + + +@click.command(name="convert") +@click.option( + "--yes", "-y", "confirmed", help='Auto confirms with "yes".', is_flag=True +) +@click.argument("config", type=ConfigPath(exists=True), nargs=1) +def command_convert(confirmed, config): + """Convert a tmuxp config between JSON and YAML.""" + + _, ext = os.path.splitext(config) + ext = ext.lower() + if ext == ".json": + to_filetype = "yaml" + elif ext in [".yaml", ".yml"]: + to_filetype = "json" + else: + raise click.BadParameter( + f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])" + ) + + configparser = kaptan.Kaptan() + configparser.import_config(config) + newfile = config.replace(ext, ".%s" % to_filetype) + + export_kwargs = {"default_flow_style": False} if to_filetype == "yaml" else {} + newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) + + if not confirmed: + if click.confirm(f"convert to <{config}> to {to_filetype}?"): + if click.confirm("Save config to %s?" % newfile): + confirmed = True + + if confirmed: + buf = open(newfile, "w") + buf.write(newconfig) + buf.close() + print("New config saved to <%s>." % newfile) diff --git a/tmuxp/cli/debug_info.py b/tmuxp/cli/debug_info.py new file mode 100644 index 0000000000..f4c0166342 --- /dev/null +++ b/tmuxp/cli/debug_info.py @@ -0,0 +1,77 @@ +import os +import pathlib +import platform +import sys + +import click + +from libtmux import __version__ as libtmux_version +from libtmux.common import get_version, tmux_cmd, which + +from ..__about__ import __version__ +from .utils import tmuxp_echo + +tmuxp_path = pathlib.Path(__file__).parent.parent + + +@click.command(name="debug-info", short_help="Print out all diagnostic info") +def command_debug_info(): + """ + Print debug info to submit with Issues. + """ + + def prepend_tab(strings): + """ + Prepend tab to strings in list. + """ + return list(map(lambda x: "\t%s" % x, strings)) + + def output_break(): + """ + Generate output break. + """ + return "-" * 25 + + def format_tmux_resp(std_resp): + """ + Format tmux command response for tmuxp stdout. + """ + return "\n".join( + [ + "\n".join(prepend_tab(std_resp.stdout)), + click.style("\n".join(prepend_tab(std_resp.stderr)), fg="red"), + ] + ) + + output = [ + output_break(), + "environment:\n%s" + % "\n".join( + prepend_tab( + [ + "dist: %s" % platform.platform(), + "arch: %s" % platform.machine(), + "uname: %s" % "; ".join(platform.uname()[:3]), + "version: %s" % platform.version(), + ] + ) + ), + output_break(), + "python version: %s" % " ".join(sys.version.split("\n")), + "system PATH: %s" % os.environ["PATH"], + "tmux version: %s" % get_version(), + "libtmux version: %s" % libtmux_version, + "tmuxp version: %s" % __version__, + "tmux path: %s" % which("tmux"), + "tmuxp path: %s" % tmuxp_path, + "shell: %s" % os.environ["SHELL"], + output_break(), + "tmux sessions:\n%s" % format_tmux_resp(tmux_cmd("list-sessions")), + "tmux windows:\n%s" % format_tmux_resp(tmux_cmd("list-windows")), + "tmux panes:\n%s" % format_tmux_resp(tmux_cmd("list-panes")), + "tmux global options:\n%s" % format_tmux_resp(tmux_cmd("show-options", "-g")), + "tmux window options:\n%s" + % format_tmux_resp(tmux_cmd("show-window-options", "-g")), + ] + + tmuxp_echo("\n".join(output)) diff --git a/tmuxp/cli/edit.py b/tmuxp/cli/edit.py new file mode 100644 index 0000000000..5611294d79 --- /dev/null +++ b/tmuxp/cli/edit.py @@ -0,0 +1,15 @@ +import os +import subprocess + +import click + +from .utils import ConfigPath, scan_config + + +@click.command(name="edit", short_help="Run $EDITOR on config.") +@click.argument("config", type=ConfigPath(exists=True), nargs=1) +def command_edit_config(config): + config = scan_config(config) + + sys_editor = os.environ.get("EDITOR", "vim") + subprocess.call([sys_editor, config]) diff --git a/tmuxp/cli/freeze.py b/tmuxp/cli/freeze.py new file mode 100644 index 0000000000..343228873c --- /dev/null +++ b/tmuxp/cli/freeze.py @@ -0,0 +1,136 @@ +import os +import sys + +import click +import kaptan + +from libtmux.server import Server + +from .. import config, util +from ..workspacebuilder import freeze +from . import exc +from .utils import _validate_choices, get_abs_path, get_config_dir + + +@click.command(name="freeze") +@click.argument("session_name", nargs=1, required=False) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") +@click.option( + "-f", + "--config-format", + type=click.Choice(["yaml", "json"]), + help="format to save in", +) +@click.option("-o", "--save-to", type=click.Path(exists=False), help="file to save to") +@click.option( + "-y", + "--yes", + type=bool, + is_flag=True, + default=False, + help="Don't prompt for confirmation", +) +@click.option( + "-q", + "--quiet", + type=bool, + is_flag=True, + default=False, + help="Don't prompt for confirmation", +) +@click.option("--force", "force", help="overwrite the config file", is_flag=True) +def command_freeze( + session_name, socket_name, config_format, save_to, socket_path, yes, quiet, force +): + """Snapshot a session into a config. + + If SESSION_NAME is provided, snapshot that session. Otherwise, use the + current session.""" + + t = Server(socket_name=socket_name, socket_path=socket_path) + + try: + if session_name: + session = t.find_where({"session_name": session_name}) + else: + session = util.get_session(t) + + if not session: + raise exc.TmuxpException("Session not found.") + except exc.TmuxpException as e: + print(e) + return + + sconf = freeze(session) + configparser = kaptan.Kaptan() + newconfig = config.inline(sconf) + configparser.import_config(newconfig) + + if not quiet: + print( + "---------------------------------------------------------------" + "\n" + "Freeze does its best to snapshot live tmux sessions.\n" + ) + if not ( + yes + or click.confirm( + "The new config *WILL* require adjusting afterwards. Save config?" + ) + ): + if not quiet: + print( + "tmuxp has examples in JSON and YAML format at " + "\n" + "View tmuxp docs at ." + ) + sys.exit() + + dest = save_to + while not dest: + save_to = os.path.abspath( + os.path.join( + get_config_dir(), + "{}.{}".format(sconf.get("session_name"), config_format or "yaml"), + ) + ) + dest_prompt = click.prompt( + "Save to: %s" % save_to, value_proc=get_abs_path, default=save_to + ) + if not force and os.path.exists(dest_prompt): + print("%s exists. Pick a new filename." % dest_prompt) + continue + + dest = dest_prompt + dest = os.path.abspath(os.path.relpath(os.path.expanduser(dest))) + + if config_format is None: + valid_config_formats = ["json", "yaml"] + _, config_format = os.path.splitext(dest) + config_format = config_format[1:].lower() + if config_format not in valid_config_formats: + config_format = click.prompt( + "Couldn't ascertain one of [%s] from file name. Convert to" + % ", ".join(valid_config_formats), + value_proc=_validate_choices(["yaml", "json"]), + default="yaml", + ) + + if config_format == "yaml": + newconfig = configparser.export( + "yaml", indent=2, default_flow_style=False, safe=True + ) + elif config_format == "json": + newconfig = configparser.export("json", indent=2) + + if yes or click.confirm("Save to %s?" % dest): + destdir = os.path.dirname(dest) + if not os.path.isdir(destdir): + os.makedirs(destdir) + buf = open(dest, "w") + buf.write(newconfig) + buf.close() + + if not quiet: + print("Saved to %s." % dest) diff --git a/tmuxp/cli/import_config.py b/tmuxp/cli/import_config.py new file mode 100644 index 0000000000..162f1858b8 --- /dev/null +++ b/tmuxp/cli/import_config.py @@ -0,0 +1,170 @@ +import os +import sys + +import click +import kaptan + +from .. import config +from .utils import ConfigPath, _validate_choices, get_abs_path, tmuxp_echo + + +def get_tmuxinator_dir(): + """ + Return tmuxinator configuration directory. + + Checks for ``TMUXINATOR_CONFIG`` environmental variable. + + Returns + ------- + str : + absolute path to tmuxinator config directory + + See Also + -------- + :meth:`tmuxp.config.import_tmuxinator` + """ + if "TMUXINATOR_CONFIG" in os.environ: + return os.path.expanduser(os.environ["TMUXINATOR_CONFIG"]) + + return os.path.expanduser("~/.tmuxinator/") + + +def get_teamocil_dir(): + """ + Return teamocil configuration directory. + + Returns + ------- + str : + absolute path to teamocil config directory + + See Also + -------- + :meth:`tmuxp.config.import_teamocil` + """ + return os.path.expanduser("~/.teamocil/") + + +def _resolve_path_no_overwrite(config): + path = get_abs_path(config) + if os.path.exists(path): + raise click.exceptions.UsageError("%s exists. Pick a new filename." % path) + return path + + +@click.group(name="import") +def import_config_cmd(): + """Import a teamocil/tmuxinator config.""" + + +def import_config(configfile, importfunc): + configparser = kaptan.Kaptan(handler="yaml") + + configparser.import_config(configfile) + newconfig = importfunc(configparser.get()) + configparser.import_config(newconfig) + + config_format = click.prompt( + "Convert to", value_proc=_validate_choices(["yaml", "json"]), default="yaml" + ) + + if config_format == "yaml": + newconfig = configparser.export("yaml", indent=2, default_flow_style=False) + elif config_format == "json": + newconfig = configparser.export("json", indent=2) + else: + sys.exit("Unknown config format.") + + tmuxp_echo( + newconfig + "---------------------------------------------------------------" + "\n" + "Configuration import does its best to convert files.\n" + ) + if click.confirm( + "The new config *WILL* require adjusting afterwards. Save config?" + ): + dest = None + while not dest: + dest_path = click.prompt( + "Save to [%s]" % os.getcwd(), value_proc=_resolve_path_no_overwrite + ) + + # dest = dest_prompt + if click.confirm("Save to %s?" % dest_path): + dest = dest_path + + buf = open(dest, "w") + buf.write(newconfig) + buf.close() + + tmuxp_echo("Saved to %s." % dest) + else: + tmuxp_echo( + "tmuxp has examples in JSON and YAML format at " + "\n" + "View tmuxp docs at " + ) + sys.exit() + + +@import_config_cmd.command( + name="tmuxinator", short_help="Convert and import a tmuxinator config." +) +@click.argument( + "configfile", type=ConfigPath(exists=True, config_dir=get_tmuxinator_dir), nargs=1 +) +def command_import_tmuxinator(configfile): + """Convert a tmuxinator config from CONFIGFILE to tmuxp format and import + it into tmuxp.""" + import_config(configfile, config.import_tmuxinator) + + +@click.command(name="convert") +@click.option( + "--yes", "-y", "confirmed", help='Auto confirms with "yes".', is_flag=True +) +@click.argument("config", type=ConfigPath(exists=True), nargs=1) +def command_convert(confirmed, config): + """Convert a tmuxp config between JSON and YAML.""" + + _, ext = os.path.splitext(config) + ext = ext.lower() + if ext == ".json": + to_filetype = "yaml" + elif ext in [".yaml", ".yml"]: + to_filetype = "json" + else: + raise click.BadParameter( + f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])" + ) + + configparser = kaptan.Kaptan() + configparser.import_config(config) + newfile = config.replace(ext, ".%s" % to_filetype) + + export_kwargs = {"default_flow_style": False} if to_filetype == "yaml" else {} + newconfig = configparser.export(to_filetype, indent=2, **export_kwargs) + + if not confirmed: + if click.confirm(f"convert to <{config}> to {to_filetype}?"): + if click.confirm("Save config to %s?" % newfile): + confirmed = True + + if confirmed: + buf = open(newfile, "w") + buf.write(newconfig) + buf.close() + print("New config saved to <%s>." % newfile) + + +@import_config_cmd.command( + name="teamocil", short_help="Convert and import a teamocil config." +) +@click.argument( + "configfile", type=ConfigPath(exists=True, config_dir=get_teamocil_dir), nargs=1 +) +def command_import_teamocil(configfile): + """Convert a teamocil config from CONFIGFILE to tmuxp format and import + it into tmuxp.""" + + import_config(configfile, config.import_teamocil) diff --git a/tmuxp/cli/load.py b/tmuxp/cli/load.py new file mode 100644 index 0000000000..d159c63d1a --- /dev/null +++ b/tmuxp/cli/load.py @@ -0,0 +1,544 @@ +"""Command line tool for managing tmux workspaces and tmuxp configurations. + +tmuxp.cli +~~~~~~~~~ + +""" +import importlib +import logging +import os +import sys + +import click +import kaptan + +from libtmux.common import has_gte_version, which +from libtmux.server import Server + +from .. import config, exc, log, util +from ..workspacebuilder import WorkspaceBuilder +from .utils import ConfigPath, _validate_choices, tmuxp_echo + + +def set_layout_hook(session, hook_name): + """Set layout hooks to normalize layout. + + References: + + - tmuxp issue: https://github.com/tmux-python/tmuxp/issues/309 + - tmux issue: https://github.com/tmux/tmux/issues/1106 + + tmux 2.6+ requires that the window be viewed with the client before + select-layout adjustments can take effect. + + To handle this, this function creates temporary hook for this session to + iterate through all windows and select the layout. + + In order for layout changes to take effect, a client must at the very + least be attached to the window (not just the session). + + hook_name is provided to allow this to set to multiple scenarios, such + as 'client-attached' (which the user attaches the session). You may + also want 'after-switch-client' for cases where the user loads tmuxp + sessions inside tmux since tmuxp offers to switch for them. + + Also, the hooks are set immediately unbind after they're invoked via -u. + + Parameters + ---------- + session : :class:`libtmux.session.Session` + session to bind hook to + hook_name : str + hook name to bind to, e.g. 'client-attached' + """ + cmd = ["set-hook", "-t", session.id, hook_name] + hook_cmd = [] + attached_window = session.attached_window + for window in session.windows: + # unfortunately, select-layout won't work unless + # we've literally selected the window at least once + # with the client + hook_cmd.append(f"selectw -t {window.id}") + # edit: removed -t, or else it won't respect main-pane-w/h + hook_cmd.append("selectl") + hook_cmd.append("selectw -p") + + # unset the hook immediately after executing + hook_cmd.append( + "set-hook -u -t {target_session} {hook_name}".format( + target_session=session.id, hook_name=hook_name + ) + ) + hook_cmd.append(f"selectw -t {attached_window.id}") + + # join the hook's commands with semicolons + hook_cmd = "{}".format("; ".join(hook_cmd)) + + # append the hook command + cmd.append(hook_cmd) + + # create the hook + session.cmd(*cmd) + + +def load_plugins(sconf): + """ + Load and return plugins in config + """ + plugins = [] + if "plugins" in sconf: + for plugin in sconf["plugins"]: + try: + module_name = plugin.split(".") + module_name = ".".join(module_name[:-1]) + plugin_name = plugin.split(".")[-1] + plugin = getattr(importlib.import_module(module_name), plugin_name) + plugins.append(plugin()) + except exc.TmuxpPluginException as error: + if not click.confirm( + "%sSkip loading %s?" + % (click.style(str(error), fg="yellow"), plugin_name), + default=True, + ): + click.echo( + click.style("[Not Skipping] ", fg="yellow") + + "Plugin versions constraint not met. Exiting..." + ) + sys.exit(1) + except Exception as error: + click.echo( + click.style("[Plugin Error] ", fg="red") + + f"Couldn't load {plugin}\n" + + click.style(f"{error}", fg="yellow") + ) + sys.exit(1) + + return plugins + + +def _reattach(builder): + """ + Reattach session (depending on env being inside tmux already or not) + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + + Notes + ----- + If ``TMUX`` environmental variable exists in the environment this script is + running, that means we're in a tmux client. So ``tmux switch-client`` will + load the session. + + If not, ``tmux attach-session`` loads the client to the target session. + """ + for plugin in builder.plugins: + plugin.reattach(builder.session) + proc = builder.session.cmd("display-message", "-p", "'#S'") + for line in proc.stdout: + print(line) + + if "TMUX" in os.environ: + builder.session.switch_client() + + else: + builder.session.attach_session() + + +def _load_attached(builder, detached): + """ + Load config in new session + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + detached : bool + """ + builder.build() + + if "TMUX" in os.environ: # tmuxp ran from inside tmux + # unset TMUX, save it, e.g. '/tmp/tmux-1000/default,30668,0' + tmux_env = os.environ.pop("TMUX") + + if has_gte_version("2.6"): + set_layout_hook(builder.session, "client-session-changed") + + builder.session.switch_client() # switch client to new session + + os.environ["TMUX"] = tmux_env # set TMUX back again + else: + if has_gte_version("2.6"): + # if attaching for first time + set_layout_hook(builder.session, "client-attached") + + # for cases where user switches client for first time + set_layout_hook(builder.session, "client-session-changed") + + if not detached: + builder.session.attach_session() + + +def _load_detached(builder): + """ + Load config in new session but don't attach + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + builder.build() + + if has_gte_version("2.6"): # prepare for both cases + set_layout_hook(builder.session, "client-attached") + set_layout_hook(builder.session, "client-session-changed") + + print("Session created in detached state.") + + +def _load_append_windows_to_current_session(builder): + """ + Load config as new windows in current session + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + current_attached_session = builder.find_current_attached_session() + builder.build(current_attached_session, append=True) + if has_gte_version("2.6"): # prepare for both cases + set_layout_hook(builder.session, "client-attached") + set_layout_hook(builder.session, "client-session-changed") + + +def _setup_plugins(builder): + """ + Runs after before_script + + Parameters + ---------- + builder: :class:`workspacebuilder.WorkspaceBuilder` + """ + for plugin in builder.plugins: + plugin.before_script(builder.session) + + return builder.session + + +def load_workspace( + config_file, + socket_name=None, + socket_path=None, + tmux_config_file=None, + new_session_name=None, + colors=None, + detached=False, + answer_yes=False, + append=False, +): + """ + Load a tmux "workspace" session via tmuxp file. + + Parameters + ---------- + config_file : str + absolute path to config file + socket_name : str, optional + ``tmux -L `` + socket_path: str, optional + ``tmux -S `` + new_session_name: str, options + ``tmux new -s `` + colors : str, optional + '-2' + Force tmux to support 256 colors + detached : bool + Force detached state. default False. + answer_yes : bool + Assume yes when given prompt to attach in new session. + Default False. + append : bool + Assume current when given prompt to append windows in same session. + Default False. + + Notes + ----- + + tmuxp will check and load a configuration file. The file will use kaptan + to load a JSON/YAML into a :py:obj:`dict`. Then :func:`config.expand` and + :func:`config.trickle` will be used to expand any shorthands, template + variables, or file paths relative to where the config/script is executed + from. + + :func:`config.expand` accepts the directory of the config file, so the + user's configuration can resolve absolute paths relative to where the + config file is. In otherwords, if a config file at */var/moo/hi.yaml* + has *./* in its configs, we want to be sure any file path with *./* is + relative to */var/moo*, not the user's PWD. + + A :class:`libtmux.Server` object is created. No tmux server is started yet, + just the object. + + The prepared configuration and the server object is passed into an instance + of :class:`~tmuxp.workspacebuilder.WorkspaceBuilder`. + + A sanity check against :meth:`libtmux.common.which` is ran. It will raise + an exception if tmux isn't found. + + If a tmux session under the same name as ``session_name`` in the tmuxp + configuration exists, tmuxp offers to attach the session. Currently, tmuxp + does not allow appending a workspace / incremental building on top of a + current session (pull requests are welcome!). + + :meth:`~tmuxp.workspacebuilder.WorkspaceBuilder.build` will build the session in + the background via using tmux's detached state (``-d``). + + After the session (workspace) is built, unless the user decided to load + the session in the background via ``tmuxp -d`` (which is in the spirit + of tmux's ``-d``), we need to prompt the user to attach the session. + + If the user is already inside a tmux client, which we detect via the + ``TMUX`` environment variable bring present, we will prompt the user to + switch their current client to it. + + If they're outside of tmux client - in a plain-old PTY - we will + automatically ``attach``. + + If an exception is raised during the building of the workspace, tmuxp will + prompt to cleanup (``$ tmux kill-session``) the session on the user's + behalf. An exception raised during this process means it's not easy to + predict how broken the session is. + + .. versionchanged:: tmux 2.6+ + + In tmux 2.6, the way layout and proportion's work when interfacing + with tmux in a detached state (outside of a client) changed. Since + tmuxp builds workspaces in a detached state, the WorkspaceBuilder isn't + able to rely on functionality requiring awarness of session geometry, + e.g. ``set-layout``. + + Thankfully, tmux is able to defer commands to run after the user + performs certain actions, such as loading a client via + ``attach-session`` or ``switch-client``. + + Upon client switch, ``client-session-changed`` is triggered [1]_. + + References + ---------- + .. [1] cmd-switch-client.c hook. GitHub repo for tmux. + + https://github.com/tmux/tmux/blob/2.6/cmd-switch-client.c#L132. + Accessed April 8th, 2018. + """ + # get the canonical path, eliminating any symlinks + config_file = os.path.realpath(config_file) + + tmuxp_echo( + click.style("[Loading] ", fg="green") + + click.style(config_file, fg="blue", bold=True) + ) + + # kaptan allows us to open a yaml or json file as a dict + sconfig = kaptan.Kaptan() + sconfig = sconfig.import_config(config_file).get() + # shapes configurations relative to config / profile file location + sconfig = config.expand(sconfig, os.path.dirname(config_file)) + # Overwrite session name + if new_session_name: + sconfig["session_name"] = new_session_name + # propagate config inheritance (e.g. session -> window, window -> pane) + sconfig = config.trickle(sconfig) + + t = Server( # create tmux server object + socket_name=socket_name, + socket_path=socket_path, + config_file=tmux_config_file, + colors=colors, + ) + + which("tmux") # raise exception if tmux not found + + try: # load WorkspaceBuilder object for tmuxp config / tmux server + builder = WorkspaceBuilder( + sconf=sconfig, plugins=load_plugins(sconfig), server=t + ) + except exc.EmptyConfigException: + tmuxp_echo("%s is empty or parsed no config data" % config_file, err=True) + return + + session_name = sconfig["session_name"] + + # if the session already exists, prompt the user to attach + if builder.session_exists(session_name) and not append: + if not detached and ( + answer_yes + or click.confirm( + "%s is already running. Attach?" + % click.style(session_name, fg="green"), + default=True, + ) + ): + _reattach(builder) + return + + try: + if detached: + _load_detached(builder) + return _setup_plugins(builder) + + if append: + if "TMUX" in os.environ: # tmuxp ran from inside tmux + _load_append_windows_to_current_session(builder) + else: + _load_attached(builder, detached) + + return _setup_plugins(builder) + + # append and answer_yes have no meaning if specified together + elif answer_yes: + _load_attached(builder, detached) + return _setup_plugins(builder) + + if "TMUX" in os.environ: # tmuxp ran from inside tmux + msg = ( + "Already inside TMUX, switch to session? yes/no\n" + "Or (a)ppend windows in the current active session?\n[y/n/a]" + ) + options = ["y", "n", "a"] + choice = click.prompt(msg, value_proc=_validate_choices(options)) + + if choice == "y": + _load_attached(builder, detached) + elif choice == "a": + _load_append_windows_to_current_session(builder) + else: + _load_detached(builder) + else: + _load_attached(builder, detached) + + except exc.TmuxpException as e: + import traceback + + tmuxp_echo(traceback.format_exc(), err=True) + tmuxp_echo(e, err=True) + + choice = click.prompt( + "Error loading workspace. (k)ill, (a)ttach, (d)etach?", + value_proc=_validate_choices(["k", "a", "d"]), + default="k", + ) + + if choice == "k": + builder.session.kill_session() + tmuxp_echo("Session killed.") + elif choice == "a": + _reattach(builder) + else: + sys.exit() + + return _setup_plugins(builder) + + +@click.command(name="load", short_help="Load tmuxp workspaces.") +@click.pass_context +@click.argument("config", type=ConfigPath(exists=True), nargs=-1) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") +@click.option("-f", "tmux_config_file", help="pass-through for tmux -f") +@click.option("-s", "new_session_name", help="start new session with new session name") +@click.option("--yes", "-y", "answer_yes", help="yes", is_flag=True) +@click.option( + "-d", "detached", help="Load the session without attaching it", is_flag=True +) +@click.option( + "-a", + "append", + help="Load configuration, appending windows to the current session", + is_flag=True, +) +@click.option( + "colors", + "-2", + flag_value=256, + default=True, + help="Force tmux to assume the terminal supports 256 colours.", +) +@click.option( + "colors", + "-8", + flag_value=88, + help="Like -2, but indicates that the terminal supports 88 colours.", +) +@click.option("--log-file", help="File to log errors/output to") +def command_load( + ctx, + config, + socket_name, + socket_path, + tmux_config_file, + new_session_name, + answer_yes, + detached, + append, + colors, + log_file, +): + """Load a tmux workspace from each CONFIG. + + CONFIG is a specifier for a configuration file. + + If CONFIG is a path to a directory, tmuxp will search it for + ".tmuxp.{yaml,yml,json}". + + If CONFIG is has no directory component and only a filename, e.g. + "myconfig.yaml", tmuxp will search the users's config directory for that + file. + + If CONFIG has no directory component, and only a name with no extension, + e.g. "myconfig", tmuxp will search the users's config directory for any + file with the extension ".yaml", ".yml", or ".json" that matches that name. + + If multiple configuration files that match a given CONFIG are found, tmuxp + will warn and pick the first one found. + + If multiple CONFIGs are provided, workspaces will be created for all of + them. The last one provided will be attached. The others will be created in + detached mode. + """ + util.oh_my_zsh_auto_title() + + if log_file: + logfile_handler = logging.FileHandler(log_file) + logfile_handler.setFormatter(log.LogFormatter()) + from . import logger + + logger.addHandler(logfile_handler) + + tmux_options = { + "socket_name": socket_name, + "socket_path": socket_path, + "tmux_config_file": tmux_config_file, + "new_session_name": new_session_name, + "answer_yes": answer_yes, + "colors": colors, + "detached": detached, + "append": append, + } + + if not config: + tmuxp_echo("Enter at least one CONFIG") + tmuxp_echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if isinstance(config, str): + load_workspace(config, **tmux_options) + + elif isinstance(config, tuple): + config = list(config) + # Load each configuration but the last to the background + for cfg in config[:-1]: + opt = tmux_options.copy() + opt.update({"detached": True, "new_session_name": None}) + load_workspace(cfg, **opt) + + # todo: obey the -d in the cli args only if user specifies + load_workspace(config[-1], **tmux_options) diff --git a/tmuxp/cli/ls.py b/tmuxp/cli/ls.py new file mode 100644 index 0000000000..cb828460dc --- /dev/null +++ b/tmuxp/cli/ls.py @@ -0,0 +1,17 @@ +import os + +import click + +from .constants import VALID_CONFIG_DIR_FILE_EXTENSIONS +from .utils import get_config_dir + + +@click.command(name="ls", short_help=f"List configured sessions in {get_config_dir()}.") +def command_ls(): + tmuxp_dir = get_config_dir() + if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): + for f in sorted(os.listdir(tmuxp_dir)): + stem, ext = os.path.splitext(f) + if os.path.isdir(f) or ext not in VALID_CONFIG_DIR_FILE_EXTENSIONS: + continue + print(stem) diff --git a/tmuxp/cli/shell.py b/tmuxp/cli/shell.py new file mode 100644 index 0000000000..da6f9cf960 --- /dev/null +++ b/tmuxp/cli/shell.py @@ -0,0 +1,103 @@ +import os + +import click + +from libtmux import Server + +from .. import util +from .._compat import PY3, PYMINOR + + +@click.command(name="shell") +@click.argument("session_name", nargs=1, required=False) +@click.argument("window_name", nargs=1, required=False) +@click.option("-S", "socket_path", help="pass-through for tmux -S") +@click.option("-L", "socket_name", help="pass-through for tmux -L") +@click.option( + "-c", + "command", + help="Instead of opening shell, execute python code in libtmux and exit", +) +@click.option( + "--best", + "shell", + flag_value="best", + help="Use best shell available in site packages", + default=True, +) +@click.option("--pdb", "shell", flag_value="pdb", help="Use plain pdb") +@click.option("--code", "shell", flag_value="code", help="Use stdlib's code.interact()") +@click.option( + "--ptipython", "shell", flag_value="ptipython", help="Use ptpython + ipython" +) +@click.option("--ptpython", "shell", flag_value="ptpython", help="Use ptpython") +@click.option("--ipython", "shell", flag_value="ipython", help="Use ipython") +@click.option("--bpython", "shell", flag_value="bpython", help="Use bpython") +@click.option( + "--use-pythonrc/--no-startup", + "use_pythonrc", + help="Load PYTHONSTARTUP env var and ~/.pythonrc.py script in --code", + default=False, +) +@click.option( + "--use-vi-mode/--no-vi-mode", + "use_vi_mode", + help="Use vi-mode in ptpython/ptipython", + default=False, +) +def command_shell( + session_name, + window_name, + socket_name, + socket_path, + command, + shell, + use_pythonrc, + use_vi_mode, +): + """Launch python shell for tmux server, session, window and pane. + + Priority given to loaded session/wndow/pane objects: + + - session_name and window_name arguments + - current shell: envvar ``TMUX_PANE`` for determing window and session + - :attr:`libtmux.Server.attached_sessions`, :attr:`libtmux.Session.attached_window`, + :attr:`libtmux.Window.attached_pane` + """ + server = Server(socket_name=socket_name, socket_path=socket_path) + + util.raise_if_tmux_not_running(server=server) + + current_pane = util.get_current_pane(server=server) + + session = util.get_session( + server=server, session_name=session_name, current_pane=current_pane + ) + + window = util.get_window( + session=session, window_name=window_name, current_pane=current_pane + ) + + pane = util.get_pane(window=window, current_pane=current_pane) # NOQA: F841 + + if command is not None: + exec(command) + else: + if shell == "pdb" or (os.getenv("PYTHONBREAKPOINT") and PY3 and PYMINOR >= 7): + from ._compat import breakpoint as tmuxp_breakpoint + + tmuxp_breakpoint() + return + else: + from ..shell import launch + + launch( + shell=shell, + use_pythonrc=use_pythonrc, # shell: code + use_vi_mode=use_vi_mode, # shell: ptpython, ptipython + # tmux environment / libtmux variables + server=server, + session=session, + window=window, + pane=pane, + ) diff --git a/tmuxp/cli/utils.py b/tmuxp/cli/utils.py new file mode 100644 index 0000000000..ba6cceccde --- /dev/null +++ b/tmuxp/cli/utils.py @@ -0,0 +1,259 @@ +import logging +import os + +import click +from click.exceptions import FileError + +from .. import config, log +from .constants import VALID_CONFIG_DIR_FILE_EXTENSIONS + +logger = logging.getLogger(__name__) + + +def tmuxp_echo(message=None, log_level="INFO", style_log=False, **click_kwargs): + """ + Combines logging.log and click.echo + """ + if style_log: + logger.log(log.LOG_LEVELS[log_level], message) + else: + logger.log(log.LOG_LEVELS[log_level], click.unstyle(message)) + + click.echo(message, **click_kwargs) + + +def get_config_dir(): + """ + Return tmuxp configuration directory. + + ``TMUXP_CONFIGDIR`` environmental variable has precedence if set. We also + evaluate XDG default directory from XDG_CONFIG_HOME environmental variable + if set or its default. Then the old default ~/.tmuxp is returned for + compatibility. + + Returns + ------- + str : + absolute path to tmuxp config directory + """ + + paths = [] + if "TMUXP_CONFIGDIR" in os.environ: + paths.append(os.environ["TMUXP_CONFIGDIR"]) + if "XDG_CONFIG_HOME" in os.environ: + paths.append(os.path.join(os.environ["XDG_CONFIG_HOME"], "tmuxp")) + else: + paths.append("~/.config/tmuxp/") + paths.append("~/.tmuxp") + + for path in paths: + path = os.path.expanduser(path) + if os.path.isdir(path): + return path + # Return last path as default if none of the previous ones matched + return path + + +def _validate_choices(options): + """ + Callback wrapper for validating click.prompt input. + + Parameters + ---------- + options : list + List of allowed choices + + Returns + ------- + :func:`callable` + callback function for value_proc in :func:`click.prompt`. + + Raises + ------ + :class:`click.BadParameter` + """ + + def func(value): + if value not in options: + raise click.BadParameter( + "Possible choices are: {}.".format(", ".join(options)) + ) + return value + + return func + + +class ConfigPath(click.Path): + def __init__(self, config_dir=None, *args, **kwargs): + super().__init__(*args, **kwargs) + self.config_dir = config_dir + + def convert(self, value, param, ctx): + config_dir = self.config_dir + if callable(config_dir): + config_dir = config_dir() + + value = scan_config(value, config_dir=config_dir) + return super().convert(value, param, ctx) + + +def scan_config_argument(ctx, param, value, config_dir=None): + """Validate / translate config name/path values for click config arg. + + Wrapper on top of :func:`cli.scan_config`.""" + if callable(config_dir): + config_dir = config_dir() + + if not config: + tmuxp_echo("Enter at least one CONFIG") + tmuxp_echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if isinstance(value, str): + value = scan_config(value, config_dir=config_dir) + + elif isinstance(value, tuple): + value = tuple(scan_config(v, config_dir=config_dir) for v in value) + + return value + + +def get_abs_path(config): + path = os.path + join, isabs = path.join, path.isabs + dirname, normpath = path.dirname, path.normpath + cwd = os.getcwd() + + config = os.path.expanduser(config) + if not isabs(config) or len(dirname(config)) > 1: + config = normpath(join(cwd, config)) + + return config + + +def scan_config(config, config_dir=None): + """ + Return the real config path or raise an exception. + + If config is directory, scan for .tmuxp.{yaml,yml,json} in directory. If + one or more found, it will warn and pick the first. + + If config is ".", "./" or None, it will scan current directory. + + If config is has no path and only a filename, e.g. "myconfig.yaml" it will + search config dir. + + If config has no path and only a name with no extension, e.g. "myconfig", + it will scan for file name with yaml, yml and json. If multiple exist, it + will warn and pick the first. + + Parameters + ---------- + config : str + config file, valid examples: + + - a file name, myconfig.yaml + - relative path, ../config.yaml or ../project + - a period, . + + Raises + ------ + :class:`click.exceptions.FileError` + """ + if not config_dir: + config_dir = get_config_dir() + path = os.path + exists, join, isabs = path.exists, path.join, path.isabs + dirname, normpath, splitext = path.dirname, path.normpath, path.splitext + cwd = os.getcwd() + is_name = False + file_error = None + + config = os.path.expanduser(config) + # if purename, resolve to confg dir + if is_pure_name(config): + is_name = True + elif ( + not isabs(config) + or len(dirname(config)) > 1 + or config == "." + or config == "" + or config == "./" + ): # if relative, fill in full path + config = normpath(join(cwd, config)) + + # no extension, scan + if path.isdir(config) or not splitext(config)[1]: + if is_name: + candidates = [ + x + for x in [ + f"{join(config_dir, config)}{ext}" + for ext in VALID_CONFIG_DIR_FILE_EXTENSIONS + ] + if exists(x) + ] + if not len(candidates): + file_error = ( + "config not found in config dir (yaml/yml/json) %s " + "for name" % (config_dir) + ) + else: + candidates = [ + x + for x in [ + join(config, ext) + for ext in [".tmuxp.yaml", ".tmuxp.yml", ".tmuxp.json"] + ] + if exists(x) + ] + + if len(candidates) > 1: + tmuxp_echo( + click.style( + "Multiple .tmuxp.{yml,yaml,json} configs in %s" + % dirname(config), + fg="red", + ) + ) + tmuxp_echo( + click.wrap_text( + "This is undefined behavior, use only one. " + "Use file names e.g. myproject.json, coolproject.yaml. " + "You can load them by filename." + ) + ) + elif not len(candidates): + file_error = "No tmuxp files found in directory" + if len(candidates): + config = candidates[0] + elif not exists(config): + file_error = "file not found" + + if file_error: + raise FileError(file_error, config) + + return config + + +def is_pure_name(path): + """ + Return True if path is a name and not a file path. + + Parameters + ---------- + path : str + Path (can be absolute, relative, etc.) + + Returns + ------- + bool + True if path is a name of config in config dir, not file path. + """ + return ( + not os.path.isabs(path) + and len(os.path.dirname(path)) == 0 + and not os.path.splitext(path)[1] + and path != "." + and path != "" + ) From a963deb01bdfd676724aa08fa7df81b29e1d32a3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 10:01:14 -0500 Subject: [PATCH 1060/2998] docs(API): Update for restructure --- docs/api.md | 12 ++++++------ docs/cli/import.md | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api.md b/docs/api.md index 1141ba77ed..301a2e69bd 100644 --- a/docs/api.md +++ b/docs/api.md @@ -45,27 +45,27 @@ If you need an internal API stabilized please [file an issue](https://github.com ## CLI ```{eval-rst} -.. automethod:: tmuxp.cli._reattach +.. automethod:: tmuxp.cli.utils.get_config_dir ``` ```{eval-rst} -.. automethod:: tmuxp.cli.get_config_dir +.. automethod:: tmuxp.cli.utils._validate_choices ``` ```{eval-rst} -.. automethod:: tmuxp.cli.get_teamocil_dir +.. automethod:: tmuxp.cli.import_config.get_teamocil_dir ``` ```{eval-rst} -.. automethod:: tmuxp.cli.get_tmuxinator_dir +.. automethod:: tmuxp.cli.import_config.get_tmuxinator_dir ``` ```{eval-rst} -.. automethod:: tmuxp.cli.load_workspace +.. automethod:: tmuxp.cli.load.load_workspace ``` ```{eval-rst} -.. automethod:: tmuxp.cli._validate_choices +.. automethod:: tmuxp.cli.load._reattach ``` ## Configuration diff --git a/docs/cli/import.md b/docs/cli/import.md index 5cf25c6e0b..4cffaed6bd 100644 --- a/docs/cli/import.md +++ b/docs/cli/import.md @@ -7,7 +7,7 @@ ## From teamocil ```{eval-rst} -.. click:: tmuxp.cli:command_import_teamocil +.. click:: tmuxp.cli.import_config:command_import_teamocil :prog: tmuxp import teamocil :nested: full ``` @@ -33,7 +33,7 @@ $ tmuxp import teamocil /path/to/file.json ## From tmuxinator ```{eval-rst} -.. click:: tmuxp.cli:command_import_tmuxinator +.. click:: tmuxp.cli.import_config:command_import_tmuxinator :prog: tmuxp import tmuxinator :nested: short ``` From 5323c18356ca57689fed4eaa2cddba1235d70d97 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 10:10:40 -0500 Subject: [PATCH 1061/2998] docs(CHANGES): Update for most recent changes --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 4c7b28d755..7e29cc54b2 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,11 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - _Insert changes/features/fixes for next release here_ +### Maintenance + +- {issue}`762`: CLI: Break up into modules in _cli.py_ -> _cli/{command}_ +- {issue}`761`: Refactor _tests/_ constants and fixtures + ## tmuxp 1.10.0 (2022-03-19) ### Compatibility From 745781e85ce17414e5b5b948ed046180a653ae7d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:02:44 -0500 Subject: [PATCH 1062/2998] Release v1.11.0b0 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7bd28bd407..13f78fa5a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.10.0" +version = "1.11.0b0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 8f87c969c5..ad05e2ba8d 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.10.0" +__version__ = "1.11.0b0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From a8144f439ff14d8f3b93e8bdc350e59e26648d72 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:27:22 -0500 Subject: [PATCH 1063/2998] docs: More commands fixes --- docs/cli/debug-info.md | 2 +- docs/cli/freeze.md | 2 +- docs/cli/load.md | 32 ++++++++++++++++++++++++++------ docs/cli/shell.md | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/cli/debug-info.md b/docs/cli/debug-info.md index d8ef196ca2..d0a536fcd2 100644 --- a/docs/cli/debug-info.md +++ b/docs/cli/debug-info.md @@ -22,7 +22,7 @@ environment: ```{eval-rst} .. click:: tmuxp.cli:cli - :prog: tmuxp debug-info + :prog: tmuxp :commands: debug-info :nested: full ``` diff --git a/docs/cli/freeze.md b/docs/cli/freeze.md index 9c413eb635..414ac8e869 100644 --- a/docs/cli/freeze.md +++ b/docs/cli/freeze.md @@ -27,7 +27,7 @@ If the `--force` argument is passed, it will overwrite any existing config file (cli-freeze-reference)= ```{eval-rst} -.. click:: tmuxp.cli:cli +.. click:: tmuxp.cli.freeze:command_freeze :prog: tmuxp freeze :commands: freeze :nested: full diff --git a/docs/cli/load.md b/docs/cli/load.md index 5c8d85cf78..59b48440dc 100644 --- a/docs/cli/load.md +++ b/docs/cli/load.md @@ -13,7 +13,12 @@ shorthands: Path to folder with `.tmuxp.yaml`, `.tmuxp.yml`, `.tmuxp.json`: +````{tab} Project based + +Projects with a file named `.tmuxp.yaml` or `.tmuxp.json` can be loaded: + ```console +// current directory $ tmuxp load . ``` @@ -29,6 +34,10 @@ $ tmuxp load path/to/folder/ $ tmuxp load /path/to/folder/ ``` +```` + +````{tab} User based + Name of the config, assume `$HOME/.tmuxp/myconfig.yaml`: ```console @@ -49,18 +58,19 @@ $ tmuxp load /abs/path/to/myfile.yaml $ tmuxp load ~/myfile.yaml ``` +```` + +````{tab} Direct + Absolute and relative directory paths are supported. ```console $ tmuxp load [filename] ``` -Files named `.tmuxp.yaml` or `.tmuxp.json` in the current working -directory may be loaded with: +```` -```console -$ tmuxp load . -``` +## Inside sessions If you try to load a config file from within a tmux session, it will ask you if you want to load and attach to the new session, or just load detached. @@ -72,6 +82,8 @@ Or (a)ppend windows in the current active session? [y/n/a]: ``` +## Options + All of these options can be preselected to skip the prompt: - Attach / open client after load: @@ -92,6 +104,8 @@ All of these options can be preselected to skip the prompt: $ tmuxp load -a config ``` +## Loading multiple sessions + Multiple sessions can be loaded at once. The first ones will be created without being attached. The last one will be attached if there is no `-d` flag on the command line. @@ -100,6 +114,8 @@ without being attached. The last one will be attached if there is no $ tmuxp load [filename1] [filename2] ... ``` +## Custom session name + A session name can be provided at the terminal. If multiple sessions are created, the last session is named from the terminal. @@ -107,6 +123,8 @@ are created, the last session is named from the terminal. $ tmuxp load -s [new_session_name] [filename1] ... ``` +## Logging + The output of the `load` command can be logged to a file for debugging purposes. the log level can be controlled with the global `--log-level` option (defaults to INFO). @@ -119,10 +137,12 @@ $ tmuxp load [filename] --log-file [log_filename] $ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename] ``` +## Reference + (tmuxp-load-reference)= ```{eval-rst} -.. click:: tmuxp.cli:cli +.. click:: tmuxp.cli.load:command_load :prog: tmuxp load :commands: load :nested: full diff --git a/docs/cli/shell.md b/docs/cli/shell.md index a047881e07..9843f9ada2 100644 --- a/docs/cli/shell.md +++ b/docs/cli/shell.md @@ -3,7 +3,7 @@ # tmuxp shell ```{eval-rst} -.. click:: tmuxp.cli:command_shell +.. click:: tmuxp.cli.shell:command_shell :prog: tmuxp shell :commands: shell :nested: none From 6e1420563158c4457a749f76f360b9a6f87e5ca3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:30:29 -0500 Subject: [PATCH 1064/2998] chore: Rename command_edit --- tmuxp/cli/__init__.py | 4 ++-- tmuxp/cli/edit.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tmuxp/cli/__init__.py b/tmuxp/cli/__init__.py index a60d387151..7bc4a607de 100644 --- a/tmuxp/cli/__init__.py +++ b/tmuxp/cli/__init__.py @@ -19,7 +19,7 @@ from ..log import setup_logger from .convert import command_convert from .debug_info import command_debug_info -from .edit import command_edit_config +from .edit import command_edit from .freeze import command_freeze from .import_config import import_config_cmd from .load import command_load @@ -68,7 +68,7 @@ def startup(config_dir): # Register sub-commands here cli.add_command(command_convert) -cli.add_command(command_edit_config) +cli.add_command(command_edit) cli.add_command(command_debug_info) cli.add_command(command_load) cli.add_command(command_ls) diff --git a/tmuxp/cli/edit.py b/tmuxp/cli/edit.py index 5611294d79..0eb9c95a5f 100644 --- a/tmuxp/cli/edit.py +++ b/tmuxp/cli/edit.py @@ -8,7 +8,7 @@ @click.command(name="edit", short_help="Run $EDITOR on config.") @click.argument("config", type=ConfigPath(exists=True), nargs=1) -def command_edit_config(config): +def command_edit(config): config = scan_config(config) sys_editor = os.environ.get("EDITOR", "vim") From 28b72efa13ad4d256a5226acfed7c22eccf1bd2a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:32:57 -0500 Subject: [PATCH 1065/2998] refactor!(import_config): Rename for conformity --- tmuxp/cli/__init__.py | 4 ++-- tmuxp/cli/import_config.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tmuxp/cli/__init__.py b/tmuxp/cli/__init__.py index 7bc4a607de..ab09f1ec6e 100644 --- a/tmuxp/cli/__init__.py +++ b/tmuxp/cli/__init__.py @@ -21,7 +21,7 @@ from .debug_info import command_debug_info from .edit import command_edit from .freeze import command_freeze -from .import_config import import_config_cmd +from .import_config import command_import from .load import command_load from .shell import command_shell from .utils import tmuxp_echo @@ -74,4 +74,4 @@ def startup(config_dir): cli.add_command(command_ls) cli.add_command(command_freeze) cli.add_command(command_shell) -cli.add_command(import_config_cmd) +cli.add_command(command_import) diff --git a/tmuxp/cli/import_config.py b/tmuxp/cli/import_config.py index 162f1858b8..a0a6e6f327 100644 --- a/tmuxp/cli/import_config.py +++ b/tmuxp/cli/import_config.py @@ -53,7 +53,7 @@ def _resolve_path_no_overwrite(config): @click.group(name="import") -def import_config_cmd(): +def command_import(): """Import a teamocil/tmuxinator config.""" @@ -107,7 +107,7 @@ def import_config(configfile, importfunc): sys.exit() -@import_config_cmd.command( +@command_import.command( name="tmuxinator", short_help="Convert and import a tmuxinator config." ) @click.argument( @@ -157,7 +157,7 @@ def command_convert(confirmed, config): print("New config saved to <%s>." % newfile) -@import_config_cmd.command( +@command_import.command( name="teamocil", short_help="Convert and import a teamocil config." ) @click.argument( From f54a04fc0994b8bfb9a08d1623bf13d41cce9d06 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:35:32 -0500 Subject: [PATCH 1066/2998] chore(tmuxp ls): Fix doc string --- tmuxp/cli/ls.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli/ls.py b/tmuxp/cli/ls.py index cb828460dc..0164ea9a92 100644 --- a/tmuxp/cli/ls.py +++ b/tmuxp/cli/ls.py @@ -6,7 +6,10 @@ from .utils import get_config_dir -@click.command(name="ls", short_help=f"List configured sessions in {get_config_dir()}.") +@click.command( + name="ls", + short_help="List configured sessions in :meth:`tmuxp.cli.utils.get_config_dir`.", +) def command_ls(): tmuxp_dir = get_config_dir() if os.path.exists(tmuxp_dir) and os.path.isdir(tmuxp_dir): From 3380ec2fc321acc9b5dfb541d509d39aa8d232c4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:36:00 -0500 Subject: [PATCH 1067/2998] docs(cli): Fix various namespaces. Add edit and ls --- docs/cli/convert.md | 2 +- docs/cli/debug-info.md | 4 ++-- docs/cli/edit.md | 10 ++++++++++ docs/cli/index.md | 2 ++ docs/cli/ls.md | 10 ++++++++++ 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 docs/cli/edit.md create mode 100644 docs/cli/ls.md diff --git a/docs/cli/convert.md b/docs/cli/convert.md index cc2ff0c9f8..545e2ad2d1 100644 --- a/docs/cli/convert.md +++ b/docs/cli/convert.md @@ -26,7 +26,7 @@ tmuxp automatically will prompt to convert `.yaml` to `.json` and ## Reference ```{eval-rst} -.. click:: tmuxp.cli:cli +.. click:: tmuxp.cli.convert:command_convert :prog: tmuxp convert :commands: convert :nested: full diff --git a/docs/cli/debug-info.md b/docs/cli/debug-info.md index d0a536fcd2..cd8298d8c8 100644 --- a/docs/cli/debug-info.md +++ b/docs/cli/debug-info.md @@ -21,8 +21,8 @@ environment: ## Reference ```{eval-rst} -.. click:: tmuxp.cli:cli - :prog: tmuxp +.. click:: tmuxp.cli.debug_info:command_debug_info + :prog: tmuxp debug-info :commands: debug-info :nested: full ``` diff --git a/docs/cli/edit.md b/docs/cli/edit.md new file mode 100644 index 0000000000..89735f6455 --- /dev/null +++ b/docs/cli/edit.md @@ -0,0 +1,10 @@ +(edit-config)= + +# tmuxp edit + +```{eval-rst} +.. click:: tmuxp.cli.edit:command_edit + :prog: tmuxp edit + :commands: edit + :nested: full +``` diff --git a/docs/cli/index.md b/docs/cli/index.md index dd8612a61a..0abfe3676f 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -10,12 +10,14 @@ load shell +ls ``` ```{toctree} :caption: Configuration :maxdepth: 1 +edit import convert freeze diff --git a/docs/cli/ls.md b/docs/cli/ls.md new file mode 100644 index 0000000000..f46d4593f3 --- /dev/null +++ b/docs/cli/ls.md @@ -0,0 +1,10 @@ +(ls-config)= + +# tmuxp ls + +```{eval-rst} +.. click:: tmuxp.cli.ls:command_ls + :prog: tmuxp ls + :commands: ls + :nested: full +``` From 52d9c0d3c13556fd5d6ffdb3125fcf3afd0e845d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 11:38:41 -0500 Subject: [PATCH 1068/2998] Tag 1.11.0b1 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 13f78fa5a0..e7d77e1fc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.11.0b0" +version = "1.11.0b1" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index ad05e2ba8d..1dfdefbd71 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.11.0b0" +__version__ = "1.11.0b1" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 6960dd09e7696c5efbbc1d2fd98fc34fc4c9a561 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Mar 2022 14:28:37 -0500 Subject: [PATCH 1069/2998] docs: Remove duplicate declaration of myst-parser --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 6fa2757174..db0309265f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,7 +28,6 @@ "sphinx.ext.linkcode", "aafig", "sphinx_issues", - "myst_parser", "sphinx_click.ext", # sphinx-click "sphinx_inline_tabs", "sphinx_copybutton", From 6628cc3b3ef8e0dcb03d828bc2bc699e6cfaa969 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Mar 2022 14:32:54 -0500 Subject: [PATCH 1070/2998] docs(myst): Add substitution and replacements --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index db0309265f..305c64d207 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -36,7 +36,7 @@ "myst_parser", ] -myst_enable_extensions = ["colon_fence"] +myst_enable_extensions = ["colon_fence", "substitution", "replacements"] issues_github_path = about["__github__"].replace("https://github.com/", "") From 0cca489f6c7bc0dbb6765dd288ffb11f7d86ab75 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 28 Mar 2022 05:14:04 -0500 Subject: [PATCH 1071/2998] build(deps): Update dev dependencies --- poetry.lock | 75 +++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/poetry.lock b/poetry.lock index d014220052..bdcef45bc8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -382,11 +382,11 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.1" description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -816,7 +816,7 @@ watchdog = ">=2.0.0" [[package]] name = "pytz" -version = "2021.3" +version = "2022.1" description = "World timezone definitions, modern and historical" category = "dev" optional = false @@ -1143,7 +1143,7 @@ python-versions = ">=3.7" [[package]] name = "tomlkit" -version = "0.10.0" +version = "0.10.1" description = "Style preserving TOML library" category = "dev" optional = false @@ -1227,7 +1227,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.4" +version = "20.14.0" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1246,7 +1246,7 @@ testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", [[package]] name = "watchdog" -version = "2.1.6" +version = "2.1.7" description = "Filesystem events monitoring" category = "dev" optional = false @@ -1544,8 +1544,8 @@ jeepney = [ {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, ] jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, ] kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, @@ -1793,8 +1793,8 @@ pytest-watcher = [ {file = "pytest_watcher-0.2.3-py3-none-any.whl", hash = "sha256:af935963399509a5b0e855740ba7227852f1a7fccfbb1cbb79fa19a445af02d2"}, ] pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1928,8 +1928,8 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.10.0-py3-none-any.whl", hash = "sha256:cac4aeaff42f18fef6e07831c2c2689a51df76cf2ede07a6a4fa5fcb83558870"}, - {file = "tomlkit-0.10.0.tar.gz", hash = "sha256:d99946c6aed3387c98b89d91fb9edff8f901bf9255901081266a84fb5604adcd"}, + {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, + {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, ] tornado = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, @@ -2017,33 +2017,34 @@ urllib3 = [ {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] virtualenv = [ - {file = "virtualenv-20.13.4-py2.py3-none-any.whl", hash = "sha256:c3e01300fb8495bc00ed70741f5271fc95fed067eb7106297be73d30879af60c"}, - {file = "virtualenv-20.13.4.tar.gz", hash = "sha256:ce8901d3bbf3b90393498187f2d56797a8a452fb2d0d7efc6fd837554d6f679c"}, + {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, + {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, ] watchdog = [ - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, - {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, - {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, - {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, - {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, - {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, - {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, - {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, + {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, + {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, + {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, + {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, + {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, + {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, + {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, + {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, From aba72549955ec43e6719e4e5f8c3ec737e339065 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 Apr 2022 07:43:04 -0500 Subject: [PATCH 1072/2998] build(deps): Update packages --- poetry.lock | 135 +++++++++++++++++++++++++++------------------------- 1 file changed, 71 insertions(+), 64 deletions(-) diff --git a/poetry.lock b/poetry.lock index bdcef45bc8..c7251000f8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -64,7 +64,7 @@ lxml = ["lxml"] [[package]] name = "black" -version = "22.1.0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -75,7 +75,7 @@ click = ">=8.0.0" mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=1.1.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -592,12 +592,16 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "9.0.1" +version = "9.1.0" description = "Python Imaging Library (Fork)" category = "dev" optional = false python-versions = ">=3.7" +[package.extras] +docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "pkginfo" version = "1.8.2" @@ -1105,7 +1109,7 @@ test = ["pytest"] [[package]] name = "sphinxext-opengraph" -version = "0.6.2" +version = "0.6.3" description = "Sphinx Extension to enable OGP support" category = "dev" optional = false @@ -1313,29 +1317,29 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, ] black = [ - {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, - {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, - {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, - {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, - {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, - {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, - {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, - {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, - {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, - {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, - {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, - {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, - {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, - {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, - {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, - {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, - {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, - {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, - {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, - {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, - {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] cachecontrol = [ {file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"}, @@ -1684,41 +1688,44 @@ pexpect = [ {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pillow = [ - {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"}, - {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"}, - {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"}, - {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"}, - {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"}, - {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"}, - {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"}, - {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"}, - {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"}, - {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"}, - {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"}, - {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"}, - {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"}, - {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"}, + {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, + {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, + {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, + {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, + {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, + {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, + {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, + {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, + {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, + {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, + {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, + {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, + {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, + {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, + {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, ] pkginfo = [ {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, @@ -1912,8 +1919,8 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sphinxext-opengraph = [ - {file = "sphinxext-opengraph-0.6.2.tar.gz", hash = "sha256:30d4dbe345da991c210626795c05918c3f9ad9f7d14d9c48812ccfa7a1ec4bab"}, - {file = "sphinxext_opengraph-0.6.2-py3-none-any.whl", hash = "sha256:bed3df675b0717b294e274fc59602ee43ccfb758418d5f194d2908c3592605e9"}, + {file = "sphinxext-opengraph-0.6.3.tar.gz", hash = "sha256:cd89e13cc7a44739f81b64ee57c1c20ef0c05dda5d1d8201d31ec2f34e4c29db"}, + {file = "sphinxext_opengraph-0.6.3-py3-none-any.whl", hash = "sha256:bf76017c105856b07edea6caf4942b6ae9bb168585dccfd6dbdb6e4161f6b03a"}, ] sphinxext-rediraffe = [ {file = "sphinxext-rediraffe-0.2.7.tar.gz", hash = "sha256:651dcbfae5ffda9ffd534dfb8025f36120e5efb6ea1a33f5420023862b9f725d"}, From 3c47aae492c89d4f71efc64709f912c4ac6457f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 Apr 2022 07:50:46 -0500 Subject: [PATCH 1073/2998] ci: Remove tox and tox-poetry-installer --- poetry.lock | 642 ++----------------------------------------------- pyproject.toml | 4 +- setup.cfg | 2 +- tox.ini | 21 -- 4 files changed, 16 insertions(+), 653 deletions(-) delete mode 100644 tox.ini diff --git a/poetry.lock b/poetry.lock index c7251000f8..eea7516a30 100644 --- a/poetry.lock +++ b/poetry.lock @@ -85,36 +85,6 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "cachecontrol" -version = "0.12.10" -description = "httplib2 caching for requests" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} -msgpack = ">=0.5.2" -requests = "*" - -[package.extras] -filecache = ["lockfile (>=0.9)"] -redis = ["redis (>=2.10.5)"] - -[[package]] -name = "cachy" -version = "0.3.0" -description = "Cachy provides a simple yet effective caching library." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -redis = ["redis (>=3.3.6,<4.0.0)"] -memcached = ["python-memcached (>=1.59,<2.0)"] -msgpack = ["msgpack-python (>=0.5,<0.6)"] - [[package]] name = "certifi" version = "2021.10.8" @@ -123,17 +93,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "cffi" -version = "1.15.0" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - [[package]] name = "charset-normalizer" version = "2.0.12" @@ -145,17 +104,6 @@ python-versions = ">=3.5.0" [package.extras] unicode_backport = ["unicodedata2"] -[[package]] -name = "cleo" -version = "0.8.1" -description = "Cleo allows you to create beautiful and testable command-line interfaces." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -clikit = ">=0.6.0,<0.7.0" - [[package]] name = "click" version = "8.0.4" @@ -168,19 +116,6 @@ python-versions = ">=3.6" colorama = {version = "*", markers = "platform_system == \"Windows\""} importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -[[package]] -name = "clikit" -version = "0.6.2" -description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -pastel = ">=0.2.0,<0.3.0" -pylev = ">=1.3,<2.0" - [[package]] name = "codecov" version = "2.1.12" @@ -215,41 +150,6 @@ tomli = {version = "*", optional = true, markers = "extra == \"toml\""} [package.extras] toml = ["tomli"] -[[package]] -name = "crashtest" -version = "0.3.1" -description = "Manage Python errors with ease" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "cryptography" -version = "36.0.2" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.12" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] - -[[package]] -name = "distlib" -version = "0.3.4" -description = "Distribution utilities" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "docutils" version = "0.17.1" @@ -258,18 +158,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -[[package]] -name = "filelock" -version = "3.6.0" -description = "A platform independent file lock." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] - [[package]] name = "flake8" version = "4.0.1" @@ -297,24 +185,6 @@ beautifulsoup4 = "*" pygments = ">=2.7,<3.0" sphinx = ">=4.0,<5.0" -[[package]] -name = "html5lib" -version = "1.1" -description = "HTML parser based on the WHATWG HTML specification" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -six = ">=1.9" -webencodings = "*" - -[package.extras] -all = ["genshi", "chardet (>=2.2)", "lxml"] -chardet = ["chardet (>=2.2)"] -genshi = ["genshi"] -lxml = ["lxml"] - [[package]] name = "idna" version = "3.3" @@ -333,18 +203,19 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "1.7.0" +version = "4.2.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -368,18 +239,6 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] -[[package]] -name = "jeepney" -version = "0.7.1" -description = "Low-level, pure Python DBus protocol wrapper." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] - [[package]] name = "jinja2" version = "3.1.1" @@ -405,24 +264,6 @@ python-versions = "*" [package.dependencies] PyYAML = ">=3.13,<6" -[[package]] -name = "keyring" -version = "22.3.0" -description = "Store and access your passwords safely." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] - [[package]] name = "libtmux" version = "0.11.0" @@ -443,14 +284,6 @@ python-versions = "*" six = "*" tornado = {version = "*", markers = "python_version > \"2.7\""} -[[package]] -name = "lockfile" -version = "0.12.2" -description = "Platform-independent file locking module" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "markdown-it-py" version = "2.0.1" @@ -513,14 +346,6 @@ category = "dev" optional = false python-versions = ">=3.6" -[[package]] -name = "msgpack" -version = "1.0.3" -description = "MessagePack (de)serializer." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "mypy-extensions" version = "0.4.3" @@ -554,22 +379,14 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "packaging" -version = "20.9" +version = "21.3" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pathspec" @@ -579,17 +396,6 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] name = "pillow" version = "9.1.0" @@ -602,17 +408,6 @@ python-versions = ">=3.7" docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -[[package]] -name = "pkginfo" -version = "1.8.2" -description = "Query metadatdata from sdists / bdists / installed packages." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -testing = ["coverage", "nose"] - [[package]] name = "platformdirs" version = "2.5.1" @@ -640,52 +435,6 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "poetry" -version = "1.1.13" -description = "Python dependency management and packaging made easy." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -cachy = ">=0.3.0,<0.4.0" -cleo = ">=0.8.1,<0.9.0" -clikit = ">=0.6.2,<0.7.0" -crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -html5lib = ">=1.0,<2.0" -importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} -keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -packaging = ">=20.4,<21.0" -pexpect = ">=4.7.0,<5.0.0" -pkginfo = ">=1.4,<2.0" -poetry-core = ">=1.0.7,<1.1.0" -requests = ">=2.18,<3.0" -requests-toolbelt = ">=0.9.1,<0.10.0" -shellingham = ">=1.1,<2.0" -tomlkit = ">=0.7.0,<1.0.0" -virtualenv = ">=20.0.26,<21.0.0" - -[[package]] -name = "poetry-core" -version = "1.0.8" -description = "Poetry PEP 517 Build Backend" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "py" version = "1.11.0" @@ -702,14 +451,6 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "pyflakes" version = "2.4.0" @@ -726,14 +467,6 @@ category = "dev" optional = false python-versions = ">=3.5" -[[package]] -name = "pylev" -version = "1.4.0" -description = "A pure Python Levenshtein implementation that's not freaking GPL'd." -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyparsing" version = "3.0.7" @@ -826,14 +559,6 @@ category = "dev" optional = false python-versions = "*" -[[package]] -name = "pywin32-ctypes" -version = "0.2.0" -description = "" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "pyyaml" version = "5.4.1" @@ -860,37 +585,6 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] -[[package]] -name = "requests-toolbelt" -version = "0.9.1" -description = "A utility belt for advanced users of python-requests" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "secretstorage" -version = "3.3.1" -description = "Python bindings to FreeDesktop.org Secret Service API" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - -[[package]] -name = "shellingham" -version = "1.4.0" -description = "Tool to Detect Surrounding Shell" -category = "dev" -optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" - [[package]] name = "six" version = "1.16.0" @@ -1129,14 +823,6 @@ python-versions = ">=3.6" [package.dependencies] sphinx = ">=2.0" -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -1145,14 +831,6 @@ category = "dev" optional = false python-versions = ">=3.7" -[[package]] -name = "tomlkit" -version = "0.10.1" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - [[package]] name = "tornado" version = "6.1" @@ -1161,45 +839,6 @@ category = "dev" optional = false python-versions = ">= 3.5" -[[package]] -name = "tox" -version = "3.24.5" -description = "tox is a generic virtualenv management and test command line tool" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} -filelock = ">=3.0.0" -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -packaging = ">=14" -pluggy = ">=0.12.0" -py = ">=1.4.17" -six = ">=1.14.0" -toml = ">=0.9.4" -virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" - -[package.extras] -docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] -testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "psutil (>=5.6.1)", "pathlib2 (>=2.3.3)"] - -[[package]] -name = "tox-poetry-installer" -version = "0.8.3" -description = "A plugin for Tox that lets you install test environment dependencies from the Poetry lockfile" -category = "dev" -optional = false -python-versions = ">=3.6.1,<4.0.0" - -[package.dependencies] -poetry = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"poetry\""} -poetry-core = ">=1.0.0,<2.0.0" -tox = ">=3.8.0,<4.0.0" - -[package.extras] -poetry = ["poetry (>=1.0.0,<2.0.0)"] - [[package]] name = "typed-ast" version = "1.5.2" @@ -1212,7 +851,7 @@ python-versions = ">=3.6" name = "typing-extensions" version = "4.1.1" description = "Backported and Experimental Type Hints for Python 3.6+" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" @@ -1229,25 +868,6 @@ brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -[[package]] -name = "virtualenv" -version = "20.14.0" -description = "Virtual Python Environment builder" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" - -[package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] - [[package]] name = "watchdog" version = "2.1.7" @@ -1259,14 +879,6 @@ python-versions = ">=3.6" [package.extras] watchmedo = ["PyYAML (>=3.10)"] -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "zipp" version = "3.7.0" @@ -1289,7 +901,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "301084095b8b593af4d0924c66952293d05f9dbdb7babda954a5c7344d50b3b6" +content-hash = "2cb759bc5f40eaff068622d4ce864943b845dfadce268d161bd37820d1570767" [metadata.files] aafigure = [ @@ -1341,86 +953,18 @@ black = [ {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, ] -cachecontrol = [ - {file = "CacheControl-0.12.10-py2.py3-none-any.whl", hash = "sha256:b0d43d8f71948ef5ebdee5fe236b86c6ffc7799370453dccb0e894c20dfa487c"}, - {file = "CacheControl-0.12.10.tar.gz", hash = "sha256:d8aca75b82eec92d84b5d6eb8c8f66ea16f09d2adb09dbca27fe2d5fc8d3732d"}, -] -cachy = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] -cffi = [ - {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, - {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, - {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, - {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, - {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, - {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, - {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, - {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, - {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, - {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, - {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, - {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, - {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, - {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, - {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, - {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, - {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, - {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, - {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, - {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, - {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, - {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, - {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, - {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, - {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, - {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, -] charset-normalizer = [ {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] -cleo = [ - {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, - {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, -] click = [ {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, ] -clikit = [ - {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, - {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, -] codecov = [ {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, {file = "codecov-2.1.12-py3.8.egg", hash = "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635"}, @@ -1473,44 +1017,10 @@ coverage = [ {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, ] -crashtest = [ - {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, - {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, -] -cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, -] -distlib = [ - {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, - {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, -] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] -filelock = [ - {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, - {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, -] flake8 = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, @@ -1519,10 +1029,6 @@ furo = [ {file = "furo-2022.3.4-py3-none-any.whl", hash = "sha256:6c718293ebf87755f0b9f148b1e697c9e3aabd7af955644d4bcaee5ce75db781"}, {file = "furo-2022.3.4.tar.gz", hash = "sha256:7660267cc67b2828fd0e17bc07adeb612c47b2eba5a6de07049a1569e6044aa8"}, ] -html5lib = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -1532,8 +1038,8 @@ imagesize = [ {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, ] importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1543,10 +1049,6 @@ isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] -jeepney = [ - {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, - {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, -] jinja2 = [ {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, @@ -1554,10 +1056,6 @@ jinja2 = [ kaptan = [ {file = "kaptan-0.5.12.tar.gz", hash = "sha256:1abd1f56731422fce5af1acc28801677a51e56f5d3c3e8636db761ed143c3dd2"}, ] -keyring = [ - {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, - {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, -] libtmux = [ {file = "libtmux-0.11.0-py3-none-any.whl", hash = "sha256:f2b3fd683cd1bcb416efe311315991e80b6038209b9693b58baff5f0b0ed9a50"}, {file = "libtmux-0.11.0.tar.gz", hash = "sha256:d82cf391097eb69d784d889d482bb99284b984aa6225276a3dc1af8c1460dd3c"}, @@ -1565,10 +1063,6 @@ libtmux = [ livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, ] -lockfile = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] markdown-it-py = [ {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, @@ -1627,42 +1121,6 @@ mdurl = [ {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, ] -msgpack = [ - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079"}, - {file = "msgpack-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147"}, - {file = "msgpack-1.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39"}, - {file = "msgpack-1.0.3-cp310-cp310-win32.whl", hash = "sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85"}, - {file = "msgpack-1.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7"}, - {file = "msgpack-1.0.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec"}, - {file = "msgpack-1.0.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770"}, - {file = "msgpack-1.0.3-cp36-cp36m-win32.whl", hash = "sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9"}, - {file = "msgpack-1.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a"}, - {file = "msgpack-1.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a"}, - {file = "msgpack-1.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920"}, - {file = "msgpack-1.0.3-cp37-cp37m-win32.whl", hash = "sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50"}, - {file = "msgpack-1.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea"}, - {file = "msgpack-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611"}, - {file = "msgpack-1.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1"}, - {file = "msgpack-1.0.3-cp38-cp38-win32.whl", hash = "sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4"}, - {file = "msgpack-1.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3"}, - {file = "msgpack-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996"}, - {file = "msgpack-1.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2"}, - {file = "msgpack-1.0.3-cp39-cp39-win32.whl", hash = "sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88"}, - {file = "msgpack-1.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d"}, - {file = "msgpack-1.0.3.tar.gz", hash = "sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e"}, -] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, @@ -1672,21 +1130,13 @@ myst-parser = [ {file = "myst_parser-0.17.0-py3-none-any.whl", hash = "sha256:555ec2950aba5ae5dac5c162c7e9a43ad4a7291cfac644d8f5f84da8efa6f356"}, ] packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pastel = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] pillow = [ {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, @@ -1727,10 +1177,6 @@ pillow = [ {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, ] -pkginfo = [ - {file = "pkginfo-1.8.2-py2.py3-none-any.whl", hash = "sha256:c24c487c6a7f72c66e816ab1796b96ac6c3d14d49338293d2141664330b55ffc"}, - {file = "pkginfo-1.8.2.tar.gz", hash = "sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff"}, -] platformdirs = [ {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, @@ -1739,18 +1185,6 @@ pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -poetry = [ - {file = "poetry-1.1.13-py2.py3-none-any.whl", hash = "sha256:52deb0792a2e801967ba9c4cdb39b56fe68b0b5cd3f195b004bef603db9d51a7"}, - {file = "poetry-1.1.13.tar.gz", hash = "sha256:b905ed610085f568aa61574e0e09260c02bff9eae12ff672af39e9f399357ac4"}, -] -poetry-core = [ - {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, - {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1759,10 +1193,6 @@ pycodestyle = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] pyflakes = [ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, @@ -1771,10 +1201,6 @@ pygments = [ {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, ] -pylev = [ - {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, - {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, -] pyparsing = [ {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, @@ -1803,10 +1229,6 @@ pytz = [ {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, ] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1842,18 +1264,6 @@ requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, -] -shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, -] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1926,18 +1336,10 @@ sphinxext-rediraffe = [ {file = "sphinxext-rediraffe-0.2.7.tar.gz", hash = "sha256:651dcbfae5ffda9ffd534dfb8025f36120e5efb6ea1a33f5420023862b9f725d"}, {file = "sphinxext_rediraffe-0.2.7-py3-none-any.whl", hash = "sha256:9e430a52d4403847f4ffb3a8dd6dfc34a9fe43525305131f52ed899743a5fd8c"}, ] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -tomlkit = [ - {file = "tomlkit-0.10.1-py3-none-any.whl", hash = "sha256:3eba517439dcb2f84cf39f4f85fd2c3398309823a3c75ac3e73003638daf7915"}, - {file = "tomlkit-0.10.1.tar.gz", hash = "sha256:3c517894eadef53e9072d343d37e4427b8f0b6200a70b7c9a19b2ebd1f53b951"}, -] tornado = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, @@ -1981,14 +1383,6 @@ tornado = [ {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] -tox = [ - {file = "tox-3.24.5-py2.py3-none-any.whl", hash = "sha256:be3362472a33094bce26727f5f771ca0facf6dafa217f65875314e9a6600c95c"}, - {file = "tox-3.24.5.tar.gz", hash = "sha256:67e0e32c90e278251fea45b696d0fef3879089ccbe979b0c556d35d5a70e2993"}, -] -tox-poetry-installer = [ - {file = "tox-poetry-installer-0.8.3.tar.gz", hash = "sha256:04b6c7d368b67ef3cc4409e275b26eef3564a6487259bd9cc671587f5aaf4b4f"}, - {file = "tox_poetry_installer-0.8.3-py3-none-any.whl", hash = "sha256:4cefad997ef5b8533811ceb5308b5cb6e6d6997af377c0b7d03b2dd43179c235"}, -] typed-ast = [ {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, @@ -2023,10 +1417,6 @@ urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] -virtualenv = [ - {file = "virtualenv-20.14.0-py2.py3-none-any.whl", hash = "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66"}, - {file = "virtualenv-20.14.0.tar.gz", hash = "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"}, -] watchdog = [ {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, @@ -2053,10 +1443,6 @@ watchdog = [ {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, ] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] zipp = [ {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, diff --git a/pyproject.toml b/pyproject.toml index e7d77e1fc8..a5be3b5af9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,8 +73,6 @@ pytest-rerunfailures = "*" pytest-mock = "*" pytest-cov = "*" pytest-watcher = "^0.2.3" -tox = {version = "^3.24.5", extras = ["test"]} -tox-poetry-installer = {extras = ["poetry"], version = "^0.8.3"} ### Coverage ### codecov = "*" @@ -89,7 +87,7 @@ flake8 = "*" [tool.poetry.extras] docs = ["sphinx", "sphinx-issues", "sphinx-click", "sphinx-autodoc-typehints", "sphinx-autobuild", "sphinx-copybutton", "sphinxext-opengraph", "sphinx-inline-tabs", "sphinxext-rediraffe", "myst_parser", "furo", "aafigure", "pillow"] -test = ["pytest", "pytest-rerunfailures", "pytest-mock", "pytest-watcher", "tox", "tox-poetry-installer"] +test = ["pytest", "pytest-rerunfailures", "pytest-mock", "pytest-watcher"] coverage = ["codecov", "coverage", "pytest-cov"] format = ["black", "isort"] lint = ["flake8"] diff --git a/setup.cfg b/setup.cfg index c271bb3b4f..d77dcccfba 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [flake8] -exclude = .*/,.tox,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, +exclude = .*/,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N max-line-length = 88 # Stuff we ignore thanks to black: https://github.com/ambv/black/issues/429 diff --git a/tox.ini b/tox.ini deleted file mode 100644 index fde499fb2e..0000000000 --- a/tox.ini +++ /dev/null @@ -1,21 +0,0 @@ -[tox] -isolated_build = True -envlist = py37, py38, py39, py310 -skip_missing_interpreters = true - -[testenv] -extras = - test - docs -allowlist_externals = - make - poetry -require_poetry = true -install_dev_deps = true -locked_deps = - pytest - pytest-cov -commands = - make test test='{posargs}' -setenv = - PYTHONPATH = {toxinidir} From f25bce21c975f636ee1fd81315bd4a54a2a3d308 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 Apr 2022 07:52:54 -0500 Subject: [PATCH 1074/2998] docs(CHANGES): Note removal of tox --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 7e29cc54b2..4b74563bdd 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,12 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - {issue}`762`: CLI: Break up into modules in _cli.py_ -> _cli/{command}_ - {issue}`761`: Refactor _tests/_ constants and fixtures +### Development + +- Remove tox and tox-poetry-installer + + This created issues with running poetry while inside the virtualenv. + ## tmuxp 1.10.0 (2022-03-19) ### Compatibility From 07f093200d269aa5ac53c21f0d0aaca9298d430a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 Apr 2022 08:40:41 -0500 Subject: [PATCH 1075/2998] ci(pre-commit): Update black to fix click issue --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8d9013686c..db0347ee15 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/psf/black - rev: 22.1.0 + rev: 22.3.0 hooks: - id: black language_version: python3.10 From 17aff2ba066bd601e42e81dc2a818753e52c7522 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 7 Apr 2022 17:37:32 -0500 Subject: [PATCH 1076/2998] build(deps): furo 2022.3.4 -> 2022.4.8, sphinx-click 3.1.0 -> 4.0.0, black, etc --- poetry.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/poetry.lock b/poetry.lock index eea7516a30..bf34322982 100644 --- a/poetry.lock +++ b/poetry.lock @@ -174,7 +174,7 @@ pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "furo" -version = "2022.3.4" +version = "2022.4.7" description = "A clean customisable Sphinx documentation theme." category = "dev" optional = false @@ -603,7 +603,7 @@ python-versions = "*" [[package]] name = "soupsieve" -version = "2.3.1" +version = "2.3.2" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false @@ -673,11 +673,11 @@ type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinx-click" -version = "3.1.0" +version = "4.0.0" description = "Sphinx extension that automatically documents click applications" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] click = ">=7.0" @@ -881,15 +881,15 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "zipp" -version = "3.7.0" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [extras] coverage = [] @@ -1026,8 +1026,8 @@ flake8 = [ {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] furo = [ - {file = "furo-2022.3.4-py3-none-any.whl", hash = "sha256:6c718293ebf87755f0b9f148b1e697c9e3aabd7af955644d4bcaee5ce75db781"}, - {file = "furo-2022.3.4.tar.gz", hash = "sha256:7660267cc67b2828fd0e17bc07adeb612c47b2eba5a6de07049a1569e6044aa8"}, + {file = "furo-2022.4.7-py3-none-any.whl", hash = "sha256:7f3e3d2fb977483590f8ecb2c2cd511bd82661b79c18efb24de9558bc9cdf2d7"}, + {file = "furo-2022.4.7.tar.gz", hash = "sha256:96204ab7cd047e4b6c523996e0279c4c629a8fc31f4f109b2efd470c17f49c80"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, @@ -1273,8 +1273,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] soupsieve = [ - {file = "soupsieve-2.3.1-py3-none-any.whl", hash = "sha256:1a3cca2617c6b38c0343ed661b1fa5de5637f257d4fe22bd9f1338010a1efefb"}, - {file = "soupsieve-2.3.1.tar.gz", hash = "sha256:b8d49b1cd4f037c7082a9683dfa1801aa2597fb11c3a1155b7a5b94829b4f1f9"}, + {file = "soupsieve-2.3.2-py3-none-any.whl", hash = "sha256:a714129d3021ec17ce5be346b1007300558b378332c289a1a20e7d4de6ff18a5"}, + {file = "soupsieve-2.3.2.tar.gz", hash = "sha256:0bcc6d7432153063e3df09c3ac9442af3eba488715bfcad6a4c38ccb2a523124"}, ] sphinx = [ {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, @@ -1289,8 +1289,8 @@ sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, ] sphinx-click = [ - {file = "sphinx-click-3.1.0.tar.gz", hash = "sha256:36dbf271b1d2600fb05bd598ddeed0b6b6acf35beaf8bc9d507ba7716b232b0e"}, - {file = "sphinx_click-3.1.0-py3-none-any.whl", hash = "sha256:8fb0b048a577d346d741782e44d041d7e908922858273d99746f305870116121"}, + {file = "sphinx-click-4.0.0.tar.gz", hash = "sha256:3650d80994d157b1dc18e62fefd4e93511178f9ce9d8afd80627b1b3e0210cab"}, + {file = "sphinx_click-4.0.0-py3-none-any.whl", hash = "sha256:78b78d274e32ac663693c0af4e47d3254f4a5c41fef53ace6b443d9d0a3b0631"}, ] sphinx-copybutton = [ {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"}, @@ -1444,6 +1444,6 @@ watchdog = [ {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, ] zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] From d8dc23b5e10f25139d653ac0965fac4739e3c8b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 8 Apr 2022 04:53:05 -0500 Subject: [PATCH 1077/2998] build(deps): Loosen package restrictions --- poetry.lock | 10 +++++----- pyproject.toml | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/poetry.lock b/poetry.lock index bf34322982..972a9aea8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -49,11 +49,11 @@ pytz = ">=2015.7" [[package]] name = "beautifulsoup4" -version = "4.10.0" +version = "4.11.0" description = "Screen-scraping library" category = "dev" optional = false -python-versions = ">3.0.0" +python-versions = ">=3.6.0" [package.dependencies] soupsieve = ">1.2" @@ -901,7 +901,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "2cb759bc5f40eaff068622d4ce864943b845dfadce268d161bd37820d1570767" +content-hash = "6a4ca5cf543d80c95fc29e8dec68896509e4b4ec118fbd098add7023013d3a17" [metadata.files] aafigure = [ @@ -925,8 +925,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] beautifulsoup4 = [ - {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, - {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, + {file = "beautifulsoup4-4.11.0-py3-none-any.whl", hash = "sha256:577b9e1c36d2ada780d807c5622e889d43172466658c2eb239e97296965cdddb"}, + {file = "beautifulsoup4-4.11.0.tar.gz", hash = "sha256:ac98f868e1cb8eb9932a61be75b4f7018a118a490e7fdb424a74a982430cfcbd"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, diff --git a/pyproject.toml b/pyproject.toml index a5be3b5af9..5634361989 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,16 +56,16 @@ colorama = ">=0.3.9" sphinx = "*" aafigure = ">=0.6" pillow = "*" -furo = "^2022.2.23" -sphinx-autobuild = "^2021.3.14" -sphinx-autodoc-typehints = "~1.17.0" +furo = "*" +sphinx-autobuild = "*" +sphinx-autodoc-typehints = "*" sphinx-click = "*" -sphinx-issues = "^3.0.0" -sphinx-inline-tabs = { version = "*", python = "^3.7" } +sphinx-issues = "*" +sphinx-inline-tabs = "*" sphinxext-opengraph = "*" -sphinx-copybutton = "^0.5.0" +sphinx-copybutton = "*" sphinxext-rediraffe = "*" -myst_parser = "~0.17.0" +myst_parser = "*" ### Testing ### pytest = "*" From 632660288ced742c8557e591e5ae2823f34b266b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Apr 2022 04:54:51 -0500 Subject: [PATCH 1078/2998] feat(version): Show libtmux version --- tmuxp/cli/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli/__init__.py b/tmuxp/cli/__init__.py index ab09f1ec6e..010e21a6f6 100644 --- a/tmuxp/cli/__init__.py +++ b/tmuxp/cli/__init__.py @@ -10,6 +10,7 @@ import click +from libtmux.__about__ import __version__ as libtmux_version from libtmux.common import has_minimum_version from libtmux.exc import TmuxCommandNotFound from tmuxp.cli.ls import command_ls @@ -30,7 +31,12 @@ @click.group(context_settings={"obj": {}, "help_option_names": ["-h", "--help"]}) -@click.version_option(__version__, "-V", "--version", message="%(prog)s %(version)s") +@click.version_option( + __version__, + "-V", + "--version", + message=f"%(prog)s %(version)s, libtmux {libtmux_version}", +) @click.option( "--log-level", default="INFO", From 6fca207150af2d040630e9472996db357f28ed92 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Apr 2022 04:55:22 -0500 Subject: [PATCH 1079/2998] docs(CHANGES): Note --version update --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 4b74563bdd..9968ad5403 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,7 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - {issue}`762`: CLI: Break up into modules in _cli.py_ -> _cli/{command}_ - {issue}`761`: Refactor _tests/_ constants and fixtures +- Show libtmux version with `-V` / `--version` ### Development From 17480080a1f9efce7535b8c99b555273d2f9d18d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 Apr 2022 05:07:20 -0500 Subject: [PATCH 1080/2998] build(deps): Update pyparsing and bs4 (inner deps) --- poetry.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 972a9aea8a..f34f8e3039 100644 --- a/poetry.lock +++ b/poetry.lock @@ -49,7 +49,7 @@ pytz = ">=2015.7" [[package]] name = "beautifulsoup4" -version = "4.11.0" +version = "4.11.1" description = "Screen-scraping library" category = "dev" optional = false @@ -469,14 +469,14 @@ python-versions = ">=3.5" [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" @@ -925,8 +925,8 @@ babel = [ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, ] beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.0-py3-none-any.whl", hash = "sha256:577b9e1c36d2ada780d807c5622e889d43172466658c2eb239e97296965cdddb"}, - {file = "beautifulsoup4-4.11.0.tar.gz", hash = "sha256:ac98f868e1cb8eb9932a61be75b4f7018a118a490e7fdb424a74a982430cfcbd"}, + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, ] black = [ {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, @@ -1202,8 +1202,8 @@ pygments = [ {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pytest = [ {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, From f939ddc459593ff127db3337bfd6552552abcb68 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 12 Apr 2022 17:04:39 -0500 Subject: [PATCH 1081/2998] build(docs): Bump sphinx-(autodoc-typehints,click) --- poetry.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index f34f8e3039..9725551201 100644 --- a/poetry.lock +++ b/poetry.lock @@ -340,11 +340,11 @@ testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] name = "mdurl" -version = "0.1.0" +version = "0.1.1" description = "Markdown URL utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "mypy-extensions" @@ -658,7 +658,7 @@ test = ["pytest", "pytest-cov"] [[package]] name = "sphinx-autodoc-typehints" -version = "1.17.0" +version = "1.17.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" category = "dev" optional = false @@ -668,12 +668,12 @@ python-versions = ">=3.7" Sphinx = ">=4" [package.extras] -testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] +testing = ["covdefaults (>=2)", "coverage (>=6)", "diff-cover (>=6.4)", "nptyping (>=1,<2)", "pytest (>=6)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=3.5)"] type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinx-click" -version = "4.0.0" +version = "4.0.1" description = "Sphinx extension that automatically documents click applications" category = "dev" optional = false @@ -1118,8 +1118,8 @@ mdit-py-plugins = [ {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, ] mdurl = [ - {file = "mdurl-0.1.0-py3-none-any.whl", hash = "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda"}, - {file = "mdurl-0.1.0.tar.gz", hash = "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"}, + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1285,12 +1285,12 @@ sphinx-autobuild = [ {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, ] sphinx-autodoc-typehints = [ - {file = "sphinx_autodoc_typehints-1.17.0-py3-none-any.whl", hash = "sha256:081daf53077b4ae1c28347d6d858e13e63aefe3b4aacef79fd717dd60687b470"}, - {file = "sphinx_autodoc_typehints-1.17.0.tar.gz", hash = "sha256:51c7b3f5cb9ccd15d0b52088c62df3094f1abd9612930340365c26def8629a14"}, + {file = "sphinx_autodoc_typehints-1.17.1-py3-none-any.whl", hash = "sha256:f16491cad05a13f4825ecdf9ee4ff02925d9a3b1cf103d4d02f2f81802cce653"}, + {file = "sphinx_autodoc_typehints-1.17.1.tar.gz", hash = "sha256:844d7237d3f6280b0416f5375d9556cfd84df1945356fcc34b82e8aaacab40f3"}, ] sphinx-click = [ - {file = "sphinx-click-4.0.0.tar.gz", hash = "sha256:3650d80994d157b1dc18e62fefd4e93511178f9ce9d8afd80627b1b3e0210cab"}, - {file = "sphinx_click-4.0.0-py3-none-any.whl", hash = "sha256:78b78d274e32ac663693c0af4e47d3254f4a5c41fef53ace6b443d9d0a3b0631"}, + {file = "sphinx-click-4.0.1.tar.gz", hash = "sha256:6d0bc3de8b77a1e7623061d1f1b4fcb3ba4af0471a14c5f3f40d9852156163f9"}, + {file = "sphinx_click-4.0.1-py3-none-any.whl", hash = "sha256:7569b9eec0102344a4f9fa18b1d916624ab71a47a95d2ef6113b5b7f9402bc2b"}, ] sphinx-copybutton = [ {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"}, From d6de242f89757259b184c0ec606d75262a65ef7b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 14 Apr 2022 19:23:56 -0500 Subject: [PATCH 1082/2998] build(deps): bump soupsieve, sphinx-click --- poetry.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9725551201..beea9831c8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -603,7 +603,7 @@ python-versions = "*" [[package]] name = "soupsieve" -version = "2.3.2" +version = "2.3.2.post1" description = "A modern CSS selector implementation for Beautiful Soup." category = "dev" optional = false @@ -673,7 +673,7 @@ type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinx-click" -version = "4.0.1" +version = "4.0.2" description = "Sphinx extension that automatically documents click applications" category = "dev" optional = false @@ -1273,8 +1273,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] soupsieve = [ - {file = "soupsieve-2.3.2-py3-none-any.whl", hash = "sha256:a714129d3021ec17ce5be346b1007300558b378332c289a1a20e7d4de6ff18a5"}, - {file = "soupsieve-2.3.2.tar.gz", hash = "sha256:0bcc6d7432153063e3df09c3ac9442af3eba488715bfcad6a4c38ccb2a523124"}, + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, ] sphinx = [ {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, @@ -1289,8 +1289,8 @@ sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.17.1.tar.gz", hash = "sha256:844d7237d3f6280b0416f5375d9556cfd84df1945356fcc34b82e8aaacab40f3"}, ] sphinx-click = [ - {file = "sphinx-click-4.0.1.tar.gz", hash = "sha256:6d0bc3de8b77a1e7623061d1f1b4fcb3ba4af0471a14c5f3f40d9852156163f9"}, - {file = "sphinx_click-4.0.1-py3-none-any.whl", hash = "sha256:7569b9eec0102344a4f9fa18b1d916624ab71a47a95d2ef6113b5b7f9402bc2b"}, + {file = "sphinx-click-4.0.2.tar.gz", hash = "sha256:abdaae87da5280607f0df35e01a78625f5c858ba0d1a5a553d0a803d87a88bba"}, + {file = "sphinx_click-4.0.2-py3-none-any.whl", hash = "sha256:0a158612397e094e4537a381e101f8d44acb794885ba614a804b548d62570bab"}, ] sphinx-copybutton = [ {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"}, From 01fe44c256b291401792e0d209b9952ea7b84253 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 04:09:03 -0500 Subject: [PATCH 1083/2998] build(deps): bump typed-ast, markdown-it-py --- poetry.lock | 74 ++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/poetry.lock b/poetry.lock index beea9831c8..997f56c717 100644 --- a/poetry.lock +++ b/poetry.lock @@ -286,24 +286,24 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] name = "markdown-it-py" -version = "2.0.1" +version = "2.1.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false -python-versions = "~=3.6" +python-versions = ">=3.7" [package.dependencies] -attrs = ">=19,<22" mdurl = ">=0.1,<1.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} +typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.2.2,<3.3.0)", "mistletoe-ebp (>=0.10.0,<0.11.0)", "mistune (>=0.8.4,<0.9.0)", "panflute (>=1.12,<2.0)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] plugins = ["mdit-py-plugins"] -rtd = ["myst-nb (==0.13.0a1)", "pyyaml", "sphinx (>=2,<4)", "sphinx-copybutton", "sphinx-panels (>=0.4.0,<0.5.0)", "sphinx-book-theme"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -356,7 +356,7 @@ python-versions = "*" [[package]] name = "myst-parser" -version = "0.17.0" +version = "0.17.2" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." category = "dev" optional = false @@ -374,7 +374,7 @@ typing-extensions = "*" [package.extras] code_style = ["pre-commit (>=2.12,<3.0)"] linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme (>=0.1.0,<0.2.0)", "sphinx-panels (>=0.5.2,<0.6.0)", "sphinxcontrib-bibtex (>=2.1,<3.0)", "sphinxext-rediraffe (>=0.2,<1.0)", "sphinxcontrib.mermaid (>=0.6.3,<0.7.0)", "sphinxext-opengraph (>=0.4.2,<0.5.0)"] +rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)"] testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] @@ -841,7 +841,7 @@ python-versions = ">= 3.5" [[package]] name = "typed-ast" -version = "1.5.2" +version = "1.5.3" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -1064,8 +1064,8 @@ livereload = [ {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, ] markdown-it-py = [ - {file = "markdown-it-py-2.0.1.tar.gz", hash = "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"}, - {file = "markdown_it_py-2.0.1-py3-none-any.whl", hash = "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd"}, + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, ] markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, @@ -1126,8 +1126,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] myst-parser = [ - {file = "myst-parser-0.17.0.tar.gz", hash = "sha256:d412347a5cacb77ebc03d7f7ffef050cd61957d46f234313d350e84e24972260"}, - {file = "myst_parser-0.17.0-py3-none-any.whl", hash = "sha256:555ec2950aba5ae5dac5c162c7e9a43ad4a7291cfac644d8f5f84da8efa6f356"}, + {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, + {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1384,30 +1384,30 @@ tornado = [ {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] typed-ast = [ - {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"}, - {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"}, - {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"}, - {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"}, - {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"}, - {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"}, - {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"}, - {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"}, - {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"}, - {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"}, - {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"}, - {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"}, - {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"}, - {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"}, - {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"}, - {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"}, - {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"}, - {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"}, - {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"}, - {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"}, - {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"}, - {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"}, - {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"}, - {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"}, + {file = "typed_ast-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ad3b48cf2b487be140072fb86feff36801487d4abb7382bb1929aaac80638ea"}, + {file = "typed_ast-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:542cd732351ba8235f20faa0fc7398946fe1a57f2cdb289e5497e1e7f48cfedb"}, + {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc2c11ae59003d4a26dda637222d9ae924387f96acae9492df663843aefad55"}, + {file = "typed_ast-1.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd5df1313915dbd70eaaa88c19030b441742e8b05e6103c631c83b75e0435ccc"}, + {file = "typed_ast-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:e34f9b9e61333ecb0f7d79c21c28aa5cd63bec15cb7e1310d7d3da6ce886bc9b"}, + {file = "typed_ast-1.5.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f818c5b81966d4728fec14caa338e30a70dfc3da577984d38f97816c4b3071ec"}, + {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3042bfc9ca118712c9809201f55355479cfcdc17449f9f8db5e744e9625c6805"}, + {file = "typed_ast-1.5.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fff9fdcce59dc61ec1b317bdb319f8f4e6b69ebbe61193ae0a60c5f9333dc49"}, + {file = "typed_ast-1.5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8e0b8528838ffd426fea8d18bde4c73bcb4167218998cc8b9ee0a0f2bfe678a6"}, + {file = "typed_ast-1.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ef1d96ad05a291f5c36895d86d1375c0ee70595b90f6bb5f5fdbee749b146db"}, + {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed44e81517364cb5ba367e4f68fca01fba42a7a4690d40c07886586ac267d9b9"}, + {file = "typed_ast-1.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f60d9de0d087454c91b3999a296d0c4558c1666771e3460621875021bf899af9"}, + {file = "typed_ast-1.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9e237e74fd321a55c90eee9bc5d44be976979ad38a29bbd734148295c1ce7617"}, + {file = "typed_ast-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee852185964744987609b40aee1d2eb81502ae63ee8eef614558f96a56c1902d"}, + {file = "typed_ast-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27e46cdd01d6c3a0dd8f728b6a938a6751f7bd324817501c15fb056307f918c6"}, + {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d64dabc6336ddc10373922a146fa2256043b3b43e61f28961caec2a5207c56d5"}, + {file = "typed_ast-1.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8cdf91b0c466a6c43f36c1964772918a2c04cfa83df8001ff32a89e357f8eb06"}, + {file = "typed_ast-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:9cc9e1457e1feb06b075c8ef8aeb046a28ec351b1958b42c7c31c989c841403a"}, + {file = "typed_ast-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e20d196815eeffb3d76b75223e8ffed124e65ee62097e4e73afb5fec6b993e7a"}, + {file = "typed_ast-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37e5349d1d5de2f4763d534ccb26809d1c24b180a477659a12c4bde9dd677d74"}, + {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f1a27592fac87daa4e3f16538713d705599b0a27dfe25518b80b6b017f0a6d"}, + {file = "typed_ast-1.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8831479695eadc8b5ffed06fdfb3e424adc37962a75925668deeb503f446c0a3"}, + {file = "typed_ast-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:20d5118e494478ef2d3a2702d964dae830aedd7b4d3b626d003eea526be18718"}, + {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, ] typing-extensions = [ {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, From 4af083b9fd5aea70ad448c6ff96c6d9c206be724 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 10:07:12 -0500 Subject: [PATCH 1084/2998] build(deps): Allow click 8.1 (#773) See also: https://click.palletsprojects.com/en/8.1.x/changes/#version-8-1-2 --- poetry.lock | 10 +++++----- pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 997f56c717..cbd3013d89 100644 --- a/poetry.lock +++ b/poetry.lock @@ -106,11 +106,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.2" description = "Composable command line interface toolkit" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -901,7 +901,7 @@ test = [] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "6a4ca5cf543d80c95fc29e8dec68896509e4b4ec118fbd098add7023013d3a17" +content-hash = "bb391a5a4863f5a7f6377a3477c02921b639961e4cda0688b76308d660c53f6e" [metadata.files] aafigure = [ @@ -962,8 +962,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, + {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, ] codecov = [ {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, diff --git a/pyproject.toml b/pyproject.toml index 5634361989..f6f2054436 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ tmuxp = 'tmuxp:cli.cli' [tool.poetry.dependencies] python = "^3.7" -click = ">7,<8.1" +click = ">7,<8.2" kaptan = ">=0.5.10" libtmux = "~0.11.0" colorama = ">=0.3.9" From a895bcd51cd2879d7e1b52e1da717e00ad16d42c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 10:08:53 -0500 Subject: [PATCH 1085/2998] CHANGES(docs): Note click update --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 9968ad5403..8be25d8ccc 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,10 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - _Insert changes/features/fixes for next release here_ +### Compatibility + +- {issue}`#372`: Allow click 8.1.x + ### Maintenance - {issue}`762`: CLI: Break up into modules in _cli.py_ -> _cli/{command}_ From 5abaf169539b619a1ecdb133d94adc88989c6dbb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 10:19:53 -0500 Subject: [PATCH 1086/2998] docs(CHANGES): Note v1.10.1 --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 8be25d8ccc..6144038821 100644 --- a/CHANGES +++ b/CHANGES @@ -35,6 +35,12 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force This created issues with running poetry while inside the virtualenv. +## tmuxp 1.10.1 (2022-04-17) + +### Compatibility + +- {issue}`#372` (backport): Allow click 8.1.x + ## tmuxp 1.10.0 (2022-03-19) ### Compatibility From 7228311a5efd58b54ec01b36aca637454e2dc448 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 10:22:18 -0500 Subject: [PATCH 1087/2998] Tag v1.11.0b2 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f6f2054436..53c6cc3981 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.11.0b1" +version = "1.11.0b2" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 1dfdefbd71..5aa6ca574d 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.11.0b1" +__version__ = "1.11.0b2" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From ed0aea76e01225feab61ba46cbc84b3fdec6d158 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 13:58:34 -0500 Subject: [PATCH 1088/2998] ci(docs): Update action packages --- .github/workflows/docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index b6132772f3..17ae1a39f5 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,7 +13,7 @@ jobs: matrix: python-version: [ '3.10' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Filter changed file paths to outputs uses: dorny/paths-filter@v2.7.0 id: changes @@ -35,7 +35,7 @@ jobs: run: echo "PUBLISH=$(echo true)" >> $GITHUB_ENV - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} @@ -68,7 +68,7 @@ jobs: run: poetry config virtualenvs.in-project true - name: Set up cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: cache with: path: | From 8c45928b68dbd20edaf77296cf68172d4d977de3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 13:59:09 -0500 Subject: [PATCH 1089/2998] ci(tests): Update action packages --- .github/workflows/tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fcf8bd1607..5e6fb1d6c7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,10 +19,10 @@ jobs: - python-version: '3.7' tmux-version: 'master' steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} @@ -51,7 +51,7 @@ jobs: run: poetry config virtualenvs.in-project true - name: Set up poetry cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: cache with: path: | @@ -67,7 +67,7 @@ jobs: - name: Setup tmux build cache for tmux ${{ matrix.tmux-version }} id: tmux-build-cache - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/tmux-builds/tmux-${{ matrix.tmux-version }} key: tmux-${{ matrix.tmux-version }} @@ -100,6 +100,6 @@ jobs: ls $HOME/tmux-builds/tmux-${{ matrix.tmux-version }}/bin tmux -V poetry run py.test --cov=./ --cov-report=xml - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v2 with: token: ${{ secrets.CODECOV_TOKEN }} From 62fd5b4f2082c4adcbd70c04ee62b7a5ce22b268 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 Apr 2022 13:59:55 -0500 Subject: [PATCH 1090/2998] ci(tests): Publish to PyPI --- .github/workflows/tests.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5e6fb1d6c7..a3f3b31b74 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -103,3 +103,15 @@ jobs: - uses: codecov/codecov-action@v2 with: token: ${{ secrets.CODECOV_TOKEN }} + + - name: Build package + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + run: poetry build + + - name: Publish package + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + skip_existing: true From 781877911e295b9224b874a4ee3393e7de65a35f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 19 Apr 2022 05:38:08 -0500 Subject: [PATCH 1091/2998] build(deps): Update platformdirs, typing-extensions --- poetry.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index cbd3013d89..303abb292a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -410,15 +410,15 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -849,11 +849,11 @@ python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" @@ -1178,8 +1178,8 @@ pillow = [ {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, ] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, @@ -1410,8 +1410,8 @@ typed-ast = [ {file = "typed_ast-1.5.3.tar.gz", hash = "sha256:27f25232e2dd0edfe1f019d6bfaaf11e86e657d9bdb7b0956db95f560cceb2b3"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, From 327f4e668282aba24689a9f4eda2ba2b1ddc63ff Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 20 Apr 2022 04:10:02 -0500 Subject: [PATCH 1092/2998] build(deps): Update sphinx-click to 4.0.3 --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 303abb292a..2bd5601cdd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -673,7 +673,7 @@ type_comments = ["typed-ast (>=1.4.0)"] [[package]] name = "sphinx-click" -version = "4.0.2" +version = "4.0.3" description = "Sphinx extension that automatically documents click applications" category = "dev" optional = false @@ -1289,8 +1289,8 @@ sphinx-autodoc-typehints = [ {file = "sphinx_autodoc_typehints-1.17.1.tar.gz", hash = "sha256:844d7237d3f6280b0416f5375d9556cfd84df1945356fcc34b82e8aaacab40f3"}, ] sphinx-click = [ - {file = "sphinx-click-4.0.2.tar.gz", hash = "sha256:abdaae87da5280607f0df35e01a78625f5c858ba0d1a5a553d0a803d87a88bba"}, - {file = "sphinx_click-4.0.2-py3-none-any.whl", hash = "sha256:0a158612397e094e4537a381e101f8d44acb794885ba614a804b548d62570bab"}, + {file = "sphinx-click-4.0.3.tar.gz", hash = "sha256:a1aacf00cfe11550a2211014617c426a94af8638f1ce735b5d9998cccf1a1edb"}, + {file = "sphinx_click-4.0.3-py3-none-any.whl", hash = "sha256:4c4b43386ff6304e47ae0467da9c980786eb3c1317cd6f488524c18931627c04"}, ] sphinx-copybutton = [ {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"}, From 81325ec49a69e49a83376c25e76eb595e711edd6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 27 Mar 2022 13:41:48 -0500 Subject: [PATCH 1093/2998] ci(flake8): Up ignore --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d77dcccfba..cab5f59536 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ exclude = .*/,*.egg,tmuxp/_compat.py,tmuxp/__*__.py, select = E,W,F,N max-line-length = 88 # Stuff we ignore thanks to black: https://github.com/ambv/black/issues/429 -extend-ignore = E203 +extend-ignore = E203,W503 [tool:pytest] addopts = --reruns=0 From e1f8874e3ef839721cc650ddbc08193b704a34f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 14:16:43 -0500 Subject: [PATCH 1094/2998] build(deps): babel, pytest, pygments --- poetry.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2bd5601cdd..34fe7ea8ef 100644 --- a/poetry.lock +++ b/poetry.lock @@ -38,11 +38,11 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "babel" -version = "2.9.1" +version = "2.10.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pytz = ">=2015.7" @@ -461,11 +461,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pyparsing" @@ -480,7 +480,7 @@ diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pytest" -version = "7.1.1" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -921,8 +921,8 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, + {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, + {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, ] beautifulsoup4 = [ {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, @@ -1198,16 +1198,16 @@ pyflakes = [ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pyparsing = [ {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pytest = [ - {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, - {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, From 1ce5ad632bb7d816fffa023df1fc4360bdf495cd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 20 Mar 2022 17:15:08 -0500 Subject: [PATCH 1095/2998] feat(cli): Basic project-based shell completion --- tmuxp/cli/load.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/tmuxp/cli/load.py b/tmuxp/cli/load.py index d159c63d1a..1e8149edb7 100644 --- a/tmuxp/cli/load.py +++ b/tmuxp/cli/load.py @@ -7,7 +7,9 @@ import importlib import logging import os +import pathlib import sys +from typing import List import click import kaptan @@ -17,7 +19,7 @@ from .. import config, exc, log, util from ..workspacebuilder import WorkspaceBuilder -from .utils import ConfigPath, _validate_choices, tmuxp_echo +from .utils import ConfigPath, _validate_choices, get_config_dir, tmuxp_echo def set_layout_hook(session, hook_name): @@ -438,9 +440,38 @@ def load_workspace( return _setup_plugins(builder) +def config_file_completion(ctx, params, incomplete): + config_dir = pathlib.Path(get_config_dir()) + choices: List[pathlib.Path] = [] + + # CWD Paths + choices += sorted( + [ + pathlib.Path(os.path.relpath(p, pathlib.Path.cwd())) + for p in [pathlib.Path.cwd(), *pathlib.Path.cwd().parents] + if config.in_dir(str(p)) or len(list(p.glob(".tmuxp.*"))) + ] + ) + # CWD look one directory up + choices += [ + pathlib.Path(f"./{os.path.relpath(p, pathlib.Path.cwd())}") + for p in pathlib.Path.cwd().glob("*/.tmuxp.*") + ] + + # Project configs + choices += sorted([(config_dir / c).stem for c in config.in_dir(str(config_dir))]) + + return sorted([str(c) for c in choices if str(c).startswith(incomplete)]) + + @click.command(name="load", short_help="Load tmuxp workspaces.") @click.pass_context -@click.argument("config", type=ConfigPath(exists=True), nargs=-1) +@click.argument( + "config", + type=ConfigPath(exists=True), + nargs=-1, + shell_complete=config_file_completion, +) @click.option("-S", "socket_path", help="pass-through for tmux -S") @click.option("-L", "socket_name", help="pass-through for tmux -L") @click.option("-f", "tmux_config_file", help="pass-through for tmux -f") From 8cccb8b73655a7613e4809d717346f47299508a4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 20 Apr 2022 05:01:21 -0500 Subject: [PATCH 1096/2998] feat(freeze): tmuxp freeze --- tmuxp/cli/freeze.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tmuxp/cli/freeze.py b/tmuxp/cli/freeze.py index 343228873c..54afda8786 100644 --- a/tmuxp/cli/freeze.py +++ b/tmuxp/cli/freeze.py @@ -12,8 +12,16 @@ from .utils import _validate_choices, get_abs_path, get_config_dir +def session_completion(ctx, params, incomplete): + t = Server() + choices = [session.name for session in t.list_sessions()] + return sorted([str(c) for c in choices if str(c).startswith(incomplete)]) + + @click.command(name="freeze") -@click.argument("session_name", nargs=1, required=False) +@click.argument( + "session_name", nargs=1, required=False, shell_complete=session_completion +) @click.option("-S", "socket_path", help="pass-through for tmux -S") @click.option("-L", "socket_name", help="pass-through for tmux -L") @click.option( From fd53775567732cb5eff160f4a735c693bda9d71d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 16:07:16 -0500 Subject: [PATCH 1097/2998] docs(CHANGES): Note shell completions --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 6144038821..c6d33e7ff4 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,8 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force ### Compatibility - {issue}`#372`: Allow click 8.1.x +- {issue}`#770`: Fix shell completion for `tmuxp load` {kbd}`tab` and `tmuxp freeze` + {kbd}`tab` ### Maintenance From db77ccc62f516724580110c29a6a6f7d2888fa5e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 16:07:45 -0500 Subject: [PATCH 1098/2998] Tag v1.11.0b3 --- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 53c6cc3981..589ba09671 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.11.0b2" +version = "1.11.0b3" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index 5aa6ca574d..cb5b790304 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.11.0b2" +__version__ = "1.11.0b3" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From 5ee0045ebcb7e5288cbbe4fe358d0cab738728f1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 16:09:15 -0500 Subject: [PATCH 1099/2998] docs(CHANGES): Note publishing to PyPI via CI --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index c6d33e7ff4..36a50b48c5 100644 --- a/CHANGES +++ b/CHANGES @@ -37,6 +37,8 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force This created issues with running poetry while inside the virtualenv. +- Publish packages to PyPI via github action by setting git tag. + ## tmuxp 1.10.1 (2022-04-17) ### Compatibility From 7537ccf411a46f77675cda05b29067b4427d723c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 18:19:14 -0500 Subject: [PATCH 1100/2998] chore(cli.shell): Fix typo --- tmuxp/cli/shell.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmuxp/cli/shell.py b/tmuxp/cli/shell.py index da6f9cf960..95a0cc678d 100644 --- a/tmuxp/cli/shell.py +++ b/tmuxp/cli/shell.py @@ -60,7 +60,7 @@ def command_shell( Priority given to loaded session/wndow/pane objects: - session_name and window_name arguments - - current shell: envvar ``TMUX_PANE`` for determing window and session + - current shell: envvar ``TMUX_PANE`` for determining window and session - :attr:`libtmux.Server.attached_sessions`, :attr:`libtmux.Session.attached_window`, :attr:`libtmux.Window.attached_pane` """ From ae49905cbc5e45038f2de00dfecf0b8a95b51500 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 Apr 2022 19:04:33 -0500 Subject: [PATCH 1101/2998] Tag v0.11.0 --- CHANGES | 4 +++- pyproject.toml | 2 +- tmuxp/__about__.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 36a50b48c5..1df87c2f53 100644 --- a/CHANGES +++ b/CHANGES @@ -15,10 +15,12 @@ $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force // Usage: tmuxp@next load yoursession ``` -## 1.11 - unreleased +## tmuxp 1.12.x (unreleased) - _Insert changes/features/fixes for next release here_ +## tmuxp 1.11.0 (2022-04-24) + ### Compatibility - {issue}`#372`: Allow click 8.1.x diff --git a/pyproject.toml b/pyproject.toml index 589ba09671..f0044a3373 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "tmuxp" -version = "1.11.0b3" +version = "1.11.0" description = "tmux session manager" license = "MIT" authors = ["Tony Narlock "] diff --git a/tmuxp/__about__.py b/tmuxp/__about__.py index cb5b790304..6dd02ac118 100644 --- a/tmuxp/__about__.py +++ b/tmuxp/__about__.py @@ -1,6 +1,6 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.11.0b3" +__version__ = "1.11.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" From cac8807b8baabf68afa09e6eb3336b7f1777f56a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 Apr 2022 22:36:31 -0500 Subject: [PATCH 1102/2998] docs(sidebar): Link size and unlink hostname --- docs/_static/css/custom.css | 10 +++++----- docs/_templates/sidebar/projects.html | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 8f5cc76cc6..3bf24f5ef0 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -16,7 +16,8 @@ h4 { } .sidebar-tree p.indented-block { - padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0 var(--sidebar-item-spacing-horizontal); + padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0 + var(--sidebar-item-spacing-horizontal); margin-bottom: 0; } @@ -25,13 +26,12 @@ h4 { display: block; } -.sidebar-tree p.indented-block > :not(.project-name) { - font-size: var(--toc-font-size); -} - .sidebar-tree p.indented-block .project-name { font-size: var(--sidebar-item-font-size); font-weight: bold; margin-right: calc(var(--sidebar-item-spacing-horizontal) / 2.5); } +.sidebar-tree .active { + font-weight: bold; +} diff --git a/docs/_templates/sidebar/projects.html b/docs/_templates/sidebar/projects.html index 7e9d6780de..330d159306 100644 --- a/docs/_templates/sidebar/projects.html +++ b/docs/_templates/sidebar/projects.html @@ -1,4 +1,4 @@ - From b733808998a51778b14a8a60e870e18afebddf09 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 13 Mar 2026 18:22:42 -0500 Subject: [PATCH 2762/2998] docs(nav[spa]): wrap DOM swap in View Transitions API for smooth crossfade why: SPA navigation instantly replaces DOM content, causing a jarring visual jump between pages instead of a smooth transition. what: - Wrap swap+reinit in document.startViewTransition() when available - Add 150ms crossfade animation via ::view-transition pseudo-elements - Progressive enhancement: unsupported browsers get instant swap --- docs/_static/css/custom.css | 10 ++++++++++ docs/_static/js/spa-nav.js | 32 ++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index c979ecbd60..1e2c5327af 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -197,6 +197,16 @@ article { * sets max-width: 100%; height: auto on img. We add * content-visibility and badge-specific height to prevent CLS. * ────────────────────────────────────────────────────────── */ + +/* ── View Transitions (SPA navigation) ──────────────────── + * Crossfade between pages during SPA navigation. + * Browsers without View Transitions API get instant swap. + * ────────────────────────────────────────────────────────── */ +::view-transition-old(root), +::view-transition-new(root) { + animation-duration: 150ms; +} + img { content-visibility: auto; } diff --git a/docs/_static/js/spa-nav.js b/docs/_static/js/spa-nav.js index fa7fd2ed6f..e00e521ab8 100644 --- a/docs/_static/js/spa-nav.js +++ b/docs/_static/js/spa-nav.js @@ -160,21 +160,29 @@ if (!doc.querySelector(".article-container")) throw new Error("no article"); - swap(doc); + var applySwap = function () { + swap(doc); + + if (!isPop) history.pushState({ spa: true }, "", url); + + if (!isPop) { + var hash = new URL(url, location.href).hash; + if (hash) { + var el = document.querySelector(hash); + if (el) el.scrollIntoView(); + } else { + window.scrollTo(0, 0); + } + } - if (!isPop) history.pushState({ spa: true }, "", url); + reinit(); + }; - if (!isPop) { - var hash = new URL(url, location.href).hash; - if (hash) { - var el = document.querySelector(hash); - if (el) el.scrollIntoView(); - } else { - window.scrollTo(0, 0); - } + if (document.startViewTransition) { + document.startViewTransition(applySwap); + } else { + applySwap(); } - - reinit(); } catch (err) { if (err.name === "AbortError") return; window.location.href = url; From 107f104ff688e57a0de31bf51426638db715c31b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 04:45:44 -0500 Subject: [PATCH 2763/2998] docs(css[structure]): move view transitions section after image rules why: The view transitions block was inserted between the "Image layout shift prevention" section header and its rules, orphaning the comment. what: - Move view transitions comment + rules to end of file - Keep image section header contiguous with its img/badge rules --- docs/_static/css/custom.css | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 1e2c5327af..ed6640c746 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -198,15 +198,6 @@ article { * content-visibility and badge-specific height to prevent CLS. * ────────────────────────────────────────────────────────── */ -/* ── View Transitions (SPA navigation) ──────────────────── - * Crossfade between pages during SPA navigation. - * Browsers without View Transitions API get instant swap. - * ────────────────────────────────────────────────────────── */ -::view-transition-old(root), -::view-transition-new(root) { - animation-duration: 150ms; -} - img { content-visibility: auto; } @@ -244,3 +235,12 @@ img[src*="codecov.io"] { border-radius: 3px; background: var(--color-background-secondary); } + +/* ── View Transitions (SPA navigation) ──────────────────── + * Crossfade between pages during SPA navigation. + * Browsers without View Transitions API get instant swap. + * ────────────────────────────────────────────────────────── */ +::view-transition-old(root), +::view-transition-new(root) { + animation-duration: 150ms; +} From a31731aa1531e64a1df6be10f7a5b8b90d4f53b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 04:45:48 -0500 Subject: [PATCH 2764/2998] docs(images[about]): add lazy loading to tao-tmux-screenshot why: Image is below the fold; lazy loading defers fetch until needed. what: - Add :loading: lazy to the figure directive in about_tmux.md --- docs/about_tmux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 5f10e2275e..2db7b3c4d7 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -5,6 +5,7 @@ :::{figure} /\_static/tao-tmux-screenshot.png :scale: 60% :align: center +:loading: lazy ISC-licensed terminal multiplexer. From 6564409f9640cb4bcab4c545daa466a6ce3f6b3c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 05:26:46 -0500 Subject: [PATCH 2765/2998] docs(fonts[loading]): switch to font-display block with inline CSS why: font-display swap causes visible text reflow (FOUT). Matching the tony.nl/cv approach: block rendering until preloaded fonts arrive, and inline the @font-face CSS to eliminate the extra fonts.css request. what: - Change font-display from swap to block - Move @font-face CSS from external fonts.css to inline + {%- endif %} {%- if theme_show_meta_manifest_tag == true %} {% endif -%} From 9c0caa15e277473c0a576c84e99211bda0c82a99 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 06:22:37 -0500 Subject: [PATCH 2766/2998] Revert "ci(docs): temporarily add docs-fonts branch to trigger" --- .github/workflows/docs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index dfdf570ee0..d9dbf6716b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - docs-fonts permissions: contents: read From b8500216172866e9c7bbcd4d3ab6001baa7d3aac Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 16:03:44 -0500 Subject: [PATCH 2767/2998] test(docs[sphinx_fonts]) add tests and fix download failure bugs (#1023) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: sphinx_fonts.py had zero test coverage, and two latent bugs were discovered during test development — font-face entries emitted for failed downloads, and partial files poisoning the cache. what: Test suite (21 functions, 545 lines) - _cache_dir: path construction - _cdn_url: parametrized URL formatting, template structure - _download_font: cached hit, success, URLError, OSError, partial cleanup - _on_builder_inited: non-html skip, empty fonts, font processing, download failure skip, explicit subset, preload match/no-match, fallbacks and CSS variables - _on_html_page_context: with/without app attributes - setup: return metadata, config values, event connections Bug fixes in sphinx_fonts.py - Move font_faces.append() inside if _download_font() block to skip font-face entries when download fails (was emitting CSS pointing to missing files) - Add dest.unlink() in except block to remove partial .woff2 files left by interrupted downloads (was poisoning cache) Docstrings - Add docstrings to SetupDict and setup() for ruff D101/D103 --- docs/_ext/sphinx_fonts.py | 21 +- tests/docs/_ext/test_sphinx_fonts.py | 545 +++++++++++++++++++++++++++ 2 files changed, 558 insertions(+), 8 deletions(-) create mode 100644 tests/docs/_ext/test_sphinx_fonts.py diff --git a/docs/_ext/sphinx_fonts.py b/docs/_ext/sphinx_fonts.py index b03362e921..e8d2a692ae 100644 --- a/docs/_ext/sphinx_fonts.py +++ b/docs/_ext/sphinx_fonts.py @@ -25,6 +25,8 @@ class SetupDict(t.TypedDict): + """Return type for Sphinx extension setup().""" + version: str parallel_read_safe: bool parallel_write_safe: bool @@ -61,6 +63,8 @@ def _download_font(url: str, dest: pathlib.Path) -> bool: urllib.request.urlretrieve(url, dest) logger.info("downloaded font: %s", dest.name) except (urllib.error.URLError, OSError): + if dest.exists(): + dest.unlink() logger.warning("failed to download font: %s", url) return False return True @@ -93,14 +97,14 @@ def _on_builder_inited(app: Sphinx) -> None: url = _cdn_url(package, version, font_id, subset, weight, style) if _download_font(url, cached): shutil.copy2(cached, fonts_dir / filename) - font_faces.append( - { - "family": font["family"], - "style": style, - "weight": str(weight), - "filename": filename, - } - ) + font_faces.append( + { + "family": font["family"], + "style": style, + "weight": str(weight), + "filename": filename, + } + ) preload_hrefs: list[str] = [] preload_specs: list[tuple[str, int, str]] = app.config.sphinx_font_preload @@ -135,6 +139,7 @@ def _on_html_page_context( def setup(app: Sphinx) -> SetupDict: + """Register config values, events, and return extension metadata.""" app.add_config_value("sphinx_fonts", [], "html") app.add_config_value("sphinx_font_fallbacks", [], "html") app.add_config_value("sphinx_font_css_variables", {}, "html") diff --git a/tests/docs/_ext/test_sphinx_fonts.py b/tests/docs/_ext/test_sphinx_fonts.py new file mode 100644 index 0000000000..22f546a2e1 --- /dev/null +++ b/tests/docs/_ext/test_sphinx_fonts.py @@ -0,0 +1,545 @@ +"""Tests for sphinx_fonts Sphinx extension.""" + +from __future__ import annotations + +import logging +import pathlib +import types +import typing as t +import urllib.error + +import pytest +import sphinx_fonts + +# --- _cache_dir tests --- + + +def test_cache_dir_returns_home_cache_path() -> None: + """_cache_dir returns ~/.cache/sphinx-fonts.""" + result = sphinx_fonts._cache_dir() + assert result == pathlib.Path.home() / ".cache" / "sphinx-fonts" + + +# --- _cdn_url tests --- + + +class CdnUrlFixture(t.NamedTuple): + """Test fixture for CDN URL generation.""" + + test_id: str + package: str + version: str + font_id: str + subset: str + weight: int + style: str + expected_url: str + + +CDN_URL_FIXTURES: list[CdnUrlFixture] = [ + CdnUrlFixture( + test_id="normal_weight", + package="@fontsource/open-sans", + version="5.2.5", + font_id="open-sans", + subset="latin", + weight=400, + style="normal", + expected_url=( + "https://cdn.jsdelivr.net/npm/@fontsource/open-sans@5.2.5" + "/files/open-sans-latin-400-normal.woff2" + ), + ), + CdnUrlFixture( + test_id="bold_italic", + package="@fontsource/roboto", + version="5.0.0", + font_id="roboto", + subset="latin-ext", + weight=700, + style="italic", + expected_url=( + "https://cdn.jsdelivr.net/npm/@fontsource/roboto@5.0.0" + "/files/roboto-latin-ext-700-italic.woff2" + ), + ), +] + + +@pytest.mark.parametrize( + list(CdnUrlFixture._fields), + CDN_URL_FIXTURES, + ids=[f.test_id for f in CDN_URL_FIXTURES], +) +def test_cdn_url( + test_id: str, + package: str, + version: str, + font_id: str, + subset: str, + weight: int, + style: str, + expected_url: str, +) -> None: + """_cdn_url formats the CDN URL template correctly.""" + result = sphinx_fonts._cdn_url(package, version, font_id, subset, weight, style) + assert result == expected_url + + +def test_cdn_url_matches_template() -> None: + """_cdn_url produces URLs matching CDN_TEMPLATE structure.""" + url = sphinx_fonts._cdn_url( + "@fontsource/inter", "5.1.0", "inter", "latin", 400, "normal" + ) + assert url.startswith("https://cdn.jsdelivr.net/npm/") + assert "@fontsource/inter@5.1.0" in url + assert url.endswith(".woff2") + + +# --- _download_font tests --- + + +def test_download_font_cached( + tmp_path: pathlib.Path, + caplog: pytest.LogCaptureFixture, +) -> None: + """_download_font returns True and logs debug when file exists.""" + dest = tmp_path / "font.woff2" + dest.write_bytes(b"cached-data") + + with caplog.at_level(logging.DEBUG, logger="sphinx_fonts"): + result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) + + assert result is True + debug_records = [r for r in caplog.records if r.levelno == logging.DEBUG] + assert any("cached" in r.message for r in debug_records) + + +def test_download_font_success( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, + caplog: pytest.LogCaptureFixture, +) -> None: + """_download_font downloads and returns True on success.""" + dest = tmp_path / "subdir" / "font.woff2" + + def fake_urlretrieve(url: str, filename: t.Any) -> tuple[str, t.Any]: + pathlib.Path(filename).write_bytes(b"font-data") + return (str(filename), None) + + monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) + + with caplog.at_level(logging.INFO, logger="sphinx_fonts"): + result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) + + assert result is True + info_records = [r for r in caplog.records if r.levelno == logging.INFO] + assert any("downloaded" in r.message for r in info_records) + + +def test_download_font_url_error( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, + caplog: pytest.LogCaptureFixture, +) -> None: + """_download_font returns False and warns on URLError.""" + dest = tmp_path / "font.woff2" + + msg = "network error" + + def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: + raise urllib.error.URLError(msg) + + monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) + + with caplog.at_level(logging.WARNING, logger="sphinx_fonts"): + result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) + + assert result is False + warning_records = [r for r in caplog.records if r.levelno == logging.WARNING] + assert any("failed" in r.message for r in warning_records) + + +def test_download_font_os_error( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, + caplog: pytest.LogCaptureFixture, +) -> None: + """_download_font returns False and warns on OSError.""" + dest = tmp_path / "font.woff2" + + msg = "disk full" + + def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: + raise OSError(msg) + + monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) + + with caplog.at_level(logging.WARNING, logger="sphinx_fonts"): + result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) + + assert result is False + warning_records = [r for r in caplog.records if r.levelno == logging.WARNING] + assert any("failed" in r.message for r in warning_records) + + +def test_download_font_partial_file_cleanup( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_download_font removes partial file on failure.""" + dest = tmp_path / "cache" / "partial.woff2" + + msg = "disk full" + + def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: + pathlib.Path(filename).write_bytes(b"partial") + raise OSError(msg) + + monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) + + result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) + + assert result is False + assert not dest.exists() + + +# --- _on_builder_inited tests --- + + +def _make_app( + tmp_path: pathlib.Path, + *, + builder_format: str = "html", + fonts: list[dict[str, t.Any]] | None = None, + preload: list[tuple[str, int, str]] | None = None, + fallbacks: list[dict[str, str]] | None = None, + variables: dict[str, str] | None = None, +) -> types.SimpleNamespace: + """Create a fake Sphinx app namespace for testing.""" + config = types.SimpleNamespace( + sphinx_fonts=fonts if fonts is not None else [], + sphinx_font_preload=preload if preload is not None else [], + sphinx_font_fallbacks=fallbacks if fallbacks is not None else [], + sphinx_font_css_variables=variables if variables is not None else {}, + ) + builder = types.SimpleNamespace(format=builder_format) + return types.SimpleNamespace( + builder=builder, + config=config, + outdir=str(tmp_path / "output"), + ) + + +def test_on_builder_inited_non_html(tmp_path: pathlib.Path) -> None: + """_on_builder_inited returns early for non-HTML builders.""" + app = _make_app(tmp_path, builder_format="latex") + sphinx_fonts._on_builder_inited(app) + assert not hasattr(app, "_font_faces") + + +def test_on_builder_inited_empty_fonts(tmp_path: pathlib.Path) -> None: + """_on_builder_inited returns early when no fonts configured.""" + app = _make_app(tmp_path, fonts=[]) + sphinx_fonts._on_builder_inited(app) + assert not hasattr(app, "_font_faces") + + +def test_on_builder_inited_with_fonts( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited processes fonts and stores results on app.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/open-sans", + "version": "5.2.5", + "family": "Open Sans", + "weights": [400, 700], + "styles": ["normal"], + }, + ] + app = _make_app(tmp_path, fonts=fonts) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + for weight in [400, 700]: + (cache / f"open-sans-latin-{weight}-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert len(app._font_faces) == 2 + assert app._font_faces[0]["family"] == "Open Sans" + assert app._font_faces[0]["weight"] == "400" + assert app._font_faces[1]["weight"] == "700" + assert app._font_preload_hrefs == [] + assert app._font_fallbacks == [] + assert app._font_css_variables == {} + + +def test_on_builder_inited_download_failure( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited skips font_faces entry on download failure.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + msg = "offline" + + def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: + raise urllib.error.URLError(msg) + + monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) + + fonts = [ + { + "package": "@fontsource/inter", + "version": "5.0.0", + "family": "Inter", + "weights": [400], + "styles": ["normal"], + }, + ] + app = _make_app(tmp_path, fonts=fonts) + + sphinx_fonts._on_builder_inited(app) + + assert len(app._font_faces) == 0 + + +def test_on_builder_inited_explicit_subset( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited respects explicit subset in font config.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/noto-sans", + "version": "5.0.0", + "family": "Noto Sans", + "subset": "latin-ext", + "weights": [400], + "styles": ["normal"], + }, + ] + app = _make_app(tmp_path, fonts=fonts) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "noto-sans-latin-ext-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert app._font_faces[0]["filename"] == "noto-sans-latin-ext-400-normal.woff2" + + +def test_on_builder_inited_preload_match( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited builds preload_hrefs for matching preload specs.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/open-sans", + "version": "5.2.5", + "family": "Open Sans", + "weights": [400], + "styles": ["normal"], + }, + ] + preload = [("Open Sans", 400, "normal")] + app = _make_app(tmp_path, fonts=fonts, preload=preload) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "open-sans-latin-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert app._font_preload_hrefs == ["open-sans-latin-400-normal.woff2"] + + +def test_on_builder_inited_preload_no_match( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited produces empty preload when family doesn't match.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/open-sans", + "version": "5.2.5", + "family": "Open Sans", + "weights": [400], + "styles": ["normal"], + }, + ] + preload = [("Nonexistent Font", 400, "normal")] + app = _make_app(tmp_path, fonts=fonts, preload=preload) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "open-sans-latin-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert app._font_preload_hrefs == [] + + +def test_on_builder_inited_fallbacks_and_variables( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited stores fallbacks and CSS variables on app.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/inter", + "version": "5.0.0", + "family": "Inter", + "weights": [400], + "styles": ["normal"], + }, + ] + fallbacks = [{"family": "system-ui", "style": "normal", "weight": "400"}] + variables = {"--font-body": "Inter, system-ui"} + app = _make_app(tmp_path, fonts=fonts, fallbacks=fallbacks, variables=variables) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "inter-latin-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert app._font_fallbacks == fallbacks + assert app._font_css_variables == variables + + +# --- _on_html_page_context tests --- + + +def test_on_html_page_context_with_attrs() -> None: + """_on_html_page_context injects font data from app attributes.""" + app = types.SimpleNamespace( + _font_preload_hrefs=["font-400.woff2"], + _font_faces=[ + { + "family": "Inter", + "weight": "400", + "style": "normal", + "filename": "font-400.woff2", + }, + ], + _font_fallbacks=[{"family": "system-ui"}], + _font_css_variables={"--font-body": "Inter"}, + ) + context: dict[str, t.Any] = {} + + sphinx_fonts._on_html_page_context( + app, + "index", + "page.html", + context, + None, + ) + + assert context["font_preload_hrefs"] == ["font-400.woff2"] + assert context["font_faces"] == app._font_faces + assert context["font_fallbacks"] == [{"family": "system-ui"}] + assert context["font_css_variables"] == {"--font-body": "Inter"} + + +def test_on_html_page_context_without_attrs() -> None: + """_on_html_page_context uses defaults when app attrs are missing.""" + app = types.SimpleNamespace() + context: dict[str, t.Any] = {} + + sphinx_fonts._on_html_page_context( + app, + "index", + "page.html", + context, + None, + ) + + assert context["font_preload_hrefs"] == [] + assert context["font_faces"] == [] + assert context["font_fallbacks"] == [] + assert context["font_css_variables"] == {} + + +# --- setup tests --- + + +def test_setup_return_value() -> None: + """Verify setup() returns correct metadata dict.""" + config_values: list[tuple[str, t.Any, str]] = [] + connections: list[tuple[str, t.Any]] = [] + + app = types.SimpleNamespace( + add_config_value=lambda name, default, rebuild: config_values.append( + (name, default, rebuild) + ), + connect=lambda event, handler: connections.append((event, handler)), + ) + + result = sphinx_fonts.setup(app) + + assert result == { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } + + +def test_setup_config_values() -> None: + """Verify setup() registers all expected config values.""" + config_values: list[tuple[str, t.Any, str]] = [] + connections: list[tuple[str, t.Any]] = [] + + app = types.SimpleNamespace( + add_config_value=lambda name, default, rebuild: config_values.append( + (name, default, rebuild) + ), + connect=lambda event, handler: connections.append((event, handler)), + ) + + sphinx_fonts.setup(app) + + config_names = [c[0] for c in config_values] + assert "sphinx_fonts" in config_names + assert "sphinx_font_fallbacks" in config_names + assert "sphinx_font_css_variables" in config_names + assert "sphinx_font_preload" in config_names + assert all(c[2] == "html" for c in config_values) + + +def test_setup_event_connections() -> None: + """Verify setup() connects to builder-inited and html-page-context events.""" + config_values: list[tuple[str, t.Any, str]] = [] + connections: list[tuple[str, t.Any]] = [] + + app = types.SimpleNamespace( + add_config_value=lambda name, default, rebuild: config_values.append( + (name, default, rebuild) + ), + connect=lambda event, handler: connections.append((event, handler)), + ) + + sphinx_fonts.setup(app) + + event_names = [c[0] for c in connections] + assert "builder-inited" in event_names + assert "html-page-context" in event_names + + handlers = {c[0]: c[1] for c in connections} + assert handlers["builder-inited"] is sphinx_fonts._on_builder_inited + assert handlers["html-page-context"] is sphinx_fonts._on_html_page_context From b32f996eec8959ea5ecdc80da1116d879a6cab68 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 14 Mar 2026 18:23:52 -0500 Subject: [PATCH 2768/2998] chore(mypy[overrides]): Add sphinx_fonts to ignore_missing_imports why: mypy reports `import-not-found` for `sphinx_fonts` since the package does not ship type stubs or a py.typed marker. what: - Add "sphinx_fonts" to the [[tool.mypy.overrides]] module list - Position it alongside other Sphinx extension ignores (sphinx_argparse_neo, sphinx_argparse_neo.*) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index e394750acc..9e3f8c75fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -173,6 +173,7 @@ module = [ "bpython", "sphinx_argparse_neo", "sphinx_argparse_neo.*", + "sphinx_fonts", "cli_usage_lexer", "argparse_lexer", "argparse_roles", From 7ae91c0c2b5680a06d5af5213338c92be9988a60 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 15 Mar 2026 06:44:51 -0500 Subject: [PATCH 2769/2998] docs: Improve command formatting (#1024) why: Standardize shell code blocks to follow documentation guidelines what: - Use `console` language tag with `$ ` prefix for shell commands - Split long pipx install command with `\` line continuations - Split long env commands in docs/developing.md - Add Shell Command Formatting rules to AGENTS.md --- AGENTS.md | 38 +++++++++++++++++++++++++++++++++++++- CHANGES | 18 +++++++++++------- docs/cli/completion.md | 12 ++++++------ docs/developing.md | 6 ++++-- 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index bdbe24f926..7e230283db 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -282,7 +282,7 @@ Raw `print()` is forbidden in command/business logic. The `print()` call lives o When writing documentation (README, CHANGES, docs/), follow these rules for code blocks: -**One command per code block.** This makes commands individually copyable. +**One command per code block.** This makes commands individually copyable. For sequential commands, either use separate code blocks or chain them with `&&` or `;` and `\` continuations (keeping it one logical command). **Put explanations outside the code block**, not as comments inside. @@ -310,6 +310,42 @@ $ uv run pytest $ uv run pytest --cov ``` +### Shell Command Formatting + +These rules apply to shell commands in documentation (README, CHANGES, docs/), **not** to Python doctests. + +**Use `console` language tag with `$ ` prefix.** This distinguishes interactive commands from scripts and enables prompt-aware copy in many terminals. + +Good: + +```console +$ uv run pytest +``` + +Bad: + +```bash +uv run pytest +``` + +**Split long commands with `\` for readability.** Each flag or flag+value pair gets its own continuation line, indented. Positional parameters go on the final line. + +Good: + +```console +$ pipx install \ + --suffix=@next \ + --pip-args '\--pre' \ + --force \ + 'tmuxp' +``` + +Bad: + +```console +$ pipx install --suffix=@next --pip-args '\--pre' --force 'tmuxp' +``` + ## Important Notes - **QA every edit**: Run formatting and tests before committing diff --git a/CHANGES b/CHANGES index 707359f3ac..0330651353 100644 --- a/CHANGES +++ b/CHANGES @@ -23,7 +23,11 @@ $ uvx --from 'tmuxp' --prerelease allow tmuxp [pipx](https://pypa.github.io/pipx/docs/): ```console -$ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force +$ pipx install \ + --suffix=@next \ + --pip-args '\--pre' \ + --force \ + 'tmuxp' // Usage: tmuxp@next load yoursession ``` @@ -453,8 +457,8 @@ _Maintenance only, no bug fixes or new features_ via ruff v0.8.4, all automated lint fixes, including unsafe and previews were applied for Python 3.9: - ```sh - ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . + ```console + $ ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . ``` ## tmuxp 1.49.0 (2024-11-26) @@ -560,14 +564,14 @@ _Maintenance only, no bug fixes or new features_ via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied: - ```sh - ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . + ```console + $ ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . ``` Branches were treated with: - ```sh - git rebase \ + ```console + $ git rebase \ --strategy-option=theirs \ --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \ origin/master diff --git a/docs/cli/completion.md b/docs/cli/completion.md index ee7f1f3fa1..410aed4ee3 100644 --- a/docs/cli/completion.md +++ b/docs/cli/completion.md @@ -32,8 +32,8 @@ $ uvx shtab --help :::{tab} bash -```bash -shtab --shell=bash -u tmuxp.cli.create_parser \ +```console +$ shtab --shell=bash -u tmuxp.cli.create_parser \ | sudo tee "$BASH_COMPLETION_COMPAT_DIR"/TMUXP ``` @@ -41,8 +41,8 @@ shtab --shell=bash -u tmuxp.cli.create_parser \ :::{tab} zsh -```zsh -shtab --shell=zsh -u tmuxp.cli.create_parser \ +```console +$ shtab --shell=zsh -u tmuxp.cli.create_parser \ | sudo tee /usr/local/share/zsh/site-functions/_TMUXP ``` @@ -50,8 +50,8 @@ shtab --shell=zsh -u tmuxp.cli.create_parser \ :::{tab} tcsh -```zsh -shtab --shell=tcsh -u tmuxp.cli.create_parser \ +```console +$ shtab --shell=tcsh -u tmuxp.cli.create_parser \ | sudo tee /etc/profile.d/TMUXP.completion.csh ``` diff --git a/docs/developing.md b/docs/developing.md index 1b909363df..cceb9eb61e 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -175,13 +175,15 @@ $ env PYTEST_ADDOPTS="tests/workspace/test_builder.py" uv run make start Drop into `test_automatic_rename_option()` in `tests/workspace/test_builder.py`: ```console -$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py" uv run make start +$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py" \ + uv run make start ``` Drop into `test_automatic_rename_option()` in `tests/workspace/test_builder.py` and stop on first error: ```console -$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py::test_automatic_rename_option" uv run make start +$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py::test_automatic_rename_option" \ + uv run make start ``` Drop into `pdb` on first error: From 0d13b6458f23d98dcbb2d1f7d474d3fa191d224a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 17 Mar 2026 17:44:59 -0500 Subject: [PATCH 2770/2998] docs(fix[copybutton]): Enable line continuation for multiline console blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: sphinx-copybutton's copy button silently drops continuation lines in multiline `\`-continued console commands. For example, clicking copy on: ```console $ pipx install \ --suffix=@next \ --pip-args '\--pre' \ --force \ 'libtmux' ``` Only copies `pipx install \` — the continuation lines are discarded. Root cause: `copybutton_line_continuation_character` defaults to `""`. In copybutton_funcs.js, `useLineCont = !!""` evaluates to `false`, so `gotLineCont` never activates. Lines not matching the prompt regex (`$ `) are silently dropped by the formatCopyText() line-processing loop. Setting it to `"\\"` makes `useLineCont = true`, and any line ending in `\` sets `gotLineCont = true` for the next iteration, including it regardless of prompt match. This is the standard fix adopted by Apache Arrow, NVIDIA TensorRT-LLM, Flower, Crate docs theme, and Nextstrain sphinx theme. Refs: - https://sphinx-copybutton.readthedocs.io/en/latest/use.html - https://github.com/executablebooks/sphinx-copybutton/pull/126 - https://github.com/executablebooks/sphinx-copybutton/issues/65 - https://github.com/executablebooks/sphinx-copybutton/issues/52 what: - Add `copybutton_line_continuation_character = "\\"` to docs/conf.py --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index b401540b0a..478e5c1f01 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -138,6 +138,7 @@ ) copybutton_prompt_is_regexp = True copybutton_remove_prompts = True +copybutton_line_continuation_character = "\\" # sphinxext-rediraffe rediraffe_redirects = "redirects.txt" From a1eec5de4efb48356ebadd473ee90b1c1bdcf308 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Mar 2026 05:29:07 -0500 Subject: [PATCH 2771/2998] py(deps[dev]) Bump dev packages --- uv.lock | 458 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 237 insertions(+), 221 deletions(-) diff --git a/uv.lock b/uv.lock index 5606904017..379131738e 100644 --- a/uv.lock +++ b/uv.lock @@ -84,91 +84,107 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/35/02daf95b9cd686320bb622eb148792655c9412dbb9b67abb5694e5910a24/charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644", size = 134804, upload-time = "2026-03-06T06:03:19.46Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/21/a2b1505639008ba2e6ef03733a81fc6cfd6a07ea6139a2b76421230b8dad/charset_normalizer-3.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4167a621a9a1a986c73777dbc15d4b5eac8ac5c10393374109a343d4013ec765", size = 283319, upload-time = "2026-03-06T06:00:26.433Z" }, - { url = "https://files.pythonhosted.org/packages/70/67/df234c29b68f4e1e095885c9db1cb4b69b8aba49cf94fac041db4aaf1267/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f64c6bf8f32f9133b668c7f7a7cbdbc453412bc95ecdbd157f3b1e377a92990", size = 189974, upload-time = "2026-03-06T06:00:28.222Z" }, - { url = "https://files.pythonhosted.org/packages/df/7f/fc66af802961c6be42e2c7b69c58f95cbd1f39b0e81b3365d8efe2a02a04/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:568e3c34b58422075a1b49575a6abc616d9751b4d61b23f712e12ebb78fe47b2", size = 207866, upload-time = "2026-03-06T06:00:29.769Z" }, - { url = "https://files.pythonhosted.org/packages/c9/23/404eb36fac4e95b833c50e305bba9a241086d427bb2167a42eac7c4f7da4/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:036c079aa08a6a592b82487f97c60b439428320ed1b2ea0b3912e99d30c77765", size = 203239, upload-time = "2026-03-06T06:00:31.086Z" }, - { url = "https://files.pythonhosted.org/packages/4b/2f/8a1d989bfadd120c90114ab33e0d2a0cbde05278c1fc15e83e62d570f50a/charset_normalizer-3.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340810d34ef83af92148e96e3e44cb2d3f910d2bf95e5618a5c467d9f102231d", size = 196529, upload-time = "2026-03-06T06:00:32.608Z" }, - { url = "https://files.pythonhosted.org/packages/a5/0c/c75f85ff7ca1f051958bb518cd43922d86f576c03947a050fbedfdfb4f15/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cd2d0f0ec9aa977a27731a3209ebbcacebebaf41f902bd453a928bfd281cf7f8", size = 184152, upload-time = "2026-03-06T06:00:33.93Z" }, - { url = "https://files.pythonhosted.org/packages/f9/20/4ed37f6199af5dde94d4aeaf577f3813a5ec6635834cda1d957013a09c76/charset_normalizer-3.4.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b362bcd27819f9c07cbf23db4e0e8cd4b44c5ecd900c2ff907b2b92274a7412", size = 195226, upload-time = "2026-03-06T06:00:35.469Z" }, - { url = "https://files.pythonhosted.org/packages/28/31/7ba1102178cba7c34dcc050f43d427172f389729e356038f0726253dd914/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:77be992288f720306ab4108fe5c74797de327f3248368dfc7e1a916d6ed9e5a2", size = 192933, upload-time = "2026-03-06T06:00:36.83Z" }, - { url = "https://files.pythonhosted.org/packages/4b/23/f86443ab3921e6a60b33b93f4a1161222231f6c69bc24fb18f3bee7b8518/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8b78d8a609a4b82c273257ee9d631ded7fac0d875bdcdccc109f3ee8328cfcb1", size = 185647, upload-time = "2026-03-06T06:00:38.367Z" }, - { url = "https://files.pythonhosted.org/packages/82/44/08b8be891760f1f5a6d23ce11d6d50c92981603e6eb740b4f72eea9424e2/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ba20bdf69bd127f66d0174d6f2a93e69045e0b4036dc1ca78e091bcc765830c4", size = 209533, upload-time = "2026-03-06T06:00:41.931Z" }, - { url = "https://files.pythonhosted.org/packages/3b/5f/df114f23406199f8af711ddccfbf409ffbc5b7cdc18fa19644997ff0c9bb/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:76a9d0de4d0eab387822e7b35d8f89367dd237c72e82ab42b9f7bf5e15ada00f", size = 195901, upload-time = "2026-03-06T06:00:43.978Z" }, - { url = "https://files.pythonhosted.org/packages/07/83/71ef34a76fe8aa05ff8f840244bda2d61e043c2ef6f30d200450b9f6a1be/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8fff79bf5978c693c9b1a4d71e4a94fddfb5fe744eb062a318e15f4a2f63a550", size = 204950, upload-time = "2026-03-06T06:00:45.202Z" }, - { url = "https://files.pythonhosted.org/packages/58/40/0253be623995365137d7dc68e45245036207ab2227251e69a3d93ce43183/charset_normalizer-3.4.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c7e84e0c0005e3bdc1a9211cd4e62c78ba80bc37b2365ef4410cd2007a9047f2", size = 198546, upload-time = "2026-03-06T06:00:46.481Z" }, - { url = "https://files.pythonhosted.org/packages/ed/5c/5f3cb5b259a130895ef5ae16b38eaf141430fa3f7af50cd06c5d67e4f7b2/charset_normalizer-3.4.5-cp310-cp310-win32.whl", hash = "sha256:58ad8270cfa5d4bef1bc85bd387217e14ff154d6630e976c6f56f9a040757475", size = 132516, upload-time = "2026-03-06T06:00:47.924Z" }, - { url = "https://files.pythonhosted.org/packages/a5/c3/84fb174e7770f2df2e1a2115090771bfbc2227fb39a765c6d00568d1aab4/charset_normalizer-3.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:02a9d1b01c1e12c27883b0c9349e0bcd9ae92e727ff1a277207e1a262b1cbf05", size = 142906, upload-time = "2026-03-06T06:00:49.389Z" }, - { url = "https://files.pythonhosted.org/packages/d7/b2/6f852f8b969f2cbd0d4092d2e60139ab1af95af9bb651337cae89ec0f684/charset_normalizer-3.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:039215608ac7b358c4da0191d10fc76868567fbf276d54c14721bdedeb6de064", size = 133258, upload-time = "2026-03-06T06:00:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/8f/9e/bcec3b22c64ecec47d39bf5167c2613efd41898c019dccd4183f6aa5d6a7/charset_normalizer-3.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:610f72c0ee565dfb8ae1241b666119582fdbfe7c0975c175be719f940e110694", size = 279531, upload-time = "2026-03-06T06:00:52.252Z" }, - { url = "https://files.pythonhosted.org/packages/58/12/81fd25f7e7078ab5d1eedbb0fac44be4904ae3370a3bf4533c8f2d159acd/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d68e820af339df4ae8358c7a2e7596badeb61e544438e489035f9fbf3246a5", size = 188006, upload-time = "2026-03-06T06:00:53.8Z" }, - { url = "https://files.pythonhosted.org/packages/ae/6e/f2d30e8c27c1b0736a6520311982cf5286cfc7f6cac77d7bc1325e3a23f2/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b473fc8dca1c3ad8559985794815f06ca3fc71942c969129070f2c3cdf7281", size = 205085, upload-time = "2026-03-06T06:00:55.311Z" }, - { url = "https://files.pythonhosted.org/packages/d0/90/d12cefcb53b5931e2cf792a33718d7126efb116a320eaa0742c7059a95e4/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d4eb8ac7469b2a5d64b5b8c04f84d8bf3ad340f4514b98523805cbf46e3b3923", size = 200545, upload-time = "2026-03-06T06:00:56.532Z" }, - { url = "https://files.pythonhosted.org/packages/03/f4/44d3b830a20e89ff82a3134912d9a1cf6084d64f3b95dcad40f74449a654/charset_normalizer-3.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bcb3227c3d9aaf73eaaab1db7ccd80a8995c509ee9941e2aae060ca6e4e5d81", size = 193863, upload-time = "2026-03-06T06:00:57.823Z" }, - { url = "https://files.pythonhosted.org/packages/25/4b/f212119c18a6320a9d4a730d1b4057875cdeabf21b3614f76549042ef8a8/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:75ee9c1cce2911581a70a3c0919d8bccf5b1cbc9b0e5171400ec736b4b569497", size = 181827, upload-time = "2026-03-06T06:00:59.323Z" }, - { url = "https://files.pythonhosted.org/packages/74/00/b26158e48b425a202a92965f8069e8a63d9af1481dfa206825d7f74d2a3c/charset_normalizer-3.4.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d1401945cb77787dbd3af2446ff2d75912327c4c3a1526ab7955ecf8600687c", size = 191085, upload-time = "2026-03-06T06:01:00.546Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c2/1c1737bf6fd40335fe53d28fe49afd99ee4143cc57a845e99635ce0b9b6d/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a45e504f5e1be0bd385935a8e1507c442349ca36f511a47057a71c9d1d6ea9e", size = 190688, upload-time = "2026-03-06T06:01:02.479Z" }, - { url = "https://files.pythonhosted.org/packages/5a/3d/abb5c22dc2ef493cd56522f811246a63c5427c08f3e3e50ab663de27fcf4/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e09f671a54ce70b79a1fc1dc6da3072b7ef7251fadb894ed92d9aa8218465a5f", size = 183077, upload-time = "2026-03-06T06:01:04.231Z" }, - { url = "https://files.pythonhosted.org/packages/44/33/5298ad4d419a58e25b3508e87f2758d1442ff00c2471f8e0403dab8edad5/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d01de5e768328646e6a3fa9e562706f8f6641708c115c62588aef2b941a4f88e", size = 206706, upload-time = "2026-03-06T06:01:05.773Z" }, - { url = "https://files.pythonhosted.org/packages/7b/17/51e7895ac0f87c3b91d276a449ef09f5532a7529818f59646d7a55089432/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:131716d6786ad5e3dc542f5cc6f397ba3339dc0fb87f87ac30e550e8987756af", size = 191665, upload-time = "2026-03-06T06:01:07.473Z" }, - { url = "https://files.pythonhosted.org/packages/90/8f/cce9adf1883e98906dbae380d769b4852bb0fa0004bc7d7a2243418d3ea8/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a374cc0b88aa710e8865dc1bd6edb3743c59f27830f0293ab101e4cf3ce9f85", size = 201950, upload-time = "2026-03-06T06:01:08.973Z" }, - { url = "https://files.pythonhosted.org/packages/08/ca/bce99cd5c397a52919e2769d126723f27a4c037130374c051c00470bcd38/charset_normalizer-3.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d31f0d1671e1534e395f9eb84a68e0fb670e1edb1fe819a9d7f564ae3bc4e53f", size = 195830, upload-time = "2026-03-06T06:01:10.155Z" }, - { url = "https://files.pythonhosted.org/packages/87/4f/2e3d023a06911f1281f97b8f036edc9872167036ca6f55cc874a0be6c12c/charset_normalizer-3.4.5-cp311-cp311-win32.whl", hash = "sha256:cace89841c0599d736d3d74a27bc5821288bb47c5441923277afc6059d7fbcb4", size = 132029, upload-time = "2026-03-06T06:01:11.706Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1f/a853b73d386521fd44b7f67ded6b17b7b2367067d9106a5c4b44f9a34274/charset_normalizer-3.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:f8102ae93c0bc863b1d41ea0f4499c20a83229f52ed870850892df555187154a", size = 142404, upload-time = "2026-03-06T06:01:12.865Z" }, - { url = "https://files.pythonhosted.org/packages/b4/10/dba36f76b71c38e9d391abe0fd8a5b818790e053c431adecfc98c35cd2a9/charset_normalizer-3.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:ed98364e1c262cf5f9363c3eca8c2df37024f52a8fa1180a3610014f26eac51c", size = 132796, upload-time = "2026-03-06T06:01:14.106Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b6/9ee9c1a608916ca5feae81a344dffbaa53b26b90be58cc2159e3332d44ec/charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade", size = 280976, upload-time = "2026-03-06T06:01:15.276Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d8/a54f7c0b96f1df3563e9190f04daf981e365a9b397eedfdfb5dbef7e5c6c/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54", size = 189356, upload-time = "2026-03-06T06:01:16.511Z" }, - { url = "https://files.pythonhosted.org/packages/42/69/2bf7f76ce1446759a5787cb87d38f6a61eb47dbbdf035cfebf6347292a65/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467", size = 206369, upload-time = "2026-03-06T06:01:17.853Z" }, - { url = "https://files.pythonhosted.org/packages/10/9c/949d1a46dab56b959d9a87272482195f1840b515a3380e39986989a893ae/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60", size = 203285, upload-time = "2026-03-06T06:01:19.473Z" }, - { url = "https://files.pythonhosted.org/packages/67/5c/ae30362a88b4da237d71ea214a8c7eb915db3eec941adda511729ac25fa2/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d", size = 196274, upload-time = "2026-03-06T06:01:20.728Z" }, - { url = "https://files.pythonhosted.org/packages/b2/07/c9f2cb0e46cb6d64fdcc4f95953747b843bb2181bda678dc4e699b8f0f9a/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e", size = 184715, upload-time = "2026-03-06T06:01:22.194Z" }, - { url = "https://files.pythonhosted.org/packages/36/64/6b0ca95c44fddf692cd06d642b28f63009d0ce325fad6e9b2b4d0ef86a52/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f", size = 193426, upload-time = "2026-03-06T06:01:23.795Z" }, - { url = "https://files.pythonhosted.org/packages/50/bc/a730690d726403743795ca3f5bb2baf67838c5fea78236098f324b965e40/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc", size = 191780, upload-time = "2026-03-06T06:01:25.053Z" }, - { url = "https://files.pythonhosted.org/packages/97/4f/6c0bc9af68222b22951552d73df4532b5be6447cee32d58e7e8c74ecbb7b/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95", size = 185805, upload-time = "2026-03-06T06:01:26.294Z" }, - { url = "https://files.pythonhosted.org/packages/dd/b9/a523fb9b0ee90814b503452b2600e4cbc118cd68714d57041564886e7325/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a", size = 208342, upload-time = "2026-03-06T06:01:27.55Z" }, - { url = "https://files.pythonhosted.org/packages/4d/61/c59e761dee4464050713e50e27b58266cc8e209e518c0b378c1580c959ba/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac", size = 193661, upload-time = "2026-03-06T06:01:29.051Z" }, - { url = "https://files.pythonhosted.org/packages/1c/43/729fa30aad69783f755c5ad8649da17ee095311ca42024742701e202dc59/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1", size = 204819, upload-time = "2026-03-06T06:01:30.298Z" }, - { url = "https://files.pythonhosted.org/packages/87/33/d9b442ce5a91b96fc0840455a9e49a611bbadae6122778d0a6a79683dd31/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98", size = 198080, upload-time = "2026-03-06T06:01:31.478Z" }, - { url = "https://files.pythonhosted.org/packages/56/5a/b8b5a23134978ee9885cee2d6995f4c27cc41f9baded0a9685eabc5338f0/charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262", size = 132630, upload-time = "2026-03-06T06:01:33.056Z" }, - { url = "https://files.pythonhosted.org/packages/70/53/e44a4c07e8904500aec95865dc3f6464dc3586a039ef0df606eb3ac38e35/charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636", size = 142856, upload-time = "2026-03-06T06:01:34.489Z" }, - { url = "https://files.pythonhosted.org/packages/ea/aa/c5628f7cad591b1cf45790b7a61483c3e36cf41349c98af7813c483fd6e8/charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02", size = 132982, upload-time = "2026-03-06T06:01:35.641Z" }, - { url = "https://files.pythonhosted.org/packages/f5/48/9f34ec4bb24aa3fdba1890c1bddb97c8a4be1bd84ef5c42ac2352563ad05/charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23", size = 280788, upload-time = "2026-03-06T06:01:37.126Z" }, - { url = "https://files.pythonhosted.org/packages/0e/09/6003e7ffeb90cc0560da893e3208396a44c210c5ee42efff539639def59b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8", size = 188890, upload-time = "2026-03-06T06:01:38.73Z" }, - { url = "https://files.pythonhosted.org/packages/42/1e/02706edf19e390680daa694d17e2b8eab4b5f7ac285e2a51168b4b22ee6b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d", size = 206136, upload-time = "2026-03-06T06:01:40.016Z" }, - { url = "https://files.pythonhosted.org/packages/c7/87/942c3def1b37baf3cf786bad01249190f3ca3d5e63a84f831e704977de1f/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce", size = 202551, upload-time = "2026-03-06T06:01:41.522Z" }, - { url = "https://files.pythonhosted.org/packages/94/0a/af49691938dfe175d71b8a929bd7e4ace2809c0c5134e28bc535660d5262/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819", size = 195572, upload-time = "2026-03-06T06:01:43.208Z" }, - { url = "https://files.pythonhosted.org/packages/20/ea/dfb1792a8050a8e694cfbde1570ff97ff74e48afd874152d38163d1df9ae/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d", size = 184438, upload-time = "2026-03-06T06:01:44.755Z" }, - { url = "https://files.pythonhosted.org/packages/72/12/c281e2067466e3ddd0595bfaea58a6946765ace5c72dfa3edc2f5f118026/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763", size = 193035, upload-time = "2026-03-06T06:01:46.051Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4f/3792c056e7708e10464bad0438a44708886fb8f92e3c3d29ec5e2d964d42/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9", size = 191340, upload-time = "2026-03-06T06:01:47.547Z" }, - { url = "https://files.pythonhosted.org/packages/e7/86/80ddba897127b5c7a9bccc481b0cd36c8fefa485d113262f0fe4332f0bf4/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c", size = 185464, upload-time = "2026-03-06T06:01:48.764Z" }, - { url = "https://files.pythonhosted.org/packages/4d/00/b5eff85ba198faacab83e0e4b6f0648155f072278e3b392a82478f8b988b/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67", size = 208014, upload-time = "2026-03-06T06:01:50.371Z" }, - { url = "https://files.pythonhosted.org/packages/c8/11/d36f70be01597fd30850dde8a1269ebc8efadd23ba5785808454f2389bde/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3", size = 193297, upload-time = "2026-03-06T06:01:51.933Z" }, - { url = "https://files.pythonhosted.org/packages/1a/1d/259eb0a53d4910536c7c2abb9cb25f4153548efb42800c6a9456764649c0/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf", size = 204321, upload-time = "2026-03-06T06:01:53.887Z" }, - { url = "https://files.pythonhosted.org/packages/84/31/faa6c5b9d3688715e1ed1bb9d124c384fe2fc1633a409e503ffe1c6398c1/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6", size = 197509, upload-time = "2026-03-06T06:01:56.439Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a5/c7d9dd1503ffc08950b3260f5d39ec2366dd08254f0900ecbcf3a6197c7c/charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f", size = 132284, upload-time = "2026-03-06T06:01:57.812Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0f/57072b253af40c8aa6636e6de7d75985624c1eb392815b2f934199340a89/charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7", size = 142630, upload-time = "2026-03-06T06:01:59.062Z" }, - { url = "https://files.pythonhosted.org/packages/31/41/1c4b7cc9f13bd9d369ce3bc993e13d374ce25fa38a2663644283ecf422c1/charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36", size = 133254, upload-time = "2026-03-06T06:02:00.281Z" }, - { url = "https://files.pythonhosted.org/packages/43/be/0f0fd9bb4a7fa4fb5067fb7d9ac693d4e928d306f80a0d02bde43a7c4aee/charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873", size = 280232, upload-time = "2026-03-06T06:02:01.508Z" }, - { url = "https://files.pythonhosted.org/packages/28/02/983b5445e4bef49cd8c9da73a8e029f0825f39b74a06d201bfaa2e55142a/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f", size = 189688, upload-time = "2026-03-06T06:02:02.857Z" }, - { url = "https://files.pythonhosted.org/packages/d0/88/152745c5166437687028027dc080e2daed6fe11cfa95a22f4602591c42db/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4", size = 206833, upload-time = "2026-03-06T06:02:05.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0f/ebc15c8b02af2f19be9678d6eed115feeeccc45ce1f4b098d986c13e8769/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee", size = 202879, upload-time = "2026-03-06T06:02:06.446Z" }, - { url = "https://files.pythonhosted.org/packages/38/9c/71336bff6934418dc8d1e8a1644176ac9088068bc571da612767619c97b3/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66", size = 195764, upload-time = "2026-03-06T06:02:08.763Z" }, - { url = "https://files.pythonhosted.org/packages/b7/95/ce92fde4f98615661871bc282a856cf9b8a15f686ba0af012984660d480b/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362", size = 183728, upload-time = "2026-03-06T06:02:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/1c/e7/f5b4588d94e747ce45ae680f0f242bc2d98dbd4eccfab73e6160b6893893/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7", size = 192937, upload-time = "2026-03-06T06:02:11.663Z" }, - { url = "https://files.pythonhosted.org/packages/f9/29/9d94ed6b929bf9f48bf6ede6e7474576499f07c4c5e878fb186083622716/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d", size = 192040, upload-time = "2026-03-06T06:02:13.489Z" }, - { url = "https://files.pythonhosted.org/packages/15/d2/1a093a1cf827957f9445f2fe7298bcc16f8fc5e05c1ed2ad1af0b239035e/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6", size = 184107, upload-time = "2026-03-06T06:02:14.83Z" }, - { url = "https://files.pythonhosted.org/packages/0f/7d/82068ce16bd36135df7b97f6333c5d808b94e01d4599a682e2337ed5fd14/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39", size = 208310, upload-time = "2026-03-06T06:02:16.165Z" }, - { url = "https://files.pythonhosted.org/packages/84/4e/4dfb52307bb6af4a5c9e73e482d171b81d36f522b21ccd28a49656baa680/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6", size = 192918, upload-time = "2026-03-06T06:02:18.144Z" }, - { url = "https://files.pythonhosted.org/packages/08/a4/159ff7da662cf7201502ca89980b8f06acf3e887b278956646a8aeb178ab/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94", size = 204615, upload-time = "2026-03-06T06:02:19.821Z" }, - { url = "https://files.pythonhosted.org/packages/d6/62/0dd6172203cb6b429ffffc9935001fde42e5250d57f07b0c28c6046deb6b/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e", size = 197784, upload-time = "2026-03-06T06:02:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/c7/5e/1aab5cb737039b9c59e63627dc8bbc0d02562a14f831cc450e5f91d84ce1/charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2", size = 133009, upload-time = "2026-03-06T06:02:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/40/65/e7c6c77d7aaa4c0d7974f2e403e17f0ed2cb0fc135f77d686b916bf1eead/charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa", size = 143511, upload-time = "2026-03-06T06:02:26.195Z" }, - { url = "https://files.pythonhosted.org/packages/ba/91/52b0841c71f152f563b8e072896c14e3d83b195c188b338d3cc2e582d1d4/charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4", size = 133775, upload-time = "2026-03-06T06:02:27.473Z" }, - { url = "https://files.pythonhosted.org/packages/c5/60/3a621758945513adfd4db86827a5bafcc615f913dbd0b4c2ed64a65731be/charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0", size = 55455, upload-time = "2026-03-06T06:03:17.827Z" }, +version = "3.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, + { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, + { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, + { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, + { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, + { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, + { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, + { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, + { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, + { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, + { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, + { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, + { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, + { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, + { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, + { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, + { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, + { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, + { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, + { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, + { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, + { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, + { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, + { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, + { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, + { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, + { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, + { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, + { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, + { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, + { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, + { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, + { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, + { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, + { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, + { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, + { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, + { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, + { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, + { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, + { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, + { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, + { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, + { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, ] [[package]] @@ -207,115 +223,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", size = 219152, upload-time = "2026-02-09T12:56:11.974Z" }, - { url = "https://files.pythonhosted.org/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", size = 219667, upload-time = "2026-02-09T12:56:13.33Z" }, - { url = "https://files.pythonhosted.org/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", size = 246425, upload-time = "2026-02-09T12:56:14.552Z" }, - { url = "https://files.pythonhosted.org/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", size = 248229, upload-time = "2026-02-09T12:56:16.31Z" }, - { url = "https://files.pythonhosted.org/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", size = 250106, upload-time = "2026-02-09T12:56:18.024Z" }, - { url = "https://files.pythonhosted.org/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", size = 252021, upload-time = "2026-02-09T12:56:19.272Z" }, - { url = "https://files.pythonhosted.org/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", size = 247114, upload-time = "2026-02-09T12:56:21.051Z" }, - { url = "https://files.pythonhosted.org/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", size = 248143, upload-time = "2026-02-09T12:56:22.585Z" }, - { url = "https://files.pythonhosted.org/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", size = 246152, upload-time = "2026-02-09T12:56:23.748Z" }, - { url = "https://files.pythonhosted.org/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", size = 249959, upload-time = "2026-02-09T12:56:25.209Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", size = 246416, upload-time = "2026-02-09T12:56:26.475Z" }, - { url = "https://files.pythonhosted.org/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", size = 247025, upload-time = "2026-02-09T12:56:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", size = 221758, upload-time = "2026-02-09T12:56:29.051Z" }, - { url = "https://files.pythonhosted.org/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", size = 222693, upload-time = "2026-02-09T12:56:30.366Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" }, - { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" }, - { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" }, - { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" }, - { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" }, - { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" }, - { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" }, - { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" }, - { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" }, - { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" }, - { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" }, - { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" }, - { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, - { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, - { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, - { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, - { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, - { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, - { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, - { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, - { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, - { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, - { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, - { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" }, - { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" }, - { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" }, - { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" }, - { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" }, - { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" }, - { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" }, - { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" }, - { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" }, - { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" }, - { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" }, - { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" }, - { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" }, - { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" }, - { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" }, - { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" }, - { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" }, - { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" }, - { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" }, - { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" }, - { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" }, - { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" }, - { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" }, - { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" }, - { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" }, - { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" }, - { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" }, - { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" }, - { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" }, - { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" }, - { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" }, - { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" }, - { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" }, - { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" }, - { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" }, - { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" }, - { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" }, - { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" }, - { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" }, - { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" }, - { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" }, - { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" }, - { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" }, - { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" }, - { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, +version = "7.13.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, + { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, + { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, + { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, + { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, + { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, + { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, + { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, + { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, + { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, + { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, + { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, + { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, + { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, + { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, + { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, + { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, + { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, + { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, + { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, + { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, + { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, + { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, + { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, + { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, + { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, + { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, + { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, + { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, + { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, + { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, + { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, + { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, + { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, + { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, + { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, + { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, + { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] [package.optional-dependencies] @@ -1069,27 +1085,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/77/9b/840e0039e65fcf12758adf684d2289024d6140cde9268cc59887dc55189c/ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2", size = 4574214, upload-time = "2026-03-05T20:06:34.946Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/20/5369c3ce21588c708bcbe517a8fbe1a8dfdb5dfd5137e14790b1da71612c/ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c", size = 10478185, upload-time = "2026-03-05T20:06:29.093Z" }, - { url = "https://files.pythonhosted.org/packages/44/ed/e81dd668547da281e5dce710cf0bc60193f8d3d43833e8241d006720e42b/ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080", size = 10859201, upload-time = "2026-03-05T20:06:32.632Z" }, - { url = "https://files.pythonhosted.org/packages/c4/8f/533075f00aaf19b07c5cd6aa6e5d89424b06b3b3f4583bfa9c640a079059/ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010", size = 10184752, upload-time = "2026-03-05T20:06:40.312Z" }, - { url = "https://files.pythonhosted.org/packages/66/0e/ba49e2c3fa0395b3152bad634c7432f7edfc509c133b8f4529053ff024fb/ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65", size = 10534857, upload-time = "2026-03-05T20:06:19.581Z" }, - { url = "https://files.pythonhosted.org/packages/59/71/39234440f27a226475a0659561adb0d784b4d247dfe7f43ffc12dd02e288/ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440", size = 10309120, upload-time = "2026-03-05T20:06:00.435Z" }, - { url = "https://files.pythonhosted.org/packages/f5/87/4140aa86a93df032156982b726f4952aaec4a883bb98cb6ef73c347da253/ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204", size = 11047428, upload-time = "2026-03-05T20:05:51.867Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f7/4953e7e3287676f78fbe85e3a0ca414c5ca81237b7575bdadc00229ac240/ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8", size = 11914251, upload-time = "2026-03-05T20:06:22.887Z" }, - { url = "https://files.pythonhosted.org/packages/77/46/0f7c865c10cf896ccf5a939c3e84e1cfaeed608ff5249584799a74d33835/ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681", size = 11333801, upload-time = "2026-03-05T20:05:57.168Z" }, - { url = "https://files.pythonhosted.org/packages/d3/01/a10fe54b653061585e655f5286c2662ebddb68831ed3eaebfb0eb08c0a16/ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a", size = 11206821, upload-time = "2026-03-05T20:06:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0d/2132ceaf20c5e8699aa83da2706ecb5c5dcdf78b453f77edca7fb70f8a93/ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca", size = 11133326, upload-time = "2026-03-05T20:06:25.655Z" }, - { url = "https://files.pythonhosted.org/packages/72/cb/2e5259a7eb2a0f87c08c0fe5bf5825a1e4b90883a52685524596bfc93072/ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd", size = 10510820, upload-time = "2026-03-05T20:06:37.79Z" }, - { url = "https://files.pythonhosted.org/packages/ff/20/b67ce78f9e6c59ffbdb5b4503d0090e749b5f2d31b599b554698a80d861c/ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d", size = 10302395, upload-time = "2026-03-05T20:05:54.504Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e5/719f1acccd31b720d477751558ed74e9c88134adcc377e5e886af89d3072/ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752", size = 10754069, upload-time = "2026-03-05T20:06:06.422Z" }, - { url = "https://files.pythonhosted.org/packages/c3/9c/d1db14469e32d98f3ca27079dbd30b7b44dbb5317d06ab36718dee3baf03/ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2", size = 11304315, upload-time = "2026-03-05T20:06:10.867Z" }, - { url = "https://files.pythonhosted.org/packages/28/3a/950367aee7c69027f4f422059227b290ed780366b6aecee5de5039d50fa8/ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74", size = 10551676, upload-time = "2026-03-05T20:06:13.705Z" }, - { url = "https://files.pythonhosted.org/packages/b8/00/bf077a505b4e649bdd3c47ff8ec967735ce2544c8e4a43aba42ee9bf935d/ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe", size = 11678972, upload-time = "2026-03-05T20:06:45.379Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4e/cd76eca6db6115604b7626668e891c9dd03330384082e33662fb0f113614/ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b", size = 10965572, upload-time = "2026-03-05T20:06:16.984Z" }, +version = "0.15.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, + { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" }, + { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, + { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, + { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, + { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, ] [[package]] @@ -1582,11 +1598,11 @@ wheels = [ [[package]] name = "types-docutils" -version = "0.22.3.20260223" +version = "0.22.3.20260316" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/33/92c0129283363e3b3ba270bf6a2b7d077d949d2f90afc4abaf6e73578563/types_docutils-0.22.3.20260223.tar.gz", hash = "sha256:e90e868da82df615ea2217cf36dff31f09660daa15fc0f956af53f89c1364501", size = 57230, upload-time = "2026-02-23T04:11:21.806Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/27/a7f16b3a2fad0a4ddd85a668319f9a1d0311c4bd9578894f6471c7e6c788/types_docutils-0.22.3.20260316.tar.gz", hash = "sha256:8ef27d565b9831ff094fe2eac75337a74151013e2d21ecabd445c2955f891564", size = 57263, upload-time = "2026-03-16T04:29:12.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/c7/a4ae6a75d5b07d63089d5c04d450a0de4a5d48ffcb84b95659b22d3885fe/types_docutils-0.22.3.20260223-py3-none-any.whl", hash = "sha256:cc2d6b7560a28e351903db0989091474aa619ad287843a018324baee9c4d9a8f", size = 91969, upload-time = "2026-02-23T04:11:20.966Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/c1f22b7cfc4837d5419e5a2d8702c7d65f03343f866364b71cccd8a73b79/types_docutils-0.22.3.20260316-py3-none-any.whl", hash = "sha256:083c7091b8072c242998ec51da1bf1492f0332387da81c3b085efbf5ca754c7d", size = 91968, upload-time = "2026-03-16T04:29:11.114Z" }, ] [[package]] @@ -1639,16 +1655,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.41.0" +version = "0.42.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/ce/eeb58ae4ac36fe09e3842eb02e0eb676bf2c53ae062b98f1b2531673efdd/uvicorn-0.41.0.tar.gz", hash = "sha256:09d11cf7008da33113824ee5a1c6422d89fbc2ff476540d69a34c87fab8b571a", size = 82633, upload-time = "2026-02-16T23:07:24.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/ad/4a96c425be6fb67e0621e62d86c402b4a17ab2be7f7c055d9bd2f638b9e2/uvicorn-0.42.0.tar.gz", hash = "sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775", size = 85393, upload-time = "2026-03-16T06:19:50.077Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/e4/d04a086285c20886c0daad0e026f250869201013d18f81d9ff5eada73a88/uvicorn-0.41.0-py3-none-any.whl", hash = "sha256:29e35b1d2c36a04b9e180d4007ede3bcb32a85fbdfd6c6aeb3f26839de088187", size = 68783, upload-time = "2026-02-16T23:07:22.357Z" }, + { url = "https://files.pythonhosted.org/packages/0a/89/f8827ccff89c1586027a105e5630ff6139a64da2515e24dafe860bd9ae4d/uvicorn-0.42.0-py3-none-any.whl", hash = "sha256:96c30f5c7abe6f74ae8900a70e92b85ad6613b745d4879eb9b16ccad15645359", size = 68830, upload-time = "2026-03-16T06:19:48.325Z" }, ] [[package]] From 29273984c72b684da6a18299246cb930d5e657f2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Mar 2026 05:32:59 -0500 Subject: [PATCH 2772/2998] .tool-versions(uv) uv 0.10.9 -> 0.10.12 See also: - uv: - https://github.com/astral-sh/uv/releases/tag/0.10.12 - https://github.com/astral-sh/uv/blob/0.10.12/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 0c2c7c1d5d..3e09cddfcb 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.46.0 -uv 0.10.9 +uv 0.10.12 python 3.14 3.13 3.12 3.11 3.10 From d834c79372eeac3b6c81b250609f82d7f95e973f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Mar 2026 05:39:50 -0500 Subject: [PATCH 2773/2998] .tool-versions(just) just 1.46 -> 1.47 - just - https://github.com/casey/just/blob/1.47.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.47.0 - https://github.com/casey/just/blob/1.47.1/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.47.1 --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 3e09cddfcb..9c32c2514e 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.46.0 +just 1.47 uv 0.10.12 python 3.14 3.13 3.12 3.11 3.10 From a896ce3a0c24c1efee4fefa89d6b4af759becfab Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Mar 2026 05:52:20 -0500 Subject: [PATCH 2774/2998] py(test[filterwarnings]): Fix aafigure SyntaxWarning filter for Python 3.14 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: On Python 3.14, invalid escape sequences emit SyntaxWarning at compile time. The compiler derives the warning's module from the full filesystem path (e.g. /home/…/site-packages/aafigure/aafigure), not the dotted module name. Since Python's warning filter uses re.match() (anchored at start), the bare `aafigure` pattern failed to match the full path, allowing the warning to slip through. what: - Change module regex from `aafigure` to `.*aafigure.*` so it matches the full file path that CPython's compiler passes as the module name --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9e3f8c75fa..a5c8826633 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -249,5 +249,5 @@ testpaths = [ ] filterwarnings = [ "ignore:The frontend.Option(Parser)? class.*:DeprecationWarning::", - "ignore:.*invalid escape sequence.*:SyntaxWarning:aafigure:", + "ignore:.*invalid escape sequence.*:SyntaxWarning:.*aafigure.*:", ] From a198e3c9f0cd0df771fe1593691238cbd59d9856 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 21 Mar 2026 08:27:11 -0500 Subject: [PATCH 2775/2998] ai(claude[skills]): Add update-libtmux dependency workflow skill why: Codify the recurring workflow for bumping libtmux in tmuxp into a reusable Claude Code skill with auto-discovery via description matching. what: - Add .claude/skills/update-libtmux/SKILL.md - Encodes 7-step workflow: preflight, study upstream, branch, package commit, code commit(s), test commit(s), CHANGES commit - Produces separate atomic commits with rich messages following project conventions (see ff52d0d2 as exemplar) - Includes user confirmation gate after impact analysis - References past libtmux bump commits as templates --- .claude/skills/update-libtmux/SKILL.md | 359 +++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 .claude/skills/update-libtmux/SKILL.md diff --git a/.claude/skills/update-libtmux/SKILL.md b/.claude/skills/update-libtmux/SKILL.md new file mode 100644 index 0000000000..530ae6d9e1 --- /dev/null +++ b/.claude/skills/update-libtmux/SKILL.md @@ -0,0 +1,359 @@ +--- +name: update-libtmux +description: >- + Use when the user asks to "update libtmux", "bump libtmux", + "upgrade libtmux dependency", "check for new libtmux version", + or when investigating whether tmuxp needs a libtmux update. + Guides the full workflow: studying upstream changes, updating + the dependency, migrating code and tests, and producing + separate atomic commits with rich messages. +user-invocable: true +argument-hint: "[target-version] (optional, defaults to latest on PyPI)" +--- + +# Update libtmux Dependency + +Workflow for updating the libtmux dependency in tmuxp with separate, atomic commits. + +## Overview + +This skill produces up to four atomic commits on a dedicated branch, then opens a PR: + +1. **Package commit** — bump `pyproject.toml` + `uv.lock` +2. **Code commit(s)** — API migrations, new feature adoption (if needed) +3. **Test commit(s)** — test updates for changed/new APIs (if needed) +4. **CHANGES commit** — changelog entry documenting the bump + +Each commit stands alone, passes tests independently, and has a rich commit body. + +## Step 0: Preflight + +Gather current state before making any changes. + +### 0a. Current dependency + +Read `pyproject.toml` and find the `libtmux~=X.Y.Z` specifier in `[project] dependencies`. + +### 0b. Latest version on PyPI + +```bash +pip index versions libtmux +``` + +If the user provided a target version, use that. Otherwise use the latest from PyPI. + +### 0c. Short-circuit check + +If the current specifier already covers the target version, inform the user and stop. + +### 0d. Ensure local libtmux clone is current + +The local libtmux clone lives at `~/work/python/libtmux`. Fetch and check: + +```bash +cd ~/work/python/libtmux && git fetch --tags && git log --oneline -5 +``` + +Verify the target version tag exists. If not, the version may not be released yet — warn the user. + +## Step 1: Study upstream changes + +This is the most important step. Read the libtmux CHANGES file to understand what changed between the current pinned version and the target. + +### 1a. Read libtmux CHANGES + +Read `~/work/python/libtmux/CHANGES` from the section for the target version back through all versions since the current pin. + +Categorize changes into: + +| Category | Action needed in tmuxp | +|----------|----------------------| +| **Breaking changes** | Must fix code/tests | +| **Deprecations** | Should migrate away | +| **New APIs** | Optionally adopt | +| **Bug fixes** | Note for commit message | +| **Internal/docs** | Note for commit message only | + +### 1b. Check for API impact in tmuxp + +For each breaking change or deprecation, grep tmuxp source and tests: + +```bash +# Example: if Window.rename_window() changed signature +rg "rename_window" src/ tests/ +``` + +Search patterns to check (adapt based on actual changes): +- Method/function names that changed +- Constructor parameters that changed +- Import paths that moved +- Exception types that changed +- Return type changes + +### 1c. Check libtmux git log for details + +For breaking changes where the CHANGES entry is unclear, read the actual commits: + +```bash +cd ~/work/python/libtmux && git log --oneline v{CURRENT}..v{TARGET} -- src/ +``` + +### 1d. Summarize findings + +Present findings to the user before proceeding: +- Versions being skipped (e.g., "0.53.1, 0.54.0, 0.55.0") +- Breaking changes requiring code updates +- New APIs available for adoption +- Test impact assessment +- Estimated commit count + +Get user confirmation to proceed. + +## Step 2: Create branch + +```bash +git checkout -b deps/libtmux-{TARGET_VERSION} +``` + +Branch naming convention: `deps/libtmux-X.Y.Z` + +## Step 3: Package commit + +Update the dependency specifier and lock file. + +### 3a. Edit pyproject.toml + +Change the `libtmux~=X.Y.Z` line in `[project] dependencies`. + +### 3b. Update lock file + +```bash +uv lock +``` + +### 3c. Verify installation + +```bash +uv sync +``` + +### 3d. Run tests (smoke check) + +```bash +uv run py.test tests/ -x -q 2>&1 | tail -20 +``` + +Note any failures — these indicate code changes needed in Step 4. + +### 3e. Commit + +Commit message format (use heredoc for multiline): + +``` +deps(libtmux[~=X.Y.Z]): Bump from ~=A.B.C + +why: Pick up N libtmux release(s) (list versions) bringing +[brief summary of key changes]. + +what: +- Bump libtmux dependency specifier ~=A.B.C -> ~=X.Y.Z in pyproject.toml +- Update uv.lock + +libtmux X.Y.Z (date): +- [key change 1] +- [key change 2] + +[repeat for each intermediate version] + +Release: https://github.com/tmux-python/libtmux/releases/tag/vX.Y.Z +Changelog: https://libtmux.git-pull.com/history.html#libtmux-X-Y-Z-YYYY-MM-DD +``` + +Stage only `pyproject.toml` and `uv.lock`. + +## Step 4: Code commit(s) — if needed + +Skip this step if no breaking changes or API migrations are needed. + +### 4a. Fix breaking changes + +Address each breaking change identified in Step 1b. Make minimal, targeted fixes. + +### 4b. Adopt new APIs (optional) + +Only if the user requested it or it simplifies existing code significantly. + +### 4c. Run linting and type checking + +```bash +uv run ruff check . --fix --show-fixes +uv run ruff format . +uv run mypy +``` + +### 4d. Run tests + +```bash +uv run py.test tests/ -x -q +``` + +### 4e. Commit + +One commit per logical change. Format: + +``` +Scope(type[detail]): description of the migration + +why: libtmux X.Y.Z changed [what changed]. +what: +- [specific code change 1] +- [specific code change 2] +``` + +Use the project's standard scope conventions: +- `workspace/builder(fix[method])` for builder changes +- `cli/load(fix[feature])` for CLI changes +- `plugin(fix[hook])` for plugin changes + +## Step 5: Test commit(s) — if needed + +Skip if no test changes are required beyond what was fixed in Step 4. + +### 5a. Update tests for API changes + +Fix any tests that broke due to upstream changes. + +### 5b. Add tests for newly adopted APIs + +If Step 4 adopted new libtmux features, add tests. + +### 5c. Run full test suite + +```bash +uv run py.test +``` + +All tests must pass (doctests included — pytest is configured with `--doctest-modules`). + +### 5d. Commit + +``` +tests(scope[detail]): description + +why: Adapt tests for libtmux X.Y.Z [change]. +what: +- [specific test change 1] +- [specific test change 2] +``` + +## Step 6: CHANGES commit + +### 6a. Determine placement + +The CHANGES file has a placeholder section for the next unreleased version at the top. Add the entry below the placeholder comments. + +### 6b. Write the entry + +Add under `### Breaking Changes` if the bump changes minimum version, or `### Development` / `### Dependencies` for non-breaking bumps: + +For a breaking bump: + +```markdown +#### **libtmux** minimum bumped from `~=A.B.C` to `~=X.Y.Z` + + Picks up N releases: [version list with brief descriptions]. +``` + +For a non-breaking bump, use `### Dependencies`: + +```markdown +### Dependencies + +- Bump libtmux `~=A.B.C` -> `~=X.Y.Z` ([key changes summary]) +``` + +### 6c. Commit + +``` +docs(CHANGES): libtmux ~=A.B.C -> ~=X.Y.Z + +why: Document the dependency bump for the upcoming release. +what: +- Add entry for libtmux bump under [section name] +- Summarize key upstream changes +``` + +## Step 7: Push and open PR + +### 7a. Push the branch + +```bash +git push -u origin deps/libtmux-{TARGET_VERSION} +``` + +### 7b. Open PR + +```bash +gh pr create \ + --title "deps(libtmux[~=X.Y.Z]): Bump from ~=A.B.C" \ + --body "$(cat <<'EOF' +## Summary + +- Bump libtmux from `~=A.B.C` to `~=X.Y.Z` +- [N] upstream releases included +- [Breaking changes summary, or "No breaking changes"] + +## Upstream changes + +### libtmux X.Y.Z (date) +- [changes] + +[repeat for intermediate versions] + +## Changes in this PR + +- **Package**: pyproject.toml + uv.lock +- **Code**: [summary or "No code changes needed"] +- **Tests**: [summary or "No test changes needed"] +- **CHANGES**: Documented bump + +## Test plan + +- [ ] `uv run py.test` passes +- [ ] `uv run mypy` passes +- [ ] `uv run ruff check .` passes +EOF +)" +``` + +### 7c. Report to user + +Provide the PR URL and a summary of all commits created. + +## Reference: Past libtmux bumps + +These exemplar commits show the established patterns: + +| Version bump | Deps commit | CHANGES commit | PR | +|---|---|---|---| +| 0.53.0 → 0.55.0 | `ff52d0d2` | `094800f4` | #1019 | +| 0.52.1 → 0.53.0 | `5ff6400f` | `240d85fe` | #1003 | +| 0.51.0 → 0.52.1 | `fabd678f` | (in same commit) | #1001 | +| 0.50.1 → 0.51.0 | (in merge) | (in merge) | #999 | + +The 0.53→0.55 bump (`ff52d0d2`) is the gold standard for commit message richness — per-version changelogs, upstream links, and clear why/what structure. + +## Checklist + +Use this as a progress tracker: + +- [ ] Preflight: identify current and target versions +- [ ] Study upstream CHANGES and identify impact +- [ ] Summarize findings and get user confirmation +- [ ] Create branch `deps/libtmux-X.Y.Z` +- [ ] Package commit: pyproject.toml + uv.lock +- [ ] Code commit(s): API migrations (if needed) +- [ ] Test commit(s): test updates (if needed) +- [ ] CHANGES commit: changelog entry +- [ ] Push and open PR +- [ ] Report PR URL to user From 5d81fc9928dd52cf530fe526e973a57ba22a24b3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Mar 2026 08:41:38 -0500 Subject: [PATCH 2776/2998] docs(sidebar): Add libtmux-mcp links and path-aware active detection why: Update sidebar to include libtmux-mcp and pytest sub-links under tmux-python group, and upgrade JS to support path-aware active detection for sub-project URLs. what: - Switch tmux-python to indented layout with mcp and pytest sub-links - Replace hostname-only JS matching with URL-aware path prefix matching --- docs/_templates/sidebar/projects.html | 36 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/docs/_templates/sidebar/projects.html b/docs/_templates/sidebar/projects.html index 0c182a2b33..f70e6fe032 100644 --- a/docs/_templates/sidebar/projects.html +++ b/docs/_templates/sidebar/projects.html @@ -13,8 +13,14 @@

    tmux-python - tmuxp - (libtmux) + + tmuxp + + + libtmux + (mcp, + pytest) +

    @@ -56,15 +62,23 @@ From 33da7da2b7216ce51a9866ad63a41a2962dee4cc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 22 Mar 2026 19:53:11 -0500 Subject: [PATCH 2777/2998] docs(contributing): Update for project tooling why: Template referenced flake8 and make test; project uses ruff, mypy, and uv. what: - Rewrite PR process for ruff, mypy, pytest, uv workflow - Reference AGENTS.md and developing docs --- .github/contributing.md | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/contributing.md b/.github/contributing.md index 5712dcf03a..c0eddac2c2 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -3,25 +3,17 @@ When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the maintainers of this repository before making a change. -Please note we have a code of conduct, please follow it in all your interactions with the project. +See [developing](../docs/developing.md) for environment setup and [AGENTS.md](../AGENTS.md) for +detailed coding standards. ## Pull Request Process -1. Ensure any install or build dependencies are removed before the end of the layer when doing a - build. -2. This project uses flake8 to conform with common Python standards. Make sure - to run your code through linter using latest version of flake8, before pull request. -3. Bad documnentation is a Bug. If your change demands documentation update, please do so. If you - find an issue with documentation, take the time to improve or fix it. -4. pytest is used for automated testing. Please make sure to update tests that are needed, and to run - `make test` before submitting your pull request. This should prevent issues with TravisCI and - make the review and merging process easier and faster. -5. Update the README.md with details of changes to the interface, this includes new environment - variables, exposed ports, useful file locations and container parameters. -6. Increase the version numbers in any examples files and the README.md to the new version that this - Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). -7. You may merge the Pull Request in once you have the sign-off of one other developer. If you - do not have permission to do that, you may request reviewer to merge it for you. +1. **Format and lint**: `uv run ruff format .` then `uv run ruff check . --fix --show-fixes` +2. **Type check**: `uv run mypy` +3. **Test**: `uv run pytest` — all tests must pass before submitting +4. **Document**: Update docs if your change affects the public interface +5. You may merge the Pull Request once you have the sign-off of one other developer. If you + do not have permission to do that, you may request a reviewer to merge it for you. ## Decorum From 3869c11fe476a0d4ec4d210854ed12d8ba7fd0d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 17:50:05 -0500 Subject: [PATCH 2778/2998] py(deps[docs]): add sphinx-design, annotate doc dependencies with site URLs why: sphinx-design is needed for grid cards in the documentation landing pages and section indexes. Doc-site URLs added as inline comments for quick reference when managing dependencies. what: - Add sphinx-design to docs and dev dependency groups - Annotate all doc dependencies with their documentation URLs --- pyproject.toml | 54 ++++++++++++++++++++++++++------------------------ uv.lock | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a5c8826633..02fc0e28f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,19 +55,20 @@ tmuxp = 'tmuxp:cli.cli' [dependency-groups] dev = [ # Docs - "aafigure", - "pillow", - "sphinx<9", - "furo", - "gp-libs", - "sphinx-autobuild", - "sphinx-autodoc-typehints", - "sphinx-inline-tabs", - "sphinxext-opengraph", - "sphinx-copybutton", - "sphinxext-rediraffe", - "myst-parser", - "linkify-it-py", + "aafigure", # https://launchpad.net/aafigure + "pillow", # https://pillow.readthedocs.io/ + "sphinx<9", # https://www.sphinx-doc.org/ + "furo", # https://pradyunsg.me/furo/ + "gp-libs", # https://gp-libs.git-pull.com/ + "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html + "sphinx-autodoc-typehints", # https://sphinx-autodoc-typehints.readthedocs.io/ + "sphinx-inline-tabs", # https://sphinx-inline-tabs.readthedocs.io/ + "sphinxext-opengraph", # https://sphinxext-opengraph.readthedocs.io/ + "sphinx-copybutton", # https://sphinx-copybutton.readthedocs.io/ + "sphinxext-rediraffe", # https://sphinxext-rediraffe.readthedocs.io/ + "sphinx-design", # https://sphinx-design.readthedocs.io/ + "myst-parser", # https://myst-parser.readthedocs.io/ + "linkify-it-py", # https://github.com/tsutsu3/linkify-it-py # Testing "gp-libs", "pytest", @@ -87,19 +88,20 @@ dev = [ ] docs = [ - "aafigure", - "pillow", - "sphinx<9", - "furo", - "gp-libs", - "sphinx-autobuild", - "sphinx-autodoc-typehints", - "sphinx-inline-tabs", - "sphinxext-opengraph", - "sphinx-copybutton", - "sphinxext-rediraffe", - "myst-parser", - "linkify-it-py", + "aafigure", # https://launchpad.net/aafigure + "pillow", # https://pillow.readthedocs.io/ + "sphinx<9", # https://www.sphinx-doc.org/ + "furo", # https://pradyunsg.me/furo/ + "gp-libs", # https://gp-libs.git-pull.com/ + "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html + "sphinx-autodoc-typehints", # https://sphinx-autodoc-typehints.readthedocs.io/ + "sphinx-inline-tabs", # https://sphinx-inline-tabs.readthedocs.io/ + "sphinxext-opengraph", # https://sphinxext-opengraph.readthedocs.io/ + "sphinx-copybutton", # https://sphinx-copybutton.readthedocs.io/ + "sphinxext-rediraffe", # https://sphinxext-rediraffe.readthedocs.io/ + "sphinx-design", # https://sphinx-design.readthedocs.io/ + "myst-parser", # https://myst-parser.readthedocs.io/ + "linkify-it-py", # https://github.com/tsutsu3/linkify-it-py ] testing = [ "gp-libs", diff --git a/uv.lock b/uv.lock index 379131738e..d937343d61 100644 --- a/uv.lock +++ b/uv.lock @@ -1287,6 +1287,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, ] +[[package]] +name = "sphinx-design" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, +] + +[[package]] +name = "sphinx-design" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/7b/804f311da4663a4aecc6cf7abd83443f3d4ded970826d0c958edc77d4527/sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a", size = 2203582, upload-time = "2026-01-19T13:12:53.297Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl", hash = "sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282", size = 2220350, upload-time = "2026-01-19T13:12:51.077Z" }, +] + [[package]] name = "sphinx-inline-tabs" version = "2025.12.21.14" @@ -1432,6 +1463,8 @@ dev = [ { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, @@ -1454,6 +1487,8 @@ docs = [ { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, @@ -1505,6 +1540,7 @@ dev = [ { name = "sphinx-autobuild" }, { name = "sphinx-autodoc-typehints" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, @@ -1523,6 +1559,7 @@ docs = [ { name = "sphinx-autobuild" }, { name = "sphinx-autodoc-typehints" }, { name = "sphinx-copybutton" }, + { name = "sphinx-design" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, From 07c0ff95056e70080d1d395832e7ca1d749ee1e2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 17:50:05 -0500 Subject: [PATCH 2779/2998] docs(redesign): restructure documentation to CLI Frontend Skeleton pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: The documentation mixed user-facing CLI docs with internal Python API reference at the same sidebar level, the landing page dumped the entire README (12 H1 headings), and contributor docs were scattered. This restructure follows the Python Documentation Skeletons spec where cli/ is the primary reference surface for a CLI package and the Python API is explicitly internal. what: Structure: - Move entire docs/api/ to docs/internals/api/ (Python API is internal for a CLI package) - Rename inner api/internals/ to api/_internal/ to avoid path stutter - Create topics/ directory with workflows, troubleshooting, library-vs-cli, and plugins (moved from plugins/) - Create project/ directory (contributing, code-style, releasing) - Move developing.md to project/contributing.md - Fold about.md (stale 2016 content) into topics/index.md as a brief tmuxinator/teamocil comparison note - Delete about.md New pages: - cli/exit-codes.md — exit codes for scripting and automation - cli/recipes.md — copy-pasteable command invocations - internals/index.md — explicit "not for end users" warning - internals/architecture.md — CLI dispatch flow diagram - topics/workflows.md — CI integration, scripting patterns - topics/troubleshooting.md — common shell/PATH/tmux issues - topics/library-vs-cli.md — when to use tmuxp CLI vs libtmux, concept mapping table, what the CLI can't express - project/code-style.md — ruff, mypy, NumPy docstrings - project/releasing.md — git tags, OIDC trusted publishing Landing page: - Compose standalone homepage (no README.md includes) - One-sentence intro, 3+2 grid cards, 3-command install, inline YAML example + tmuxp load command, demo GIF Section indexes: - cli/index.md: heading "CLI Reference", 2x3 card grid for key commands + exit-codes and recipes - topics/index.md: 2x2 card grid with comparison note - project/index.md: 2x2 card grid for contributor pages (3 items) - configuration/index.md: 1x3 card grid for reference subpages Navigation: - Sidebar primary: Quickstart, CLI Reference, Workspace files, Topics, Internals, Project, Changelog - Sidebar "More" caption: The Tao of tmux, Migration, Glossary - 35 redirects for all moved files (every individual api/ file covered) - README.md URLs updated to new doc structure paths, http → https Dependencies: - Add sphinx-design to docs and dev dependency groups - Annotate all doc dependencies with documentation site URLs conf.py: - Add sphinx_design extension - Add myst_heading_anchors = 4 --- README.md | 16 +-- docs/about.md | 104 ------------------ docs/cli/exit-codes.md | 30 +++++ docs/cli/index.md | 51 ++++++++- docs/cli/recipes.md | 77 +++++++++++++ docs/conf.py | 3 + docs/configuration/index.md | 25 ++++- docs/index.md | 100 ++++++++++++++--- .../api/_internal}/colors.md | 0 .../api/_internal}/config_reader.md | 0 .../api/_internal}/index.md | 4 +- .../api/_internal}/private_path.md | 0 .../api/_internal}/types.md | 0 docs/{ => internals}/api/cli/convert.md | 0 docs/{ => internals}/api/cli/debug_info.md | 0 docs/{ => internals}/api/cli/edit.md | 0 docs/{ => internals}/api/cli/freeze.md | 0 docs/{ => internals}/api/cli/import_config.md | 0 docs/{ => internals}/api/cli/index.md | 0 docs/{ => internals}/api/cli/load.md | 0 docs/{ => internals}/api/cli/ls.md | 0 docs/{ => internals}/api/cli/progress.md | 0 docs/{ => internals}/api/cli/search.md | 0 docs/{ => internals}/api/cli/shell.md | 0 docs/{ => internals}/api/cli/utils.md | 0 docs/{ => internals}/api/exc.md | 0 docs/{ => internals}/api/index.md | 2 +- docs/{ => internals}/api/log.md | 0 docs/{ => internals}/api/plugin.md | 0 docs/{ => internals}/api/shell.md | 0 docs/{ => internals}/api/types.md | 0 docs/{ => internals}/api/util.md | 0 docs/{ => internals}/api/workspace/builder.md | 0 .../api/workspace/constants.md | 0 docs/{ => internals}/api/workspace/finders.md | 0 docs/{ => internals}/api/workspace/freezer.md | 0 .../api/workspace/importers.md | 0 docs/{ => internals}/api/workspace/index.md | 0 docs/{ => internals}/api/workspace/loader.md | 0 .../api/workspace/validation.md | 0 docs/internals/architecture.md | 39 +++++++ docs/internals/index.md | 19 ++++ docs/project/code-style.md | 32 ++++++ .../contributing.md} | 0 docs/project/index.md | 36 ++++++ docs/project/releasing.md | 50 +++++++++ docs/redirects.txt | 35 ++++++ docs/topics/index.md | 52 +++++++++ docs/topics/library-vs-cli.md | 62 +++++++++++ docs/{plugins/index.md => topics/plugins.md} | 0 docs/topics/troubleshooting.md | 40 +++++++ docs/topics/workflows.md | 32 ++++++ 52 files changed, 674 insertions(+), 135 deletions(-) delete mode 100644 docs/about.md create mode 100644 docs/cli/exit-codes.md create mode 100644 docs/cli/recipes.md rename docs/{api/internals => internals/api/_internal}/colors.md (100%) rename docs/{api/internals => internals/api/_internal}/config_reader.md (100%) rename docs/{api/internals => internals/api/_internal}/index.md (90%) rename docs/{api/internals => internals/api/_internal}/private_path.md (100%) rename docs/{api/internals => internals/api/_internal}/types.md (100%) rename docs/{ => internals}/api/cli/convert.md (100%) rename docs/{ => internals}/api/cli/debug_info.md (100%) rename docs/{ => internals}/api/cli/edit.md (100%) rename docs/{ => internals}/api/cli/freeze.md (100%) rename docs/{ => internals}/api/cli/import_config.md (100%) rename docs/{ => internals}/api/cli/index.md (100%) rename docs/{ => internals}/api/cli/load.md (100%) rename docs/{ => internals}/api/cli/ls.md (100%) rename docs/{ => internals}/api/cli/progress.md (100%) rename docs/{ => internals}/api/cli/search.md (100%) rename docs/{ => internals}/api/cli/shell.md (100%) rename docs/{ => internals}/api/cli/utils.md (100%) rename docs/{ => internals}/api/exc.md (100%) rename docs/{ => internals}/api/index.md (94%) rename docs/{ => internals}/api/log.md (100%) rename docs/{ => internals}/api/plugin.md (100%) rename docs/{ => internals}/api/shell.md (100%) rename docs/{ => internals}/api/types.md (100%) rename docs/{ => internals}/api/util.md (100%) rename docs/{ => internals}/api/workspace/builder.md (100%) rename docs/{ => internals}/api/workspace/constants.md (100%) rename docs/{ => internals}/api/workspace/finders.md (100%) rename docs/{ => internals}/api/workspace/freezer.md (100%) rename docs/{ => internals}/api/workspace/importers.md (100%) rename docs/{ => internals}/api/workspace/index.md (100%) rename docs/{ => internals}/api/workspace/loader.md (100%) rename docs/{ => internals}/api/workspace/validation.md (100%) create mode 100644 docs/internals/architecture.md create mode 100644 docs/internals/index.md create mode 100644 docs/project/code-style.md rename docs/{developing.md => project/contributing.md} (100%) create mode 100644 docs/project/index.md create mode 100644 docs/project/releasing.md create mode 100644 docs/topics/index.md create mode 100644 docs/topics/library-vs-cli.md rename docs/{plugins/index.md => topics/plugins.md} (100%) create mode 100644 docs/topics/troubleshooting.md create mode 100644 docs/topics/workflows.md diff --git a/README.md b/README.md index c1a97d75a0..b53d3e100a 100644 --- a/README.md +++ b/README.md @@ -132,9 +132,9 @@ Name a session: tmuxp load -s session_name ./mysession.yaml ``` -[simple](http://tmuxp.git-pull.com/examples.html#short-hand-inline) and +[simple](https://tmuxp.git-pull.com/configuration/examples.html#short-hand-inline-style) and [very -elaborate](http://tmuxp.git-pull.com/examples.html#super-advanced-dev-environment) +elaborate](https://tmuxp.git-pull.com/configuration/examples.html#super-advanced-dev-environment) config examples # User-level configurations @@ -204,7 +204,7 @@ the CLI docs. Run custom startup scripts (such as installing project dependencies) before loading tmux. See the -[before_script](http://tmuxp.git-pull.com/examples.html#bootstrap-project-before-launch) +[before_script](https://tmuxp.git-pull.com/configuration/examples.html#bootstrap-project-before-launch) example # Load in detached state @@ -247,7 +247,7 @@ $ tmuxp convert --yes filename # Plugin System tmuxp has a plugin system to allow for custom behavior. See more about -the [Plugin System](http://tmuxp.git-pull.com/plugin_system.html). +the [Plugin System](https://tmuxp.git-pull.com/topics/plugins.html). # Debugging Helpers @@ -272,13 +272,13 @@ environment: # Docs / Reading material -See the [Quickstart](http://tmuxp.git-pull.com/quickstart.html). +See the [Quickstart](https://tmuxp.git-pull.com/quickstart.html). -[Documentation](http://tmuxp.git-pull.com) homepage (also in +[Documentation](https://tmuxp.git-pull.com) homepage (also in [中文](http://tmuxp-zh.rtfd.org/)) Want to learn more about tmux itself? [Read The Tao of Tmux -online](http://tmuxp.git-pull.com/about_tmux.html). +online](https://tmuxp.git-pull.com/about_tmux.html). # Donations @@ -295,7 +295,7 @@ See donation options at . - python support: >= 3.10, pypy, pypy3 - Source: - Docs: -- API: +- API: - Changelog: - Issues: - Test Coverage: diff --git a/docs/about.md b/docs/about.md deleted file mode 100644 index 0d380728db..0000000000 --- a/docs/about.md +++ /dev/null @@ -1,104 +0,0 @@ -```{module} tmuxp - -``` - -(about)= - -# About - -tmuxp helps you manage tmux workspaces. - -Built on an object relational mapper for tmux. tmux users can reload common -workspaces from YAML, JSON and {py:obj}`dict` workspace files like -[tmuxinator] and [teamocil]. - -tmuxp is used by developers for tmux automation at great companies like -[Bugsnag], [Pragmatic Coders] and many others. - -To jump right in, see {ref}`quickstart` and {ref}`examples`. - -Interested in some kung-fu or joining the effort? {ref}`api` and -{ref}`developing`. - -[MIT-licensed]. Code on [github](http://github.com/tmux-python/tmuxp). - -[bugsnag]: https://blog.bugsnag.com/benefits-of-using-tmux/ -[pragmatic coders]: http://pragmaticcoders.com/blog/tmuxp-preconfigured-sessions/ - -## Compared to tmuxinator / teamocil - -### Similarities - -**Load sessions** Loads tmux sessions from config - -**YAML** Supports YAML format - -**Inlining / shorthand configuration** All three support short-hand and -simplified markup for panes that have one command. - -**Maturity and stability** As of 2016, all three are considered stable, -well tested and adopted. - -### Missing - -**Version support** tmuxp only supports `tmux >= 3.2`. Teamocil and -tmuxinator may have support for earlier versions. - -### Differences - -**Programming Language** python. teamocil and tmuxinator use ruby. - -**Workspace building process** teamocil and tmuxinator process configs -directly shell commands. tmuxp processes configuration via ORM layer. - -## Additional Features - -**CLI** tmuxp's CLI can attach and kill sessions with tab-completion -support. See {ref}`commands`. - -**Import config** import configs from Teamocil / Tmuxinator [^id4]. See -{ref}`cli-import`. - -**Session freezing** Supports session freezing into YAML and JSON -format [^id4]. See {ref}`cli-freeze`. - -**JSON config** JSON config support. See {ref}`Examples`. - -**ORM-based API** via [libtmux] - Utilizes tmux's unique IDs for -panes, windows and sessions to create an object relational view of the tmux -{class}`~libtmux.Server`, its {class}`~libtmux.Session`, -{class}`~libtmux.Window`, and {class}`~libtmux.Pane`. -See {ref}`libtmux's internals `. - -**Conversion** `$ tmuxp convert ` can convert files to and -from JSON and YAML. - -[^id4]: On freezing - - While freezing and importing sessions is a great way to save time, - tweaking will probably be required - There is no substitute to a - config made with love. - -[libtmux]: https://libtmux.git-pull.com - -## Minor tweaks - -- Unit tests against live tmux version to test statefulness of tmux - sessions, windows and panes. See {ref}`gh-actions`. -- Load + switch to new session from inside tmux. -- Resume session if config loaded. -- Pre-commands virtualenv / rvm / any other commands. -- Load config from anywhere `$ tmuxp load /full/file/path.json`. -- Load config `.tmuxp.yaml` or `.tmuxp.json` from current working - directory with `$ tmuxp load .`. -- `$ tmuxp -2`, `$ tmuxp -8` for forcing term colors a la - {term}`tmux(1)`. -- `$ tmuxp -L`, `$ tmuxp -S` for sockets and - `$ tmuxp -f ` for config file. - -[attempt at 1.7 test]: https://travis-ci.org/tmux-python/tmuxp/jobs/12348263 -[mit-licensed]: http://opensource.org/licenses/MIT -[tmuxinator]: https://github.com/aziz/tmuxinator -[teamocil]: https://github.com/remiprev/teamocil -[erb]: http://ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html -[edit this page]: https://github.com/tmux-python/tmuxp/edit/master/doc/about.rst diff --git a/docs/cli/exit-codes.md b/docs/cli/exit-codes.md new file mode 100644 index 0000000000..e8a80e892d --- /dev/null +++ b/docs/cli/exit-codes.md @@ -0,0 +1,30 @@ +(cli-exit-codes)= + +# Exit Codes + +tmuxp uses standard exit codes for scripting and automation. + +| Code | Meaning | +|------|---------| +| `0` | Success | +| `1` | General error (config validation, tmux command failure) | +| `2` | Usage error (invalid arguments, missing required options) | + +## Usage in Scripts + +```bash +#!/bin/bash +tmuxp load my-workspace.yaml +if [ $? -ne 0 ]; then + echo "Failed to load workspace" + exit 1 +fi +``` + +```bash +#!/bin/bash +tmuxp load -d my-workspace.yaml || { + echo "tmuxp failed with exit code $?" + exit 1 +} +``` diff --git a/docs/cli/index.md b/docs/cli/index.md index cb8bf94b3b..c1c6b605fc 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -2,7 +2,48 @@ (commands)= -# Commands +# CLI Reference + +::::{grid} 2 +:gutter: 3 + +:::{grid-item-card} tmuxp load +:link: load +:link-type: doc +Load tmux sessions from workspace configs. +::: + +:::{grid-item-card} tmuxp shell +:link: shell +:link-type: doc +Interactive Python shell with tmux context. +::: + +:::{grid-item-card} tmuxp freeze +:link: freeze +:link-type: doc +Export running sessions to config files. +::: + +:::{grid-item-card} tmuxp convert +:link: convert +:link-type: doc +Convert between YAML and JSON formats. +::: + +:::{grid-item-card} Exit Codes +:link: exit-codes +:link-type: doc +Exit codes for scripting and automation. +::: + +:::{grid-item-card} Recipes +:link: recipes +:link-type: doc +Copy-pasteable command invocations. +::: + +:::: ```{toctree} :caption: General commands @@ -38,6 +79,14 @@ debug-info completion ``` +```{toctree} +:caption: Reference +:maxdepth: 1 + +exit-codes +recipes +``` + (cli-main)= (tmuxp-main)= diff --git a/docs/cli/recipes.md b/docs/cli/recipes.md new file mode 100644 index 0000000000..fdbdd7dad9 --- /dev/null +++ b/docs/cli/recipes.md @@ -0,0 +1,77 @@ +(cli-recipes)= + +# Recipes + +Copy-pasteable command invocations for common tasks. + +## Load a workspace + +```console +$ tmuxp load my-workspace.yaml +``` + +## Load in detached mode + +```console +$ tmuxp load -d my-workspace.yaml +``` + +## Load from a project directory + +```console +$ tmuxp load . +``` + +## Freeze a running session + +```console +$ tmuxp freeze my-session +``` + +## Convert YAML to JSON + +```console +$ tmuxp convert my-workspace.yaml +``` + +## Convert JSON to YAML + +```console +$ tmuxp convert my-workspace.json +``` + +## List available workspaces + +```console +$ tmuxp ls +``` + +## Search workspaces + +```console +$ tmuxp search my-project +``` + +## Edit a workspace config + +```console +$ tmuxp edit my-workspace +``` + +## Collect debug info + +```console +$ tmuxp debug-info +``` + +## Shell with tmux context + +```console +$ tmuxp shell +``` + +Access libtmux objects directly: + +```console +$ tmuxp shell --best --command 'print(server.sessions)' +``` diff --git a/docs/conf.py b/docs/conf.py index 478e5c1f01..3d77fc8993 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -44,6 +44,7 @@ "sphinxext.rediraffe", "myst_parser", "linkify_issues", + "sphinx_design", ] myst_enable_extensions = [ @@ -54,6 +55,8 @@ "linkify", ] +myst_heading_anchors = 4 + templates_path = ["_templates"] source_suffix = {".rst": "restructuredtext", ".md": "markdown"} diff --git a/docs/configuration/index.md b/docs/configuration/index.md index aa59b017ee..89b37b2a34 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -167,10 +167,33 @@ $ tmuxp load /opt/myapp ## Reference and usage +::::{grid} 3 +:gutter: 3 + +:::{grid-item-card} Top-level Options +:link: top-level +:link-type: doc +Session and window configuration keys. +::: + +:::{grid-item-card} Environment Variables +:link: environmental-variables +:link-type: doc +TMUXP_CONFIGDIR and other env vars. +::: + +:::{grid-item-card} Examples +:link: examples +:link-type: doc +Sample workspace configurations. +::: + +:::: + ```{toctree} +:hidden: top-level environmental-variables examples - ``` diff --git a/docs/index.md b/docs/index.md index fd8a21575f..9d8d12db2b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,81 @@ (index)= -```{include} ../README.md -:end-before: ``` diff --git a/docs/api/internals/colors.md b/docs/internals/api/_internal/colors.md similarity index 100% rename from docs/api/internals/colors.md rename to docs/internals/api/_internal/colors.md diff --git a/docs/api/internals/config_reader.md b/docs/internals/api/_internal/config_reader.md similarity index 100% rename from docs/api/internals/config_reader.md rename to docs/internals/api/_internal/config_reader.md diff --git a/docs/api/internals/index.md b/docs/internals/api/_internal/index.md similarity index 90% rename from docs/api/internals/index.md rename to docs/internals/api/_internal/index.md index b96fc8657b..391a80b60f 100644 --- a/docs/api/internals/index.md +++ b/docs/internals/api/_internal/index.md @@ -1,6 +1,6 @@ -(internals)= +(api-internal)= -# Internals +# Internal Modules :::{warning} Be careful with these! Internal APIs are **not** covered by version policies. They can break or be removed between minor versions! diff --git a/docs/api/internals/private_path.md b/docs/internals/api/_internal/private_path.md similarity index 100% rename from docs/api/internals/private_path.md rename to docs/internals/api/_internal/private_path.md diff --git a/docs/api/internals/types.md b/docs/internals/api/_internal/types.md similarity index 100% rename from docs/api/internals/types.md rename to docs/internals/api/_internal/types.md diff --git a/docs/api/cli/convert.md b/docs/internals/api/cli/convert.md similarity index 100% rename from docs/api/cli/convert.md rename to docs/internals/api/cli/convert.md diff --git a/docs/api/cli/debug_info.md b/docs/internals/api/cli/debug_info.md similarity index 100% rename from docs/api/cli/debug_info.md rename to docs/internals/api/cli/debug_info.md diff --git a/docs/api/cli/edit.md b/docs/internals/api/cli/edit.md similarity index 100% rename from docs/api/cli/edit.md rename to docs/internals/api/cli/edit.md diff --git a/docs/api/cli/freeze.md b/docs/internals/api/cli/freeze.md similarity index 100% rename from docs/api/cli/freeze.md rename to docs/internals/api/cli/freeze.md diff --git a/docs/api/cli/import_config.md b/docs/internals/api/cli/import_config.md similarity index 100% rename from docs/api/cli/import_config.md rename to docs/internals/api/cli/import_config.md diff --git a/docs/api/cli/index.md b/docs/internals/api/cli/index.md similarity index 100% rename from docs/api/cli/index.md rename to docs/internals/api/cli/index.md diff --git a/docs/api/cli/load.md b/docs/internals/api/cli/load.md similarity index 100% rename from docs/api/cli/load.md rename to docs/internals/api/cli/load.md diff --git a/docs/api/cli/ls.md b/docs/internals/api/cli/ls.md similarity index 100% rename from docs/api/cli/ls.md rename to docs/internals/api/cli/ls.md diff --git a/docs/api/cli/progress.md b/docs/internals/api/cli/progress.md similarity index 100% rename from docs/api/cli/progress.md rename to docs/internals/api/cli/progress.md diff --git a/docs/api/cli/search.md b/docs/internals/api/cli/search.md similarity index 100% rename from docs/api/cli/search.md rename to docs/internals/api/cli/search.md diff --git a/docs/api/cli/shell.md b/docs/internals/api/cli/shell.md similarity index 100% rename from docs/api/cli/shell.md rename to docs/internals/api/cli/shell.md diff --git a/docs/api/cli/utils.md b/docs/internals/api/cli/utils.md similarity index 100% rename from docs/api/cli/utils.md rename to docs/internals/api/cli/utils.md diff --git a/docs/api/exc.md b/docs/internals/api/exc.md similarity index 100% rename from docs/api/exc.md rename to docs/internals/api/exc.md diff --git a/docs/api/index.md b/docs/internals/api/index.md similarity index 94% rename from docs/api/index.md rename to docs/internals/api/index.md index 89ec3d508b..2debbe3f26 100644 --- a/docs/api/index.md +++ b/docs/internals/api/index.md @@ -8,7 +8,7 @@ tmux via python API calls. ::: ```{toctree} -internals/index +_internal/index cli/index workspace/index exc diff --git a/docs/api/log.md b/docs/internals/api/log.md similarity index 100% rename from docs/api/log.md rename to docs/internals/api/log.md diff --git a/docs/api/plugin.md b/docs/internals/api/plugin.md similarity index 100% rename from docs/api/plugin.md rename to docs/internals/api/plugin.md diff --git a/docs/api/shell.md b/docs/internals/api/shell.md similarity index 100% rename from docs/api/shell.md rename to docs/internals/api/shell.md diff --git a/docs/api/types.md b/docs/internals/api/types.md similarity index 100% rename from docs/api/types.md rename to docs/internals/api/types.md diff --git a/docs/api/util.md b/docs/internals/api/util.md similarity index 100% rename from docs/api/util.md rename to docs/internals/api/util.md diff --git a/docs/api/workspace/builder.md b/docs/internals/api/workspace/builder.md similarity index 100% rename from docs/api/workspace/builder.md rename to docs/internals/api/workspace/builder.md diff --git a/docs/api/workspace/constants.md b/docs/internals/api/workspace/constants.md similarity index 100% rename from docs/api/workspace/constants.md rename to docs/internals/api/workspace/constants.md diff --git a/docs/api/workspace/finders.md b/docs/internals/api/workspace/finders.md similarity index 100% rename from docs/api/workspace/finders.md rename to docs/internals/api/workspace/finders.md diff --git a/docs/api/workspace/freezer.md b/docs/internals/api/workspace/freezer.md similarity index 100% rename from docs/api/workspace/freezer.md rename to docs/internals/api/workspace/freezer.md diff --git a/docs/api/workspace/importers.md b/docs/internals/api/workspace/importers.md similarity index 100% rename from docs/api/workspace/importers.md rename to docs/internals/api/workspace/importers.md diff --git a/docs/api/workspace/index.md b/docs/internals/api/workspace/index.md similarity index 100% rename from docs/api/workspace/index.md rename to docs/internals/api/workspace/index.md diff --git a/docs/api/workspace/loader.md b/docs/internals/api/workspace/loader.md similarity index 100% rename from docs/api/workspace/loader.md rename to docs/internals/api/workspace/loader.md diff --git a/docs/api/workspace/validation.md b/docs/internals/api/workspace/validation.md similarity index 100% rename from docs/api/workspace/validation.md rename to docs/internals/api/workspace/validation.md diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md new file mode 100644 index 0000000000..7a104dbfea --- /dev/null +++ b/docs/internals/architecture.md @@ -0,0 +1,39 @@ +# Architecture + +How the tmuxp CLI dispatches commands to the underlying library. + +## Request Flow + +``` +tmuxp CLI (argparse) + │ + ├── tmuxp load ──→ workspace.loader ──→ workspace.builder ──→ libtmux + ├── tmuxp freeze ──→ workspace.freezer ──→ libtmux + ├── tmuxp convert ──→ _internal.config_reader + ├── tmuxp shell ──→ libtmux (interactive) + └── tmuxp ls/search ──→ workspace.finders +``` + +## Key Components + +### CLI Layer (`tmuxp.cli`) + +The CLI uses Python's `argparse` with a custom formatter ({mod}`tmuxp.cli._formatter`). +Each subcommand lives in its own module under `tmuxp.cli`. + +The entry point is `tmuxp.cli.cli()`, registered as a console script in `pyproject.toml`. + +### Workspace Layer (`tmuxp.workspace`) + +The workspace layer handles configuration lifecycle: + +1. **Finding**: {mod}`tmuxp.workspace.finders` locates config files +2. **Loading**: {mod}`tmuxp.workspace.loader` reads and validates configs +3. **Building**: {mod}`tmuxp.workspace.builder` creates tmux sessions via libtmux +4. **Freezing**: {mod}`tmuxp.workspace.freezer` exports running sessions + +### Library Layer (libtmux) + +tmuxp delegates all tmux operations to [libtmux](https://libtmux.git-pull.com/). +The `WorkspaceBuilder` creates libtmux `Server`, `Session`, `Window`, and `Pane` +objects to construct the requested workspace. diff --git a/docs/internals/index.md b/docs/internals/index.md new file mode 100644 index 0000000000..9db3cf96a3 --- /dev/null +++ b/docs/internals/index.md @@ -0,0 +1,19 @@ +(internals)= + +# Internals + +```{warning} +Everything in this section is **internal implementation detail**. There is +no stability guarantee. Interfaces may change or be removed without notice +between any release. + +If you are building an application with tmuxp, use the [CLI](../cli/index.md) +or refer to the [libtmux API](https://libtmux.git-pull.com/api/). +``` + +```{toctree} +:maxdepth: 2 + +architecture +api/index +``` diff --git a/docs/project/code-style.md b/docs/project/code-style.md new file mode 100644 index 0000000000..1ea71dc8c3 --- /dev/null +++ b/docs/project/code-style.md @@ -0,0 +1,32 @@ +# Code Style + +## Formatting + +tmuxp uses [ruff](https://github.com/astral-sh/ruff) for both linting and formatting. + +```console +$ uv run ruff format . +``` + +```console +$ uv run ruff check . --fix --show-fixes +``` + +## Type Checking + +Strict [mypy](https://mypy-lang.org/) is enforced. + +```console +$ uv run mypy +``` + +## Docstrings + +All public functions and methods use NumPy-style docstrings. + +## Imports + +- Standard library: namespace imports (`import pathlib`, not `from pathlib import Path`) + - Exception: `from dataclasses import dataclass, field` +- Typing: `import typing as t`, access via `t.Optional`, `t.NamedTuple`, etc. +- All files: `from __future__ import annotations` diff --git a/docs/developing.md b/docs/project/contributing.md similarity index 100% rename from docs/developing.md rename to docs/project/contributing.md diff --git a/docs/project/index.md b/docs/project/index.md new file mode 100644 index 0000000000..8c37a15d84 --- /dev/null +++ b/docs/project/index.md @@ -0,0 +1,36 @@ +(project)= + +# Project + +Information for contributors and maintainers. + +::::{grid} 2 +:gutter: 3 + +:::{grid-item-card} Contributing +:link: contributing +:link-type: doc +Development setup, running tests, submitting PRs. +::: + +:::{grid-item-card} Code Style +:link: code-style +:link-type: doc +Ruff, mypy, NumPy docstrings, import conventions. +::: + +:::{grid-item-card} Releasing +:link: releasing +:link-type: doc +Release checklist and version policy. +::: + +:::: + +```{toctree} +:hidden: + +contributing +code-style +releasing +``` diff --git a/docs/project/releasing.md b/docs/project/releasing.md new file mode 100644 index 0000000000..37b31aa3a7 --- /dev/null +++ b/docs/project/releasing.md @@ -0,0 +1,50 @@ +# Releasing + +## Release Process + +Releases are triggered by git tags and published to PyPI via OIDC trusted publishing. + +1. Update `CHANGES` with the release notes + +2. Bump version in `src/tmuxp/__about__.py` + +3. Commit: + + ```console + $ git commit -m "tmuxp " + ``` + +4. Tag: + + ```console + $ git tag v + ``` + +5. Push: + + ```console + $ git push && git push --tags + ``` + +6. CI builds and publishes to PyPI automatically via trusted publishing + +## Changelog Format + +The `CHANGES` file uses this format: + +```text +tmuxp () +------------------------ + +### What's new + +- Description of feature (#issue) + +### Bug fixes + +- Description of fix (#issue) + +### Breaking changes + +- Description of break, migration path (#issue) +``` diff --git a/docs/redirects.txt b/docs/redirects.txt index 66d2cb860b..b22b99cfd9 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -3,3 +3,38 @@ "examples.md" "configuration/examples.md" "plugin_system.md" "plugins/index.md" "commands/index.md" "cli/index.md" +"api/index.md" "internals/api/index.md" +"api/exc.md" "internals/api/exc.md" +"api/log.md" "internals/api/log.md" +"api/plugin.md" "internals/api/plugin.md" +"api/shell.md" "internals/api/shell.md" +"api/types.md" "internals/api/types.md" +"api/util.md" "internals/api/util.md" +"api/cli/index.md" "internals/api/cli/index.md" +"api/cli/convert.md" "internals/api/cli/convert.md" +"api/cli/debug_info.md" "internals/api/cli/debug_info.md" +"api/cli/edit.md" "internals/api/cli/edit.md" +"api/cli/freeze.md" "internals/api/cli/freeze.md" +"api/cli/import_config.md" "internals/api/cli/import_config.md" +"api/cli/load.md" "internals/api/cli/load.md" +"api/cli/ls.md" "internals/api/cli/ls.md" +"api/cli/progress.md" "internals/api/cli/progress.md" +"api/cli/search.md" "internals/api/cli/search.md" +"api/cli/shell.md" "internals/api/cli/shell.md" +"api/cli/utils.md" "internals/api/cli/utils.md" +"api/workspace/index.md" "internals/api/workspace/index.md" +"api/workspace/builder.md" "internals/api/workspace/builder.md" +"api/workspace/constants.md" "internals/api/workspace/constants.md" +"api/workspace/finders.md" "internals/api/workspace/finders.md" +"api/workspace/freezer.md" "internals/api/workspace/freezer.md" +"api/workspace/importers.md" "internals/api/workspace/importers.md" +"api/workspace/loader.md" "internals/api/workspace/loader.md" +"api/workspace/validation.md" "internals/api/workspace/validation.md" +"api/internals/index.md" "internals/api/_internal/index.md" +"api/internals/colors.md" "internals/api/_internal/colors.md" +"api/internals/config_reader.md" "internals/api/_internal/config_reader.md" +"api/internals/private_path.md" "internals/api/_internal/private_path.md" +"api/internals/types.md" "internals/api/_internal/types.md" +"plugins/index.md" "topics/plugins.md" +"developing.md" "project/contributing.md" +"about.md" "topics/index.md" diff --git a/docs/topics/index.md b/docs/topics/index.md new file mode 100644 index 0000000000..a7be5c5792 --- /dev/null +++ b/docs/topics/index.md @@ -0,0 +1,52 @@ +(topics)= + +# Topics + +Conceptual guides and workflow documentation. + +::::{grid} 2 +:gutter: 3 + +:::{grid-item-card} Workflows +:link: workflows +:link-type: doc +CI integration, scripting, and automation patterns. +::: + +:::{grid-item-card} Plugins +:link: plugins +:link-type: doc +Plugin system for custom behavior. +::: + +:::{grid-item-card} Library vs CLI +:link: library-vs-cli +:link-type: doc +When to use tmuxp CLI vs libtmux directly. +::: + +:::{grid-item-card} Troubleshooting +:link: troubleshooting +:link-type: doc +Common shell, PATH, and tmux issues. +::: + +:::: + +## Compared to tmuxinator / teamocil + +tmuxp, [tmuxinator](https://github.com/aziz/tmuxinator), and +[teamocil](https://github.com/remiprev/teamocil) all load tmux sessions +from config files. Key differences: tmuxp is Python (not Ruby), builds +sessions through [libtmux](https://libtmux.git-pull.com/)'s ORM layer +instead of raw shell commands, supports JSON and YAML, and can +[freeze](../cli/freeze.md) running sessions back to config. + +```{toctree} +:hidden: + +workflows +plugins +library-vs-cli +troubleshooting +``` diff --git a/docs/topics/library-vs-cli.md b/docs/topics/library-vs-cli.md new file mode 100644 index 0000000000..8c431caa3d --- /dev/null +++ b/docs/topics/library-vs-cli.md @@ -0,0 +1,62 @@ +# Library vs CLI + +tmuxp is a CLI tool. [libtmux](https://libtmux.git-pull.com/) is the Python library it's built on. Both control tmux, but they serve different needs. + +## When to Use the CLI + +Use `tmuxp` when: + +- You want **declarative workspace configs** — define your layout in YAML, load it with one command +- You're setting up **daily development environments** — same windows, same panes, every time +- You need **CI/CD tmux sessions** — `tmuxp load -d` in a script +- You prefer **configuration over code** — no Python needed + +```console +$ tmuxp load my-workspace.yaml +``` + +## When to Use libtmux + +Use [libtmux](https://libtmux.git-pull.com/) directly when: + +- You need **dynamic logic** — conditionals, loops, branching based on state +- You want to **read pane output** — capture what's on screen and react to it +- You're **testing** tmux interactions — libtmux provides pytest fixtures +- You need **multi-server orchestration** — manage multiple tmux servers programmatically +- The CLI's config format **can't express** what you need + +```python +import libtmux + +server = libtmux.Server() +session = server.new_session("my-project") +window = session.new_window("editor") +pane = window.split() +pane.send_keys("vim .") +``` + +## Concept Mapping + +How tmuxp config keys map to libtmux API calls: + +| tmuxp YAML | libtmux equivalent | +|------------|-------------------| +| `session_name: foo` | `server.new_session(session_name="foo")` | +| `windows:` | `session.new_window(...)` | +| `panes:` | `window.split(...)` | +| `shell_command:` | `pane.send_keys(...)` | +| `layout: main-vertical` | `window.select_layout("main-vertical")` | +| `start_directory: ~/project` | `session.new_window(start_directory="~/project")` | +| `before_script:` | Run via `subprocess` before building | + +## What the CLI Can't Express + +tmuxp configs are static declarations. They can't: + +- **Branch on conditions** — "only create this pane if a file exists" +- **Read pane output** — "wait until the server is ready, then open the browser" +- **React to state** — "if this session already has 3 windows, add a 4th" +- **Orchestrate across servers** — "connect to both local and remote tmux" +- **Build layouts dynamically** — "create N panes based on a list of services" + +For these, use libtmux directly. See the [libtmux quickstart](https://libtmux.git-pull.com/quickstart.html). diff --git a/docs/plugins/index.md b/docs/topics/plugins.md similarity index 100% rename from docs/plugins/index.md rename to docs/topics/plugins.md diff --git a/docs/topics/troubleshooting.md b/docs/topics/troubleshooting.md new file mode 100644 index 0000000000..bfacad2c34 --- /dev/null +++ b/docs/topics/troubleshooting.md @@ -0,0 +1,40 @@ +# Troubleshooting + +## tmuxp command not found + +Ensure tmuxp is installed and on your `PATH`: + +```console +$ which tmuxp +``` + +If installed with `pip install --user`, ensure `~/.local/bin` is in your `PATH`. + +## tmux server not found + +tmuxp requires a running tmux server or will start one automatically. +Ensure tmux is installed: + +```console +$ tmux -V +``` + +Minimum required version: tmux 3.2a. + +## Configuration errors + +Use `tmuxp debug-info` to collect system information for bug reports: + +```console +$ tmuxp debug-info +``` + +## Session already exists + +If a session with the same name already exists, tmuxp will prompt you. +Use `tmuxp load -d` to load in detached mode alongside existing sessions. + +## Shell completion not working + +See [Shell Completion](../cli/completion.md) for setup instructions +for bash, zsh, and fish. diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md new file mode 100644 index 0000000000..5965653c0d --- /dev/null +++ b/docs/topics/workflows.md @@ -0,0 +1,32 @@ +# Workflows + +## CI Integration + +tmuxp can set up tmux sessions in CI pipelines for integration testing: + +```console +$ tmuxp load -d my-workspace.yaml +``` + +The `-d` flag loads the session in detached mode, useful for headless environments. + +## Scripting + +tmuxp's exit codes enable scripting and error handling. See +[Exit Codes](../cli/exit-codes.md) for the complete list. + +## Automating Development Environments + +Use tmuxp to codify your development environment: + +1. Set up your ideal tmux layout manually +2. Freeze it: `tmuxp freeze my-session` +3. Edit the generated YAML to add commands +4. Load it on any machine: `tmuxp load my-workspace.yaml` + +## User-Level Configuration + +Workspace configs can be stored in: +- `~/.tmuxp/` (legacy) +- `~/.config/tmuxp/` (XDG default) +- Project-local `.tmuxp.yaml` or `.tmuxp/` directory From 475d049b76ff18e269600d16e7089a74d6034a6f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 18:09:22 -0500 Subject: [PATCH 2780/2998] fix(docs[spa-nav]): always navigate on popstate to fix back-button content update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: The popstate handler guarded on `e.state && e.state.spa`, but browsers can deliver null state for the initial history entry even after replaceState({spa: true}). This caused three symptoms: - Back button changed URL but didn't update page content - Sidebar links resolved wrong after back-navigating across depths - Brand logo href went stale after SPA navigation what: - Remove state guard from popstate handler — always call navigate() - Safe: navigate() falls back to full page load on error, and isPop=true prevents pushing duplicate history entries --- docs/_static/js/spa-nav.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_static/js/spa-nav.js b/docs/_static/js/spa-nav.js index e00e521ab8..c26ba23171 100644 --- a/docs/_static/js/spa-nav.js +++ b/docs/_static/js/spa-nav.js @@ -203,8 +203,8 @@ history.replaceState({ spa: true }, ""); - window.addEventListener("popstate", function (e) { - if (e.state && e.state.spa) navigate(location.href, true); + window.addEventListener("popstate", function () { + navigate(location.href, true); }); // --- Hover prefetch --- From 877c9aed2983e908b0f5da87f57f9a249adffd6d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:06:38 -0500 Subject: [PATCH 2781/2998] fix(docs[spa-nav]): update brand links and logo srcs after SPA navigation why: The sidebar brand link, mobile header brand link, and logo image srcs use relative paths that go stale after SPA navigation across directory depths. They live outside the swap regions (.article-container, .sidebar-tree, .toc-drawer) so swap() never updates them. what: - After swapping content regions, copy brand href and logo src from the fetched document (which has correct relative paths for the target) - Covers: .sidebar-brand href, .header-center a href, .sidebar-logo src --- docs/_static/js/spa-nav.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/_static/js/spa-nav.js b/docs/_static/js/spa-nav.js index c26ba23171..cd99233fb7 100644 --- a/docs/_static/js/spa-nav.js +++ b/docs/_static/js/spa-nav.js @@ -132,6 +132,24 @@ ); var title = doc.querySelector("title"); if (title) document.title = title.textContent || ""; + + // Brand links and logo images live outside swapped regions. + // Their relative hrefs/srcs go stale after cross-depth navigation. + // Copy the correct values from the fetched document. + [".sidebar-brand", ".header-center a"].forEach(function (sel) { + var fresh = doc.querySelector(sel); + if (!fresh) return; + document.querySelectorAll(sel).forEach(function (el) { + el.setAttribute("href", fresh.getAttribute("href")); + }); + }); + var freshLogos = doc.querySelectorAll(".sidebar-logo"); + var staleLogos = document.querySelectorAll(".sidebar-logo"); + freshLogos.forEach(function (fresh, i) { + if (staleLogos[i]) { + staleLogos[i].setAttribute("src", fresh.getAttribute("src")); + } + }); } function reinit() { From 03a559bf0963b39fe59150914276a06c9e4b32a7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:23:08 -0500 Subject: [PATCH 2782/2998] docs(build): switch from html to dirhtml builder for clean URLs why: The html builder generates relative paths like ../index.html and # that go stale after SPA navigation across directory depths. The dirhtml builder generates clean URLs natively (/api/ instead of /api/index.html). what: - Change html, start, and design recipes to use -b dirhtml - sphinx-autobuild serves dirhtml correctly (StaticFiles html=True) - SPA nav already handles / endings (shouldIntercept checks endsWith("/")) - rediraffe supports dirhtml natively (DirectoryHTMLBuilder detection) - No changes needed to redirects.txt, conf.py, or documentation source --- docs/justfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/justfile b/docs/justfile index 171766555a..afeec6b509 100644 --- a/docs/justfile +++ b/docs/justfile @@ -27,7 +27,7 @@ default: # Build HTML documentation [group: 'build'] html: - {{ sphinxbuild }} -b html {{ allsphinxopts }} {{ builddir }}/html + {{ sphinxbuild }} -b dirhtml {{ allsphinxopts }} {{ builddir }}/html @echo "" @echo "Build finished. The HTML pages are in {{ builddir }}/html." @@ -202,9 +202,9 @@ dev: # Start sphinx-autobuild server [group: 'dev'] start: - uv run sphinx-autobuild "{{ sourcedir }}" "{{ builddir }}" {{ sphinxopts }} --port {{ http_port }} + uv run sphinx-autobuild -b dirhtml "{{ sourcedir }}" "{{ builddir }}" {{ sphinxopts }} --port {{ http_port }} # Design mode: watch static files and disable incremental builds [group: 'dev'] design: - uv run sphinx-autobuild "{{ sourcedir }}" "{{ builddir }}" {{ sphinxopts }} --port {{ http_port }} --watch "." -a + uv run sphinx-autobuild -b dirhtml "{{ sourcedir }}" "{{ builddir }}" {{ sphinxopts }} --port {{ http_port }} --watch "." -a From 6745bd6b69ed245f6d6d9b9a60bb31e7c3ffc298 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:28:25 -0500 Subject: [PATCH 2783/2998] docs(readme): update links to clean URLs for dirhtml builder why: Switched to dirhtml builder which generates clean URLs (/quickstart/ instead of /quickstart.html). README links need to match since they render on GitHub/PyPI where redirects don't apply. what: - Convert all .html doc links to trailing-slash format - Covers: cli/, configuration/, topics/, quickstart, history, about_tmux --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b53d3e100a..359ae17202 100644 --- a/README.md +++ b/README.md @@ -132,9 +132,9 @@ Name a session: tmuxp load -s session_name ./mysession.yaml ``` -[simple](https://tmuxp.git-pull.com/configuration/examples.html#short-hand-inline-style) and +[simple](https://tmuxp.git-pull.com/configuration/examples/#short-hand-inline-style) and [very -elaborate](https://tmuxp.git-pull.com/configuration/examples.html#super-advanced-dev-environment) +elaborate](https://tmuxp.git-pull.com/configuration/examples/#super-advanced-dev-environment) config examples # User-level configurations @@ -197,14 +197,14 @@ $ tmuxp shell -c 'print(window.name.upper())' MY_WINDOW ``` -Read more on [tmuxp shell](https://tmuxp.git-pull.com/cli/shell.html) in +Read more on [tmuxp shell](https://tmuxp.git-pull.com/cli/shell/) in the CLI docs. # Pre-load hook Run custom startup scripts (such as installing project dependencies) before loading tmux. See the -[before_script](https://tmuxp.git-pull.com/configuration/examples.html#bootstrap-project-before-launch) +[before_script](https://tmuxp.git-pull.com/configuration/examples/#bootstrap-project-before-launch) example # Load in detached state @@ -224,7 +224,7 @@ $ tmuxp freeze session-name ``` See more about [freezing -tmux](https://tmuxp.git-pull.com/cli/freeze.html) sessions. +tmux](https://tmuxp.git-pull.com/cli/freeze/) sessions. # Convert a session file @@ -247,7 +247,7 @@ $ tmuxp convert --yes filename # Plugin System tmuxp has a plugin system to allow for custom behavior. See more about -the [Plugin System](https://tmuxp.git-pull.com/topics/plugins.html). +the [Plugin System](https://tmuxp.git-pull.com/topics/plugins/). # Debugging Helpers @@ -272,13 +272,13 @@ environment: # Docs / Reading material -See the [Quickstart](https://tmuxp.git-pull.com/quickstart.html). +See the [Quickstart](https://tmuxp.git-pull.com/quickstart/). [Documentation](https://tmuxp.git-pull.com) homepage (also in [中文](http://tmuxp-zh.rtfd.org/)) Want to learn more about tmux itself? [Read The Tao of Tmux -online](https://tmuxp.git-pull.com/about_tmux.html). +online](https://tmuxp.git-pull.com/about_tmux/). # Donations @@ -295,8 +295,8 @@ See donation options at . - python support: >= 3.10, pypy, pypy3 - Source: - Docs: -- API: -- Changelog: +- API: +- Changelog: - Issues: - Test Coverage: - pypi: From 63edc1fad7b7b69924ff264945e65890ea2fab65 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:32:34 -0500 Subject: [PATCH 2784/2998] fix(docs[redirects]): remove dirhtml-conflicting redirect entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: With dirhtml builder, api.md and api/index.md both produce api/index.html. The redirect chain api.md → api/index.md → internals/api/index.md causes rediraffe to write two redirects at the same output path, failing the build. what: - Comment out api.md redirect (api/index.md redirect handles it) --- docs/redirects.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/redirects.txt b/docs/redirects.txt index b22b99cfd9..ba67fdc915 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1,5 +1,5 @@ "cli.md" "commands/index.md" -"api.md" "api/index.md" +# "api.md" → api/index.md: not needed with dirhtml (same output path as api/index.md redirect) "examples.md" "configuration/examples.md" "plugin_system.md" "plugins/index.md" "commands/index.md" "cli/index.md" From b5b434c38c6eb0b9c13fb5428d62e0504f0d82b0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:38:45 -0500 Subject: [PATCH 2785/2998] fix(docs[conf]): suppress docutils duplicate label warnings for dirhtml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: The dirhtml builder generates duplicate implicit labels across CLI pages — each argparse-generated page has "Usage", "Options", "Examples" headings that create colliding labels. These warnings cause the build to exit with code 1. what: - Add "docutils" to suppress_warnings in conf.py --- docs/conf.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 3d77fc8993..4385b3323d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -128,6 +128,9 @@ # (types in TYPE_CHECKING blocks used for circular import avoidance) suppress_warnings = [ "sphinx_autodoc_typehints.forward_reference", + # dirhtml builder creates duplicate implicit labels across CLI pages + # (each argparse page generates "Usage", "Options", "Examples" headings) + "docutils", ] # sphinxext.opengraph From d288c8b2ea8592b8993c19f039bccda8c2426e30 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 19:51:32 -0500 Subject: [PATCH 2786/2998] fix(docs[redirects]): remove cli.md self-redirect for dirhtml, revert suppress_warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: cli.md → commands/index.md → cli/index.md chain produces same dirhtml output path (cli/index.html) as the real cli/index.md file. Rediraffe reports "already exists" and exits with code 1. what: - Comment out cli.md redirect (same dirhtml output as cli/index.md) - Revert docutils suppress_warnings (didn't help, wrong approach) --- docs/conf.py | 3 --- docs/redirects.txt | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 4385b3323d..3d77fc8993 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -128,9 +128,6 @@ # (types in TYPE_CHECKING blocks used for circular import avoidance) suppress_warnings = [ "sphinx_autodoc_typehints.forward_reference", - # dirhtml builder creates duplicate implicit labels across CLI pages - # (each argparse page generates "Usage", "Options", "Examples" headings) - "docutils", ] # sphinxext.opengraph diff --git a/docs/redirects.txt b/docs/redirects.txt index ba67fdc915..be9e1bdd10 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -1,4 +1,4 @@ -"cli.md" "commands/index.md" +# "cli.md" → commands/index.md → cli/index.md: not needed with dirhtml (same output path) # "api.md" → api/index.md: not needed with dirhtml (same output path as api/index.md redirect) "examples.md" "configuration/examples.md" "plugin_system.md" "plugins/index.md" From c956490fbd8753c6f48e678e6dd4a1e326330660 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 23 Mar 2026 20:40:41 -0500 Subject: [PATCH 2787/2998] docs(grid): make grid cards responsive for phone and tablet why: Grid cards used single-value column counts ({grid} 2, {grid} 3) which don't collapse on small screens, squeezing content uncomfortably. what: - 2-col grids: {grid} 1 1 2 2 (stack on phone/tablet, 2-col on desktop) - 3-col grids: {grid} 1 2 3 3 (1-col phone, 2-col tablet, 3-col desktop) - Gutters: 2 2 3 3 (tighter spacing on mobile) - Uses sphinx-design's responsive breakpoint syntax (xs sm md lg) --- docs/cli/index.md | 4 ++-- docs/configuration/index.md | 4 ++-- docs/index.md | 8 ++++---- docs/project/index.md | 4 ++-- docs/topics/index.md | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/cli/index.md b/docs/cli/index.md index c1c6b605fc..fd38b681ea 100644 --- a/docs/cli/index.md +++ b/docs/cli/index.md @@ -4,8 +4,8 @@ # CLI Reference -::::{grid} 2 -:gutter: 3 +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 :::{grid-item-card} tmuxp load :link: load diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 89b37b2a34..166017226a 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -167,8 +167,8 @@ $ tmuxp load /opt/myapp ## Reference and usage -::::{grid} 3 -:gutter: 3 +::::{grid} 1 2 3 3 +:gutter: 2 2 3 3 :::{grid-item-card} Top-level Options :link: top-level diff --git a/docs/index.md b/docs/index.md index 9d8d12db2b..64308bd782 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,8 +5,8 @@ Session manager for tmux. Load, freeze, and convert tmux sessions through YAML/JSON configuration files. Powered by [libtmux](https://libtmux.git-pull.com/). -::::{grid} 3 -:gutter: 3 +::::{grid} 1 2 3 3 +:gutter: 2 2 3 3 :::{grid-item-card} Quickstart :link: quickstart @@ -28,8 +28,8 @@ Config format, examples, and environment variables. :::: -::::{grid} 2 -:gutter: 3 +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 :::{grid-item-card} Topics :link: topics/index diff --git a/docs/project/index.md b/docs/project/index.md index 8c37a15d84..2b60711f5c 100644 --- a/docs/project/index.md +++ b/docs/project/index.md @@ -4,8 +4,8 @@ Information for contributors and maintainers. -::::{grid} 2 -:gutter: 3 +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 :::{grid-item-card} Contributing :link: contributing diff --git a/docs/topics/index.md b/docs/topics/index.md index a7be5c5792..050ddb9d58 100644 --- a/docs/topics/index.md +++ b/docs/topics/index.md @@ -4,8 +4,8 @@ Conceptual guides and workflow documentation. -::::{grid} 2 -:gutter: 3 +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 :::{grid-item-card} Workflows :link: workflows From 6dd0024f370d2e9ab5aff179b87f3e027c828ab0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Mar 2026 03:57:46 -0500 Subject: [PATCH 2788/2998] docs(sections): add grid cards to configuration and internals index pages why: Configuration and Internals were the only section indexes without grid cards at the top. Configuration had cards at the bottom but not above the fold. All other sections (CLI, Topics, Project) have cards immediately after the heading. what: - configuration/index.md: add 1x3 responsive card grid at top linking to Top-level Options, Environment Variables, and Examples - internals/index.md: add 1x2 responsive card grid for Architecture and Python API, hide toctree for sidebar-only nav --- docs/configuration/index.md | 23 +++++++++++++++++++++++ docs/internals/index.md | 19 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 166017226a..619cb62710 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -6,6 +6,29 @@ # Workspace files +::::{grid} 1 2 3 3 +:gutter: 2 2 3 3 + +:::{grid-item-card} Top-level Options +:link: top-level +:link-type: doc +Session and window configuration keys. +::: + +:::{grid-item-card} Environment Variables +:link: environmental-variables +:link-type: doc +TMUXP_CONFIGDIR and other env vars. +::: + +:::{grid-item-card} Examples +:link: examples +:link-type: doc +Sample workspace configurations. +::: + +:::: + tmuxp loads your terminal workspace into tmux using workspace files. The workspace file can be JSON or YAML. It's declarative style resembles tmux's object hierarchy: session, window and panes. diff --git a/docs/internals/index.md b/docs/internals/index.md index 9db3cf96a3..82a8c121c0 100644 --- a/docs/internals/index.md +++ b/docs/internals/index.md @@ -11,8 +11,25 @@ If you are building an application with tmuxp, use the [CLI](../cli/index.md) or refer to the [libtmux API](https://libtmux.git-pull.com/api/). ``` +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 + +:::{grid-item-card} Architecture +:link: architecture +:link-type: doc +How the CLI dispatches to the workspace builder and libtmux. +::: + +:::{grid-item-card} Python API +:link: api/index +:link-type: doc +Internal module reference for contributors and plugin authors. +::: + +:::: + ```{toctree} -:maxdepth: 2 +:hidden: architecture api/index From 520d4605f3a5192d93b139b3540e9ac63acaa1dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 24 Mar 2026 04:03:04 -0500 Subject: [PATCH 2789/2998] fix(docs[aafig]): use builder target URI for image paths (dirhtml compat) why: The aafig extension computed image paths using the raw docname instead of the builder's target URI. With dirhtml, this produces ../_images/ instead of ../../_images/ because dirhtml outputs files one directory deeper (page/index.html vs page.html). what: - Change relative_uri(docname, "_images") to relative_uri(get_target_uri(docname), "_images") - Matches how Sphinx itself computes image paths (sphinx/builders/html/__init__.py:655) --- docs/_ext/aafig.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_ext/aafig.py b/docs/_ext/aafig.py index 418dbbc028..6f90d51378 100644 --- a/docs/_ext/aafig.py +++ b/docs/_ext/aafig.py @@ -176,7 +176,8 @@ def render_aafigure( fname = "{}.{}".format(get_basename(text, options), options["format"]) if app.builder.format == "html": # HTML - imgpath = relative_uri(app.builder.env.docname, "_images") + target_uri = app.builder.get_target_uri(app.builder.env.docname) + imgpath = relative_uri(target_uri, "_images") relfn = posixpath.join(imgpath, fname) outfn = path.join(app.builder.outdir, "_images", fname) else: From 8b1e11e0835f19f0984b81190a4a95cd0a28d8b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Mar 2026 04:40:02 -0500 Subject: [PATCH 2790/2998] py(deps[dev]) Bump dev packages --- uv.lock | 172 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/uv.lock b/uv.lock index d937343d61..2c031d824e 100644 --- a/uv.lock +++ b/uv.lock @@ -39,16 +39,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.12.1" +version = "4.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] [[package]] @@ -933,16 +933,16 @@ wheels = [ [[package]] name = "pytest-cov" -version = "7.0.0" +version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] [[package]] @@ -1049,7 +1049,7 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1057,9 +1057,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, ] [[package]] @@ -1085,27 +1085,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" }, - { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" }, - { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" }, - { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" }, - { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" }, - { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" }, - { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" }, - { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" }, - { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" }, - { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" }, - { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" }, +version = "0.15.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, + { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, + { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, + { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, + { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, + { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, + { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, + { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, + { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" }, ] [[package]] @@ -1413,15 +1413,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.52.1" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933", size = 2653702, upload-time = "2026-01-18T13:34:11.062Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/69/17425771797c36cded50b7fe44e850315d039f28b15901ab44839e70b593/starlette-1.0.0.tar.gz", hash = "sha256:6a4beaf1f81bb472fd19ea9b918b50dc3a77a6f2e190a12954b25e6ed5eea149", size = 2655289, upload-time = "2026-03-22T18:29:46.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74", size = 74272, upload-time = "2026-01-18T13:34:09.188Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, ] [[package]] @@ -1581,65 +1581,65 @@ testing = [ [[package]] name = "tomli" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, - { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, - { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, - { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, - { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, - { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, - { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, - { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, - { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, - { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, - { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, - { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, - { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, - { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, - { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, - { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, - { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, - { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, - { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, - { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, - { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, - { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, - { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, - { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, - { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, - { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] [[package]] name = "types-docutils" -version = "0.22.3.20260316" +version = "0.22.3.20260322" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/27/a7f16b3a2fad0a4ddd85a668319f9a1d0311c4bd9578894f6471c7e6c788/types_docutils-0.22.3.20260316.tar.gz", hash = "sha256:8ef27d565b9831ff094fe2eac75337a74151013e2d21ecabd445c2955f891564", size = 57263, upload-time = "2026-03-16T04:29:12.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/bb/243a87fc1605a4a94c2c343d6dbddbf0d7ef7c0b9550f360b8cda8e82c39/types_docutils-0.22.3.20260322.tar.gz", hash = "sha256:e2450bb997283c3141ec5db3e436b91f0aa26efe35eb9165178ca976ccb4930b", size = 57311, upload-time = "2026-03-22T04:08:44.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/60/c1f22b7cfc4837d5419e5a2d8702c7d65f03343f866364b71cccd8a73b79/types_docutils-0.22.3.20260316-py3-none-any.whl", hash = "sha256:083c7091b8072c242998ec51da1bf1492f0332387da81c3b085efbf5ca754c7d", size = 91968, upload-time = "2026-03-16T04:29:11.114Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4a/22c090cd4615a16917dff817cbe7c5956da376c961e024c241cd962d2c3d/types_docutils-0.22.3.20260322-py3-none-any.whl", hash = "sha256:681d4510ce9b80a0c6a593f0f9843d81f8caa786db7b39ba04d9fd5480ac4442", size = 91978, upload-time = "2026-03-22T04:08:43.117Z" }, ] [[package]] From 0413e08d564c6be5543e0621b603d124e98c59d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 28 Mar 2026 04:44:21 -0500 Subject: [PATCH 2791/2998] .tool-versions(uv) uv 0.10.12 -> 0.11.2 See also: - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.2 - https://github.com/astral-sh/uv/blob/0.11.2/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 9c32c2514e..1ced26b3e9 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.47 -uv 0.10.12 +uv 0.11.2 python 3.14 3.13 3.12 3.11 3.10 From 1ee42b0e232874df2eaac1fb43e94fca6faedc65 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 29 Mar 2026 06:02:02 -0500 Subject: [PATCH 2792/2998] AGENTS(ai[rules]): Add git commit standards why: This repo documented testing and coding workflow but did not spell out the commit message structure used across recent history. Adding the commit guidance from libtmux gives agents an explicit what/why format to follow instead of inferring it from past commits. what: - Add a Git Commit Standards section to AGENTS.md - Document the Scope(type[detail]) subject pattern and common commit types - Include a what/why body template and heredoc example for multi-line commits --- AGENTS.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 7e230283db..0f87f4ce20 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -116,6 +116,55 @@ windows: - **Type imports**: Use `import typing as t` and access via namespace (e.g., `t.Optional`) - **Development workflow**: Format → Test → Commit → Lint/Type Check → Test → Final Commit +## Git Commit Standards + +Format commit messages as: +``` +Scope(type[detail]): concise description + +why: Explanation of necessity or impact. +what: +- Specific technical changes made +- Focused on a single topic +``` + +Common commit types: +- **feat**: New features or enhancements +- **fix**: Bug fixes +- **refactor**: Code restructuring without functional change +- **docs**: Documentation updates +- **chore**: Maintenance (dependencies, tooling, config) +- **test**: Test-related updates +- **style**: Code style and formatting +- **py(deps)**: Dependencies +- **py(deps[dev])**: Dev Dependencies +- **ai(rules[AGENTS])**: AI rule updates +- **ai(claude[rules])**: Claude Code rules (CLAUDE.md) +- **ai(claude[command])**: Claude Code command changes + +Example: +``` +Pane(feat[send_keys]): Add support for literal flag + +why: Enable sending literal characters without tmux interpretation +what: +- Add literal parameter to send_keys method +- Update send_keys to pass -l flag when literal=True +- Add tests for literal key sending +``` +For multi-line commits, use heredoc to preserve formatting: +```bash +git commit -m "$(cat <<'EOF' +feat(Component[method]) add feature description + +why: Explanation of the change. +what: +- First change +- Second change +EOF +)" +``` + ## Logging Standards These rules guide future logging changes; existing code may not yet conform. From e1d43b7d1bf5396dacd5b32c18e745abae4c951d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 29 Mar 2026 09:10:28 -0500 Subject: [PATCH 2793/2998] py(deps[dev]) Bump dev packages --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 2c031d824e..90e0fc9b54 100644 --- a/uv.lock +++ b/uv.lock @@ -906,11 +906,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] From 83265512bced6ef24732becd9b4682c99d319697 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 31 Mar 2026 17:23:14 -0500 Subject: [PATCH 2794/2998] docs(conf): add IBM Plex Mono weights 500/600/700 why: Only weight 400 was downloaded. Bold monospace text (badge labels at font-weight 650, in code) used browser faux-bolding which looks noticeably worse than the real typeface weights. what: - Match IBM Plex Sans weight range: [400, 500, 600, 700] --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 3d77fc8993..9539c52438 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -165,7 +165,7 @@ "family": "IBM Plex Mono", "package": "@fontsource/ibm-plex-mono", "version": "5.2.7", - "weights": [400], + "weights": [400, 500, 600, 700], "styles": ["normal", "italic"], "subset": "latin", }, From 598e4e5abaa8e06bd2ccf12620660e8b2ad94c70 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 31 Mar 2026 17:23:33 -0500 Subject: [PATCH 2795/2998] docs(sphinx_fonts): multi-subset support with unicode-range descriptors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Only the "latin" subset was downloaded. Characters outside basic Latin (accented letters like ñ, ř, ž common in contributor names and code comments) fell back to system fonts, breaking the typographic consistency of IBM Plex. what: - Add _UNICODE_RANGES dict mapping Fontsource subset names to CSS unicode-range descriptors for latin, latin-ext, cyrillic, cyrillic-ext, greek, and vietnamese - Add _unicode_range() lookup function with empty-string fallback for unknown subsets (omitting the descriptor = all codepoints) - Support "subsets" (list) config key alongside legacy "subset" (str) in _on_builder_inited — iterates all subsets in the download loop - Emit unicode-range in font_faces dict; template renders it in @font-face blocks so browsers only download subset files when characters from that range appear on the page (zero cost for pages that only use ASCII) - Preload uses the first (primary) subset only — typically "latin" - Update page.html template: conditional unicode-range line in @font-face blocks - Add 8 tests: _unicode_range (4), multi-subset builder-inited (2), legacy subset backward compat (1), preload primary subset (1) --- docs/_ext/sphinx_fonts.py | 92 +++++++++++++++---- docs/_templates/page.html | 3 + tests/docs/_ext/test_sphinx_fonts.py | 129 +++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 18 deletions(-) diff --git a/docs/_ext/sphinx_fonts.py b/docs/_ext/sphinx_fonts.py index e8d2a692ae..7a7e1a2780 100644 --- a/docs/_ext/sphinx_fonts.py +++ b/docs/_ext/sphinx_fonts.py @@ -54,6 +54,57 @@ def _cdn_url( ) +# Unicode range descriptors per subset — tells the browser to only download +# the file when characters from this range appear on the page. Ranges are +# from Fontsource / Google Fonts CSS (CSS unicode-range values). +_UNICODE_RANGES: dict[str, str] = { + "latin": ( + "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6," + " U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F," + " U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215," + " U+FEFF, U+FFFD" + ), + "latin-ext": ( + "U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7," + " U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF," + " U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB," + " U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF" + ), + "cyrillic": ("U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116"), + "cyrillic-ext": ( + "U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F" + ), + "greek": ( + "U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF" + ), + "vietnamese": ( + "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169," + " U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304," + " U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" + ), +} + + +def _unicode_range(subset: str) -> str: + """Return the CSS ``unicode-range`` descriptor for *subset*. + + Falls back to an empty string for unknown subsets (omitting the + descriptor causes the browser to treat the face as covering all + codepoints, which is the correct fallback). + + Parameters + ---------- + subset : str + Fontsource subset name (e.g. ``"latin"``, ``"latin-ext"``). + + Returns + ------- + str + CSS ``unicode-range`` value, or ``""`` if unknown. + """ + return _UNICODE_RANGES.get(subset, "") + + def _download_font(url: str, dest: pathlib.Path) -> bool: if dest.exists(): logger.debug("font cached: %s", dest.name) @@ -89,22 +140,25 @@ def _on_builder_inited(app: Sphinx) -> None: font_id = font["package"].split("/")[-1] version = font["version"] package = font["package"] - subset = font.get("subset", "latin") - for weight in font["weights"]: - for style in font["styles"]: - filename = f"{font_id}-{subset}-{weight}-{style}.woff2" - cached = cache / filename - url = _cdn_url(package, version, font_id, subset, weight, style) - if _download_font(url, cached): - shutil.copy2(cached, fonts_dir / filename) - font_faces.append( - { - "family": font["family"], - "style": style, - "weight": str(weight), - "filename": filename, - } - ) + # Accept "subsets" (list) or legacy "subset" (str). + subsets: list[str] = font.get("subsets", [font.get("subset", "latin")]) + for subset in subsets: + for weight in font["weights"]: + for style in font["styles"]: + filename = f"{font_id}-{subset}-{weight}-{style}.woff2" + cached = cache / filename + url = _cdn_url(package, version, font_id, subset, weight, style) + if _download_font(url, cached): + shutil.copy2(cached, fonts_dir / filename) + font_faces.append( + { + "family": font["family"], + "style": style, + "weight": str(weight), + "filename": filename, + "unicode_range": _unicode_range(subset), + } + ) preload_hrefs: list[str] = [] preload_specs: list[tuple[str, int, str]] = app.config.sphinx_font_preload @@ -112,8 +166,10 @@ def _on_builder_inited(app: Sphinx) -> None: for font in fonts: if font["family"] == family_name: font_id = font["package"].split("/")[-1] - subset = font.get("subset", "latin") - filename = f"{font_id}-{subset}-{weight}-{style}.woff2" + # Preload the first (primary) subset only — typically "latin". + subsets = font.get("subsets", [font.get("subset", "latin")]) + primary = subsets[0] if subsets else "latin" + filename = f"{font_id}-{primary}-{weight}-{style}.woff2" preload_hrefs.append(filename) break diff --git a/docs/_templates/page.html b/docs/_templates/page.html index 7c0b561789..0c1ad27ea1 100644 --- a/docs/_templates/page.html +++ b/docs/_templates/page.html @@ -13,6 +13,9 @@ font-weight: {{ face.weight }}; font-display: block; src: url("{{ pathto('_static/fonts/' + face.filename, 1) }}") format("woff2"); + {%- if face.unicode_range %} + unicode-range: {{ face.unicode_range }}; + {%- endif %} } {%- endfor %} {%- for fb in font_fallbacks|default([]) %} diff --git a/tests/docs/_ext/test_sphinx_fonts.py b/tests/docs/_ext/test_sphinx_fonts.py index 22f546a2e1..e96a879be3 100644 --- a/tests/docs/_ext/test_sphinx_fonts.py +++ b/tests/docs/_ext/test_sphinx_fonts.py @@ -96,6 +96,36 @@ def test_cdn_url_matches_template() -> None: assert url.endswith(".woff2") +# --- _unicode_range tests --- + + +def test_unicode_range_latin() -> None: + """_unicode_range returns a non-empty range for 'latin'.""" + result = sphinx_fonts._unicode_range("latin") + assert result.startswith("U+") + assert "U+0000" in result + + +def test_unicode_range_latin_ext() -> None: + """_unicode_range returns a non-empty range for 'latin-ext'.""" + result = sphinx_fonts._unicode_range("latin-ext") + assert result.startswith("U+") + assert result != sphinx_fonts._unicode_range("latin") + + +def test_unicode_range_unknown_subset() -> None: + """_unicode_range returns empty string for unknown subsets.""" + result = sphinx_fonts._unicode_range("klingon") + assert result == "" + + +def test_unicode_range_all_known_subsets_non_empty() -> None: + """Every subset in _UNICODE_RANGES produces a non-empty range.""" + for subset, urange in sphinx_fonts._UNICODE_RANGES.items(): + assert urange.startswith("U+"), f"subset {subset!r} has invalid range" + assert sphinx_fonts._unicode_range(subset) == urange + + # --- _download_font tests --- @@ -337,6 +367,105 @@ def test_on_builder_inited_explicit_subset( assert app._font_faces[0]["filename"] == "noto-sans-latin-ext-400-normal.woff2" +def test_on_builder_inited_multiple_subsets( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """_on_builder_inited downloads files for each subset and includes unicode_range.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/ibm-plex-sans", + "version": "5.2.8", + "family": "IBM Plex Sans", + "subsets": ["latin", "latin-ext"], + "weights": [400], + "styles": ["normal"], + }, + ] + app = _make_app(tmp_path, fonts=fonts) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "ibm-plex-sans-latin-400-normal.woff2").write_bytes(b"data") + (cache / "ibm-plex-sans-latin-ext-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert len(app._font_faces) == 2 + filenames = [f["filename"] for f in app._font_faces] + assert "ibm-plex-sans-latin-400-normal.woff2" in filenames + assert "ibm-plex-sans-latin-ext-400-normal.woff2" in filenames + + # unicode_range should be populated for known subsets + latin_face = next(f for f in app._font_faces if "latin-400" in f["filename"]) + assert latin_face["unicode_range"].startswith("U+") + latin_ext_face = next(f for f in app._font_faces if "latin-ext" in f["filename"]) + assert latin_ext_face["unicode_range"].startswith("U+") + assert latin_face["unicode_range"] != latin_ext_face["unicode_range"] + + +def test_on_builder_inited_legacy_subset_gets_unicode_range( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Legacy single 'subset' config still produces unicode_range in font_faces.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/noto-sans", + "version": "5.0.0", + "family": "Noto Sans", + "subset": "latin", + "weights": [400], + "styles": ["normal"], + }, + ] + app = _make_app(tmp_path, fonts=fonts) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "noto-sans-latin-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + assert len(app._font_faces) == 1 + assert app._font_faces[0]["unicode_range"].startswith("U+") + + +def test_on_builder_inited_preload_uses_primary_subset( + tmp_path: pathlib.Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Preload uses the first (primary) subset when multiple are configured.""" + monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") + + fonts = [ + { + "package": "@fontsource/ibm-plex-sans", + "version": "5.2.8", + "family": "IBM Plex Sans", + "subsets": ["latin", "latin-ext"], + "weights": [400], + "styles": ["normal"], + }, + ] + preload = [("IBM Plex Sans", 400, "normal")] + app = _make_app(tmp_path, fonts=fonts, preload=preload) + + cache = tmp_path / "cache" + cache.mkdir(parents=True) + (cache / "ibm-plex-sans-latin-400-normal.woff2").write_bytes(b"data") + (cache / "ibm-plex-sans-latin-ext-400-normal.woff2").write_bytes(b"data") + + sphinx_fonts._on_builder_inited(app) + + # Preload should only include the primary (first) subset + assert app._font_preload_hrefs == ["ibm-plex-sans-latin-400-normal.woff2"] + + def test_on_builder_inited_preload_match( tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch, From 4760f29e9934ed8e8308219a6a012d6fa1370467 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 31 Mar 2026 17:23:45 -0500 Subject: [PATCH 2796/2998] docs(conf): add latin-ext subset for IBM Plex Sans and Mono MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Accented characters (ñ, ř, ž, ö) in contributor names, docstrings, and code comments fell back to system fonts. latin-ext covers U+0100-02FF and extended Latin ranges used across European languages. what: - Change "subset": "latin" to "subsets": ["latin", "latin-ext"] for both IBM Plex Sans and IBM Plex Mono - Total font files: 32 (2 fonts × 2 subsets × 4 weights × 2 styles) - Zero performance cost for ASCII-only pages: unicode-range descriptors tell the browser to skip latin-ext downloads when no extended chars appear on the page --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 9539c52438..0e393d32e3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -159,7 +159,7 @@ "version": "5.2.8", "weights": [400, 500, 600, 700], "styles": ["normal", "italic"], - "subset": "latin", + "subsets": ["latin", "latin-ext"], }, { "family": "IBM Plex Mono", @@ -167,7 +167,7 @@ "version": "5.2.7", "weights": [400, 500, 600, 700], "styles": ["normal", "italic"], - "subset": "latin", + "subsets": ["latin", "latin-ext"], }, ] From 097f6178f9968e96d14ca2d8dbdded26147d309b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Apr 2026 06:09:52 -0500 Subject: [PATCH 2797/2998] py(deps[dev]) Bump dev packages --- uv.lock | 536 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 274 insertions(+), 262 deletions(-) diff --git a/uv.lock b/uv.lock index 90e0fc9b54..0a708b6f9c 100644 --- a/uv.lock +++ b/uv.lock @@ -84,119 +84,119 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" }, - { url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" }, - { url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" }, - { url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" }, - { url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" }, - { url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" }, - { url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" }, - { url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" }, - { url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" }, - { url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" }, - { url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" }, - { url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" }, - { url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" }, - { url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" }, - { url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" }, - { url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" }, - { url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" }, - { url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" }, - { url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" }, - { url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" }, - { url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" }, - { url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" }, - { url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" }, - { url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" }, - { url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" }, - { url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" }, - { url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" }, - { url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" }, - { url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" }, - { url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" }, - { url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" }, - { url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" }, - { url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" }, - { url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" }, - { url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" }, - { url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" }, - { url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" }, - { url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" }, - { url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" }, - { url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" }, - { url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" }, - { url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" }, - { url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" }, - { url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" }, - { url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" }, - { url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" }, - { url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" }, - { url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" }, - { url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" }, - { url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" }, - { url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" }, - { url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" }, - { url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" }, - { url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" }, - { url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" }, - { url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" }, - { url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" }, - { url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" }, - { url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" }, - { url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" }, - { url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" }, - { url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" }, - { url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" }, - { url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" }, - { url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" }, - { url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" }, - { url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" }, - { url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" }, - { url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" }, - { url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" }, - { url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" }, - { url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" }, +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", size = 315182, upload-time = "2026-04-02T09:25:40.673Z" }, + { url = "https://files.pythonhosted.org/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", size = 209329, upload-time = "2026-04-02T09:25:42.354Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", size = 231230, upload-time = "2026-04-02T09:25:44.281Z" }, + { url = "https://files.pythonhosted.org/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", size = 225890, upload-time = "2026-04-02T09:25:45.475Z" }, + { url = "https://files.pythonhosted.org/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", size = 216930, upload-time = "2026-04-02T09:25:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", size = 202109, upload-time = "2026-04-02T09:25:48.031Z" }, + { url = "https://files.pythonhosted.org/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", size = 214684, upload-time = "2026-04-02T09:25:49.245Z" }, + { url = "https://files.pythonhosted.org/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", size = 212785, upload-time = "2026-04-02T09:25:50.671Z" }, + { url = "https://files.pythonhosted.org/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", size = 203055, upload-time = "2026-04-02T09:25:51.802Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", size = 232502, upload-time = "2026-04-02T09:25:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", size = 214295, upload-time = "2026-04-02T09:25:54.765Z" }, + { url = "https://files.pythonhosted.org/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", size = 227145, upload-time = "2026-04-02T09:25:55.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", size = 218884, upload-time = "2026-04-02T09:25:57.074Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", size = 148343, upload-time = "2026-04-02T09:25:58.199Z" }, + { url = "https://files.pythonhosted.org/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", size = 159174, upload-time = "2026-04-02T09:25:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", size = 147805, upload-time = "2026-04-02T09:26:00.756Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] name = "click" -version = "8.3.1" +version = "8.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, ] [[package]] @@ -685,7 +685,7 @@ wheels = [ [[package]] name = "mypy" -version = "1.19.1" +version = "1.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, @@ -694,39 +694,51 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, - { url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, - { url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, - { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, - { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, - { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, - { url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, - { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, - { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, - { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, - { url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, - { url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, - { url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, - { url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, - { url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, - { url = "https://files.pythonhosted.org/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" }, - { url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, - { url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, - { url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, - { url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, - { url = "https://files.pythonhosted.org/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/b0089fe7fef0a994ae5ee07029ced0526082c6cfaaa4c10d40a10e33b097/mypy-1.20.0.tar.gz", hash = "sha256:eb96c84efcc33f0b5e0e04beacf00129dd963b67226b01c00b9dfc8affb464c3", size = 3815028, upload-time = "2026-03-31T16:55:14.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/a2/a965c8c3fcd4fa8b84ba0d46606181b0d0a1d50f274c67877f3e9ed4882c/mypy-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99f515f95fd03a90875fdb2cca12ff074aa04490db4d190905851bdf8a549a8", size = 14430138, upload-time = "2026-03-31T16:52:37.843Z" }, + { url = "https://files.pythonhosted.org/packages/53/6e/043477501deeb8eabbab7f1a2f6cac62cfb631806dc1d6862a04a7f5011b/mypy-1.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd0212976dc57a5bfeede7c219e7cd66568a32c05c9129686dd487c059c1b88a", size = 13311282, upload-time = "2026-03-31T16:55:11.021Z" }, + { url = "https://files.pythonhosted.org/packages/65/aa/bd89b247b83128197a214f29f0632ff3c14f54d4cd70d144d157bd7d7d6e/mypy-1.20.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8426d4d75d68714abc17a4292d922f6ba2cfb984b72c2278c437f6dae797865", size = 13750889, upload-time = "2026-03-31T16:52:02.909Z" }, + { url = "https://files.pythonhosted.org/packages/fa/9d/2860be7355c45247ccc0be1501c91176318964c2a137bd4743f58ce6200e/mypy-1.20.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02cca0761c75b42a20a2757ae58713276605eb29a08dd8a6e092aa347c4115ca", size = 14619788, upload-time = "2026-03-31T16:50:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/75/7f/3ef3e360c91f3de120f205c8ce405e9caf9fc52ef14b65d37073e322c114/mypy-1.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3a49064504be59e59da664c5e149edc1f26c67c4f8e8456f6ba6aba55033018", size = 14918849, upload-time = "2026-03-31T16:51:10.478Z" }, + { url = "https://files.pythonhosted.org/packages/ae/72/af970dfe167ef788df7c5e6109d2ed0229f164432ce828bc9741a4250e64/mypy-1.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebea00201737ad4391142808ed16e875add5c17f676e0912b387739f84991e13", size = 10822007, upload-time = "2026-03-31T16:50:25.268Z" }, + { url = "https://files.pythonhosted.org/packages/93/94/ba9065c2ebe5421619aff684b793d953e438a8bfe31a320dd6d1e0706e81/mypy-1.20.0-cp310-cp310-win_arm64.whl", hash = "sha256:e80cf77847d0d3e6e3111b7b25db32a7f8762fd4b9a3a72ce53fe16a2863b281", size = 9756158, upload-time = "2026-03-31T16:48:36.213Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1c/74cb1d9993236910286865679d1c616b136b2eae468493aa939431eda410/mypy-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4525e7010b1b38334516181c5b81e16180b8e149e6684cee5a727c78186b4e3b", size = 14343972, upload-time = "2026-03-31T16:49:04.887Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/01399515eca280386e308cf57901e68d3a52af18691941b773b3380c1df8/mypy-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a17c5d0bdcca61ce24a35beb828a2d0d323d3fcf387d7512206888c900193367", size = 13225007, upload-time = "2026-03-31T16:50:08.151Z" }, + { url = "https://files.pythonhosted.org/packages/56/ac/b4ba5094fb2d7fe9d2037cd8d18bbe02bcf68fd22ab9ff013f55e57ba095/mypy-1.20.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75ff57defcd0f1d6e006d721ccdec6c88d4f6a7816eb92f1c4890d979d9ee62", size = 13663752, upload-time = "2026-03-31T16:49:26.064Z" }, + { url = "https://files.pythonhosted.org/packages/db/a7/460678d3cf7da252d2288dad0c602294b6ec22a91932ec368cc11e44bb6e/mypy-1.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b503ab55a836136b619b5fc21c8803d810c5b87551af8600b72eecafb0059cb0", size = 14532265, upload-time = "2026-03-31T16:53:55.077Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/051cca8166cf0438ae3ea80e0e7c030d7a8ab98dffc93f80a1aa3f23c1a2/mypy-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1973868d2adbb4584a3835780b27436f06d1dc606af5be09f187aaa25be1070f", size = 14768476, upload-time = "2026-03-31T16:50:34.587Z" }, + { url = "https://files.pythonhosted.org/packages/be/66/8e02ec184f852ed5c4abb805583305db475930854e09964b55e107cdcbc4/mypy-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:2fcedb16d456106e545b2bfd7ef9d24e70b38ec252d2a629823a4d07ebcdb69e", size = 10818226, upload-time = "2026-03-31T16:53:15.624Z" }, + { url = "https://files.pythonhosted.org/packages/13/4b/383ad1924b28f41e4879a74151e7a5451123330d45652da359f9183bcd45/mypy-1.20.0-cp311-cp311-win_arm64.whl", hash = "sha256:379edf079ce44ac8d2805bcf9b3dd7340d4f97aad3a5e0ebabbf9d125b84b442", size = 9750091, upload-time = "2026-03-31T16:54:12.162Z" }, + { url = "https://files.pythonhosted.org/packages/be/dd/3afa29b58c2e57c79116ed55d700721c3c3b15955e2b6251dd165d377c0e/mypy-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:002b613ae19f4ac7d18b7e168ffe1cb9013b37c57f7411984abbd3b817b0a214", size = 14509525, upload-time = "2026-03-31T16:55:01.824Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/227b516ab8cad9f2a13c5e7a98d28cd6aa75e9c83e82776ae6c1c4c046c7/mypy-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9336b5e6712f4adaf5afc3203a99a40b379049104349d747eb3e5a3aa23ac2e", size = 13326469, upload-time = "2026-03-31T16:51:41.23Z" }, + { url = "https://files.pythonhosted.org/packages/57/d4/1ddb799860c1b5ac6117ec307b965f65deeb47044395ff01ab793248a591/mypy-1.20.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f13b3e41bce9d257eded794c0f12878af3129d80aacd8a3ee0dee51f3a978651", size = 13705953, upload-time = "2026-03-31T16:48:55.69Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b7/54a720f565a87b893182a2a393370289ae7149e4715859e10e1c05e49154/mypy-1.20.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9804c3ad27f78e54e58b32e7cb532d128b43dbfb9f3f9f06262b821a0f6bd3f5", size = 14710363, upload-time = "2026-03-31T16:53:26.948Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2a/74810274848d061f8a8ea4ac23aaad43bd3d8c1882457999c2e568341c57/mypy-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:697f102c5c1d526bdd761a69f17c6070f9892eebcb94b1a5963d679288c09e78", size = 14947005, upload-time = "2026-03-31T16:50:17.591Z" }, + { url = "https://files.pythonhosted.org/packages/77/91/21b8ba75f958bcda75690951ce6fa6b7138b03471618959529d74b8544e2/mypy-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ecd63f75fdd30327e4ad8b5704bd6d91fc6c1b2e029f8ee14705e1207212489", size = 10880616, upload-time = "2026-03-31T16:52:19.986Z" }, + { url = "https://files.pythonhosted.org/packages/8a/15/3d8198ef97c1ca03aea010cce4f1d4f3bc5d9849e8c0140111ca2ead9fdd/mypy-1.20.0-cp312-cp312-win_arm64.whl", hash = "sha256:f194db59657c58593a3c47c6dfd7bad4ef4ac12dbc94d01b3a95521f78177e33", size = 9813091, upload-time = "2026-03-31T16:53:44.385Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a7/f64ea7bd592fa431cb597418b6dec4a47f7d0c36325fec7ac67bc8402b94/mypy-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b20c8b0fd5877abdf402e79a3af987053de07e6fb208c18df6659f708b535134", size = 14485344, upload-time = "2026-03-31T16:49:16.78Z" }, + { url = "https://files.pythonhosted.org/packages/bb/72/8927d84cfc90c6abea6e96663576e2e417589347eb538749a464c4c218a0/mypy-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:367e5c993ba34d5054d11937d0485ad6dfc60ba760fa326c01090fc256adf15c", size = 13327400, upload-time = "2026-03-31T16:53:08.02Z" }, + { url = "https://files.pythonhosted.org/packages/ab/4a/11ab99f9afa41aa350178d24a7d2da17043228ea10f6456523f64b5a6cf6/mypy-1.20.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f799d9db89fc00446f03281f84a221e50018fc40113a3ba9864b132895619ebe", size = 13706384, upload-time = "2026-03-31T16:52:28.577Z" }, + { url = "https://files.pythonhosted.org/packages/42/79/694ca73979cfb3535ebfe78733844cd5aff2e63304f59bf90585110d975a/mypy-1.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555658c611099455b2da507582ea20d2043dfdfe7f5ad0add472b1c6238b433f", size = 14700378, upload-time = "2026-03-31T16:48:45.527Z" }, + { url = "https://files.pythonhosted.org/packages/84/24/a022ccab3a46e3d2cdf2e0e260648633640eb396c7e75d5a42818a8d3971/mypy-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:efe8d70949c3023698c3fca1e94527e7e790a361ab8116f90d11221421cd8726", size = 14932170, upload-time = "2026-03-31T16:49:36.038Z" }, + { url = "https://files.pythonhosted.org/packages/d8/9b/549228d88f574d04117e736f55958bd4908f980f9f5700a07aeb85df005b/mypy-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:f49590891d2c2f8a9de15614e32e459a794bcba84693c2394291a2038bbaaa69", size = 10888526, upload-time = "2026-03-31T16:50:59.827Z" }, + { url = "https://files.pythonhosted.org/packages/91/17/15095c0e54a8bc04d22d4ff06b2139d5f142c2e87520b4e39010c4862771/mypy-1.20.0-cp313-cp313-win_arm64.whl", hash = "sha256:76a70bf840495729be47510856b978f1b0ec7d08f257ca38c9d932720bf6b43e", size = 9816456, upload-time = "2026-03-31T16:49:59.537Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0e/6ca4a84cbed9e62384bc0b2974c90395ece5ed672393e553996501625fc5/mypy-1.20.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0f42dfaab7ec1baff3b383ad7af562ab0de573c5f6edb44b2dab016082b89948", size = 14483331, upload-time = "2026-03-31T16:52:57.999Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c5/5fe9d8a729dd9605064691816243ae6c49fde0bd28f6e5e17f6a24203c43/mypy-1.20.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:31b5dbb55293c1bd27c0fc813a0d2bb5ceef9d65ac5afa2e58f829dab7921fd5", size = 13342047, upload-time = "2026-03-31T16:54:21.555Z" }, + { url = "https://files.pythonhosted.org/packages/4c/33/e18bcfa338ca4e6b2771c85d4c5203e627d0c69d9de5c1a2cf2ba13320ba/mypy-1.20.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49d11c6f573a5a08f77fad13faff2139f6d0730ebed2cfa9b3d2702671dd7188", size = 13719585, upload-time = "2026-03-31T16:51:53.89Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/93491ff7b79419edc7eabf95cb3b3f7490e2e574b2855c7c7e7394ff933f/mypy-1.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d3243c406773185144527f83be0e0aefc7bf4601b0b2b956665608bf7c98a83", size = 14685075, upload-time = "2026-03-31T16:54:04.464Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9d/d924b38a4923f8d164bf2b4ec98bf13beaf6e10a5348b4b137eadae40a6e/mypy-1.20.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a79c1eba7ac4209f2d850f0edd0a2f8bba88cbfdfefe6fb76a19e9d4fe5e71a2", size = 14919141, upload-time = "2026-03-31T16:54:51.785Z" }, + { url = "https://files.pythonhosted.org/packages/59/98/1da9977016678c0b99d43afe52ed00bb3c1a0c4c995d3e6acca1a6ebb9b4/mypy-1.20.0-cp314-cp314-win_amd64.whl", hash = "sha256:00e047c74d3ec6e71a2eb88e9ea551a2edb90c21f993aefa9e0d2a898e0bb732", size = 11050925, upload-time = "2026-03-31T16:51:30.758Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e3/ba0b7a3143e49a9c4f5967dde6ea4bf8e0b10ecbbcca69af84027160ee89/mypy-1.20.0-cp314-cp314-win_arm64.whl", hash = "sha256:931a7630bba591593dcf6e97224a21ff80fb357e7982628d25e3c618e7f598ef", size = 10001089, upload-time = "2026-03-31T16:49:43.632Z" }, + { url = "https://files.pythonhosted.org/packages/12/28/e617e67b3be9d213cda7277913269c874eb26472489f95d09d89765ce2d8/mypy-1.20.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:26c8b52627b6552f47ff11adb4e1509605f094e29815323e487fc0053ebe93d1", size = 15534710, upload-time = "2026-03-31T16:52:12.506Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0c/3b5f2d3e45dc7169b811adce8451679d9430399d03b168f9b0489f43adaa/mypy-1.20.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:39362cdb4ba5f916e7976fccecaab1ba3a83e35f60fa68b64e9a70e221bb2436", size = 14393013, upload-time = "2026-03-31T16:54:41.186Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/edc8b0aa145cc09c1c74f7ce2858eead9329931dcbbb26e2ad40906daa4e/mypy-1.20.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34506397dbf40c15dc567635d18a21d33827e9ab29014fb83d292a8f4f8953b6", size = 15047240, upload-time = "2026-03-31T16:54:31.955Z" }, + { url = "https://files.pythonhosted.org/packages/42/37/a946bb416e37a57fa752b3100fd5ede0e28df94f92366d1716555d47c454/mypy-1.20.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555493c44a4f5a1b58d611a43333e71a9981c6dbe26270377b6f8174126a0526", size = 15858565, upload-time = "2026-03-31T16:53:36.997Z" }, + { url = "https://files.pythonhosted.org/packages/2f/99/7690b5b5b552db1bd4ff362e4c0eb3107b98d680835e65823fbe888c8b78/mypy-1.20.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2721f0ce49cb74a38f00c50da67cb7d36317b5eda38877a49614dc018e91c787", size = 16087874, upload-time = "2026-03-31T16:52:48.313Z" }, + { url = "https://files.pythonhosted.org/packages/aa/76/53e893a498138066acd28192b77495c9357e5a58cc4be753182846b43315/mypy-1.20.0-cp314-cp314t-win_amd64.whl", hash = "sha256:47781555a7aa5fedcc2d16bcd72e0dc83eb272c10dd657f9fb3f9cc08e2e6abb", size = 12572380, upload-time = "2026-03-31T16:49:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/9c/6dbdae21f01b7aacddc2c0bbf3c5557aa547827fdf271770fe1e521e7093/mypy-1.20.0-cp314-cp314t-win_arm64.whl", hash = "sha256:c70380fe5d64010f79fb863b9081c7004dd65225d2277333c219d93a10dad4dd", size = 10381174, upload-time = "2026-03-31T16:51:20.179Z" }, + { url = "https://files.pythonhosted.org/packages/21/66/4d734961ce167f0fd8380769b3b7c06dbdd6ff54c2190f3f2ecd22528158/mypy-1.20.0-py3-none-any.whl", hash = "sha256:a6e0641147cbfa7e4e94efdb95c2dab1aff8cfc159ded13e07f308ddccc8c48e", size = 2636365, upload-time = "2026-03-31T16:51:44.911Z" }, ] [[package]] @@ -799,100 +811,100 @@ wheels = [ [[package]] name = "pillow" -version = "12.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, - { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, - { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, - { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, - { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, - { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, - { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, - { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, - { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, - { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, - { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, - { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, - { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, - { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, - { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, - { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, - { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, - { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, - { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, - { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, - { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, - { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, - { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, - { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, - { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, - { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, - { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, - { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, - { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, - { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, - { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, - { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, - { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, - { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, - { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, - { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, - { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, - { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, - { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, - { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, - { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, - { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, - { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, - { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, - { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, - { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, - { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, - { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, - { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, - { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, - { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, - { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, - { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, - { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, - { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, - { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, - { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, - { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, - { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, + { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, + { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, + { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] [[package]] @@ -1049,7 +1061,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.0" +version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1057,9 +1069,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] @@ -1085,27 +1097,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, - { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, - { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, - { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, - { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, - { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, - { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, - { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, - { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, - { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, - { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" }, - { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" }, +version = "0.15.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/97/e9f1ca355108ef7194e38c812ef40ba98c7208f47b13ad78d023caa583da/ruff-0.15.9.tar.gz", hash = "sha256:29cbb1255a9797903f6dde5ba0188c707907ff44a9006eb273b5a17bfa0739a2", size = 4617361, upload-time = "2026-04-02T18:17:20.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/1f/9cdfd0ac4b9d1e5a6cf09bedabdf0b56306ab5e333c85c87281273e7b041/ruff-0.15.9-py3-none-linux_armv6l.whl", hash = "sha256:6efbe303983441c51975c243e26dff328aca11f94b70992f35b093c2e71801e1", size = 10511206, upload-time = "2026-04-02T18:16:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f6/32bfe3e9c136b35f02e489778d94384118bb80fd92c6d92e7ccd97db12ce/ruff-0.15.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4965bac6ac9ea86772f4e23587746f0b7a395eccabb823eb8bfacc3fa06069f7", size = 10923307, upload-time = "2026-04-02T18:17:08.645Z" }, + { url = "https://files.pythonhosted.org/packages/ca/25/de55f52ab5535d12e7aaba1de37a84be6179fb20bddcbe71ec091b4a3243/ruff-0.15.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf05aad70ca5b5a0a4b0e080df3a6b699803916d88f006efd1f5b46302daab8", size = 10316722, upload-time = "2026-04-02T18:16:44.206Z" }, + { url = "https://files.pythonhosted.org/packages/48/11/690d75f3fd6278fe55fff7c9eb429c92d207e14b25d1cae4064a32677029/ruff-0.15.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9439a342adb8725f32f92732e2bafb6d5246bd7a5021101166b223d312e8fc59", size = 10623674, upload-time = "2026-04-02T18:16:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ec/176f6987be248fc5404199255522f57af1b4a5a1b57727e942479fec98ad/ruff-0.15.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5e6faf9d97c8edc43877c3f406f47446fc48c40e1442d58cfcdaba2acea745", size = 10351516, upload-time = "2026-04-02T18:16:57.206Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fc/51cffbd2b3f240accc380171d51446a32aa2ea43a40d4a45ada67368fbd2/ruff-0.15.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b34a9766aeec27a222373d0b055722900fbc0582b24f39661aa96f3fe6ad901", size = 11150202, upload-time = "2026-04-02T18:17:06.452Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d4/25292a6dfc125f6b6528fe6af31f5e996e19bf73ca8e3ce6eb7fa5b95885/ruff-0.15.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89dd695bc72ae76ff484ae54b7e8b0f6b50f49046e198355e44ea656e521fef9", size = 11988891, upload-time = "2026-04-02T18:17:18.575Z" }, + { url = "https://files.pythonhosted.org/packages/13/e1/1eebcb885c10e19f969dcb93d8413dfee8172578709d7ee933640f5e7147/ruff-0.15.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce187224ef1de1bd225bc9a152ac7102a6171107f026e81f317e4257052916d5", size = 11480576, upload-time = "2026-04-02T18:16:52.986Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/a1548ac378a78332a4c3dcf4a134c2475a36d2a22ddfa272acd574140b50/ruff-0.15.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6", size = 11254525, upload-time = "2026-04-02T18:17:02.041Z" }, + { url = "https://files.pythonhosted.org/packages/42/aa/4bb3af8e61acd9b1281db2ab77e8b2c3c5e5599bf2a29d4a942f1c62b8d6/ruff-0.15.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:55cc15eee27dc0eebdfcb0d185a6153420efbedc15eb1d38fe5e685657b0f840", size = 11204072, upload-time = "2026-04-02T18:17:13.581Z" }, + { url = "https://files.pythonhosted.org/packages/69/48/d550dc2aa6e423ea0bcc1d0ff0699325ffe8a811e2dba156bd80750b86dc/ruff-0.15.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6537f6eed5cda688c81073d46ffdfb962a5f29ecb6f7e770b2dc920598997ed", size = 10594998, upload-time = "2026-04-02T18:16:46.369Z" }, + { url = "https://files.pythonhosted.org/packages/63/47/321167e17f5344ed5ec6b0aa2cff64efef5f9e985af8f5622cfa6536043f/ruff-0.15.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6d3fcbca7388b066139c523bda744c822258ebdcfbba7d24410c3f454cc9af71", size = 10359769, upload-time = "2026-04-02T18:17:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/67/5e/074f00b9785d1d2c6f8c22a21e023d0c2c1817838cfca4c8243200a1fa87/ruff-0.15.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:058d8e99e1bfe79d8a0def0b481c56059ee6716214f7e425d8e737e412d69677", size = 10850236, upload-time = "2026-04-02T18:16:48.749Z" }, + { url = "https://files.pythonhosted.org/packages/76/37/804c4135a2a2caf042925d30d5f68181bdbd4461fd0d7739da28305df593/ruff-0.15.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8e1ddb11dbd61d5983fa2d7d6370ef3eb210951e443cace19594c01c72abab4c", size = 11358343, upload-time = "2026-04-02T18:16:55.068Z" }, + { url = "https://files.pythonhosted.org/packages/88/3d/1364fcde8656962782aa9ea93c92d98682b1ecec2f184e625a965ad3b4a6/ruff-0.15.9-py3-none-win32.whl", hash = "sha256:bde6ff36eaf72b700f32b7196088970bf8fdb2b917b7accd8c371bfc0fd573ec", size = 10583382, upload-time = "2026-04-02T18:17:04.261Z" }, + { url = "https://files.pythonhosted.org/packages/4c/56/5c7084299bd2cacaa07ae63a91c6f4ba66edc08bf28f356b24f6b717c799/ruff-0.15.9-py3-none-win_amd64.whl", hash = "sha256:45a70921b80e1c10cf0b734ef09421f71b5aa11d27404edc89d7e8a69505e43d", size = 11744969, upload-time = "2026-04-02T18:16:59.611Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" }, ] [[package]] @@ -1644,14 +1656,14 @@ wheels = [ [[package]] name = "types-pygments" -version = "2.19.0.20251121" +version = "2.19.0.20260402" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/3b/cd650700ce9e26b56bd1a6aa4af397bbbc1784e22a03971cb633cdb0b601/types_pygments-2.19.0.20251121.tar.gz", hash = "sha256:eef114fde2ef6265365522045eac0f8354978a566852f69e75c531f0553822b1", size = 18590, upload-time = "2025-11-21T03:03:46.623Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/a8/5834c55d900ce31b31367eedb82e664347dfa551a957b74a0ce0cd9f4f9a/types_pygments-2.19.0.20260402.tar.gz", hash = "sha256:bd26e1f662c9a3b8ea56668ddc099b809ffd54931bee97b15853bc4a8e5d4250", size = 18808, upload-time = "2026-04-02T04:21:13.058Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/8a/9244b21f1d60dcc62e261435d76b02f1853b4771663d7ec7d287e47a9ba9/types_pygments-2.19.0.20251121-py3-none-any.whl", hash = "sha256:cb3bfde34eb75b984c98fb733ce4f795213bd3378f855c32e75b49318371bb25", size = 25674, upload-time = "2025-11-21T03:03:45.72Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f2/b23659df4219fc4f39a45ede527cc209d961c7ff957678536a7a9d9ac9c5/types_pygments-2.19.0.20260402-py3-none-any.whl", hash = "sha256:5b0d863cec1c43ba38c946fb6e89d389c1cf287806f72360336fba4482f8daeb", size = 25672, upload-time = "2026-04-02T04:21:11.916Z" }, ] [[package]] @@ -1692,16 +1704,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.42.0" +version = "0.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e3/ad/4a96c425be6fb67e0621e62d86c402b4a17ab2be7f7c055d9bd2f638b9e2/uvicorn-0.42.0.tar.gz", hash = "sha256:9b1f190ce15a2dd22e7758651d9b6d12df09a13d51ba5bf4fc33c383a48e1775", size = 85393, upload-time = "2026-03-16T06:19:50.077Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/f2/368268300fb8af33743508d738ef7bb4d56afdb46c6d9c0fa3dd515df171/uvicorn-0.43.0.tar.gz", hash = "sha256:ab1652d2fb23abf124f36ccc399828558880def222c3cb3d98d24021520dc6e8", size = 85686, upload-time = "2026-04-03T18:37:48.984Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/89/f8827ccff89c1586027a105e5630ff6139a64da2515e24dafe860bd9ae4d/uvicorn-0.42.0-py3-none-any.whl", hash = "sha256:96c30f5c7abe6f74ae8900a70e92b85ad6613b745d4879eb9b16ccad15645359", size = 68830, upload-time = "2026-03-16T06:19:48.325Z" }, + { url = "https://files.pythonhosted.org/packages/55/df/0cf5b0c451602748fdc7a702d4667f6e209bf96aa6e3160d754234445f2a/uvicorn-0.43.0-py3-none-any.whl", hash = "sha256:46fac64f487fd968cd999e5e49efbbe64bd231b5bd8b4a0b482a23ebce499620", size = 68591, upload-time = "2026-04-03T18:37:47.64Z" }, ] [[package]] From 6b1651f4499c4641552b9a5702843ac286ee57be Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 08:45:19 -0500 Subject: [PATCH 2798/2998] .tool-versions(uv, just) uv 0.11.2 -> 0.11.3, just 1.47 -> 1.49 - just - https://github.com/casey/just/blob/1.49.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.48.0 - https://github.com/casey/just/releases/tag/1.49.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.3 - https://github.com/astral-sh/uv/blob/0.11.3/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index 1ced26b3e9..88d422f528 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.47 -uv 0.11.2 +just 1.49 +uv 0.11.3 python 3.14 3.13 3.12 3.11 3.10 From 903041edbc6400acd02e931ad4c298ef8c311ce9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 08:45:24 -0500 Subject: [PATCH 2799/2998] py(deps[dev]) Bump dev packages --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 0a708b6f9c..67edd3767c 100644 --- a/uv.lock +++ b/uv.lock @@ -1656,14 +1656,14 @@ wheels = [ [[package]] name = "types-pygments" -version = "2.19.0.20260402" +version = "2.20.0.20260405" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/a8/5834c55d900ce31b31367eedb82e664347dfa551a957b74a0ce0cd9f4f9a/types_pygments-2.19.0.20260402.tar.gz", hash = "sha256:bd26e1f662c9a3b8ea56668ddc099b809ffd54931bee97b15853bc4a8e5d4250", size = 18808, upload-time = "2026-04-02T04:21:13.058Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/28/7a11c06b290e370eca368dd59d9738a79657a7518f5a4021b1e187c1a16d/types_pygments-2.20.0.20260405.tar.gz", hash = "sha256:f06fe34d6457044ce7587a5a6cf73e6bc5c769c933cd9edf033379bcd7ed2897", size = 19342, upload-time = "2026-04-05T04:27:06.184Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/f2/b23659df4219fc4f39a45ede527cc209d961c7ff957678536a7a9d9ac9c5/types_pygments-2.19.0.20260402-py3-none-any.whl", hash = "sha256:5b0d863cec1c43ba38c946fb6e89d389c1cf287806f72360336fba4482f8daeb", size = 25672, upload-time = "2026-04-02T04:21:11.916Z" }, + { url = "https://files.pythonhosted.org/packages/fe/51/dabb479c2cda4fbed99a0f2045aee2bb91487c50c654a7ad6dfa327c5b82/types_pygments-2.20.0.20260405-py3-none-any.whl", hash = "sha256:79dc975f7a9c6cbfdcc32f3d31b7eb507d39a41031c3b2124f16fc2e42326954", size = 26688, upload-time = "2026-04-05T04:27:05.215Z" }, ] [[package]] From a4d11b52bf404f9f661a18bb062562e29db69fe5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 07:30:10 -0500 Subject: [PATCH 2800/2998] py(deps[dev]): Replace sphinx/furo stack with gp-sphinx==0.0.1a0 why: Consolidate docs dependencies into the gp-sphinx shared platform, resolving from PyPI now that 0.0.1a0 is published. what: - Remove sphinx<9, furo, sphinx-autodoc-typehints, sphinx-inline-tabs, sphinxext-opengraph, sphinx-copybutton, sphinxext-rediraffe, sphinx-design, myst-parser, linkify-it-py from dev/docs groups - Add gp-sphinx==0.0.1a0 and sphinx-argparse-neo==0.0.1a0 - Remove cli_usage_lexer, argparse_lexer, argparse_roles from mypy overrides - Update uv.lock to resolve from PyPI --- pyproject.toml | 27 ++--------- uv.lock | 124 ++++++++++++++++++++++++++++++------------------- 2 files changed, 80 insertions(+), 71 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 02fc0e28f6..50327c2125 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,18 +57,10 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "sphinx<9", # https://www.sphinx-doc.org/ - "furo", # https://pradyunsg.me/furo/ + "gp-sphinx==0.0.1a0", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a0", # https://gp-sphinx.git-pull.com/ "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html - "sphinx-autodoc-typehints", # https://sphinx-autodoc-typehints.readthedocs.io/ - "sphinx-inline-tabs", # https://sphinx-inline-tabs.readthedocs.io/ - "sphinxext-opengraph", # https://sphinxext-opengraph.readthedocs.io/ - "sphinx-copybutton", # https://sphinx-copybutton.readthedocs.io/ - "sphinxext-rediraffe", # https://sphinxext-rediraffe.readthedocs.io/ - "sphinx-design", # https://sphinx-design.readthedocs.io/ - "myst-parser", # https://myst-parser.readthedocs.io/ - "linkify-it-py", # https://github.com/tsutsu3/linkify-it-py # Testing "gp-libs", "pytest", @@ -90,18 +82,10 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "sphinx<9", # https://www.sphinx-doc.org/ - "furo", # https://pradyunsg.me/furo/ + "gp-sphinx==0.0.1a0", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a0", # https://gp-sphinx.git-pull.com/ "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html - "sphinx-autodoc-typehints", # https://sphinx-autodoc-typehints.readthedocs.io/ - "sphinx-inline-tabs", # https://sphinx-inline-tabs.readthedocs.io/ - "sphinxext-opengraph", # https://sphinxext-opengraph.readthedocs.io/ - "sphinx-copybutton", # https://sphinx-copybutton.readthedocs.io/ - "sphinxext-rediraffe", # https://sphinxext-rediraffe.readthedocs.io/ - "sphinx-design", # https://sphinx-design.readthedocs.io/ - "myst-parser", # https://myst-parser.readthedocs.io/ - "linkify-it-py", # https://github.com/tsutsu3/linkify-it-py ] testing = [ "gp-libs", @@ -176,9 +160,6 @@ module = [ "sphinx_argparse_neo", "sphinx_argparse_neo.*", "sphinx_fonts", - "cli_usage_lexer", - "argparse_lexer", - "argparse_roles", "docutils", "docutils.*", "pygments", diff --git a/uv.lock b/uv.lock index 67edd3767c..32264f4b46 100644 --- a/uv.lock +++ b/uv.lock @@ -391,6 +391,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/f9/5d78d1dda9cb0f27d6f2305e95a58edbff935a62d53ec3227a3518cb4f72/gp_libs-0.0.17-py3-none-any.whl", hash = "sha256:7ce96d5e09980c0dc82062ab3e3b911600bd44da97a64fb78379f1af9a79d4d3", size = 16157, upload-time = "2025-12-07T22:44:48.036Z" }, ] +[[package]] +name = "gp-sphinx" +version = "0.0.1a0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "gp-libs" }, + { name = "linkify-it-py" }, + { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-copybutton" }, + { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-fonts" }, + { name = "sphinx-gptheme" }, + { name = "sphinx-inline-tabs" }, + { name = "sphinxext-opengraph" }, + { name = "sphinxext-rediraffe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/57/7a8ea21c53c83e7c54b17610ed0c48e8db6254c2ff017c1e44ae4f7132ca/gp_sphinx-0.0.1a0.tar.gz", hash = "sha256:5cf583c06dffe6697b05a9a5f0593aa41cfe35fed8a1577324ccc87e0c0c92f7", size = 13989, upload-time = "2026-04-05T10:10:23.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/8e/5e0a0364be9c80e18bd07ec2bf43fd760c5938629035a356c172f1234daa/gp_sphinx-0.0.1a0-py3-none-any.whl", hash = "sha256:fb8310dd73ffb52827ed834f49d2e769ed3136359b54879aadd9d55ff7c6048d", size = 14399, upload-time = "2026-04-05T10:04:29.578Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -1201,6 +1229,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, ] +[[package]] +name = "sphinx-argparse-neo" +version = "0.0.1a0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/37/83215aabda61647f0fb0ab489e0c7227a59e041f565e9b44f2af073f6008/sphinx_argparse_neo-0.0.1a0.tar.gz", hash = "sha256:d40c931a687fe79dc465d850fb9904f552de575952b6dee291de61149c7bc66a", size = 37123, upload-time = "2026-04-05T10:10:23.969Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/4c/6b9ac99f0639eebcecef7d294c079b66c06d56f0cc9a285ebbe2b05c68c9/sphinx_argparse_neo-0.0.1a0-py3-none-any.whl", hash = "sha256:19cf9ba32d14ca686112c1d8509f268f0ab2b1822a003875de64bbd9449ab5ef", size = 41428, upload-time = "2026-04-05T10:04:31.212Z" }, +] + [[package]] name = "sphinx-autobuild" version = "2024.10.3" @@ -1330,6 +1373,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/cf/45dd359f6ca0c3762ce0490f681da242f0530c49c81050c035c016bfdd3a/sphinx_design-0.7.0-py3-none-any.whl", hash = "sha256:f82bf179951d58f55dca78ab3706aeafa496b741a91b1911d371441127d64282", size = 2220350, upload-time = "2026-01-19T13:12:51.077Z" }, ] +[[package]] +name = "sphinx-fonts" +version = "0.0.1a0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/4f/be4fe35f90d0bc5090a8bd1367c53d063d5808e367e22274f16cc6978796/sphinx_fonts-0.0.1a0.tar.gz", hash = "sha256:9ca77ba151fa27963e90f899d92b1e43680e223efa3acdd3c532d5e4f0b29eed", size = 5628, upload-time = "2026-04-05T10:10:28.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/68/c8793bc5a08aee5644aed1ac0eb1ef2368cc61e31d4c1d6fd6cc52192a15/sphinx_fonts-0.0.1a0-py3-none-any.whl", hash = "sha256:aae888b35cc901ad2947c3d171a0bf02b724bc78d2677827673113c8c73e11fd", size = 4345, upload-time = "2026-04-05T10:09:11.134Z" }, +] + +[[package]] +name = "sphinx-gptheme" +version = "0.0.1a0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "furo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/7c/71908e74939fd4d33d83bc39d31398deae895218dd319f626f6a3e4a1068/sphinx_gptheme-0.0.1a0.tar.gz", hash = "sha256:06f222f557dbd0e3256494f145cdbc1bc971d665e9203db19bc9c105283132ac", size = 13697, upload-time = "2026-04-05T10:10:29.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/ec/7fe7909d31da9007232a77ac5750da9b9329921e938c3d73d409e4caa4ec/sphinx_gptheme-0.0.1a0-py3-none-any.whl", hash = "sha256:da0e6bb047b01c93a7df2f81be693e46b0709a1960b250991597648f7b320dfa", size = 14690, upload-time = "2026-04-05T10:10:21.577Z" }, +] + [[package]] name = "sphinx-inline-tabs" version = "2025.12.21.14" @@ -1455,12 +1523,9 @@ dev = [ { name = "aafigure" }, { name = "codecov" }, { name = "coverage" }, - { name = "furo" }, { name = "gp-libs" }, - { name = "linkify-it-py" }, + { name = "gp-sphinx" }, { name = "mypy" }, - { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pillow" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -1468,42 +1533,21 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-copybutton" }, - { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-inline-tabs" }, - { name = "sphinxext-opengraph" }, - { name = "sphinxext-rediraffe" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, ] docs = [ { name = "aafigure" }, - { name = "furo" }, { name = "gp-libs" }, - { name = "linkify-it-py" }, - { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "gp-sphinx" }, { name = "pillow" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-copybutton" }, - { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-inline-tabs" }, - { name = "sphinxext-opengraph" }, - { name = "sphinxext-rediraffe" }, ] lint = [ { name = "mypy" }, @@ -1536,11 +1580,9 @@ dev = [ { name = "aafigure" }, { name = "codecov" }, { name = "coverage" }, - { name = "furo" }, { name = "gp-libs" }, - { name = "linkify-it-py" }, + { name = "gp-sphinx", specifier = "==0.0.1a0" }, { name = "mypy" }, - { name = "myst-parser" }, { name = "pillow" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -1548,33 +1590,19 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx", specifier = "<9" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a0" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-typehints" }, - { name = "sphinx-copybutton" }, - { name = "sphinx-design" }, - { name = "sphinx-inline-tabs" }, - { name = "sphinxext-opengraph" }, - { name = "sphinxext-rediraffe" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, ] docs = [ { name = "aafigure" }, - { name = "furo" }, { name = "gp-libs" }, - { name = "linkify-it-py" }, - { name = "myst-parser" }, + { name = "gp-sphinx", specifier = "==0.0.1a0" }, { name = "pillow" }, - { name = "sphinx", specifier = "<9" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a0" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-typehints" }, - { name = "sphinx-copybutton" }, - { name = "sphinx-design" }, - { name = "sphinx-inline-tabs" }, - { name = "sphinxext-opengraph" }, - { name = "sphinxext-rediraffe" }, ] lint = [ { name = "mypy" }, From 587ec3705b88836dc38d63b6817ddb0fc279dcdb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 07:25:03 -0500 Subject: [PATCH 2801/2998] docs(chore): Remove bundled extensions and migrate conf.py to gp-sphinx why: sphinx-argparse-neo and sphinx-fonts are now provided as PyPI packages via gp-sphinx; bundled copies in docs/_ext/ are no longer needed. what: - Delete docs/_ext/sphinx_fonts.py, sphinx_argparse_neo/, argparse_exemplar.py, argparse_lexer.py, argparse_roles.py, cli_usage_lexer.py - Delete docs/_static/js/spa-nav.js (now bundled in sphinx-gptheme) - Migrate docs/conf.py to use merge_sphinx_config() from gp_sphinx - Update tests/docs/_ext/ imports to reference installed packages --- docs/_ext/argparse_exemplar.py | 1305 -------------------- docs/_ext/argparse_lexer.py | 429 ------- docs/_ext/argparse_roles.py | 370 ------ docs/_ext/cli_usage_lexer.py | 115 -- docs/_ext/sphinx_argparse_neo/__init__.py | 101 -- docs/_ext/sphinx_argparse_neo/compat.py | 271 ---- docs/_ext/sphinx_argparse_neo/directive.py | 240 ---- docs/_ext/sphinx_argparse_neo/nodes.py | 647 ---------- docs/_ext/sphinx_argparse_neo/parser.py | 659 ---------- docs/_ext/sphinx_argparse_neo/renderer.py | 604 --------- docs/_ext/sphinx_argparse_neo/utils.py | 78 -- docs/_ext/sphinx_fonts.py | 209 ---- docs/_static/js/spa-nav.js | 254 ---- docs/conf.py | 300 +---- tests/docs/_ext/conftest.py | 8 - tests/docs/_ext/test_argparse_exemplar.py | 4 +- tests/docs/_ext/test_argparse_lexer.py | 2 +- tests/docs/_ext/test_argparse_roles.py | 4 +- tests/docs/_ext/test_cli_usage_lexer.py | 2 +- tests/docs/_ext/test_sphinx_fonts.py | 2 +- 20 files changed, 35 insertions(+), 5569 deletions(-) delete mode 100644 docs/_ext/argparse_exemplar.py delete mode 100644 docs/_ext/argparse_lexer.py delete mode 100644 docs/_ext/argparse_roles.py delete mode 100644 docs/_ext/cli_usage_lexer.py delete mode 100644 docs/_ext/sphinx_argparse_neo/__init__.py delete mode 100644 docs/_ext/sphinx_argparse_neo/compat.py delete mode 100644 docs/_ext/sphinx_argparse_neo/directive.py delete mode 100644 docs/_ext/sphinx_argparse_neo/nodes.py delete mode 100644 docs/_ext/sphinx_argparse_neo/parser.py delete mode 100644 docs/_ext/sphinx_argparse_neo/renderer.py delete mode 100644 docs/_ext/sphinx_argparse_neo/utils.py delete mode 100644 docs/_ext/sphinx_fonts.py delete mode 100644 docs/_static/js/spa-nav.js diff --git a/docs/_ext/argparse_exemplar.py b/docs/_ext/argparse_exemplar.py deleted file mode 100644 index a4a7e1fc8b..0000000000 --- a/docs/_ext/argparse_exemplar.py +++ /dev/null @@ -1,1305 +0,0 @@ -"""Transform argparse epilog "examples:" definition lists into documentation sections. - -This Sphinx extension post-processes sphinx_argparse_neo output to convert -specially-formatted "examples:" definition lists in argparse epilogs into -proper documentation sections with syntax-highlighted code blocks. - -The extension is designed to be generic and reusable across different projects. -All behavior can be customized via Sphinx configuration options. - -Purpose -------- -When documenting CLI tools with argparse, it's useful to include examples in -the epilog. This extension recognizes a specific definition list format and -transforms it into structured documentation sections that appear in the TOC. - -Input Format ------------- -Format your argparse epilog with definition lists where terms end with "examples:": - -.. code-block:: python - - parser = argparse.ArgumentParser( - epilog=textwrap.dedent(''' - examples: - myapp sync - myapp sync myrepo - - Machine-readable output examples: - myapp sync --json - myapp sync -F json myrepo - '''), - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - -The epilog text will be parsed as a definition list by docutils, with: -- Terms: "examples:", "Machine-readable output examples:", etc. -- Definitions: The example commands (one per line) - -Output ------- -The extension transforms these into proper sections: - -- A base "examples:" term creates an "Examples" section -- Category-prefixed terms like "Machine-readable output examples:" create - subsections nested under the parent Examples section -- Each command line becomes a syntax-highlighted console code block - -Configuration -------------- -Configure via conf.py. All options have sensible defaults. - -**Term Detection:** - -``argparse_examples_term_suffix`` : str (default: "examples") - Term must end with this string to be treated as an examples header. - -``argparse_examples_base_term`` : str (default: "examples") - Exact match for the base examples section (case-insensitive). - -``argparse_examples_section_title`` : str (default: "Examples") - Title used for the base examples section. - -**Usage Detection:** - -``argparse_usage_pattern`` : str (default: "usage:") - Text must start with this to be treated as a usage block (case-insensitive). - -**Code Block Formatting:** - -``argparse_examples_command_prefix`` : str (default: "$ ") - Prefix added to each command line in examples code blocks. - -``argparse_examples_code_language`` : str (default: "console") - Language identifier for examples code blocks. - -``argparse_examples_code_classes`` : list[str] (default: ["highlight-console"]) - CSS classes added to examples code blocks. - -``argparse_usage_code_language`` : str (default: "cli-usage") - Language identifier for usage blocks. - -**Behavior:** - -``argparse_reorder_usage_before_examples`` : bool (default: True) - Whether to reorder nodes so usage appears before examples. - -Additional Features -------------------- -- Removes ANSI escape codes (useful when FORCE_COLOR is set) -- Applies syntax highlighting to usage blocks -- Reorders sections so usage appears before examples in the output -- Extracts sections from argparse_program containers for TOC visibility - -Project-Specific Setup ----------------------- -Projects using this extension should register their own lexers and CSS in -their conf.py setup() function. For example:: - - def setup(app): - from my_lexer import MyLexer - app.add_lexer("my-output", MyLexer) - app.add_css_file("css/my-highlight.css") -""" - -from __future__ import annotations - -import dataclasses -import typing as t - -from docutils import nodes -from sphinx_argparse_neo.directive import ArgparseDirective -from sphinx_argparse_neo.utils import strip_ansi - -if t.TYPE_CHECKING: - import sphinx.config - from sphinx.application import Sphinx - - -@dataclasses.dataclass -class ExemplarConfig: - """Configuration for argparse_exemplar transformation. - - This dataclass provides all configurable options for the argparse_exemplar - extension. Functions accept an optional config parameter with a factory - default, allowing them to work standalone with defaults or accept custom - config for full control. - - Attributes - ---------- - examples_term_suffix : str - Term must end with this string (case-insensitive) to be treated as an - examples header. Default: "examples". - examples_base_term : str - Exact match (case-insensitive, after stripping ":") for the base - examples section. Default: "examples". - examples_section_title : str - Title used for the base examples section. Default: "Examples". - usage_pattern : str - Text must start with this string (case-insensitive, after stripping - whitespace) to be treated as a usage block. Default: "usage:". - command_prefix : str - Prefix added to each command line in examples code blocks. - Default: "$ ". - code_language : str - Language identifier for examples code blocks. Default: "console". - code_classes : tuple[str, ...] - CSS classes added to examples code blocks. - Default: ("highlight-console",). - usage_code_language : str - Language identifier for usage blocks. Default: "cli-usage". - reorder_usage_before_examples : bool - Whether to reorder nodes so usage appears before examples. - Default: True. - - Examples - -------- - Using default configuration: - - >>> config = ExemplarConfig() - >>> config.examples_term_suffix - 'examples' - >>> config.command_prefix - '$ ' - - Custom configuration: - - >>> config = ExemplarConfig( - ... command_prefix="> ", - ... code_language="bash", - ... ) - >>> config.command_prefix - '> ' - >>> config.code_language - 'bash' - """ - - # Term detection - examples_term_suffix: str = "examples" - examples_base_term: str = "examples" - examples_section_title: str = "Examples" - - # Usage detection - usage_pattern: str = "usage:" - - # Code block formatting - command_prefix: str = "$ " - code_language: str = "console" - code_classes: tuple[str, ...] = ("highlight-console",) - usage_code_language: str = "cli-usage" - - # Behavior - reorder_usage_before_examples: bool = True - - @classmethod - def from_sphinx_config(cls, config: sphinx.config.Config) -> ExemplarConfig: - """Create ExemplarConfig from Sphinx configuration. - - Parameters - ---------- - config : sphinx.config.Config - The Sphinx configuration object. - - Returns - ------- - ExemplarConfig - Configuration populated from Sphinx config values. - - Examples - -------- - This is typically called from a directive's run() method: - - >>> # In CleanArgParseDirective.run(): - >>> # config = ExemplarConfig.from_sphinx_config(self.env.config) - """ - # Get code_classes as tuple (Sphinx stores lists) - code_classes_raw = getattr( - config, "argparse_examples_code_classes", ("highlight-console",) - ) - code_classes = ( - tuple(code_classes_raw) - if isinstance(code_classes_raw, list) - else code_classes_raw - ) - - return cls( - examples_term_suffix=getattr( - config, "argparse_examples_term_suffix", "examples" - ), - examples_base_term=getattr( - config, "argparse_examples_base_term", "examples" - ), - examples_section_title=getattr( - config, "argparse_examples_section_title", "Examples" - ), - usage_pattern=getattr(config, "argparse_usage_pattern", "usage:"), - command_prefix=getattr(config, "argparse_examples_command_prefix", "$ "), - code_language=getattr(config, "argparse_examples_code_language", "console"), - code_classes=code_classes, - usage_code_language=getattr( - config, "argparse_usage_code_language", "cli-usage" - ), - reorder_usage_before_examples=getattr( - config, "argparse_reorder_usage_before_examples", True - ), - ) - - -# Re-export for backwards compatibility and public API -__all__ = [ - "CleanArgParseDirective", - "ExemplarConfig", - "is_base_examples_term", - "is_examples_term", - "make_section_id", - "make_section_title", - "process_node", - "strip_ansi", - "transform_definition_list", -] - - -def is_examples_term(term_text: str, *, config: ExemplarConfig | None = None) -> bool: - """Check if a definition term is an examples header. - - Parameters - ---------- - term_text : str - The text content of a definition term. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - bool - True if this is an examples header. - - Examples - -------- - >>> is_examples_term("examples:") - True - >>> is_examples_term("Machine-readable output examples:") - True - >>> is_examples_term("Usage:") - False - - With custom configuration: - - >>> custom_config = ExemplarConfig(examples_term_suffix="demos") - >>> is_examples_term("demos:", config=custom_config) - True - >>> is_examples_term("examples:", config=custom_config) - False - """ - config = config or ExemplarConfig() - return term_text.lower().rstrip(":").endswith(config.examples_term_suffix) - - -def is_base_examples_term( - term_text: str, *, config: ExemplarConfig | None = None -) -> bool: - """Check if a definition term is a base "examples:" header (no prefix). - - Parameters - ---------- - term_text : str - The text content of a definition term. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - bool - True if this is just "examples:" with no category prefix. - - Examples - -------- - >>> is_base_examples_term("examples:") - True - >>> is_base_examples_term("Examples") - True - >>> is_base_examples_term("Field-scoped examples:") - False - - With custom configuration: - - >>> custom_config = ExemplarConfig(examples_base_term="demos") - >>> is_base_examples_term("demos:", config=custom_config) - True - >>> is_base_examples_term("examples:", config=custom_config) - False - """ - config = config or ExemplarConfig() - return term_text.lower().rstrip(":").strip() == config.examples_base_term - - -def make_section_id( - term_text: str, - counter: int = 0, - *, - is_subsection: bool = False, - page_prefix: str = "", - config: ExemplarConfig | None = None, -) -> str: - """Generate a section ID from an examples term. - - Parameters - ---------- - term_text : str - The examples term text (e.g., "Machine-readable output: examples:") - counter : int - Counter for uniqueness if multiple examples sections exist. - is_subsection : bool - If True, omit "-examples" suffix for cleaner nested IDs. - page_prefix : str - Optional prefix from the page name (e.g., "sync", "add") to ensure - uniqueness across different documentation pages. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - str - A normalized section ID. - - Examples - -------- - >>> make_section_id("examples:") - 'examples' - >>> make_section_id("examples:", page_prefix="sync") - 'sync-examples' - >>> make_section_id("Machine-readable output examples:") - 'machine-readable-output-examples' - >>> make_section_id("Field-scoped examples:", is_subsection=True) - 'field-scoped' - >>> make_section_id("examples:", counter=1) - 'examples-1' - - With custom configuration: - - >>> custom_config = ExemplarConfig(examples_term_suffix="demos") - >>> make_section_id("demos:", config=custom_config) - 'demos' - >>> make_section_id("Machine-readable output demos:", config=custom_config) - 'machine-readable-output-demos' - """ - config = config or ExemplarConfig() - term_suffix = config.examples_term_suffix - - # Extract prefix before the term suffix (e.g., "Machine-readable output") - lower_text = term_text.lower().rstrip(":") - if term_suffix in lower_text: - prefix = lower_text.rsplit(term_suffix, 1)[0].strip() - # Remove trailing colon from prefix (handles ": examples" pattern) - prefix = prefix.rstrip(":").strip() - if prefix: - normalized_prefix = prefix.replace(" ", "-") - # Subsections don't need "-examples" suffix - if is_subsection: - section_id = normalized_prefix - else: - section_id = f"{normalized_prefix}-{term_suffix}" - else: - # Plain "examples" - add page prefix if provided for uniqueness - section_id = f"{page_prefix}-{term_suffix}" if page_prefix else term_suffix - else: - section_id = term_suffix - - # Add counter suffix for uniqueness - if counter > 0: - section_id = f"{section_id}-{counter}" - - return section_id - - -def make_section_title( - term_text: str, - *, - is_subsection: bool = False, - config: ExemplarConfig | None = None, -) -> str: - """Generate a section title from an examples term. - - Parameters - ---------- - term_text : str - The examples term text (e.g., "Machine-readable output: examples:") - is_subsection : bool - If True, omit "Examples" suffix for cleaner nested titles. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - str - A proper title (e.g., "Machine-readable Output Examples" or just - "Machine-Readable Output" if is_subsection=True). - - Examples - -------- - >>> make_section_title("examples:") - 'Examples' - >>> make_section_title("Machine-readable output examples:") - 'Machine-Readable Output Examples' - >>> make_section_title("Field-scoped examples:", is_subsection=True) - 'Field-Scoped' - - With custom configuration: - - >>> custom_config = ExemplarConfig( - ... examples_base_term="demos", - ... examples_term_suffix="demos", - ... examples_section_title="Demos", - ... ) - >>> make_section_title("demos:", config=custom_config) - 'Demos' - >>> make_section_title("Machine-readable output demos:", config=custom_config) - 'Machine-Readable Output Demos' - """ - config = config or ExemplarConfig() - base_term = config.examples_base_term - term_suffix = config.examples_term_suffix - section_title = config.examples_section_title - - # Remove trailing colon and normalize - text = term_text.rstrip(":").strip() - # Handle base term case (e.g., "examples:") - if text.lower() == base_term: - return section_title - - # Extract the prefix (category name) before the term suffix - lower = text.lower() - colon_suffix = f": {term_suffix}" - space_suffix = f" {term_suffix}" - if lower.endswith(colon_suffix): - prefix = text[: -len(colon_suffix)] - elif lower.endswith(space_suffix): - prefix = text[: -len(space_suffix)] - else: - prefix = text - - # Title case the prefix - titled_prefix = prefix.title() - - # For subsections, just use the prefix (cleaner nested titles) - if is_subsection: - return titled_prefix - - # For top-level sections, append the section title - return f"{titled_prefix} {section_title}" - - -def _create_example_section( - term_text: str, - def_node: nodes.definition, - *, - is_subsection: bool = False, - page_prefix: str = "", - config: ExemplarConfig | None = None, -) -> nodes.section: - """Create a section node for an examples item. - - Parameters - ---------- - term_text : str - The examples term text. - def_node : nodes.definition - The definition node containing example commands. - is_subsection : bool - If True, create a subsection with simpler title/id. - page_prefix : str - Optional prefix from the page name for unique section IDs. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - nodes.section - A section node with title and code blocks. - - Examples - -------- - Create a section from a definition node containing example commands: - - >>> from docutils import nodes - >>> def_node = nodes.definition() - >>> def_node += nodes.paragraph(text="myapp sync") - >>> section = _create_example_section("examples:", def_node) - >>> section["ids"] - ['examples'] - >>> section[0].astext() - 'Examples' - - With a page prefix for uniqueness across documentation pages: - - >>> section = _create_example_section("examples:", def_node, page_prefix="sync") - >>> section["ids"] - ['sync-examples'] - - Category-prefixed examples create descriptive section IDs: - - >>> section = _create_example_section("Machine-readable output examples:", def_node) - >>> section["ids"] - ['machine-readable-output-examples'] - >>> section[0].astext() - 'Machine-Readable Output Examples' - """ - config = config or ExemplarConfig() - section_id = make_section_id( - term_text, is_subsection=is_subsection, page_prefix=page_prefix, config=config - ) - section_title = make_section_title( - term_text, is_subsection=is_subsection, config=config - ) - - section = nodes.section() - section["ids"] = [section_id] - section["names"] = [nodes.fully_normalize_name(section_title)] - - title = nodes.title(text=section_title) - section += title - - # Extract commands from definition and create separate code blocks - def_text = strip_ansi(def_node.astext()) - for line in def_text.split("\n"): - line = line.strip() - if line: - code_block = nodes.literal_block( - text=f"{config.command_prefix}{line}", - classes=list(config.code_classes), - ) - code_block["language"] = config.code_language - section += code_block - - return section - - -def transform_definition_list( - dl_node: nodes.definition_list, - *, - page_prefix: str = "", - config: ExemplarConfig | None = None, -) -> list[nodes.Node]: - """Transform a definition list, converting examples items to code blocks. - - If there's a base "examples:" item followed by category-specific examples - (e.g., "Field-scoped: examples:"), the categories are nested under the - parent Examples section for cleaner ToC structure. - - Parameters - ---------- - dl_node : nodes.definition_list - A definition list node. - page_prefix : str - Optional prefix from the page name for unique section IDs. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - list[nodes.Node] - Transformed nodes - code blocks for examples, original for others. - - Note - ---- - **Intentional reordering behavior:** This function always emits non-example - items (preamble text, descriptions, etc.) before example sections, regardless - of their original position in the definition list. This "flush first" approach - groups conceptually related content: introductory material appears before - examples, even if the source document interleaves them. This produces cleaner - documentation structure where descriptions introduce their examples. - - If you need to preserve the original interleaved order, you would need to - modify this function to track item positions during the first pass. - """ - config = config or ExemplarConfig() - - # First pass: collect examples and non-examples items separately - example_items: list[tuple[str, nodes.definition]] = [] # (term_text, def_node) - non_example_items: list[nodes.Node] = [] - base_examples_index: int | None = None - - for item in dl_node.children: - if not isinstance(item, nodes.definition_list_item): - continue - - # Get the term and definition - term_node = None - def_node = None - for child in item.children: - if isinstance(child, nodes.term): - term_node = child - elif isinstance(child, nodes.definition): - def_node = child - - if term_node is None or def_node is None: - non_example_items.append(item) - continue - - term_text = strip_ansi(term_node.astext()) - - if is_examples_term(term_text, config=config): - if is_base_examples_term(term_text, config=config): - base_examples_index = len(example_items) - example_items.append((term_text, def_node)) - else: - non_example_items.append(item) - - # Build result nodes - result_nodes: list[nodes.Node] = [] - - # Emit non-example items first (see docstring Note on reordering behavior) - if non_example_items: - new_dl = nodes.definition_list() - new_dl.extend(non_example_items) - result_nodes.append(new_dl) - - # Determine nesting strategy - # Nest if: there's a base "examples:" AND at least one other example category - should_nest = base_examples_index is not None and len(example_items) > 1 - - if should_nest and base_examples_index is not None: - # Create parent "Examples" section - base_term, base_def = example_items[base_examples_index] - parent_section = _create_example_section( - base_term, - base_def, - is_subsection=False, - page_prefix=page_prefix, - config=config, - ) - - # Add other examples as nested subsections - for i, (term_text, def_node) in enumerate(example_items): - if i == base_examples_index: - continue # Skip the base (already used as parent) - subsection = _create_example_section( - term_text, - def_node, - is_subsection=True, - page_prefix=page_prefix, - config=config, - ) - parent_section += subsection - - result_nodes.append(parent_section) - else: - # No nesting - create flat sections (backwards compatible) - for term_text, def_node in example_items: - section = _create_example_section( - term_text, - def_node, - is_subsection=False, - page_prefix=page_prefix, - config=config, - ) - result_nodes.append(section) - - return result_nodes - - -def process_node( - node: nodes.Node, - *, - page_prefix: str = "", - config: ExemplarConfig | None = None, -) -> nodes.Node | list[nodes.Node]: - """Process a node: strip ANSI codes and transform examples. - - Parameters - ---------- - node : nodes.Node - A docutils node to process. - page_prefix : str - Optional prefix from the page name for unique section IDs. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - nodes.Node | list[nodes.Node] - The processed node(s). - """ - config = config or ExemplarConfig() - - # Handle text nodes - strip ANSI - if isinstance(node, nodes.Text): - cleaned = strip_ansi(node.astext()) - if cleaned != node.astext(): - return nodes.Text(cleaned) - return node - - # Handle definition lists - transform examples - if isinstance(node, nodes.definition_list): - # Check if any items are examples - has_examples = False - for item in node.children: - if isinstance(item, nodes.definition_list_item): - for child in item.children: - if isinstance(child, nodes.term) and is_examples_term( - strip_ansi(child.astext()), config=config - ): - has_examples = True - break - if has_examples: - break - - if has_examples: - return transform_definition_list( - node, page_prefix=page_prefix, config=config - ) - - # Handle literal_block nodes - strip ANSI and apply usage highlighting - if isinstance(node, nodes.literal_block): - text = strip_ansi(node.astext()) - needs_update = text != node.astext() - - # Check if this is a usage block (starts with configured pattern) - is_usage = text.lstrip().lower().startswith(config.usage_pattern.lower()) - - if needs_update or is_usage: - new_block = nodes.literal_block(text=text) - # Preserve attributes - for attr in ("language", "classes"): - if attr in node: - new_block[attr] = node[attr] - # Apply configured language to usage blocks - if is_usage: - new_block["language"] = config.usage_code_language - return new_block - return node - - # Handle paragraph nodes - strip ANSI and lift sections out - if isinstance(node, nodes.paragraph): - # Process children and check if any become sections - processed_children: list[nodes.Node] = [] - changed = False - has_sections = False - - for child in node.children: - if isinstance(child, nodes.Text): - cleaned = strip_ansi(child.astext()) - if cleaned != child.astext(): - processed_children.append(nodes.Text(cleaned)) - changed = True - else: - processed_children.append(child) - else: - result = process_node(child, page_prefix=page_prefix, config=config) - if isinstance(result, list): - processed_children.extend(result) - changed = True - # Check if any results are sections - if any(isinstance(r, nodes.section) for r in result): - has_sections = True - elif result is not child: - processed_children.append(result) - changed = True - if isinstance(result, nodes.section): - has_sections = True - else: - processed_children.append(child) - - if not changed: - return node - - # If no sections, return a normal paragraph - if not has_sections: - new_para = nodes.paragraph() - new_para.extend(processed_children) - return new_para - - # Sections found - lift them out of the paragraph - # Return a list: [para_before, section1, section2, ..., para_after] - result_nodes: list[nodes.Node] = [] - current_para_children: list[nodes.Node] = [] - - for child in processed_children: - if isinstance(child, nodes.section): - # Flush current paragraph content - if current_para_children: - para = nodes.paragraph() - para.extend(current_para_children) - result_nodes.append(para) - current_para_children = [] - # Add section as a sibling - result_nodes.append(child) - else: - current_para_children.append(child) - - # Flush remaining paragraph content - if current_para_children: - para = nodes.paragraph() - para.extend(current_para_children) - result_nodes.append(para) - - return result_nodes - - # Recursively process children for other node types - if hasattr(node, "children"): - new_children: list[nodes.Node] = [] - children_changed = False - for child in node.children: - result = process_node(child, page_prefix=page_prefix, config=config) - if isinstance(result, list): - new_children.extend(result) - children_changed = True - elif result is not child: - new_children.append(result) - children_changed = True - else: - new_children.append(child) - if children_changed: - node[:] = new_children # type: ignore[index] - - return node - - -def _is_usage_block(node: nodes.Node, *, config: ExemplarConfig | None = None) -> bool: - """Check if a node is a usage literal block. - - Parameters - ---------- - node : nodes.Node - A docutils node to check. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - bool - True if this is a usage block (literal_block starting with usage pattern). - - Examples - -------- - >>> from docutils import nodes - >>> _is_usage_block(nodes.literal_block(text="usage: cmd [-h]")) - True - >>> _is_usage_block(nodes.literal_block(text="Usage: myapp sync")) - True - >>> _is_usage_block(nodes.literal_block(text=" usage: cmd")) - True - >>> _is_usage_block(nodes.literal_block(text="some other text")) - False - >>> _is_usage_block(nodes.paragraph(text="usage: cmd")) - False - >>> _is_usage_block(nodes.section()) - False - - With custom configuration: - - >>> custom_config = ExemplarConfig(usage_pattern="synopsis:") - >>> _is_usage_block(nodes.literal_block(text="synopsis: cmd"), config=custom_config) - True - >>> _is_usage_block(nodes.literal_block(text="usage: cmd"), config=custom_config) - False - """ - config = config or ExemplarConfig() - if not isinstance(node, nodes.literal_block): - return False - text = node.astext() - return text.lstrip().lower().startswith(config.usage_pattern.lower()) - - -def _is_usage_section(node: nodes.Node) -> bool: - """Check if a node is a usage section. - - Parameters - ---------- - node : nodes.Node - A docutils node to check. - - Returns - ------- - bool - True if this is a section with "usage" in its ID. - - Examples - -------- - >>> from docutils import nodes - >>> section = nodes.section() - >>> section["ids"] = ["usage"] - >>> _is_usage_section(section) - True - >>> section2 = nodes.section() - >>> section2["ids"] = ["sync-usage"] - >>> _is_usage_section(section2) - True - >>> section3 = nodes.section() - >>> section3["ids"] = ["options"] - >>> _is_usage_section(section3) - False - >>> _is_usage_section(nodes.paragraph()) - False - """ - if not isinstance(node, nodes.section): - return False - ids: list[str] = node.get("ids", []) - return any(id_str == "usage" or id_str.endswith("-usage") for id_str in ids) - - -def _is_examples_section( - node: nodes.Node, *, config: ExemplarConfig | None = None -) -> bool: - """Check if a node is an examples section. - - Parameters - ---------- - node : nodes.Node - A docutils node to check. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - bool - True if this is an examples section (section with term suffix in its ID). - - Examples - -------- - >>> from docutils import nodes - >>> section = nodes.section() - >>> section["ids"] = ["examples"] - >>> _is_examples_section(section) - True - >>> section2 = nodes.section() - >>> section2["ids"] = ["machine-readable-output-examples"] - >>> _is_examples_section(section2) - True - >>> section3 = nodes.section() - >>> section3["ids"] = ["positional-arguments"] - >>> _is_examples_section(section3) - False - >>> _is_examples_section(nodes.paragraph()) - False - >>> _is_examples_section(nodes.literal_block(text="examples")) - False - - With custom configuration: - - >>> custom_config = ExemplarConfig(examples_term_suffix="demos") - >>> section = nodes.section() - >>> section["ids"] = ["demos"] - >>> _is_examples_section(section, config=custom_config) - True - >>> section2 = nodes.section() - >>> section2["ids"] = ["examples"] - >>> _is_examples_section(section2, config=custom_config) - False - """ - config = config or ExemplarConfig() - if not isinstance(node, nodes.section): - return False - ids: list[str] = node.get("ids", []) - return any(config.examples_term_suffix in id_str.lower() for id_str in ids) - - -def _reorder_nodes( - processed: list[nodes.Node], *, config: ExemplarConfig | None = None -) -> list[nodes.Node]: - """Reorder nodes so usage sections/blocks appear before examples sections. - - This ensures the CLI usage synopsis appears above examples in the - documentation, making it easier to understand command syntax before - seeing example invocations. - - The function handles both: - - Usage as literal_block (legacy format from older renderer) - - Usage as section#usage (new format with TOC support) - - Parameters - ---------- - processed : list[nodes.Node] - List of processed docutils nodes. - config : ExemplarConfig | None - Optional configuration. If None, uses default ExemplarConfig(). - - Returns - ------- - list[nodes.Node] - Reordered nodes with usage before examples (if enabled). - - Examples - -------- - >>> from docutils import nodes - - Create test nodes: - - >>> desc = nodes.paragraph(text="Description") - >>> examples = nodes.section() - >>> examples["ids"] = ["examples"] - >>> usage = nodes.literal_block(text="usage: cmd [-h]") - >>> args = nodes.section() - >>> args["ids"] = ["arguments"] - - When usage appears after examples, it gets moved before: - - >>> result = _reorder_nodes([desc, examples, usage, args]) - >>> [type(n).__name__ for n in result] - ['paragraph', 'literal_block', 'section', 'section'] - - When no examples exist, order is unchanged: - - >>> result = _reorder_nodes([desc, usage, args]) - >>> [type(n).__name__ for n in result] - ['paragraph', 'literal_block', 'section'] - - When usage already before examples, order is preserved: - - >>> result = _reorder_nodes([desc, usage, examples, args]) - >>> [type(n).__name__ for n in result] - ['paragraph', 'literal_block', 'section', 'section'] - - Empty list returns empty: - - >>> _reorder_nodes([]) - [] - - Usage sections (with TOC heading) are also handled: - - >>> usage_section = nodes.section() - >>> usage_section["ids"] = ["usage"] - >>> result = _reorder_nodes([desc, examples, usage_section, args]) - >>> [n.get("ids", []) for n in result if isinstance(n, nodes.section)] - [['usage'], ['examples'], ['arguments']] - - Reordering can be disabled via config: - - >>> no_reorder_config = ExemplarConfig(reorder_usage_before_examples=False) - >>> result = _reorder_nodes([desc, examples, usage, args], config=no_reorder_config) - >>> [type(n).__name__ for n in result] - ['paragraph', 'section', 'literal_block', 'section'] - """ - config = config or ExemplarConfig() - - # If reordering is disabled, return as-is - if not config.reorder_usage_before_examples: - return processed - - # First pass: check if there are any examples sections - has_examples = any(_is_examples_section(node, config=config) for node in processed) - if not has_examples: - # No examples, preserve original order - return processed - - usage_nodes: list[nodes.Node] = [] - examples_sections: list[nodes.Node] = [] - other_before_examples: list[nodes.Node] = [] - other_after_examples: list[nodes.Node] = [] - - seen_examples = False - for node in processed: - # Check for both usage block (literal_block) and usage section - if _is_usage_block(node, config=config) or _is_usage_section(node): - usage_nodes.append(node) - elif _is_examples_section(node, config=config): - examples_sections.append(node) - seen_examples = True - elif not seen_examples: - other_before_examples.append(node) - else: - other_after_examples.append(node) - - # Order: before_examples → usage → examples → after_examples - return ( - other_before_examples + usage_nodes + examples_sections + other_after_examples - ) - - -def _extract_sections_from_container( - container: nodes.Node, -) -> tuple[nodes.Node, list[nodes.section]]: - """Extract section nodes from a container, returning modified container. - - This function finds any section nodes that are children of the container - (typically argparse_program), removes them from the container, and returns - them separately so they can be made siblings. - - This is needed because Sphinx's TocTreeCollector only discovers sections - that are direct children of the document or properly nested in the section - hierarchy - sections inside arbitrary div containers are invisible to TOC. - - Parameters - ---------- - container : nodes.Node - A container node (typically argparse_program) that may contain sections. - - Returns - ------- - tuple[nodes.Node, list[nodes.section]] - A tuple of (modified_container, extracted_sections). - - Examples - -------- - >>> from docutils import nodes - >>> from sphinx_argparse_neo.nodes import argparse_program - >>> container = argparse_program() - >>> para = nodes.paragraph(text="Description") - >>> examples = nodes.section() - >>> examples["ids"] = ["examples"] - >>> container += para - >>> container += examples - >>> modified, extracted = _extract_sections_from_container(container) - >>> len(modified.children) - 1 - >>> len(extracted) - 1 - >>> extracted[0]["ids"] - ['examples'] - """ - if not hasattr(container, "children"): - return container, [] - - extracted_sections: list[nodes.section] = [] - remaining_children: list[nodes.Node] = [] - - for child in container.children: - if isinstance(child, nodes.section): - extracted_sections.append(child) - else: - remaining_children.append(child) - - # Update container with remaining children only - container[:] = remaining_children # type: ignore[index] - - return container, extracted_sections - - -class CleanArgParseDirective(ArgparseDirective): # type: ignore[misc] - """ArgParse directive that strips ANSI codes and formats examples.""" - - def run(self) -> list[nodes.Node]: - """Run the directive, clean output, format examples, and reorder. - - The processing pipeline: - 1. Run base directive to get initial nodes - 2. Load configuration from Sphinx config - 3. Process each node (strip ANSI, transform examples definition lists) - 4. Extract sections from inside argparse_program containers - 5. Reorder so usage appears before examples (if enabled) - """ - result = super().run() - - # Load configuration from Sphinx - config = ExemplarConfig.from_sphinx_config(self.env.config) - - # Extract page name for unique section IDs across different CLI pages - page_prefix = "" - if hasattr(self.state, "document"): - settings = self.state.document.settings - if hasattr(settings, "env") and hasattr(settings.env, "docname"): - # docname is like "cli/sync" - extract "sync" - docname = settings.env.docname - page_prefix = docname.split("/")[-1] - - processed: list[nodes.Node] = [] - for node in result: - processed_node = process_node(node, page_prefix=page_prefix, config=config) - if isinstance(processed_node, list): - processed.extend(processed_node) - else: - processed.append(processed_node) - - # Extract sections from inside argparse_program containers - # This is needed because sections inside divs are invisible to Sphinx TOC - flattened: list[nodes.Node] = [] - for node in processed: - # Check if this is an argparse_program (or similar container) - # that might have sections inside - node_class_name = type(node).__name__ - if node_class_name == "argparse_program": - modified, extracted = _extract_sections_from_container(node) - flattened.append(modified) - flattened.extend(extracted) - else: - flattened.append(node) - - # Reorder: usage sections/blocks before examples sections - return _reorder_nodes(flattened, config=config) - - -def setup(app: Sphinx) -> dict[str, t.Any]: - """Register the clean argparse directive, lexers, and CLI roles. - - Configuration Options - --------------------- - The following configuration options can be set in conf.py: - - ``argparse_examples_term_suffix`` : str (default: "examples") - Term must end with this string to be treated as examples header. - - ``argparse_examples_base_term`` : str (default: "examples") - Exact match for the base examples section. - - ``argparse_examples_section_title`` : str (default: "Examples") - Title used for the base examples section. - - ``argparse_usage_pattern`` : str (default: "usage:") - Text must start with this to be treated as a usage block. - - ``argparse_examples_command_prefix`` : str (default: "$ ") - Prefix added to each command line in examples code blocks. - - ``argparse_examples_code_language`` : str (default: "console") - Language identifier for examples code blocks. - - ``argparse_examples_code_classes`` : list[str] (default: ["highlight-console"]) - CSS classes added to examples code blocks. - - ``argparse_usage_code_language`` : str (default: "cli-usage") - Language identifier for usage blocks. - - ``argparse_reorder_usage_before_examples`` : bool (default: True) - Whether to reorder nodes so usage appears before examples. - - Parameters - ---------- - app : Sphinx - The Sphinx application object. - - Returns - ------- - dict - Extension metadata. - """ - # Load the base sphinx_argparse_neo extension first - app.setup_extension("sphinx_argparse_neo") - - # Register configuration options - app.add_config_value("argparse_examples_term_suffix", "examples", "html") - app.add_config_value("argparse_examples_base_term", "examples", "html") - app.add_config_value("argparse_examples_section_title", "Examples", "html") - app.add_config_value("argparse_usage_pattern", "usage:", "html") - app.add_config_value("argparse_examples_command_prefix", "$ ", "html") - app.add_config_value("argparse_examples_code_language", "console", "html") - app.add_config_value( - "argparse_examples_code_classes", ["highlight-console"], "html" - ) - app.add_config_value("argparse_usage_code_language", "cli-usage", "html") - app.add_config_value("argparse_reorder_usage_before_examples", True, "html") - - # Override the argparse directive with our enhanced version - app.add_directive("argparse", CleanArgParseDirective, override=True) - - # Register CLI usage lexer for usage block highlighting - from cli_usage_lexer import CLIUsageLexer - - app.add_lexer("cli-usage", CLIUsageLexer) - - # Register argparse lexers for help output highlighting - from argparse_lexer import ( - ArgparseHelpLexer, - ArgparseLexer, - ArgparseUsageLexer, - ) - - app.add_lexer("argparse", ArgparseLexer) - app.add_lexer("argparse-usage", ArgparseUsageLexer) - app.add_lexer("argparse-help", ArgparseHelpLexer) - - # Register CLI inline roles for documentation - from argparse_roles import register_roles - - register_roles() - - return {"version": "4.0", "parallel_read_safe": True} diff --git a/docs/_ext/argparse_lexer.py b/docs/_ext/argparse_lexer.py deleted file mode 100644 index 14aed55649..0000000000 --- a/docs/_ext/argparse_lexer.py +++ /dev/null @@ -1,429 +0,0 @@ -"""Pygments lexers for argparse help output. - -This module provides custom Pygments lexers for highlighting argparse-generated -command-line help text, including usage lines, section headers, and full help output. - -Three lexer classes are provided: -- ArgparseUsageLexer: For usage lines only -- ArgparseHelpLexer: For full -h output (delegates usage to ArgparseUsageLexer) -- ArgparseLexer: Smart auto-detecting wrapper -""" - -from __future__ import annotations - -from pygments.lexer import RegexLexer, bygroups, include -from pygments.token import Generic, Name, Operator, Punctuation, Text, Whitespace - - -class ArgparseUsageLexer(RegexLexer): - """Lexer for argparse usage lines only. - - Handles patterns like: - - usage: PROG [-h] [--foo FOO] bar {a,b,c} - - Mutually exclusive: [-a | -b], (--foo | --bar) - - Choices: {json,yaml,table} - - Variadic: FILE ..., [FILE ...], [--foo [FOO]] - - Examples - -------- - >>> from pygments.token import Token - >>> lexer = ArgparseUsageLexer() - >>> tokens = list(lexer.get_tokens("usage: cmd [-h]")) - >>> tokens[0] - (Token.Generic.Heading, 'usage:') - >>> tokens[2] - (Token.Name.Label, 'cmd') - """ - - name = "Argparse Usage" - aliases = ["argparse-usage"] # noqa: RUF012 - filenames: list[str] = [] # noqa: RUF012 - mimetypes = ["text/x-argparse-usage"] # noqa: RUF012 - - tokens = { # noqa: RUF012 - "root": [ - # "usage:" at start of line - then look for program name - ( - r"^(usage:)(\s+)", - bygroups(Generic.Heading, Whitespace), # type: ignore[no-untyped-call] - "after_usage", - ), - # Continuation lines (leading whitespace for wrapped usage) - (r"^(\s+)(?=\S)", Whitespace), - include("inline"), - ], - "after_usage": [ - # Whitespace - (r"\s+", Whitespace), - # Program name (first lowercase word after usage:) - (r"\b[a-z][-a-z0-9_]*\b", Name.Label, "usage_body"), - # Fallback to inline if something unexpected - include("inline"), - ], - "usage_body": [ - # Whitespace - (r"\s+", Whitespace), - # Ellipsis for variadic args (before other patterns) - (r"\.\.\.", Punctuation), - # Long options with = value (e.g., --log-level=VALUE) - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(=)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Tag, Operator, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options standalone - (r"--[a-zA-Z0-9][-a-zA-Z0-9]*", Name.Tag), - # Short options with space-separated value (e.g., -S socket-path) - ( - r"(-[a-zA-Z0-9])(\s+)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Attribute, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Short options standalone - (r"-[a-zA-Z0-9]", Name.Attribute), - # Opening brace - enter choices state - (r"\{", Punctuation, "choices"), - # Opening bracket - enter optional state - (r"\[", Punctuation, "optional"), - # Closing bracket (fallback for unmatched) - (r"\]", Punctuation), - # Opening paren - enter required mutex state - (r"\(", Punctuation, "required"), - # Closing paren (fallback for unmatched) - (r"\)", Punctuation), - # Choice separator (pipe) for mutex groups - (r"\|", Operator), - # UPPERCASE meta-variables (COMMAND, FILE, PATH) - (r"\b[A-Z][A-Z0-9_]*\b", Name.Variable), - # Subcommand/positional names (Name.Function for distinct styling) - (r"\b[a-z][-a-z0-9_]*\b", Name.Function), - # Catch-all for any other text - (r"[^\s\[\]|(){},]+", Text), - ], - "inline": [ - # Whitespace - (r"\s+", Whitespace), - # Ellipsis for variadic args (before other patterns) - (r"\.\.\.", Punctuation), - # Long options with = value (e.g., --log-level=VALUE) - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(=)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Tag, Operator, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options standalone - (r"--[a-zA-Z0-9][-a-zA-Z0-9]*", Name.Tag), - # Short options with space-separated value (e.g., -S socket-path) - ( - r"(-[a-zA-Z0-9])(\s+)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Attribute, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Short options standalone - (r"-[a-zA-Z0-9]", Name.Attribute), - # Opening brace - enter choices state - (r"\{", Punctuation, "choices"), - # Opening bracket - enter optional state - (r"\[", Punctuation, "optional"), - # Closing bracket (fallback for unmatched) - (r"\]", Punctuation), - # Opening paren - enter required mutex state - (r"\(", Punctuation, "required"), - # Closing paren (fallback for unmatched) - (r"\)", Punctuation), - # Choice separator (pipe) for mutex groups - (r"\|", Operator), - # UPPERCASE meta-variables (COMMAND, FILE, PATH) - (r"\b[A-Z][A-Z0-9_]*\b", Name.Variable), - # Positional/command names (lowercase with dashes) - (r"\b[a-z][-a-z0-9_]*\b", Name.Label), - # Catch-all for any other text - (r"[^\s\[\]|(){},]+", Text), - ], - "optional": [ - # Nested optional bracket - (r"\[", Punctuation, "#push"), - # End optional - (r"\]", Punctuation, "#pop"), - # Contents use usage_body rules (subcommands are green) - include("usage_body"), - ], - "required": [ - # Nested required paren - (r"\(", Punctuation, "#push"), - # End required - (r"\)", Punctuation, "#pop"), - # Contents use usage_body rules (subcommands are green) - include("usage_body"), - ], - "choices": [ - # Choice values (comma-separated inside braces) - (r"[a-zA-Z0-9][-a-zA-Z0-9_]*", Name.Constant), - # Comma separator - (r",", Punctuation), - # End choices - (r"\}", Punctuation, "#pop"), - # Whitespace - (r"\s+", Whitespace), - ], - } - - -class ArgparseHelpLexer(RegexLexer): - """Lexer for full argparse -h help output. - - Handles: - - Usage lines (delegates to ArgparseUsageLexer patterns) - - Section headers (positional arguments:, options:, etc.) - - Option entries with help text - - Indented descriptions - - Examples - -------- - >>> from pygments.token import Token - >>> lexer = ArgparseHelpLexer() - >>> tokens = list(lexer.get_tokens("positional arguments:")) - >>> any(t[0] == Token.Generic.Subheading for t in tokens) - True - >>> tokens = list(lexer.get_tokens(" -h, --help show help")) - >>> any(t[0] == Token.Name.Attribute for t in tokens) - True - """ - - name = "Argparse Help" - aliases = ["argparse-help"] # noqa: RUF012 - filenames: list[str] = [] # noqa: RUF012 - mimetypes = ["text/x-argparse-help"] # noqa: RUF012 - - tokens = { # noqa: RUF012 - "root": [ - # "usage:" line - switch to after_usage to find program name - ( - r"^(usage:)(\s+)", - bygroups(Generic.Heading, Whitespace), # type: ignore[no-untyped-call] - "after_usage", - ), - # Section headers (e.g., "positional arguments:", "options:") - (r"^([a-zA-Z][-a-zA-Z0-9_ ]*:)\s*$", Generic.Subheading), - # Option entry lines (indented with spaces/tabs, not just newlines) - (r"^([ \t]+)", Whitespace, "option_line"), - # Continuation of usage (leading spaces/tabs followed by content) - (r"^([ \t]+)(?=\S)", Whitespace), - # Anything else (must match at least one char to avoid infinite loop) - (r".+\n?", Text), - # Standalone newlines - (r"\n", Whitespace), - ], - "after_usage": [ - # Whitespace - (r"\s+", Whitespace), - # Program name (first lowercase word after usage:) - (r"\b[a-z][-a-z0-9_]*\b", Name.Label, "usage"), - # Fallback to usage if something unexpected - include("usage_inline"), - ], - "usage": [ - # End of usage on blank line or section header - (r"\n(?=[a-zA-Z][-a-zA-Z0-9_ ]*:\s*$)", Text, "#pop:2"), - (r"\n(?=\n)", Text, "#pop:2"), - # Usage content - use usage_inline rules (subcommands are green) - include("usage_inline"), - # Line continuation - (r"\n", Text), - ], - "usage_inline": [ - # Whitespace - (r"\s+", Whitespace), - # Ellipsis for variadic args - (r"\.\.\.", Punctuation), - # Long options with = value - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(=)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Tag, Operator, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options standalone - (r"--[a-zA-Z0-9][-a-zA-Z0-9]*", Name.Tag), - # Short options with value - ( - r"(-[a-zA-Z0-9])(\s+)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Attribute, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Short options standalone - (r"-[a-zA-Z0-9]", Name.Attribute), - # Choices in braces - (r"\{", Punctuation, "choices"), - # Optional brackets - (r"\[", Punctuation, "optional"), - (r"\]", Punctuation), - # Required parens (mutex) - (r"\(", Punctuation, "required"), - (r"\)", Punctuation), - # Pipe for mutex - (r"\|", Operator), - # UPPERCASE metavars - (r"\b[A-Z][A-Z0-9_]*\b", Name.Variable), - # Subcommand/positional names (Name.Function for distinct styling) - (r"\b[a-z][-a-z0-9_]*\b", Name.Function), - # Other text - (r"[^\s\[\]|(){},\n]+", Text), - ], - "option_line": [ - # Short option with comma (e.g., "-h, --help") - ( - r"(-[a-zA-Z0-9])(,)(\s*)(--[a-zA-Z0-9][-a-zA-Z0-9]*)", - bygroups(Name.Attribute, Punctuation, Whitespace, Name.Tag), # type: ignore[no-untyped-call] - ), - # Long options with = value - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(=)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9_]*)", - bygroups(Name.Tag, Operator, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options with space-separated metavar - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(\s+)([A-Z][A-Z0-9_]+)", - bygroups(Name.Tag, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options standalone - (r"--[a-zA-Z0-9][-a-zA-Z0-9]*", Name.Tag), - # Short options with metavar - ( - r"(-[a-zA-Z0-9])(\s+)([A-Z][A-Z0-9_]+)", - bygroups(Name.Attribute, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Short options standalone - (r"-[a-zA-Z0-9]", Name.Attribute), - # Choices in braces - (r"\{", Punctuation, "option_choices"), - # Help text (everything after double space or large gap) - (r"([ \t]{2,})(.+)$", bygroups(Whitespace, Text)), # type: ignore[no-untyped-call] - # End of line - MUST come before \s+ to properly pop on newlines - (r"\n", Text, "#pop"), - # Other whitespace (spaces/tabs only, not newlines) - (r"[ \t]+", Whitespace), - # UPPERCASE metavars - (r"\b[A-Z][A-Z0-9_]*\b", Name.Variable), - # Anything else on the line - (r"[^\s\n]+", Text), - ], - "optional": [ - (r"\[", Punctuation, "#push"), - (r"\]", Punctuation, "#pop"), - include("usage_inline"), - ], - "required": [ - (r"\(", Punctuation, "#push"), - (r"\)", Punctuation, "#pop"), - include("usage_inline"), - ], - "choices": [ - (r"[a-zA-Z0-9][-a-zA-Z0-9_]*", Name.Constant), - (r",", Punctuation), - (r"\}", Punctuation, "#pop"), - (r"\s+", Whitespace), - ], - "option_choices": [ - (r"[a-zA-Z0-9][-a-zA-Z0-9_]*", Name.Constant), - (r",", Punctuation), - (r"\}", Punctuation, "#pop"), - (r"\s+", Whitespace), - ], - } - - -class ArgparseLexer(ArgparseHelpLexer): - """Smart auto-detecting lexer for argparse output. - - Inherits from ArgparseHelpLexer to properly handle Pygments' metaclass - token processing. Using inheritance (not token dict copying) avoids - shared mutable state that causes memory corruption. - - This is the recommended lexer for general argparse highlighting. - - Examples - -------- - >>> from pygments.token import Token - >>> lexer = ArgparseLexer() - - Usage line detection: - - >>> tokens = list(lexer.get_tokens("usage: cmd [-h]")) - >>> tokens[0] - (Token.Generic.Heading, 'usage:') - - Section header detection (Pygments appends newline to input): - - >>> tokens = list(lexer.get_tokens("positional arguments:")) - >>> any(t[0] == Token.Generic.Subheading for t in tokens) - True - - Option highlighting in option line context: - - >>> tokens = list(lexer.get_tokens(" -h, --help show help")) - >>> any(t[0] == Token.Name.Attribute for t in tokens) - True - """ - - name = "Argparse" - aliases = ["argparse"] # noqa: RUF012 - filenames: list[str] = [] # noqa: RUF012 - mimetypes = ["text/x-argparse"] # noqa: RUF012 - - # Tokens inherited from ArgparseHelpLexer - do NOT redefine or copy - - -def tokenize_argparse(text: str) -> list[tuple[str, str]]: - """Tokenize argparse text and return list of (token_type, value) tuples. - - Parameters - ---------- - text : str - Argparse help or usage text to tokenize. - - Returns - ------- - list[tuple[str, str]] - List of (token_type_name, text_value) tuples. - - Examples - -------- - >>> result = tokenize_argparse("usage: cmd [-h]") - >>> result[0] - ('Token.Generic.Heading', 'usage:') - >>> result[2] - ('Token.Name.Label', 'cmd') - - >>> result = tokenize_argparse("positional arguments:") - >>> any('Token.Generic.Subheading' in t[0] for t in result) - True - """ - lexer = ArgparseLexer() - return [ - (str(tok_type), tok_value) for tok_type, tok_value in lexer.get_tokens(text) - ] - - -def tokenize_usage(text: str) -> list[tuple[str, str]]: - """Tokenize usage text and return list of (token_type, value) tuples. - - Parameters - ---------- - text : str - CLI usage text to tokenize. - - Returns - ------- - list[tuple[str, str]] - List of (token_type_name, text_value) tuples. - - Examples - -------- - >>> result = tokenize_usage("usage: cmd [-h]") - >>> result[0] - ('Token.Generic.Heading', 'usage:') - >>> result[2] - ('Token.Name.Label', 'cmd') - >>> result[4] - ('Token.Punctuation', '[') - >>> result[5] - ('Token.Name.Attribute', '-h') - """ - lexer = ArgparseUsageLexer() - return [ - (str(tok_type), tok_value) for tok_type, tok_value in lexer.get_tokens(text) - ] diff --git a/docs/_ext/argparse_roles.py b/docs/_ext/argparse_roles.py deleted file mode 100644 index 86e5459a28..0000000000 --- a/docs/_ext/argparse_roles.py +++ /dev/null @@ -1,370 +0,0 @@ -"""Docutils inline roles for CLI/argparse highlighting. - -This module provides custom docutils roles for inline highlighting of CLI -elements in reStructuredText and MyST documentation. - -Available roles: -- :cli-option: - CLI options (--verbose, -h) -- :cli-metavar: - Metavar placeholders (FILE, PATH) -- :cli-command: - Command names (sync, add) -- :cli-default: - Default values (None, "default") -- :cli-choice: - Choice values (json, yaml) -""" - -from __future__ import annotations - -import typing as t - -from docutils import nodes -from docutils.parsers.rst import roles - -if t.TYPE_CHECKING: - from docutils.parsers.rst.states import Inliner - - -def normalize_options(options: dict[str, t.Any] | None) -> dict[str, t.Any]: - """Normalize role options, converting None to empty dict. - - Parameters - ---------- - options : dict | None - Options passed to the role. - - Returns - ------- - dict - Normalized options dict (never None). - - Examples - -------- - >>> normalize_options(None) - {} - >>> normalize_options({"class": "custom"}) - {'class': 'custom'} - """ - return options if options is not None else {} - - -def cli_option_role( - name: str, - rawtext: str, - text: str, - lineno: int, - inliner: Inliner | None, - options: dict[str, t.Any] | None = None, - content: list[str] | None = None, -) -> tuple[list[nodes.Node], list[nodes.system_message]]: - """Role for CLI options like --foo or -h. - - Generates a literal node with appropriate CSS classes for styling. - Long options (--foo) get 'cli-option-long', short options (-h) get - 'cli-option-short'. - - Parameters - ---------- - name : str - Local name of the role used in document. - rawtext : str - Full interpreted text including role markup. - text : str - Content between backticks. - lineno : int - Line number. - inliner : Inliner | None - Object that called the role (has .reporter, .document). - options : dict | None - Options from role directive. - content : list | None - Content from role directive. - - Returns - ------- - tuple[list[nodes.Node], list[nodes.system_message]] - Nodes to insert and any messages. - - Examples - -------- - >>> node_list, messages = cli_option_role( - ... "cli-option", ":cli-option:`--verbose`", "--verbose", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-option', 'cli-option-long'] - - >>> node_list, messages = cli_option_role( - ... "cli-option", ":cli-option:`-h`", "-h", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-option', 'cli-option-short'] - - >>> node_list, messages = cli_option_role( - ... "cli-option", ":cli-option:`--no-color`", "--no-color", - ... 1, None - ... ) - >>> node_list[0].astext() - '--no-color' - """ - options = normalize_options(options) - node = nodes.literal(rawtext, text, classes=["cli-option"]) - - if text.startswith("--"): - node["classes"].append("cli-option-long") - elif text.startswith("-"): - node["classes"].append("cli-option-short") - - return [node], [] - - -def cli_metavar_role( - name: str, - rawtext: str, - text: str, - lineno: int, - inliner: Inliner | None, - options: dict[str, t.Any] | None = None, - content: list[str] | None = None, -) -> tuple[list[nodes.Node], list[nodes.system_message]]: - """Role for CLI metavar placeholders like FILE or PATH. - - Generates a literal node with 'cli-metavar' CSS class for styling. - - Parameters - ---------- - name : str - Local name of the role used in document. - rawtext : str - Full interpreted text including role markup. - text : str - Content between backticks. - lineno : int - Line number. - inliner : Inliner | None - Object that called the role. - options : dict | None - Options from role directive. - content : list | None - Content from role directive. - - Returns - ------- - tuple[list[nodes.Node], list[nodes.system_message]] - Nodes to insert and any messages. - - Examples - -------- - >>> node_list, messages = cli_metavar_role( - ... "cli-metavar", ":cli-metavar:`FILE`", "FILE", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-metavar'] - >>> node_list[0].astext() - 'FILE' - - >>> node_list, messages = cli_metavar_role( - ... "cli-metavar", ":cli-metavar:`PATH`", "PATH", - ... 1, None - ... ) - >>> "cli-metavar" in node_list[0]["classes"] - True - """ - options = normalize_options(options) - node = nodes.literal(rawtext, text, classes=["cli-metavar"]) - return [node], [] - - -def cli_command_role( - name: str, - rawtext: str, - text: str, - lineno: int, - inliner: Inliner | None, - options: dict[str, t.Any] | None = None, - content: list[str] | None = None, -) -> tuple[list[nodes.Node], list[nodes.system_message]]: - """Role for CLI command names like sync or add. - - Generates a literal node with 'cli-command' CSS class for styling. - - Parameters - ---------- - name : str - Local name of the role used in document. - rawtext : str - Full interpreted text including role markup. - text : str - Content between backticks. - lineno : int - Line number. - inliner : Inliner | None - Object that called the role. - options : dict | None - Options from role directive. - content : list | None - Content from role directive. - - Returns - ------- - tuple[list[nodes.Node], list[nodes.system_message]] - Nodes to insert and any messages. - - Examples - -------- - >>> node_list, messages = cli_command_role( - ... "cli-command", ":cli-command:`sync`", "sync", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-command'] - >>> node_list[0].astext() - 'sync' - - >>> node_list, messages = cli_command_role( - ... "cli-command", ":cli-command:`myapp`", "myapp", - ... 1, None - ... ) - >>> "cli-command" in node_list[0]["classes"] - True - """ - options = normalize_options(options) - node = nodes.literal(rawtext, text, classes=["cli-command"]) - return [node], [] - - -def cli_default_role( - name: str, - rawtext: str, - text: str, - lineno: int, - inliner: Inliner | None, - options: dict[str, t.Any] | None = None, - content: list[str] | None = None, -) -> tuple[list[nodes.Node], list[nodes.system_message]]: - """Role for CLI default values like None or "default". - - Generates a literal node with 'cli-default' CSS class for styling. - - Parameters - ---------- - name : str - Local name of the role used in document. - rawtext : str - Full interpreted text including role markup. - text : str - Content between backticks. - lineno : int - Line number. - inliner : Inliner | None - Object that called the role. - options : dict | None - Options from role directive. - content : list | None - Content from role directive. - - Returns - ------- - tuple[list[nodes.Node], list[nodes.system_message]] - Nodes to insert and any messages. - - Examples - -------- - >>> node_list, messages = cli_default_role( - ... "cli-default", ":cli-default:`None`", "None", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-default'] - >>> node_list[0].astext() - 'None' - - >>> node_list, messages = cli_default_role( - ... "cli-default", ':cli-default:`"auto"`', '"auto"', - ... 1, None - ... ) - >>> "cli-default" in node_list[0]["classes"] - True - """ - options = normalize_options(options) - node = nodes.literal(rawtext, text, classes=["cli-default"]) - return [node], [] - - -def cli_choice_role( - name: str, - rawtext: str, - text: str, - lineno: int, - inliner: Inliner | None, - options: dict[str, t.Any] | None = None, - content: list[str] | None = None, -) -> tuple[list[nodes.Node], list[nodes.system_message]]: - """Role for CLI choice values like json or yaml. - - Generates a literal node with 'cli-choice' CSS class for styling. - - Parameters - ---------- - name : str - Local name of the role used in document. - rawtext : str - Full interpreted text including role markup. - text : str - Content between backticks. - lineno : int - Line number. - inliner : Inliner | None - Object that called the role. - options : dict | None - Options from role directive. - content : list | None - Content from role directive. - - Returns - ------- - tuple[list[nodes.Node], list[nodes.system_message]] - Nodes to insert and any messages. - - Examples - -------- - >>> node_list, messages = cli_choice_role( - ... "cli-choice", ":cli-choice:`json`", "json", - ... 1, None - ... ) - >>> node_list[0]["classes"] - ['cli-choice'] - >>> node_list[0].astext() - 'json' - - >>> node_list, messages = cli_choice_role( - ... "cli-choice", ":cli-choice:`yaml`", "yaml", - ... 1, None - ... ) - >>> "cli-choice" in node_list[0]["classes"] - True - """ - options = normalize_options(options) - node = nodes.literal(rawtext, text, classes=["cli-choice"]) - return [node], [] - - -def register_roles() -> None: - """Register all CLI roles with docutils. - - This function registers the following roles: - - cli-option: For CLI options (--verbose, -h) - - cli-metavar: For metavar placeholders (FILE, PATH) - - cli-command: For command names (sync, add) - - cli-default: For default values (None, "default") - - cli-choice: For choice values (json, yaml) - - Examples - -------- - >>> register_roles() - >>> # Roles are now available in docutils RST parsing - """ - roles.register_local_role("cli-option", cli_option_role) # type: ignore[arg-type] - roles.register_local_role("cli-metavar", cli_metavar_role) # type: ignore[arg-type] - roles.register_local_role("cli-command", cli_command_role) # type: ignore[arg-type] - roles.register_local_role("cli-default", cli_default_role) # type: ignore[arg-type] - roles.register_local_role("cli-choice", cli_choice_role) # type: ignore[arg-type] diff --git a/docs/_ext/cli_usage_lexer.py b/docs/_ext/cli_usage_lexer.py deleted file mode 100644 index 40170e3178..0000000000 --- a/docs/_ext/cli_usage_lexer.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Pygments lexer for CLI usage/help output. - -This module provides a custom Pygments lexer for highlighting command-line -usage text typically generated by argparse, getopt, or similar libraries. -""" - -from __future__ import annotations - -from pygments.lexer import RegexLexer, bygroups, include -from pygments.token import Generic, Name, Operator, Punctuation, Text, Whitespace - - -class CLIUsageLexer(RegexLexer): - """Lexer for CLI usage/help text (argparse, etc.). - - Highlights usage patterns including options, arguments, and meta-variables. - - Examples - -------- - >>> from pygments.token import Token - >>> lexer = CLIUsageLexer() - >>> tokens = list(lexer.get_tokens("usage: cmd [-h]")) - >>> tokens[0] - (Token.Generic.Heading, 'usage:') - >>> tokens[2] - (Token.Name.Label, 'cmd') - """ - - name = "CLI Usage" - aliases = ["cli-usage", "usage"] # noqa: RUF012 - filenames: list[str] = [] # noqa: RUF012 - mimetypes = ["text/x-cli-usage"] # noqa: RUF012 - - tokens = { # noqa: RUF012 - "root": [ - # "usage:" at start of line - (r"^(usage:)(\s+)", bygroups(Generic.Heading, Whitespace)), # type: ignore[no-untyped-call] - # Continuation lines (leading whitespace for wrapped usage) - (r"^(\s+)(?=\S)", Whitespace), - include("inline"), - ], - "inline": [ - # Whitespace - (r"\s+", Whitespace), - # Long options with = value (e.g., --log-level=VALUE) - ( - r"(--[a-zA-Z0-9][-a-zA-Z0-9]*)(=)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9]*)", - bygroups(Name.Tag, Operator, Name.Variable), # type: ignore[no-untyped-call] - ), - # Long options standalone - (r"--[a-zA-Z0-9][-a-zA-Z0-9]*", Name.Tag), - # Short options with space-separated value (e.g., -S socket-path) - ( - r"(-[a-zA-Z0-9])(\s+)([A-Z][A-Z0-9_]*|[a-z][-a-z0-9]*)", - bygroups(Name.Attribute, Whitespace, Name.Variable), # type: ignore[no-untyped-call] - ), - # Short options standalone - (r"-[a-zA-Z0-9]", Name.Attribute), - # UPPERCASE meta-variables (COMMAND, FILE, PATH) - (r"\b[A-Z][A-Z0-9_]+\b", Name.Constant), - # Opening bracket - enter optional state - (r"\[", Punctuation, "optional"), - # Closing bracket (fallback for unmatched) - (r"\]", Punctuation), - # Choice separator (pipe) - (r"\|", Operator), - # Parentheses for grouping - (r"[()]", Punctuation), - # Positional/command names (lowercase with dashes) - (r"\b[a-z][-a-z0-9]*\b", Name.Label), - # Catch-all for any other text - (r"[^\s\[\]|()]+", Text), - ], - "optional": [ - # Nested optional bracket - (r"\[", Punctuation, "#push"), - # End optional - (r"\]", Punctuation, "#pop"), - # Contents use inline rules - include("inline"), - ], - } - - -def tokenize_usage(text: str) -> list[tuple[str, str]]: - """Tokenize usage text and return list of (token_type, value) tuples. - - Parameters - ---------- - text : str - CLI usage text to tokenize. - - Returns - ------- - list[tuple[str, str]] - List of (token_type_name, text_value) tuples. - - Examples - -------- - >>> result = tokenize_usage("usage: cmd [-h]") - >>> result[0] - ('Token.Generic.Heading', 'usage:') - >>> result[2] - ('Token.Name.Label', 'cmd') - >>> result[4] - ('Token.Punctuation', '[') - >>> result[5] - ('Token.Name.Attribute', '-h') - >>> result[6] - ('Token.Punctuation', ']') - """ - lexer = CLIUsageLexer() - return [ - (str(tok_type), tok_value) for tok_type, tok_value in lexer.get_tokens(text) - ] diff --git a/docs/_ext/sphinx_argparse_neo/__init__.py b/docs/_ext/sphinx_argparse_neo/__init__.py deleted file mode 100644 index 5fa8dd94fe..0000000000 --- a/docs/_ext/sphinx_argparse_neo/__init__.py +++ /dev/null @@ -1,101 +0,0 @@ -"""sphinx_argparse_neo - Modern sphinx-argparse replacement. - -A Sphinx extension for documenting argparse-based CLI tools that: -- Works with Sphinx 8.x AND 9.x (no autodoc.mock dependency) -- Fixes long-standing sphinx-argparse issues (TOC pollution, heading levels) -- Provides configurable output (rubrics vs sections, flattened subcommands) -- Supports extensibility via renderer classes -- Text processing utilities (ANSI stripping) -""" - -from __future__ import annotations - -import typing as t - -from sphinx_argparse_neo.directive import ArgparseDirective -from sphinx_argparse_neo.nodes import ( - argparse_argument, - argparse_group, - argparse_program, - argparse_subcommand, - argparse_subcommands, - argparse_usage, - depart_argparse_argument_html, - depart_argparse_group_html, - depart_argparse_program_html, - depart_argparse_subcommand_html, - depart_argparse_subcommands_html, - depart_argparse_usage_html, - visit_argparse_argument_html, - visit_argparse_group_html, - visit_argparse_program_html, - visit_argparse_subcommand_html, - visit_argparse_subcommands_html, - visit_argparse_usage_html, -) -from sphinx_argparse_neo.utils import strip_ansi - -__all__ = [ - "ArgparseDirective", - "strip_ansi", -] - -if t.TYPE_CHECKING: - from sphinx.application import Sphinx - -__version__ = "1.0.0" - - -def setup(app: Sphinx) -> dict[str, t.Any]: - """Register the argparse directive and configuration options. - - Parameters - ---------- - app : Sphinx - The Sphinx application object. - - Returns - ------- - dict[str, t.Any] - Extension metadata. - """ - # Configuration options - app.add_config_value("argparse_group_title_prefix", "", "html") - app.add_config_value("argparse_show_defaults", True, "html") - app.add_config_value("argparse_show_choices", True, "html") - app.add_config_value("argparse_show_types", True, "html") - - # Register custom nodes - app.add_node( - argparse_program, - html=(visit_argparse_program_html, depart_argparse_program_html), - ) - app.add_node( - argparse_usage, - html=(visit_argparse_usage_html, depart_argparse_usage_html), - ) - app.add_node( - argparse_group, - html=(visit_argparse_group_html, depart_argparse_group_html), - ) - app.add_node( - argparse_argument, - html=(visit_argparse_argument_html, depart_argparse_argument_html), - ) - app.add_node( - argparse_subcommands, - html=(visit_argparse_subcommands_html, depart_argparse_subcommands_html), - ) - app.add_node( - argparse_subcommand, - html=(visit_argparse_subcommand_html, depart_argparse_subcommand_html), - ) - - # Register directive - app.add_directive("argparse", ArgparseDirective) - - return { - "version": __version__, - "parallel_read_safe": True, - "parallel_write_safe": True, - } diff --git a/docs/_ext/sphinx_argparse_neo/compat.py b/docs/_ext/sphinx_argparse_neo/compat.py deleted file mode 100644 index 15816d574c..0000000000 --- a/docs/_ext/sphinx_argparse_neo/compat.py +++ /dev/null @@ -1,271 +0,0 @@ -"""Compatibility utilities for module loading. - -This module provides utilities for loading Python modules safely, -including mock handling for imports that may fail during documentation -builds. - -Unlike sphinx-argparse, this module does NOT depend on autodoc's mock -functionality, which moved in Sphinx 9.x. -""" - -from __future__ import annotations - -import contextlib -import importlib -import sys -import typing as t - -if t.TYPE_CHECKING: - import argparse - from collections.abc import Iterator - - -class MockModule: - """Simple mock for unavailable imports. - - This class provides a minimal mock that can be used as a placeholder - for modules that aren't available during documentation builds. - - Parameters - ---------- - name : str - The module name being mocked. - - Examples - -------- - >>> mock = MockModule("mypackage.submodule") - >>> mock.__name__ - 'mypackage.submodule' - >>> child = mock.child_attr - >>> child.__name__ - 'mypackage.submodule.child_attr' - >>> callable(mock.some_function) - True - >>> mock.some_function() - - """ - - def __init__(self, name: str) -> None: - """Initialize the mock module.""" - self.__name__ = name - self._name = name - - def __repr__(self) -> str: - """Return string representation.""" - return f"" - - def __getattr__(self, name: str) -> MockModule: - """Return a child mock for any attribute access. - - Parameters - ---------- - name : str - The attribute name. - - Returns - ------- - MockModule - A new mock for the child attribute. - """ - return MockModule(f"{self._name}.{name}") - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> MockModule: - """Return self when called as a function. - - Parameters - ---------- - *args : t.Any - Positional arguments (ignored). - **kwargs : t.Any - Keyword arguments (ignored). - - Returns - ------- - MockModule - Self. - """ - return self - - -@contextlib.contextmanager -def mock_imports(modules: list[str]) -> Iterator[None]: - """Context manager to mock missing imports. - - This provides a simple way to temporarily add mock modules to - sys.modules, allowing imports to succeed during documentation builds - even when the actual modules aren't available. - - Parameters - ---------- - modules : list[str] - List of module names to mock. - - Yields - ------ - None - Context manager yields nothing. - - Examples - -------- - >>> import sys - >>> "fake_module" in sys.modules - False - >>> with mock_imports(["fake_module", "fake_module.sub"]): - ... import fake_module - ... fake_module.__name__ - 'fake_module' - >>> "fake_module" in sys.modules - False - """ - mocked: dict[str, MockModule] = {} - - for name in modules: - if name not in sys.modules: - mocked[name] = MockModule(name) - sys.modules[name] = mocked[name] # type: ignore[assignment] - - try: - yield - finally: - for name in mocked: - del sys.modules[name] - - -def import_module(module_name: str) -> t.Any: - """Import a module by name. - - Parameters - ---------- - module_name : str - The fully qualified module name. - - Returns - ------- - t.Any - The imported module. - - Raises - ------ - ImportError - If the module cannot be imported. - - Examples - -------- - >>> mod = import_module("argparse") - >>> hasattr(mod, "ArgumentParser") - True - """ - return importlib.import_module(module_name) - - -def get_parser_from_module( - module_name: str, - func_name: str, - mock_modules: list[str] | None = None, -) -> argparse.ArgumentParser: - """Import a module and call a function to get an ArgumentParser. - - Parameters - ---------- - module_name : str - The module containing the parser factory function. - func_name : str - The name of the function that returns an ArgumentParser. - Can be a dotted path like "Class.method". - mock_modules : list[str] | None - Optional list of module names to mock during import. - - Returns - ------- - argparse.ArgumentParser - The argument parser returned by the function. - - Raises - ------ - ImportError - If the module cannot be imported. - AttributeError - If the function is not found. - TypeError - If the function doesn't return an ArgumentParser. - - Examples - -------- - Load tmuxp's parser factory: - - >>> parser = get_parser_from_module("tmuxp.cli", "create_parser") - >>> parser.prog - 'tmuxp' - >>> hasattr(parser, 'parse_args') - True - """ - ctx = mock_imports(mock_modules) if mock_modules else contextlib.nullcontext() - - with ctx: - module = import_module(module_name) - - # Handle dotted paths like "Class.method" - obj = module - for part in func_name.split("."): - obj = getattr(obj, part) - - # Call the function if it's callable - parser = obj() if callable(obj) else obj - - # Validate the return type at runtime - import argparse as argparse_module - - if not isinstance(parser, argparse_module.ArgumentParser): - msg = ( - f"{module_name}:{func_name} returned {type(parser).__name__}, " - f"expected ArgumentParser" - ) - raise TypeError(msg) - - return parser - - -def get_parser_from_entry_point( - entry_point: str, - mock_modules: list[str] | None = None, -) -> argparse.ArgumentParser: - """Get an ArgumentParser from a setuptools-style entry point string. - - Parameters - ---------- - entry_point : str - Entry point in the format "module:function" or "module:Class.method". - mock_modules : list[str] | None - Optional list of module names to mock during import. - - Returns - ------- - argparse.ArgumentParser - The argument parser. - - Raises - ------ - ValueError - If the entry point format is invalid. - - Examples - -------- - Load tmuxp's parser using entry point syntax: - - >>> parser = get_parser_from_entry_point("tmuxp.cli:create_parser") - >>> parser.prog - 'tmuxp' - - Invalid format raises ValueError: - - >>> get_parser_from_entry_point("no_colon") - Traceback (most recent call last): - ... - ValueError: Invalid entry point format: 'no_colon'. Expected 'module:function' - """ - if ":" not in entry_point: - msg = f"Invalid entry point format: {entry_point!r}. Expected 'module:function'" - raise ValueError(msg) - - module_name, func_name = entry_point.split(":", 1) - return get_parser_from_module(module_name, func_name, mock_modules) diff --git a/docs/_ext/sphinx_argparse_neo/directive.py b/docs/_ext/sphinx_argparse_neo/directive.py deleted file mode 100644 index 80d6d155ab..0000000000 --- a/docs/_ext/sphinx_argparse_neo/directive.py +++ /dev/null @@ -1,240 +0,0 @@ -"""Sphinx directive for argparse documentation. - -This module provides the ArgparseDirective class that integrates -with Sphinx to generate documentation from ArgumentParser instances. -""" - -from __future__ import annotations - -import typing as t - -from docutils import nodes -from docutils.parsers.rst import directives -from sphinx.util.docutils import SphinxDirective -from sphinx_argparse_neo.compat import get_parser_from_module -from sphinx_argparse_neo.parser import extract_parser -from sphinx_argparse_neo.renderer import ArgparseRenderer, RenderConfig - -if t.TYPE_CHECKING: - import argparse - - -class ArgparseDirective(SphinxDirective): - """Sphinx directive for documenting argparse-based CLI tools. - - Usage - ----- - .. argparse:: - :module: myapp.cli - :func: create_parser - :prog: myapp - - Options - ------- - :module: - The Python module containing the parser factory function. - :func: - The function name that returns an ArgumentParser. - Can be a dotted path like "Class.method". - :prog: - Override the program name (optional). - :path: - Navigate to a specific subparser by path (e.g., "sync pull"). - :no-defaults: - Don't show default values (flag). - :no-description: - Don't show parser description (flag). - :no-epilog: - Don't show parser epilog (flag). - :mock-modules: - Comma-separated list of modules to mock during import. - - Examples - -------- - In RST documentation:: - - .. argparse:: - :module: myapp.cli - :func: create_parser - :prog: myapp - - :path: subcommand - """ - - has_content = True - required_arguments = 0 - optional_arguments = 0 - - option_spec: t.ClassVar[dict[str, t.Any]] = { - "module": directives.unchanged_required, - "func": directives.unchanged_required, - "prog": directives.unchanged, - "path": directives.unchanged, - "no-defaults": directives.flag, - "no-description": directives.flag, - "no-epilog": directives.flag, - "no-choices": directives.flag, - "no-types": directives.flag, - "mock-modules": directives.unchanged, - # sphinx-argparse compatibility options - "nosubcommands": directives.flag, - "nodefault": directives.flag, - "noepilog": directives.flag, - "nodescription": directives.flag, - } - - def run(self) -> list[nodes.Node]: - """Execute the directive and return docutils nodes. - - Returns - ------- - list[nodes.Node] - List of docutils nodes representing the CLI documentation. - """ - # Get required options - module_name = self.options.get("module") - func_name = self.options.get("func") - - if not module_name or not func_name: - error = self.state_machine.reporter.error( - "argparse directive requires :module: and :func: options", - line=self.lineno, - ) - return [error] - - # Parse mock modules - mock_modules: list[str] | None = None - if "mock-modules" in self.options: - mock_modules = [m.strip() for m in self.options["mock-modules"].split(",")] - - # Load the parser - try: - parser = get_parser_from_module(module_name, func_name, mock_modules) - except Exception as e: - error = self.state_machine.reporter.error( - f"Failed to load parser from {module_name}:{func_name}: {e}", - line=self.lineno, - ) - return [error] - - # Override prog if specified - if "prog" in self.options: - parser.prog = self.options["prog"] - - # Navigate to subparser if path specified - if "path" in self.options: - parser = self._navigate_to_subparser(parser, self.options["path"]) - if parser is None: - error = self.state_machine.reporter.error( - f"Subparser path not found: {self.options['path']}", - line=self.lineno, - ) - return [error] - - # Build render config from directive options and Sphinx config - config = self._build_render_config() - - # Extract parser info - parser_info = extract_parser(parser) - - # Apply directive-level overrides - # Handle both new-style and sphinx-argparse compatibility options - if "no-description" in self.options or "nodescription" in self.options: - parser_info = parser_info.__class__( - prog=parser_info.prog, - usage=parser_info.usage, - bare_usage=parser_info.bare_usage, - description=None, - epilog=parser_info.epilog, - argument_groups=parser_info.argument_groups, - subcommands=parser_info.subcommands, - subcommand_dest=parser_info.subcommand_dest, - ) - if "no-epilog" in self.options or "noepilog" in self.options: - parser_info = parser_info.__class__( - prog=parser_info.prog, - usage=parser_info.usage, - bare_usage=parser_info.bare_usage, - description=parser_info.description, - epilog=None, - argument_groups=parser_info.argument_groups, - subcommands=parser_info.subcommands, - subcommand_dest=parser_info.subcommand_dest, - ) - if "nosubcommands" in self.options: - parser_info = parser_info.__class__( - prog=parser_info.prog, - usage=parser_info.usage, - bare_usage=parser_info.bare_usage, - description=parser_info.description, - epilog=parser_info.epilog, - argument_groups=parser_info.argument_groups, - subcommands=None, - subcommand_dest=None, - ) - - # Render to nodes - renderer = ArgparseRenderer(config=config, state=self.state) - return t.cast(list[nodes.Node], renderer.render(parser_info)) - - def _build_render_config(self) -> RenderConfig: - """Build RenderConfig from directive and Sphinx config options. - - Returns - ------- - RenderConfig - Configuration for the renderer. - """ - # Start with Sphinx config defaults - config = RenderConfig.from_sphinx_config(self.config) - - # Override with directive options - # Handle both new-style and sphinx-argparse compatibility options - if "no-defaults" in self.options or "nodefault" in self.options: - config.show_defaults = False - if "no-choices" in self.options: - config.show_choices = False - if "no-types" in self.options: - config.show_types = False - - return config - - def _navigate_to_subparser( - self, parser: argparse.ArgumentParser, path: str - ) -> argparse.ArgumentParser | None: - """Navigate to a nested subparser by path. - - Parameters - ---------- - parser : argparse.ArgumentParser - The root parser. - path : str - Space-separated path to the subparser (e.g., "sync pull"). - - Returns - ------- - argparse.ArgumentParser | None - The subparser, or None if not found. - """ - import argparse as argparse_module - - current = parser - for name in path.split(): - # Find subparsers action - subparser_action = None - for action in current._actions: - if isinstance(action, argparse_module._SubParsersAction): - subparser_action = action - break - - if subparser_action is None: - return None - - # Find the named subparser - choices = subparser_action.choices or {} - if name not in choices: - return None - - current = choices[name] - - return current diff --git a/docs/_ext/sphinx_argparse_neo/nodes.py b/docs/_ext/sphinx_argparse_neo/nodes.py deleted file mode 100644 index 468b5876a5..0000000000 --- a/docs/_ext/sphinx_argparse_neo/nodes.py +++ /dev/null @@ -1,647 +0,0 @@ -"""Custom docutils node types for argparse documentation. - -This module defines custom node types that represent the structure of -CLI documentation, along with HTML visitor functions for rendering. -""" - -from __future__ import annotations - -import typing as t - -from docutils import nodes - -if t.TYPE_CHECKING: - from sphinx.writers.html5 import HTML5Translator - -# Import the lexer - use absolute import from parent package -import pathlib -import sys - -# Add parent directory to path for lexer import -_ext_dir = pathlib.Path(__file__).parent.parent -if str(_ext_dir) not in sys.path: - sys.path.insert(0, str(_ext_dir)) - -from argparse_lexer import ArgparseUsageLexer # noqa: E402 -from sphinx_argparse_neo.utils import strip_ansi # noqa: E402 - - -def _generate_argument_id(names: list[str], id_prefix: str = "") -> str: - """Generate unique ID for an argument based on its names. - - Creates a slug-style ID suitable for HTML anchors by: - 1. Stripping leading dashes from option names - 2. Joining multiple names with hyphens - 3. Prepending optional prefix for namespace isolation - - Parameters - ---------- - names : list[str] - List of argument names (e.g., ["-L", "--socket-name"]). - id_prefix : str - Optional prefix for uniqueness (e.g., "shell" -> "shell-L-socket-name"). - - Returns - ------- - str - A slug-style ID suitable for HTML anchors. - - Examples - -------- - >>> _generate_argument_id(["-L"]) - 'L' - >>> _generate_argument_id(["--help"]) - 'help' - >>> _generate_argument_id(["-v", "--verbose"]) - 'v-verbose' - >>> _generate_argument_id(["-L"], "shell") - 'shell-L' - >>> _generate_argument_id(["filename"]) - 'filename' - >>> _generate_argument_id([]) - '' - """ - clean_names = [name.lstrip("-") for name in names if name.lstrip("-")] - if not clean_names: - return "" - name_part = "-".join(clean_names) - return f"{id_prefix}-{name_part}" if id_prefix else name_part - - -def _token_to_css_class(token_type: t.Any) -> str: - """Map a Pygments token type to its CSS class abbreviation. - - Pygments uses hierarchical token names like Token.Name.Attribute. - These map to CSS classes using abbreviations of the last two parts: - - Token.Name.Attribute → 'na' (Name.Attribute) - - Token.Generic.Heading → 'gh' (Generic.Heading) - - Token.Punctuation → 'p' (just Punctuation) - - Parameters - ---------- - token_type : Any - A Pygments token type (from pygments.token). - - Returns - ------- - str - CSS class abbreviation, or empty string if not mappable. - - Examples - -------- - >>> from pygments.token import Token - >>> _token_to_css_class(Token.Name.Attribute) - 'na' - >>> _token_to_css_class(Token.Generic.Heading) - 'gh' - >>> _token_to_css_class(Token.Punctuation) - 'p' - >>> _token_to_css_class(Token.Text.Whitespace) - 'tw' - """ - type_str = str(token_type) - # Token string looks like "Token.Name.Attribute" or "Token.Punctuation" - parts = type_str.split(".") - - if len(parts) >= 3: - # Token.Name.Attribute -> "na" (first char of each of last two parts) - return parts[-2][0].lower() + parts[-1][0].lower() - elif len(parts) == 2: - # Token.Punctuation -> "p" (first char of last part) - return parts[-1][0].lower() - return "" - - -def _highlight_usage(usage_text: str, encode: t.Callable[[str], str]) -> str: - """Tokenize usage text and wrap tokens in highlighted span elements. - - Uses ArgparseUsageLexer to tokenize the usage string, then wraps each - token in a with the appropriate CSS class for styling. - - Parameters - ---------- - usage_text : str - The usage string to highlight (should include "usage: " prefix). - encode : Callable[[str], str] - HTML encoding function (typically translator.encode). - - Returns - ------- - str - HTML string with tokens wrapped in styled elements. - - Examples - -------- - >>> def mock_encode(s: str) -> str: - ... return s.replace("&", "&").replace("<", "<") - >>> html = _highlight_usage("usage: cmd [-h]", mock_encode) - >>> 'usage:' in html - True - >>> 'cmd' in html - True - >>> '-h' in html - True - """ - lexer = ArgparseUsageLexer() - parts: list[str] = [] - - for tok_type, tok_value in lexer.get_tokens(usage_text): - if not tok_value: - continue - - css_class = _token_to_css_class(tok_type) - escaped = encode(tok_value) - type_str = str(tok_type).lower() - - # Skip wrapping for whitespace and plain text tokens - if css_class and "whitespace" not in type_str and "text" not in type_str: - parts.append(f'{escaped}') - else: - parts.append(escaped) - - return "".join(parts) - - -def _highlight_argument_names( - names: list[str], metavar: str | None, encode: t.Callable[[str], str] -) -> str: - """Highlight argument names and metavar with appropriate CSS classes. - - Short options (-h) get class 'na' (Name.Attribute). - Long options (--help) get class 'nt' (Name.Tag). - Positional arguments get class 'nl' (Name.Label). - Metavars get class 'nv' (Name.Variable). - - Parameters - ---------- - names : list[str] - List of argument names (e.g., ["-v", "--verbose"]). - metavar : str | None - Optional metavar (e.g., "FILE", "PATH"). - encode : Callable[[str], str] - HTML encoding function. - - Returns - ------- - str - HTML string with highlighted argument signature. - - Examples - -------- - >>> def mock_encode(s: str) -> str: - ... return s - >>> html = _highlight_argument_names(["-h", "--help"], None, mock_encode) - >>> '-h' in html - True - >>> '--help' in html - True - >>> html = _highlight_argument_names(["--output"], "FILE", mock_encode) - >>> 'FILE' in html - True - >>> html = _highlight_argument_names(["sync"], None, mock_encode) - >>> 'sync' in html - True - """ - sig_parts: list[str] = [] - - for name in names: - escaped = encode(name) - if name.startswith("--"): - sig_parts.append(f'{escaped}') - elif name.startswith("-"): - sig_parts.append(f'{escaped}') - else: - # Positional argument or subcommand - sig_parts.append(f'{escaped}') - - result = ", ".join(sig_parts) - - if metavar: - escaped_metavar = encode(metavar) - result = f'{result} {escaped_metavar}' - - return result - - -class argparse_program(nodes.General, nodes.Element): - """Root node for an argparse program documentation block. - - Attributes - ---------- - prog : str - The program name. - - Examples - -------- - >>> node = argparse_program() - >>> node["prog"] = "myapp" - >>> node["prog"] - 'myapp' - """ - - pass - - -class argparse_usage(nodes.General, nodes.Element): - """Node for displaying program usage. - - Contains the usage string as a literal block. - - Examples - -------- - >>> node = argparse_usage() - >>> node["usage"] = "myapp [-h] [--verbose] command" - >>> node["usage"] - 'myapp [-h] [--verbose] command' - """ - - pass - - -class argparse_group(nodes.General, nodes.Element): - """Node for an argument group (positional, optional, or custom). - - Attributes - ---------- - title : str - The group title. - description : str | None - Optional group description. - - Examples - -------- - >>> node = argparse_group() - >>> node["title"] = "Output Options" - >>> node["title"] - 'Output Options' - """ - - pass - - -class argparse_argument(nodes.Part, nodes.Element): - """Node for a single CLI argument. - - Attributes - ---------- - names : list[str] - Argument names/flags. - help : str | None - Help text. - default : str | None - Default value string. - choices : list[str] | None - Available choices. - required : bool - Whether the argument is required. - metavar : str | None - Metavar for display. - - Examples - -------- - >>> node = argparse_argument() - >>> node["names"] = ["-v", "--verbose"] - >>> node["names"] - ['-v', '--verbose'] - """ - - pass - - -class argparse_subcommands(nodes.General, nodes.Element): - """Container node for subcommands section. - - Examples - -------- - >>> node = argparse_subcommands() - >>> node["title"] = "Commands" - >>> node["title"] - 'Commands' - """ - - pass - - -class argparse_subcommand(nodes.General, nodes.Element): - """Node for a single subcommand. - - Attributes - ---------- - name : str - Subcommand name. - aliases : list[str] - Subcommand aliases. - help : str | None - Subcommand help text. - - Examples - -------- - >>> node = argparse_subcommand() - >>> node["name"] = "sync" - >>> node["aliases"] = ["s"] - >>> node["name"] - 'sync' - """ - - pass - - -# HTML Visitor Functions - - -def visit_argparse_program_html(self: HTML5Translator, node: argparse_program) -> None: - """Visit argparse_program node - start program container. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_program - The program node being visited. - """ - prog = node.get("prog", "") - self.body.append(f'

    \n') - - -def depart_argparse_program_html(self: HTML5Translator, node: argparse_program) -> None: - """Depart argparse_program node - close program container. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_program - The program node being departed. - """ - self.body.append("
    \n") - - -def visit_argparse_usage_html(self: HTML5Translator, node: argparse_usage) -> None: - """Visit argparse_usage node - render usage block with syntax highlighting. - - The usage text is tokenized using ArgparseUsageLexer and wrapped in - styled elements for semantic highlighting of options, metavars, - commands, and punctuation. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_usage - The usage node being visited. - """ - usage = strip_ansi(node.get("usage", "")) - # Add both argparse-usage class and highlight class for CSS targeting - self.body.append('
    ')
    -    # Prepend "usage: " and highlight the full usage string
    -    highlighted = _highlight_usage(f"usage: {usage}", self.encode)
    -    self.body.append(highlighted)
    -
    -
    -def depart_argparse_usage_html(self: HTML5Translator, node: argparse_usage) -> None:
    -    """Depart argparse_usage node - close usage block.
    -
    -    Parameters
    -    ----------
    -    self : HTML5Translator
    -        The Sphinx HTML translator.
    -    node : argparse_usage
    -        The usage node being departed.
    -    """
    -    self.body.append("
    \n") - - -def visit_argparse_group_html(self: HTML5Translator, node: argparse_group) -> None: - """Visit argparse_group node - start argument group. - - The title is now rendered by the parent section node, so this visitor - only handles the group container and description. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_group - The group node being visited. - """ - title = node.get("title", "") - group_id = title.lower().replace(" ", "-") if title else "arguments" - self.body.append(f'
    \n') - # Title rendering removed - parent section now provides the heading - description = node.get("description") - if description: - self.body.append( - f'

    {self.encode(description)}

    \n' - ) - self.body.append('
    \n') - - -def depart_argparse_group_html(self: HTML5Translator, node: argparse_group) -> None: - """Depart argparse_group node - close argument group. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_group - The group node being departed. - """ - self.body.append("
    \n") - self.body.append("
    \n") - - -def visit_argparse_argument_html( - self: HTML5Translator, node: argparse_argument -) -> None: - """Visit argparse_argument node - render argument entry with highlighting. - - Argument names are highlighted with semantic CSS classes: - - Short options (-h) get class 'na' (Name.Attribute) - - Long options (--help) get class 'nt' (Name.Tag) - - Positional arguments get class 'nl' (Name.Label) - - Metavars get class 'nv' (Name.Variable) - - The argument is wrapped in a container div with a unique ID for linking. - A headerlink anchor (¶) is added for direct navigation. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_argument - The argument node being visited. - """ - names: list[str] = node.get("names", []) - metavar = node.get("metavar") - id_prefix: str = node.get("id_prefix", "") - - # Generate unique ID for this argument - arg_id = _generate_argument_id(names, id_prefix) - - # Open wrapper div with ID for linking - if arg_id: - self.body.append(f'
    \n') - else: - self.body.append('
    \n') - - # Build the argument signature with syntax highlighting - highlighted_sig = _highlight_argument_names(names, metavar, self.encode) - - # Add headerlink anchor inside dt for navigation - headerlink = "" - if arg_id: - headerlink = f'' - - self.body.append( - f'
    {highlighted_sig}{headerlink}
    \n' - ) - self.body.append('
    ') - - # Add help text - help_text = node.get("help") - if help_text: - self.body.append(f"

    {self.encode(help_text)}

    ") - - -def depart_argparse_argument_html( - self: HTML5Translator, node: argparse_argument -) -> None: - """Depart argparse_argument node - close argument entry. - - Adds default, choices, and type information if present. - Default values are wrapped in ```` for styled display. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_argument - The argument node being departed. - """ - # Build metadata as definition list items - default = node.get("default_string") - choices = node.get("choices") - type_name = node.get("type_name") - required = node.get("required", False) - - if default is not None or choices or type_name or required: - self.body.append('
    \n') - - if default is not None: - self.body.append('
    ') - self.body.append('
    Default
    ') - self.body.append( - f'
    ' - f'{self.encode(default)}
    ' - ) - self.body.append("
    \n") - - if type_name: - self.body.append('
    ') - self.body.append('
    Type
    ') - self.body.append( - f'
    ' - f'{self.encode(type_name)}
    ' - ) - self.body.append("
    \n") - - if choices: - choices_str = ", ".join(str(c) for c in choices) - self.body.append('
    ') - self.body.append('
    Choices
    ') - self.body.append( - f'
    {self.encode(choices_str)}
    ' - ) - self.body.append("
    \n") - - if required: - self.body.append('
    Required
    \n') - - self.body.append("
    \n") - - self.body.append("
    \n") - # Close wrapper div - self.body.append("
    \n") - - -def visit_argparse_subcommands_html( - self: HTML5Translator, node: argparse_subcommands -) -> None: - """Visit argparse_subcommands node - start subcommands section. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_subcommands - The subcommands node being visited. - """ - title = node.get("title", "Sub-commands") - self.body.append('
    \n') - self.body.append( - f'

    {self.encode(title)}

    \n' - ) - - -def depart_argparse_subcommands_html( - self: HTML5Translator, node: argparse_subcommands -) -> None: - """Depart argparse_subcommands node - close subcommands section. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_subcommands - The subcommands node being departed. - """ - self.body.append("
    \n") - - -def visit_argparse_subcommand_html( - self: HTML5Translator, node: argparse_subcommand -) -> None: - """Visit argparse_subcommand node - start subcommand entry. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_subcommand - The subcommand node being visited. - """ - name = node.get("name", "") - aliases: list[str] = node.get("aliases", []) - - self.body.append(f'
    \n') - - # Subcommand header - header = name - if aliases: - alias_str = ", ".join(aliases) - header = f"{name} ({alias_str})" - self.body.append( - f'

    {self.encode(header)}

    \n' - ) - - # Help text - help_text = node.get("help") - if help_text: - self.body.append( - f'

    {self.encode(help_text)}

    \n' - ) - - -def depart_argparse_subcommand_html( - self: HTML5Translator, node: argparse_subcommand -) -> None: - """Depart argparse_subcommand node - close subcommand entry. - - Parameters - ---------- - self : HTML5Translator - The Sphinx HTML translator. - node : argparse_subcommand - The subcommand node being departed. - """ - self.body.append("
    \n") diff --git a/docs/_ext/sphinx_argparse_neo/parser.py b/docs/_ext/sphinx_argparse_neo/parser.py deleted file mode 100644 index f3a6db44af..0000000000 --- a/docs/_ext/sphinx_argparse_neo/parser.py +++ /dev/null @@ -1,659 +0,0 @@ -"""Argparse introspection - extract structured data from ArgumentParser. - -This module provides dataclasses and functions to introspect argparse -ArgumentParser instances and convert them into structured data suitable -for documentation rendering. -""" - -from __future__ import annotations - -import argparse -import dataclasses -import typing as t - -from sphinx_argparse_neo.utils import strip_ansi - -# Sentinel for "no default" (distinct from None which is a valid default) -NO_DEFAULT = object() - - -@dataclasses.dataclass -class ArgumentInfo: - """Represents a single CLI argument. - - Examples - -------- - >>> info = ArgumentInfo( - ... names=["-v", "--verbose"], - ... help="Enable verbose output", - ... default=False, - ... default_string="False", - ... choices=None, - ... required=False, - ... metavar=None, - ... nargs=None, - ... action="store_true", - ... type_name=None, - ... const=True, - ... dest="verbose", - ... ) - >>> info.names - ['-v', '--verbose'] - >>> info.is_positional - False - """ - - names: list[str] - help: str | None - default: t.Any - default_string: str | None - choices: list[t.Any] | None - required: bool - metavar: str | None - nargs: str | int | None - action: str - type_name: str | None - const: t.Any - dest: str - - @property - def is_positional(self) -> bool: - """Return True if this is a positional argument. - - Examples - -------- - >>> ArgumentInfo( - ... names=["filename"], - ... help=None, - ... default=None, - ... default_string=None, - ... choices=None, - ... required=True, - ... metavar=None, - ... nargs=None, - ... action="store", - ... type_name=None, - ... const=None, - ... dest="filename", - ... ).is_positional - True - >>> ArgumentInfo( - ... names=["-f", "--file"], - ... help=None, - ... default=None, - ... default_string=None, - ... choices=None, - ... required=False, - ... metavar=None, - ... nargs=None, - ... action="store", - ... type_name=None, - ... const=None, - ... dest="file", - ... ).is_positional - False - """ - return bool(self.names) and not self.names[0].startswith("-") - - -@dataclasses.dataclass -class MutuallyExclusiveGroup: - """Arguments that cannot be used together. - - Examples - -------- - >>> group = MutuallyExclusiveGroup(arguments=[], required=True) - >>> group.required - True - """ - - arguments: list[ArgumentInfo] - required: bool - - -@dataclasses.dataclass -class ArgumentGroup: - """Named group of arguments. - - Examples - -------- - >>> group = ArgumentGroup( - ... title="Output Options", - ... description="Control output format", - ... arguments=[], - ... mutually_exclusive=[], - ... ) - >>> group.title - 'Output Options' - """ - - title: str - description: str | None - arguments: list[ArgumentInfo] - mutually_exclusive: list[MutuallyExclusiveGroup] - - -@dataclasses.dataclass -class SubcommandInfo: - """A subparser/subcommand. - - Examples - -------- - >>> sub = SubcommandInfo( - ... name="sync", - ... aliases=["s"], - ... help="Synchronize repositories", - ... parser=None, # type: ignore[arg-type] - ... ) - >>> sub.aliases - ['s'] - """ - - name: str - aliases: list[str] - help: str | None - parser: ParserInfo # Recursive reference - - -@dataclasses.dataclass -class ParserInfo: - """Complete parsed ArgumentParser. - - Examples - -------- - >>> info = ParserInfo( - ... prog="myapp", - ... usage=None, - ... bare_usage="myapp [-h] command", - ... description="My application", - ... epilog=None, - ... argument_groups=[], - ... subcommands=None, - ... subcommand_dest=None, - ... ) - >>> info.prog - 'myapp' - """ - - prog: str - usage: str | None - bare_usage: str - description: str | None - epilog: str | None - argument_groups: list[ArgumentGroup] - subcommands: list[SubcommandInfo] | None - subcommand_dest: str | None - - -def _format_default(default: t.Any) -> str | None: - """Format a default value for display. - - Parameters - ---------- - default : t.Any - The default value to format. - - Returns - ------- - str | None - Formatted string representation, or None if suppressed/unset. - - Examples - -------- - >>> _format_default(None) - 'None' - >>> _format_default("hello") - 'hello' - >>> _format_default(42) - '42' - >>> _format_default(argparse.SUPPRESS) is None - True - >>> _format_default([1, 2, 3]) - '[1, 2, 3]' - """ - if default is argparse.SUPPRESS: - return None - if default is None: - return "None" - if isinstance(default, str): - return default - return repr(default) - - -def _get_type_name(action: argparse.Action) -> str | None: - """Extract the type name from an action. - - Parameters - ---------- - action : argparse.Action - The argparse action to inspect. - - Returns - ------- - str | None - The type name, or None if no type is specified. - - Examples - -------- - >>> parser = argparse.ArgumentParser() - >>> action = parser.add_argument("--count", type=int) - >>> _get_type_name(action) - 'int' - >>> action2 = parser.add_argument("--name") - >>> _get_type_name(action2) is None - True - """ - if action.type is None: - return None - if hasattr(action.type, "__name__"): - return action.type.__name__ - return str(action.type) - - -def _get_action_name(action: argparse.Action) -> str: - """Get the action type name. - - Parameters - ---------- - action : argparse.Action - The argparse action to inspect. - - Returns - ------- - str - The action type name. - - Examples - -------- - >>> parser = argparse.ArgumentParser() - >>> action = parser.add_argument("--verbose", action="store_true") - >>> _get_action_name(action) - 'store_true' - >>> action2 = parser.add_argument("--file") - >>> _get_action_name(action2) - 'store' - """ - # Map action classes to their string names - action_class = type(action).__name__ - action_map = { - "_StoreAction": "store", - "_StoreTrueAction": "store_true", - "_StoreFalseAction": "store_false", - "_StoreConstAction": "store_const", - "_AppendAction": "append", - "_AppendConstAction": "append_const", - "_CountAction": "count", - "_HelpAction": "help", - "_VersionAction": "version", - "_ExtendAction": "extend", - "BooleanOptionalAction": "boolean_optional", - } - return action_map.get(action_class, action_class.lower()) - - -def _extract_argument(action: argparse.Action) -> ArgumentInfo: - """Extract ArgumentInfo from an argparse Action. - - Parameters - ---------- - action : argparse.Action - The argparse action to extract information from. - - Returns - ------- - ArgumentInfo - Structured argument information. - - Examples - -------- - >>> parser = argparse.ArgumentParser() - >>> action = parser.add_argument( - ... "-v", "--verbose", - ... action="store_true", - ... help="Enable verbose mode", - ... ) - >>> info = _extract_argument(action) - >>> info.names - ['-v', '--verbose'] - >>> info.action - 'store_true' - """ - # Determine names - option_strings for optionals, dest for positionals - names = list(action.option_strings) if action.option_strings else [action.dest] - - # Determine if required - required = action.required if hasattr(action, "required") else False - # Positional arguments are required by default (unless nargs makes them optional) - if not action.option_strings: - required = action.nargs not in ("?", "*", argparse.REMAINDER) - - # Format metavar - metavar = action.metavar - if isinstance(metavar, tuple): - metavar = " ".join(metavar) - - # Handle default - default = action.default - default_string = _format_default(default) - - return ArgumentInfo( - names=names, - help=action.help if action.help != argparse.SUPPRESS else None, - default=default if default is not argparse.SUPPRESS else NO_DEFAULT, - default_string=default_string, - choices=list(action.choices) if action.choices else None, - required=required, - metavar=metavar, - nargs=action.nargs, - action=_get_action_name(action), - type_name=_get_type_name(action), - const=action.const, - dest=action.dest, - ) - - -def _extract_mutex_groups( - parser: argparse.ArgumentParser, -) -> dict[int, MutuallyExclusiveGroup]: - """Extract mutually exclusive groups from a parser. - - Parameters - ---------- - parser : argparse.ArgumentParser - The parser to extract from. - - Returns - ------- - dict[int, MutuallyExclusiveGroup] - Mapping from action id to the MutuallyExclusiveGroup it belongs to. - - Examples - -------- - Extract mutually exclusive groups from a parser with one group: - - >>> parser = argparse.ArgumentParser() - >>> group = parser.add_mutually_exclusive_group() - >>> _ = group.add_argument("--foo", help="Use foo") - >>> _ = group.add_argument("--bar", help="Use bar") - >>> mutex_map = _extract_mutex_groups(parser) - >>> len(mutex_map) - 2 - - Each action in the group maps to the same MutuallyExclusiveGroup: - - >>> values = list(mutex_map.values()) - >>> values[0] is values[1] - True - >>> len(values[0].arguments) - 2 - >>> [arg.names[0] for arg in values[0].arguments] - ['--foo', '--bar'] - - A parser without mutex groups returns an empty mapping: - - >>> parser2 = argparse.ArgumentParser() - >>> _ = parser2.add_argument("--verbose") - >>> _extract_mutex_groups(parser2) - {} - """ - mutex_map: dict[int, MutuallyExclusiveGroup] = {} - - for mutex_group in parser._mutually_exclusive_groups: - group_info = MutuallyExclusiveGroup( - arguments=[ - _extract_argument(action) - for action in mutex_group._group_actions - if action.help != argparse.SUPPRESS - ], - required=mutex_group.required, - ) - for action in mutex_group._group_actions: - mutex_map[id(action)] = group_info - - return mutex_map - - -def _extract_argument_groups( - parser: argparse.ArgumentParser, - hide_suppressed: bool = True, -) -> list[ArgumentGroup]: - """Extract argument groups from a parser. - - Parameters - ---------- - parser : argparse.ArgumentParser - The parser to extract from. - hide_suppressed : bool - Whether to hide arguments with SUPPRESS help. - - Returns - ------- - list[ArgumentGroup] - List of argument groups. - - Examples - -------- - >>> parser = argparse.ArgumentParser(description="Test") - >>> _ = parser.add_argument("filename", help="Input file") - >>> _ = parser.add_argument("-v", "--verbose", action="store_true") - >>> groups = _extract_argument_groups(parser) - >>> len(groups) >= 2 # positional and optional groups - True - """ - mutex_map = _extract_mutex_groups(parser) - seen_mutex: set[int] = set() - groups: list[ArgumentGroup] = [] - - for group in parser._action_groups: - arguments: list[ArgumentInfo] = [] - mutex_groups: list[MutuallyExclusiveGroup] = [] - - for action in group._group_actions: - # Skip help action and suppressed actions - if isinstance(action, argparse._HelpAction): - continue - if hide_suppressed and action.help == argparse.SUPPRESS: - continue - # Skip subparser actions - handled separately - if isinstance(action, argparse._SubParsersAction): - continue - - # Check if this action is in a mutex group - if id(action) in mutex_map: - mutex_info = mutex_map[id(action)] - mutex_id = id(mutex_info) - if mutex_id not in seen_mutex: - seen_mutex.add(mutex_id) - mutex_groups.append(mutex_info) - else: - arguments.append(_extract_argument(action)) - - # Skip empty groups - if not arguments and not mutex_groups: - continue - - groups.append( - ArgumentGroup( - title=group.title or "", - description=group.description, - arguments=arguments, - mutually_exclusive=mutex_groups, - ) - ) - - return groups - - -def _extract_subcommands( - parser: argparse.ArgumentParser, - hide_suppressed: bool = True, -) -> tuple[list[SubcommandInfo] | None, str | None]: - """Extract subcommands from a parser. - - Parameters - ---------- - parser : argparse.ArgumentParser - The parser to extract from. - hide_suppressed : bool - Whether to hide subcommands with SUPPRESS help. - - Returns - ------- - tuple[list[SubcommandInfo] | None, str | None] - Tuple of (subcommands list, destination variable name). - - Examples - -------- - >>> parser = argparse.ArgumentParser() - >>> subparsers = parser.add_subparsers(dest="command") - >>> _ = subparsers.add_parser("sync", help="Sync repos") - >>> _ = subparsers.add_parser("add", help="Add repo") - >>> subs, dest = _extract_subcommands(parser) - >>> dest - 'command' - >>> len(subs) - 2 - """ - for action in parser._actions: - if isinstance(action, argparse._SubParsersAction): - subcommands: list[SubcommandInfo] = [] - - # Get the choices (subparsers) - choices = action.choices or {} - - # Build reverse mapping of aliases - # action._parser_class might have name_parser_map with aliases - alias_map: dict[str, list[str]] = {} - seen_parsers: dict[int, str] = {} - - for name, subparser in choices.items(): - parser_id = id(subparser) - if parser_id in seen_parsers: - # This is an alias - primary = seen_parsers[parser_id] - if primary not in alias_map: - alias_map[primary] = [] - alias_map[primary].append(name) - else: - seen_parsers[parser_id] = name - - # Now extract subcommand info - processed: set[int] = set() - for name, subparser in choices.items(): - parser_id = id(subparser) - if parser_id in processed: - continue - processed.add(parser_id) - - # Get help text - help_text: str | None = None - if hasattr(action, "_choices_actions"): - for choice_action in action._choices_actions: - if choice_action.dest == name: - help_text = choice_action.help - break - - if hide_suppressed and help_text == argparse.SUPPRESS: - continue - - # Recursively extract parser info - sub_info = extract_parser(subparser, hide_suppressed=hide_suppressed) - - subcommands.append( - SubcommandInfo( - name=name, - aliases=alias_map.get(name, []), - help=help_text, - parser=sub_info, - ) - ) - - return subcommands, action.dest - - return None, None - - -def _generate_usage(parser: argparse.ArgumentParser) -> str: - """Generate the usage string for a parser. - - Parameters - ---------- - parser : argparse.ArgumentParser - The parser to generate usage for. - - Returns - ------- - str - The bare usage string (without "usage: " prefix). - - Examples - -------- - >>> parser = argparse.ArgumentParser(prog="myapp") - >>> _ = parser.add_argument("-v", "--verbose", action="store_true") - >>> usage = _generate_usage(parser) - >>> "myapp" in usage - True - """ - # Use argparse's built-in formatter to generate usage - formatter = parser._get_formatter() - formatter.add_usage( - parser.usage, parser._actions, parser._mutually_exclusive_groups - ) - usage: str = formatter.format_help().strip() - - # Strip ANSI codes before checking prefix (handles FORCE_COLOR edge case) - usage = strip_ansi(usage) - - # Remove "usage: " prefix if present - if usage.lower().startswith("usage:"): - usage = usage[6:].strip() - - return usage - - -def extract_parser( - parser: argparse.ArgumentParser, - hide_suppressed: bool = True, -) -> ParserInfo: - """Extract complete parser information. - - Parameters - ---------- - parser : argparse.ArgumentParser - The parser to extract information from. - hide_suppressed : bool - Whether to hide arguments/subcommands with SUPPRESS help. - - Returns - ------- - ParserInfo - Complete structured parser information. - - Examples - -------- - >>> parser = argparse.ArgumentParser( - ... prog="myapp", - ... description="My application", - ... ) - >>> _ = parser.add_argument("filename", help="Input file") - >>> _ = parser.add_argument("-v", "--verbose", action="store_true") - >>> info = extract_parser(parser) - >>> info.prog - 'myapp' - >>> info.description - 'My application' - >>> len(info.argument_groups) >= 1 - True - """ - subcommands, subcommand_dest = _extract_subcommands(parser, hide_suppressed) - - return ParserInfo( - prog=parser.prog, - usage=parser.usage, - bare_usage=_generate_usage(parser), - description=parser.description, - epilog=parser.epilog, - argument_groups=_extract_argument_groups(parser, hide_suppressed), - subcommands=subcommands, - subcommand_dest=subcommand_dest, - ) diff --git a/docs/_ext/sphinx_argparse_neo/renderer.py b/docs/_ext/sphinx_argparse_neo/renderer.py deleted file mode 100644 index f6c313f9f1..0000000000 --- a/docs/_ext/sphinx_argparse_neo/renderer.py +++ /dev/null @@ -1,604 +0,0 @@ -"""Renderer - convert ParserInfo to docutils nodes. - -This module provides the ArgparseRenderer class that transforms -structured parser information into docutils nodes for documentation. -""" - -from __future__ import annotations - -import dataclasses -import typing as t - -from docutils import nodes -from docutils.statemachine import StringList -from sphinx_argparse_neo.nodes import ( - argparse_argument, - argparse_group, - argparse_program, - argparse_subcommand, - argparse_subcommands, - argparse_usage, -) -from sphinx_argparse_neo.parser import ( - ArgumentGroup, - ArgumentInfo, - MutuallyExclusiveGroup, - ParserInfo, - SubcommandInfo, -) -from sphinx_argparse_neo.utils import escape_rst_emphasis - -if t.TYPE_CHECKING: - from docutils.parsers.rst.states import RSTState - from sphinx.config import Config - - -@dataclasses.dataclass -class RenderConfig: - """Configuration for the renderer. - - Examples - -------- - >>> config = RenderConfig() - >>> config.show_defaults - True - >>> config.group_title_prefix - '' - """ - - group_title_prefix: str = "" - show_defaults: bool = True - show_choices: bool = True - show_types: bool = True - - @classmethod - def from_sphinx_config(cls, config: Config) -> RenderConfig: - """Create RenderConfig from Sphinx configuration. - - Parameters - ---------- - config : Config - Sphinx configuration object. - - Returns - ------- - RenderConfig - Render configuration based on Sphinx config values. - """ - return cls( - group_title_prefix=getattr(config, "argparse_group_title_prefix", ""), - show_defaults=getattr(config, "argparse_show_defaults", True), - show_choices=getattr(config, "argparse_show_choices", True), - show_types=getattr(config, "argparse_show_types", True), - ) - - -class ArgparseRenderer: - """Render ParserInfo to docutils nodes. - - This class can be subclassed to customize rendering behavior. - Override individual methods to change how specific elements are rendered. - - Parameters - ---------- - config : RenderConfig - Rendering configuration. - state : RSTState | None - RST state for parsing nested RST content. - - Examples - -------- - >>> from sphinx_argparse_neo.parser import ParserInfo - >>> config = RenderConfig() - >>> renderer = ArgparseRenderer(config) - >>> info = ParserInfo( - ... prog="myapp", - ... usage=None, - ... bare_usage="myapp [-h]", - ... description="My app", - ... epilog=None, - ... argument_groups=[], - ... subcommands=None, - ... subcommand_dest=None, - ... ) - >>> result = renderer.render(info) - >>> isinstance(result, list) - True - """ - - def __init__( - self, - config: RenderConfig | None = None, - state: RSTState | None = None, - ) -> None: - """Initialize the renderer.""" - self.config = config or RenderConfig() - self.state = state - - @staticmethod - def _extract_id_prefix(prog: str) -> str: - """Extract subcommand from prog for unique section IDs. - - Parameters - ---------- - prog : str - The program name, potentially with subcommand (e.g., "tmuxp load"). - - Returns - ------- - str - The subcommand part for use as ID prefix, or empty string if none. - - Examples - -------- - >>> ArgparseRenderer._extract_id_prefix("tmuxp load") - 'load' - >>> ArgparseRenderer._extract_id_prefix("tmuxp") - '' - >>> ArgparseRenderer._extract_id_prefix("vcspull sync") - 'sync' - >>> ArgparseRenderer._extract_id_prefix("myapp sub cmd") - 'sub-cmd' - """ - parts = prog.split() - if len(parts) <= 1: - return "" - # Join remaining parts with hyphen for multi-level subcommands - return "-".join(parts[1:]) - - def render(self, parser_info: ParserInfo) -> list[nodes.Node]: - """Render a complete parser to docutils nodes. - - Parameters - ---------- - parser_info : ParserInfo - The parsed parser information. - - Returns - ------- - list[nodes.Node] - List of docutils nodes representing the documentation. - - Note - ---- - Sections for Usage and argument groups are emitted as siblings of - argparse_program rather than children. This allows Sphinx's - TocTreeCollector to discover them for inclusion in the table of - contents. - - The rendered structure is: - - - argparse_program (description only, no "examples:" part) - - section#usage (h3 "Usage" with usage block) - - section#positional-arguments (h3) - - section#options (h3) - - The "examples:" definition list in descriptions is left for - argparse_exemplar.py to transform into a proper Examples section. - """ - result: list[nodes.Node] = [] - - # Create program container for description only - program_node = argparse_program() - program_node["prog"] = parser_info.prog - - # Add description (may contain "examples:" definition list for later - # transformation by argparse_exemplar.py) - if parser_info.description: - desc_nodes = self._parse_text(parser_info.description) - program_node.extend(desc_nodes) - - result.append(program_node) - - # Extract ID prefix from prog for unique section IDs - # e.g., "tmuxp load" -> "load", "myapp" -> "" - id_prefix = self._extract_id_prefix(parser_info.prog) - - # Add Usage section as sibling (for TOC visibility) - usage_section = self.render_usage_section(parser_info, id_prefix=id_prefix) - result.append(usage_section) - - # Add argument groups as sibling sections (for TOC visibility) - for group in parser_info.argument_groups: - group_section = self.render_group_section(group, id_prefix=id_prefix) - result.append(group_section) - - # Add subcommands - if parser_info.subcommands: - subcommands_node = self.render_subcommands(parser_info.subcommands) - result.append(subcommands_node) - - # Add epilog - if parser_info.epilog: - epilog_nodes = self._parse_text(parser_info.epilog) - result.extend(epilog_nodes) - - return self.post_process(result) - - def render_usage(self, parser_info: ParserInfo) -> argparse_usage: - """Render the usage block. - - Parameters - ---------- - parser_info : ParserInfo - The parser information. - - Returns - ------- - argparse_usage - Usage node. - """ - usage_node = argparse_usage() - usage_node["usage"] = parser_info.bare_usage - return usage_node - - def render_usage_section( - self, parser_info: ParserInfo, *, id_prefix: str = "" - ) -> nodes.section: - """Render usage as a section with heading for TOC visibility. - - Creates a proper section node with "Usage" heading containing the - usage block. This structure allows Sphinx's TocTreeCollector to - discover it for the table of contents. - - Parameters - ---------- - parser_info : ParserInfo - The parser information. - id_prefix : str - Optional prefix for the section ID (e.g., "load" -> "load-usage"). - Used to ensure unique IDs when multiple argparse directives exist - on the same page. - - Returns - ------- - nodes.section - Section node containing the usage block with a "Usage" heading. - - Examples - -------- - >>> from sphinx_argparse_neo.parser import ParserInfo - >>> renderer = ArgparseRenderer() - >>> info = ParserInfo( - ... prog="myapp", - ... usage=None, - ... bare_usage="myapp [-h] command", - ... description=None, - ... epilog=None, - ... argument_groups=[], - ... subcommands=None, - ... subcommand_dest=None, - ... ) - >>> section = renderer.render_usage_section(info) - >>> section["ids"] - ['usage'] - - With prefix for subcommand pages: - - >>> section = renderer.render_usage_section(info, id_prefix="load") - >>> section["ids"] - ['load-usage'] - >>> section.children[0].astext() - 'Usage' - """ - section_id = f"{id_prefix}-usage" if id_prefix else "usage" - section = nodes.section() - section["ids"] = [section_id] - section["names"] = [nodes.fully_normalize_name("Usage")] - section += nodes.title("Usage", "Usage") - - usage_node = argparse_usage() - usage_node["usage"] = parser_info.bare_usage - section += usage_node - - return section - - def render_group_section( - self, group: ArgumentGroup, *, id_prefix: str = "" - ) -> nodes.section: - """Render an argument group wrapped in a section for TOC visibility. - - Creates a proper section node with the group title as heading, - containing the argparse_group node. This structure allows Sphinx's - TocTreeCollector to discover it for the table of contents. - - Parameters - ---------- - group : ArgumentGroup - The argument group to render. - id_prefix : str - Optional prefix for the section ID (e.g., "load" -> "load-options"). - Used to ensure unique IDs when multiple argparse directives exist - on the same page. - - Returns - ------- - nodes.section - Section node containing the group for TOC discovery. - - Examples - -------- - >>> from sphinx_argparse_neo.parser import ArgumentGroup - >>> renderer = ArgparseRenderer() - >>> group = ArgumentGroup( - ... title="positional arguments", - ... description=None, - ... arguments=[], - ... mutually_exclusive=[], - ... ) - >>> section = renderer.render_group_section(group) - >>> section["ids"] - ['positional-arguments'] - - With prefix for subcommand pages: - - >>> section = renderer.render_group_section(group, id_prefix="load") - >>> section["ids"] - ['load-positional-arguments'] - >>> section.children[0].astext() - 'Positional Arguments' - """ - # Title case the group title for proper display - raw_title = group.title or "Arguments" - title = raw_title.title() # "positional arguments" -> "Positional Arguments" - - if self.config.group_title_prefix: - title = f"{self.config.group_title_prefix}{title}" - - # Generate section ID from title (with optional prefix for uniqueness) - base_id = title.lower().replace(" ", "-") - section_id = f"{id_prefix}-{base_id}" if id_prefix else base_id - - # Create section wrapper for TOC discovery - section = nodes.section() - section["ids"] = [section_id] - section["names"] = [nodes.fully_normalize_name(title)] - - # Add title for TOC - Sphinx's TocTreeCollector looks for this - section += nodes.title(title, title) - - # Create the styled group container (with empty title - section provides it) - # Pass id_prefix to render_group so arguments get unique IDs - group_node = self.render_group(group, include_title=False, id_prefix=id_prefix) - section += group_node - - return section - - def render_group( - self, - group: ArgumentGroup, - include_title: bool = True, - *, - id_prefix: str = "", - ) -> argparse_group: - """Render an argument group. - - Parameters - ---------- - group : ArgumentGroup - The argument group to render. - include_title : bool - Whether to include the title in the group node. When False, - the title is assumed to come from a parent section node. - Default is True for backwards compatibility. - id_prefix : str - Optional prefix for argument IDs (e.g., "shell" -> "shell-h"). - Used to ensure unique IDs when multiple argparse directives exist - on the same page. - - Returns - ------- - argparse_group - Group node containing argument nodes. - """ - group_node = argparse_group() - - if include_title: - title = group.title - if self.config.group_title_prefix: - title = f"{self.config.group_title_prefix}{title}" - group_node["title"] = title - else: - # Title provided by parent section - group_node["title"] = "" - - group_node["description"] = group.description - - # Add individual arguments - for arg in group.arguments: - arg_node = self.render_argument(arg, id_prefix=id_prefix) - group_node.append(arg_node) - - # Add mutually exclusive groups - for mutex in group.mutually_exclusive: - mutex_nodes = self.render_mutex_group(mutex, id_prefix=id_prefix) - group_node.extend(mutex_nodes) - - return group_node - - def render_argument( - self, arg: ArgumentInfo, *, id_prefix: str = "" - ) -> argparse_argument: - """Render a single argument. - - Parameters - ---------- - arg : ArgumentInfo - The argument to render. - id_prefix : str - Optional prefix for the argument ID (e.g., "shell" -> "shell-L"). - Used to ensure unique IDs when multiple argparse directives exist - on the same page. - - Returns - ------- - argparse_argument - Argument node. - """ - arg_node = argparse_argument() - arg_node["names"] = arg.names - arg_node["help"] = arg.help - arg_node["metavar"] = arg.metavar - arg_node["required"] = arg.required - arg_node["id_prefix"] = id_prefix - - if self.config.show_defaults: - arg_node["default_string"] = arg.default_string - - if self.config.show_choices: - arg_node["choices"] = arg.choices - - if self.config.show_types: - arg_node["type_name"] = arg.type_name - - return arg_node - - def render_mutex_group( - self, mutex: MutuallyExclusiveGroup, *, id_prefix: str = "" - ) -> list[argparse_argument]: - """Render a mutually exclusive group. - - Parameters - ---------- - mutex : MutuallyExclusiveGroup - The mutually exclusive group. - id_prefix : str - Optional prefix for argument IDs (e.g., "shell" -> "shell-h"). - - Returns - ------- - list[argparse_argument] - List of argument nodes with mutex indicator. - """ - result: list[argparse_argument] = [] - for arg in mutex.arguments: - arg_node = self.render_argument(arg, id_prefix=id_prefix) - # Mark as part of mutex group - arg_node["mutex"] = True - arg_node["mutex_required"] = mutex.required - result.append(arg_node) - return result - - def render_subcommands( - self, subcommands: list[SubcommandInfo] - ) -> argparse_subcommands: - """Render subcommands section. - - Parameters - ---------- - subcommands : list[SubcommandInfo] - List of subcommand information. - - Returns - ------- - argparse_subcommands - Subcommands container node. - """ - container = argparse_subcommands() - container["title"] = "Sub-commands" - - for subcmd in subcommands: - subcmd_node = self.render_subcommand(subcmd) - container.append(subcmd_node) - - return container - - def render_subcommand(self, subcmd: SubcommandInfo) -> argparse_subcommand: - """Render a single subcommand. - - Parameters - ---------- - subcmd : SubcommandInfo - The subcommand information. - - Returns - ------- - argparse_subcommand - Subcommand node, potentially containing nested parser content. - """ - subcmd_node = argparse_subcommand() - subcmd_node["name"] = subcmd.name - subcmd_node["aliases"] = subcmd.aliases - subcmd_node["help"] = subcmd.help - - # Recursively render the subcommand's parser - if subcmd.parser: - nested_nodes = self.render(subcmd.parser) - subcmd_node.extend(nested_nodes) - - return subcmd_node - - def post_process(self, result_nodes: list[nodes.Node]) -> list[nodes.Node]: - """Post-process the rendered nodes. - - Override this method to apply transformations after rendering. - - Parameters - ---------- - result_nodes : list[nodes.Node] - The rendered nodes. - - Returns - ------- - list[nodes.Node] - Post-processed nodes. - """ - return result_nodes - - def _parse_text(self, text: str) -> list[nodes.Node]: - """Parse text as RST or MyST content. - - Parameters - ---------- - text : str - Text to parse. - - Returns - ------- - list[nodes.Node] - Parsed docutils nodes. - """ - if not text: - return [] - - # Escape RST emphasis patterns before parsing (e.g., "django-*" -> "django-\*") - text = escape_rst_emphasis(text) - - if self.state is None: - # No state machine available, return as paragraph - para = nodes.paragraph(text=text) - return [para] - - # Use the state machine to parse RST - container = nodes.container() - self.state.nested_parse( - StringList(text.split("\n")), - 0, - container, - ) - return list(container.children) - - -def create_renderer( - config: RenderConfig | None = None, - state: RSTState | None = None, - renderer_class: type[ArgparseRenderer] | None = None, -) -> ArgparseRenderer: - """Create a renderer instance. - - Parameters - ---------- - config : RenderConfig | None - Rendering configuration. - state : RSTState | None - RST state for parsing. - renderer_class : type[ArgparseRenderer] | None - Custom renderer class to use. - - Returns - ------- - ArgparseRenderer - Configured renderer instance. - """ - cls = renderer_class or ArgparseRenderer - return cls(config=config, state=state) diff --git a/docs/_ext/sphinx_argparse_neo/utils.py b/docs/_ext/sphinx_argparse_neo/utils.py deleted file mode 100644 index 468b1961fa..0000000000 --- a/docs/_ext/sphinx_argparse_neo/utils.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Text processing utilities for sphinx_argparse_neo. - -This module provides utilities for cleaning argparse output before rendering: -- strip_ansi: Remove ANSI escape codes (for when FORCE_COLOR is set) -""" - -from __future__ import annotations - -import re - -# ANSI escape code pattern - matches CSI sequences like \033[32m, \033[1;34m, etc. -_ANSI_RE = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def strip_ansi(text: str) -> str: - r"""Remove ANSI escape codes from text. - - When FORCE_COLOR is set in the environment, argparse may include ANSI - escape codes in its output. This function removes them so the output - renders correctly in Sphinx documentation. - - Parameters - ---------- - text : str - Text potentially containing ANSI codes. - - Returns - ------- - str - Text with ANSI codes removed. - - Examples - -------- - >>> strip_ansi("plain text") - 'plain text' - >>> strip_ansi("\033[32mgreen\033[0m") - 'green' - >>> strip_ansi("\033[1;34mbold blue\033[0m") - 'bold blue' - """ - return _ANSI_RE.sub("", text) - - -# RST emphasis pattern: matches -* that would trigger inline emphasis errors. -# Pattern matches: non-whitespace/non-backslash char, followed by -*, NOT followed by -# another * (which would be strong emphasis **). -_RST_EMPHASIS_RE = re.compile(r"(?<=[^\s\\])-\*(?!\*)") - - -def escape_rst_emphasis(text: str) -> str: - r"""Escape asterisks that would trigger RST inline emphasis. - - RST interprets ``*text*`` as emphasis. When argparse help text contains - glob patterns like ``django-*``, the ``-*`` sequence triggers RST - "Inline emphasis start-string without end-string" warnings. - - This function escapes such asterisks to prevent RST parsing errors. - - Parameters - ---------- - text : str - Text potentially containing problematic asterisks. - - Returns - ------- - str - Text with asterisks escaped where needed. - - Examples - -------- - >>> escape_rst_emphasis('tmuxp load "my-*"') - 'tmuxp load "my-\\*"' - >>> escape_rst_emphasis("plain text") - 'plain text' - >>> escape_rst_emphasis("*emphasis* is ok") - '*emphasis* is ok' - """ - return _RST_EMPHASIS_RE.sub(r"-\*", text) diff --git a/docs/_ext/sphinx_fonts.py b/docs/_ext/sphinx_fonts.py deleted file mode 100644 index 7a7e1a2780..0000000000 --- a/docs/_ext/sphinx_fonts.py +++ /dev/null @@ -1,209 +0,0 @@ -"""Sphinx extension for self-hosted fonts via Fontsource CDN. - -Downloads font files at build time, caches them locally, and passes -structured font data to the template context for inline @font-face CSS. -""" - -from __future__ import annotations - -import logging -import pathlib -import shutil -import typing as t -import urllib.error -import urllib.request - -if t.TYPE_CHECKING: - from sphinx.application import Sphinx - -logger = logging.getLogger(__name__) - -CDN_TEMPLATE = ( - "https://cdn.jsdelivr.net/npm/{package}@{version}" - "/files/{font_id}-{subset}-{weight}-{style}.woff2" -) - - -class SetupDict(t.TypedDict): - """Return type for Sphinx extension setup().""" - - version: str - parallel_read_safe: bool - parallel_write_safe: bool - - -def _cache_dir() -> pathlib.Path: - return pathlib.Path.home() / ".cache" / "sphinx-fonts" - - -def _cdn_url( - package: str, - version: str, - font_id: str, - subset: str, - weight: int, - style: str, -) -> str: - return CDN_TEMPLATE.format( - package=package, - version=version, - font_id=font_id, - subset=subset, - weight=weight, - style=style, - ) - - -# Unicode range descriptors per subset — tells the browser to only download -# the file when characters from this range appear on the page. Ranges are -# from Fontsource / Google Fonts CSS (CSS unicode-range values). -_UNICODE_RANGES: dict[str, str] = { - "latin": ( - "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6," - " U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F," - " U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215," - " U+FEFF, U+FFFD" - ), - "latin-ext": ( - "U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7," - " U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF," - " U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB," - " U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF" - ), - "cyrillic": ("U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116"), - "cyrillic-ext": ( - "U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F" - ), - "greek": ( - "U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF" - ), - "vietnamese": ( - "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169," - " U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304," - " U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB" - ), -} - - -def _unicode_range(subset: str) -> str: - """Return the CSS ``unicode-range`` descriptor for *subset*. - - Falls back to an empty string for unknown subsets (omitting the - descriptor causes the browser to treat the face as covering all - codepoints, which is the correct fallback). - - Parameters - ---------- - subset : str - Fontsource subset name (e.g. ``"latin"``, ``"latin-ext"``). - - Returns - ------- - str - CSS ``unicode-range`` value, or ``""`` if unknown. - """ - return _UNICODE_RANGES.get(subset, "") - - -def _download_font(url: str, dest: pathlib.Path) -> bool: - if dest.exists(): - logger.debug("font cached: %s", dest.name) - return True - dest.parent.mkdir(parents=True, exist_ok=True) - try: - urllib.request.urlretrieve(url, dest) - logger.info("downloaded font: %s", dest.name) - except (urllib.error.URLError, OSError): - if dest.exists(): - dest.unlink() - logger.warning("failed to download font: %s", url) - return False - return True - - -def _on_builder_inited(app: Sphinx) -> None: - if app.builder.format != "html": - return - - fonts: list[dict[str, t.Any]] = app.config.sphinx_fonts - variables: dict[str, str] = app.config.sphinx_font_css_variables - if not fonts: - return - - cache = _cache_dir() - static_dir = pathlib.Path(app.outdir) / "_static" - fonts_dir = static_dir / "fonts" - fonts_dir.mkdir(parents=True, exist_ok=True) - - font_faces: list[dict[str, str]] = [] - for font in fonts: - font_id = font["package"].split("/")[-1] - version = font["version"] - package = font["package"] - # Accept "subsets" (list) or legacy "subset" (str). - subsets: list[str] = font.get("subsets", [font.get("subset", "latin")]) - for subset in subsets: - for weight in font["weights"]: - for style in font["styles"]: - filename = f"{font_id}-{subset}-{weight}-{style}.woff2" - cached = cache / filename - url = _cdn_url(package, version, font_id, subset, weight, style) - if _download_font(url, cached): - shutil.copy2(cached, fonts_dir / filename) - font_faces.append( - { - "family": font["family"], - "style": style, - "weight": str(weight), - "filename": filename, - "unicode_range": _unicode_range(subset), - } - ) - - preload_hrefs: list[str] = [] - preload_specs: list[tuple[str, int, str]] = app.config.sphinx_font_preload - for family_name, weight, style in preload_specs: - for font in fonts: - if font["family"] == family_name: - font_id = font["package"].split("/")[-1] - # Preload the first (primary) subset only — typically "latin". - subsets = font.get("subsets", [font.get("subset", "latin")]) - primary = subsets[0] if subsets else "latin" - filename = f"{font_id}-{primary}-{weight}-{style}.woff2" - preload_hrefs.append(filename) - break - - fallbacks: list[dict[str, str]] = app.config.sphinx_font_fallbacks - - app._font_preload_hrefs = preload_hrefs # type: ignore[attr-defined] - app._font_faces = font_faces # type: ignore[attr-defined] - app._font_fallbacks = fallbacks # type: ignore[attr-defined] - app._font_css_variables = variables # type: ignore[attr-defined] - - -def _on_html_page_context( - app: Sphinx, - pagename: str, - templatename: str, - context: dict[str, t.Any], - doctree: t.Any, -) -> None: - context["font_preload_hrefs"] = getattr(app, "_font_preload_hrefs", []) - context["font_faces"] = getattr(app, "_font_faces", []) - context["font_fallbacks"] = getattr(app, "_font_fallbacks", []) - context["font_css_variables"] = getattr(app, "_font_css_variables", {}) - - -def setup(app: Sphinx) -> SetupDict: - """Register config values, events, and return extension metadata.""" - app.add_config_value("sphinx_fonts", [], "html") - app.add_config_value("sphinx_font_fallbacks", [], "html") - app.add_config_value("sphinx_font_css_variables", {}, "html") - app.add_config_value("sphinx_font_preload", [], "html") - app.connect("builder-inited", _on_builder_inited) - app.connect("html-page-context", _on_html_page_context) - return { - "version": "1.0", - "parallel_read_safe": True, - "parallel_write_safe": True, - } diff --git a/docs/_static/js/spa-nav.js b/docs/_static/js/spa-nav.js deleted file mode 100644 index cd99233fb7..0000000000 --- a/docs/_static/js/spa-nav.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * SPA-like navigation for Sphinx/Furo docs. - * - * Intercepts internal link clicks and swaps only the content that changes - * (article, sidebar nav tree, TOC drawer), preserving sidebar scroll - * position, theme state, and avoiding full-page reloads. - * - * Progressive enhancement: no-op when fetch/DOMParser/pushState unavailable. - */ -(function () { - "use strict"; - - if (!window.fetch || !window.DOMParser || !window.history?.pushState) return; - - // --- Theme toggle (replicates Furo's cycleThemeOnce) --- - - function cycleTheme() { - var current = localStorage.getItem("theme") || "auto"; - var prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - var next; - if (current === "auto") next = prefersDark ? "light" : "dark"; - else if (current === "dark") next = prefersDark ? "auto" : "light"; - else next = prefersDark ? "dark" : "auto"; - document.body.dataset.theme = next; - localStorage.setItem("theme", next); - } - - // --- Copy button injection --- - - var copyBtnTemplate = null; - - function captureCopyIcon() { - var btn = document.querySelector(".copybtn"); - if (btn) copyBtnTemplate = btn.cloneNode(true); - } - - function addCopyButtons() { - if (!copyBtnTemplate) captureCopyIcon(); - if (!copyBtnTemplate) return; - var cells = document.querySelectorAll("div.highlight pre"); - cells.forEach(function (cell, i) { - cell.id = "codecell" + i; - var next = cell.nextElementSibling; - if (next && next.classList.contains("copybtn")) { - next.setAttribute("data-clipboard-target", "#codecell" + i); - } else { - var btn = copyBtnTemplate.cloneNode(true); - btn.setAttribute("data-clipboard-target", "#codecell" + i); - cell.insertAdjacentElement("afterend", btn); - } - }); - } - - // --- Minimal scrollspy --- - - var scrollCleanup = null; - - function initScrollSpy() { - if (scrollCleanup) scrollCleanup(); - scrollCleanup = null; - - var links = document.querySelectorAll(".toc-tree a"); - if (!links.length) return; - - var entries = []; - links.forEach(function (a) { - var id = (a.getAttribute("href") || "").split("#")[1]; - var el = id && document.getElementById(id); - var li = a.closest("li"); - if (el && li) entries.push({ el: el, li: li }); - }); - if (!entries.length) return; - - function update() { - var offset = - parseFloat(getComputedStyle(document.documentElement).fontSize) * 4; - var active = null; - for (var i = entries.length - 1; i >= 0; i--) { - if (entries[i].el.getBoundingClientRect().top <= offset) { - active = entries[i]; - break; - } - } - entries.forEach(function (e) { - e.li.classList.remove("scroll-current"); - }); - if (active) active.li.classList.add("scroll-current"); - } - - window.addEventListener("scroll", update, { passive: true }); - update(); - scrollCleanup = function () { - window.removeEventListener("scroll", update); - }; - } - - // --- Link interception --- - - function shouldIntercept(link, e) { - if (e.defaultPrevented || e.button !== 0) return false; - if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) return false; - if (link.origin !== location.origin) return false; - if (link.target && link.target !== "_self") return false; - if (link.hasAttribute("download")) return false; - - var path = link.pathname; - if (!path.endsWith(".html") && !path.endsWith("/")) return false; - - var base = path.split("/").pop() || ""; - if ( - base === "search.html" || - base === "genindex.html" || - base === "py-modindex.html" - ) - return false; - - if (link.closest("#sidebar-projects")) return false; - if (link.pathname === location.pathname && link.hash) return false; - - return true; - } - - // --- DOM swap --- - - function swap(doc) { - [".article-container", ".sidebar-tree", ".toc-drawer"].forEach( - function (sel) { - var fresh = doc.querySelector(sel); - var stale = document.querySelector(sel); - if (fresh && stale) stale.replaceWith(fresh); - }, - ); - var title = doc.querySelector("title"); - if (title) document.title = title.textContent || ""; - - // Brand links and logo images live outside swapped regions. - // Their relative hrefs/srcs go stale after cross-depth navigation. - // Copy the correct values from the fetched document. - [".sidebar-brand", ".header-center a"].forEach(function (sel) { - var fresh = doc.querySelector(sel); - if (!fresh) return; - document.querySelectorAll(sel).forEach(function (el) { - el.setAttribute("href", fresh.getAttribute("href")); - }); - }); - var freshLogos = doc.querySelectorAll(".sidebar-logo"); - var staleLogos = document.querySelectorAll(".sidebar-logo"); - freshLogos.forEach(function (fresh, i) { - if (staleLogos[i]) { - staleLogos[i].setAttribute("src", fresh.getAttribute("src")); - } - }); - } - - function reinit() { - addCopyButtons(); - initScrollSpy(); - var btn = document.querySelector(".content-icon-container .theme-toggle"); - if (btn) btn.addEventListener("click", cycleTheme); - } - - // --- Navigation --- - - var currentCtrl = null; - - async function navigate(url, isPop) { - if (currentCtrl) currentCtrl.abort(); - var ctrl = new AbortController(); - currentCtrl = ctrl; - - try { - var resp = await fetch(url, { signal: ctrl.signal }); - if (!resp.ok) throw new Error(resp.status); - - var html = await resp.text(); - var doc = new DOMParser().parseFromString(html, "text/html"); - - if (!doc.querySelector(".article-container")) - throw new Error("no article"); - - var applySwap = function () { - swap(doc); - - if (!isPop) history.pushState({ spa: true }, "", url); - - if (!isPop) { - var hash = new URL(url, location.href).hash; - if (hash) { - var el = document.querySelector(hash); - if (el) el.scrollIntoView(); - } else { - window.scrollTo(0, 0); - } - } - - reinit(); - }; - - if (document.startViewTransition) { - document.startViewTransition(applySwap); - } else { - applySwap(); - } - } catch (err) { - if (err.name === "AbortError") return; - window.location.href = url; - } finally { - if (currentCtrl === ctrl) currentCtrl = null; - } - } - - // --- Events --- - - document.addEventListener("click", function (e) { - var link = e.target.closest("a[href]"); - if (link && shouldIntercept(link, e)) { - e.preventDefault(); - navigate(link.href, false); - } - }); - - history.replaceState({ spa: true }, ""); - - window.addEventListener("popstate", function () { - navigate(location.href, true); - }); - - // --- Hover prefetch --- - - var prefetchTimer = null; - - document.addEventListener("mouseover", function (e) { - var link = e.target.closest("a[href]"); - if (!link || link.origin !== location.origin) return; - if (!link.pathname.endsWith(".html") && !link.pathname.endsWith("/")) - return; - - clearTimeout(prefetchTimer); - prefetchTimer = setTimeout(function () { - fetch(link.href, { priority: "low" }).catch(function () {}); - }, 65); - }); - - document.addEventListener("mouseout", function (e) { - if (e.target.closest("a[href]")) clearTimeout(prefetchTimer); - }); - - // --- Init --- - - // Copy buttons are injected by copybutton.js on DOMContentLoaded. - // This defer script runs before DOMContentLoaded, so our handler - // fires after copybutton's handler (registration order preserved). - document.addEventListener("DOMContentLoaded", captureCopyIcon); -})(); diff --git a/docs/conf.py b/docs/conf.py index 0e393d32e3..208f183724 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,19 +1,9 @@ -# flake8: NOQA: E501 """Sphinx documentation configuration for tmuxp.""" from __future__ import annotations -import contextlib -import inspect import pathlib import sys -import typing as t -from os.path import relpath - -import tmuxp - -if t.TYPE_CHECKING: - from sphinx.application import Sphinx # Get the project root dir, which is the parent dir of this cwd = pathlib.Path(__file__).parent @@ -21,272 +11,38 @@ src_root = project_root / "src" sys.path.insert(0, str(src_root)) -sys.path.insert(0, str(cwd / "_ext")) +sys.path.insert(0, str(cwd / "_ext")) # for local aafig extension # package data about: dict[str, str] = {} with (src_root / "tmuxp" / "__about__.py").open() as fp: exec(fp.read(), about) -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx_autodoc_typehints", - "sphinx.ext.todo", - "sphinx.ext.napoleon", - "sphinx.ext.linkcode", - "aafig", - "sphinx_fonts", - "argparse_exemplar", # Custom sphinx-argparse replacement - "sphinx_inline_tabs", - "sphinx_copybutton", - "sphinxext.opengraph", - "sphinxext.rediraffe", - "myst_parser", - "linkify_issues", - "sphinx_design", -] - -myst_enable_extensions = [ - "colon_fence", - "substitution", - "replacements", - "strikethrough", - "linkify", -] - -myst_heading_anchors = 4 - -templates_path = ["_templates"] - -source_suffix = {".rst": "restructuredtext", ".md": "markdown"} - -master_doc = "index" - -project = about["__title__"] -project_copyright = about["__copyright__"] - -version = "{}".format(".".join(about["__version__"].split("."))[:2]) -release = "{}".format(about["__version__"]) - -exclude_patterns = ["_build"] - -pygments_style = "monokai" -pygments_dark_style = "monokai" - -html_css_files = ["css/custom.css", "css/argparse-highlight.css"] -html_extra_path = ["manifest.json"] -html_static_path = ["_static"] -html_favicon = "_static/favicon.ico" -html_theme = "furo" -html_theme_path: list[str] = [] -html_theme_options: dict[str, str | list[dict[str, str]]] = { - "light_logo": "img/tmuxp.svg", - "dark_logo": "img/tmuxp.svg", - "footer_icons": [ - { - "name": "GitHub", - "url": about["__github__"], - "html": """ - - - - """, - "class": "", - }, - ], - "source_repository": f"{about['__github__']}/", - "source_branch": "master", - "source_directory": "docs/", -} -html_sidebars = { - "**": [ - "sidebar/scroll-start.html", - "sidebar/brand.html", - "sidebar/search.html", - "sidebar/navigation.html", - "sidebar/projects.html", - "sidebar/scroll-end.html", - ], -} - -# linkify_issues -issue_url_tpl = about["__github__"] + "/issues/{issue_id}" - -# sphinx.ext.autodoc -toc_object_entries_show_parents = "hide" -autodoc_default_options = { - "undoc-members": True, - "members": True, - "private-members": True, - "show-inheritance": True, - "member-order": "bysource", -} - -# sphinx-autodoc-typehints -# Suppress warnings for forward references that can't be resolved -# (types in TYPE_CHECKING blocks used for circular import avoidance) -suppress_warnings = [ - "sphinx_autodoc_typehints.forward_reference", -] - -# sphinxext.opengraph -ogp_site_url = about["__docs__"] -ogp_image = "_static/img/icons/icon-192x192.png" -ogp_site_name = about["__title__"] - -# sphinx-copybutton -copybutton_prompt_text = ( - r">>> |\.\.\. |> |\$ |\# | In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " -) -copybutton_prompt_is_regexp = True -copybutton_remove_prompts = True -copybutton_line_continuation_character = "\\" - -# sphinxext-rediraffe -rediraffe_redirects = "redirects.txt" -rediraffe_branch = "master~1" - -# aafig format, try to get working with pdf -aafig_format = {"latex": "pdf", "html": "gif"} -aafig_default_options = {"scale": 0.75, "aspect": 0.5, "proportional": True} - -# sphinx_fonts — self-hosted IBM Plex via Fontsource CDN -sphinx_fonts = [ - { - "family": "IBM Plex Sans", - "package": "@fontsource/ibm-plex-sans", - "version": "5.2.8", - "weights": [400, 500, 600, 700], - "styles": ["normal", "italic"], - "subsets": ["latin", "latin-ext"], +from gp_sphinx.config import make_linkcode_resolve, merge_sphinx_config # noqa: E402 + +import tmuxp # noqa: E402 + +conf = merge_sphinx_config( + project=about["__title__"], + version=about["__version__"], + copyright=about["__copyright__"], + source_repository=f"{about['__github__']}/", + docs_url=about["__docs__"], + source_branch="master", + light_logo="img/tmuxp.svg", + dark_logo="img/tmuxp.svg", + extra_extensions=["aafig", "sphinx_argparse_neo.exemplar"], + intersphinx_mapping={ + "python": ("https://docs.python.org/", None), + "libtmux": ("https://libtmux.git-pull.com/", None), }, - { - "family": "IBM Plex Mono", - "package": "@fontsource/ibm-plex-mono", - "version": "5.2.7", - "weights": [400, 500, 600, 700], - "styles": ["normal", "italic"], - "subsets": ["latin", "latin-ext"], - }, -] - -sphinx_font_preload = [ - ("IBM Plex Sans", 400, "normal"), # body text - ("IBM Plex Sans", 700, "normal"), # headings - ("IBM Plex Mono", 400, "normal"), # code blocks -] - -sphinx_font_fallbacks = [ - { - "family": "IBM Plex Sans Fallback", - "src": 'local("Arial"), local("Helvetica Neue"), local("Helvetica")', - "size_adjust": "110.6%", - "ascent_override": "92.7%", - "descent_override": "24.9%", - "line_gap_override": "0%", - }, - { - "family": "IBM Plex Mono Fallback", - "src": 'local("Courier New"), local("Courier")', - "size_adjust": "100%", - "ascent_override": "102.5%", - "descent_override": "27.5%", - "line_gap_override": "0%", - }, -] - -sphinx_font_css_variables = { - "--font-stack": '"IBM Plex Sans", "IBM Plex Sans Fallback", -apple-system, BlinkMacSystemFont, sans-serif', - "--font-stack--monospace": '"IBM Plex Mono", "IBM Plex Mono Fallback", SFMono-Regular, Menlo, Consolas, monospace', - "--font-stack--headings": "var(--font-stack)", -} - -intersphinx_mapping = { - "python": ("https://docs.python.org/", None), - "libtmux": ("https://libtmux.git-pull.com/", None), -} - - -def linkcode_resolve(domain: str, info: dict[str, str]) -> None | str: - """ - Determine the URL corresponding to Python object. - - Notes - ----- - From https://github.com/numpy/numpy/blob/v1.15.1/doc/source/conf.py, 7c49cfa - on Jul 31. License BSD-3. https://github.com/numpy/numpy/blob/v1.15.1/LICENSE.txt - """ - if domain != "py": - return None - - modname = info["module"] - fullname = info["fullname"] - - submod = sys.modules.get(modname) - if submod is None: - return None - - obj = submod - for part in fullname.split("."): - try: - obj = getattr(obj, part) - except Exception: # NOQA: PERF203 - return None - - # strip decorators, which would resolve to the source of the decorator - # possibly an upstream bug in getsourcefile, bpo-1764286 - try: - unwrap = inspect.unwrap - except AttributeError: - pass - else: - if callable(obj): - obj = unwrap(obj) - - try: - fn = inspect.getsourcefile(obj) - except Exception: - fn = None - if not fn: - return None - - try: - source, lineno = inspect.getsourcelines(obj) - except Exception: - lineno = None - - linespec = f"#L{lineno}-L{lineno + len(source) - 1}" if lineno else "" - - fn = relpath(fn, start=pathlib.Path(tmuxp.__file__).parent) - - if "dev" in about["__version__"]: - return "{}/blob/master/{}/{}/{}{}".format( - about["__github__"], - "src", - about["__package_name__"], - fn, - linespec, - ) - return "{}/blob/v{}/{}/{}/{}{}".format( - about["__github__"], - about["__version__"], - "src", - about["__package_name__"], - fn, - linespec, - ) - - -def remove_tabs_js(app: Sphinx, exc: Exception) -> None: - """Fix for sphinx-inline-tabs#18.""" - if app.builder.format == "html" and not exc: - tabs_js = pathlib.Path(app.builder.outdir) / "_static" / "tabs.js" - with contextlib.suppress(FileNotFoundError): - tabs_js.unlink() # When python 3.7 deprecated, use missing_ok=True - - -def setup(app: Sphinx) -> None: - """Sphinx setup hook.""" - app.add_js_file("js/spa-nav.js", loading_method="defer") - app.connect("build-finished", remove_tabs_js) + linkcode_resolve=make_linkcode_resolve(tmuxp, about["__github__"]), + # tmuxp-specific overrides + html_css_files=["css/custom.css"], + html_extra_path=["manifest.json"], + html_favicon="_static/favicon.ico", + aafig_format={"latex": "pdf", "html": "gif"}, + aafig_default_options={"scale": 0.75, "aspect": 0.5, "proportional": True}, + rediraffe_redirects="redirects.txt", +) +globals().update(conf) diff --git a/tests/docs/_ext/conftest.py b/tests/docs/_ext/conftest.py index fa2919bdcf..3124d5b7b7 100644 --- a/tests/docs/_ext/conftest.py +++ b/tests/docs/_ext/conftest.py @@ -1,11 +1,3 @@ """Fixtures and configuration for docs extension tests.""" from __future__ import annotations - -import pathlib -import sys - -# Add docs/_ext to path so we can import the extension module -docs_ext_path = pathlib.Path(__file__).parent.parent.parent.parent / "docs" / "_ext" -if str(docs_ext_path) not in sys.path: - sys.path.insert(0, str(docs_ext_path)) diff --git a/tests/docs/_ext/test_argparse_exemplar.py b/tests/docs/_ext/test_argparse_exemplar.py index 18679827d5..c25b48f9da 100644 --- a/tests/docs/_ext/test_argparse_exemplar.py +++ b/tests/docs/_ext/test_argparse_exemplar.py @@ -13,7 +13,8 @@ import typing as t import pytest -from argparse_exemplar import ( # type: ignore[import-not-found] +from docutils import nodes +from sphinx_argparse_neo.exemplar import ( ExemplarConfig, _extract_sections_from_container, _is_examples_section, @@ -26,7 +27,6 @@ process_node, transform_definition_list, ) -from docutils import nodes # --- is_examples_term tests --- diff --git a/tests/docs/_ext/test_argparse_lexer.py b/tests/docs/_ext/test_argparse_lexer.py index 7a621f1093..d5966007a8 100644 --- a/tests/docs/_ext/test_argparse_lexer.py +++ b/tests/docs/_ext/test_argparse_lexer.py @@ -5,7 +5,7 @@ import typing as t import pytest -from argparse_lexer import ( +from sphinx_argparse_neo.lexer import ( ArgparseHelpLexer, ArgparseLexer, ArgparseUsageLexer, diff --git a/tests/docs/_ext/test_argparse_roles.py b/tests/docs/_ext/test_argparse_roles.py index c31e12691a..08093c2481 100644 --- a/tests/docs/_ext/test_argparse_roles.py +++ b/tests/docs/_ext/test_argparse_roles.py @@ -5,7 +5,8 @@ import typing as t import pytest -from argparse_roles import ( +from docutils import nodes +from sphinx_argparse_neo.roles import ( cli_choice_role, cli_command_role, cli_default_role, @@ -14,7 +15,6 @@ normalize_options, register_roles, ) -from docutils import nodes # --- normalize_options tests --- diff --git a/tests/docs/_ext/test_cli_usage_lexer.py b/tests/docs/_ext/test_cli_usage_lexer.py index 3c32ebac6d..fab92a3d14 100644 --- a/tests/docs/_ext/test_cli_usage_lexer.py +++ b/tests/docs/_ext/test_cli_usage_lexer.py @@ -5,7 +5,7 @@ import typing as t import pytest -from cli_usage_lexer import ( +from sphinx_argparse_neo.cli_usage_lexer import ( CLIUsageLexer, tokenize_usage, ) diff --git a/tests/docs/_ext/test_sphinx_fonts.py b/tests/docs/_ext/test_sphinx_fonts.py index e96a879be3..67c2f31216 100644 --- a/tests/docs/_ext/test_sphinx_fonts.py +++ b/tests/docs/_ext/test_sphinx_fonts.py @@ -623,7 +623,7 @@ def test_setup_return_value() -> None: result = sphinx_fonts.setup(app) assert result == { - "version": "1.0", + "version": sphinx_fonts.__version__, "parallel_read_safe": True, "parallel_write_safe": True, } From b5ecfb4fdac34908cc10f7b88c4062e3828900bb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 29 Mar 2026 10:15:47 -0500 Subject: [PATCH 2802/2998] docs(chore): Remove files now provided by sphinx-gptheme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: All removed files are now bundled in sphinx-gptheme and loaded automatically, making local copies pure maintenance debt. what: - Delete argparse-highlight.css — identical to theme bundled version - Delete custom.css — replaced by tmuxp.css (12-line project-specific aspect-ratio overrides only; all generic CSS now from theme) - Delete _templates/page.html — identical to theme version; mask-icon moved to theme_options.mask_icon instead of hardcoded in template - Delete _templates/sidebar/brand.html — identical to theme version - Delete _templates/sidebar/projects.html — identical to theme version - Add docs/_static/css/tmuxp.css with only tmuxp-specific image aspect-ratio rules (tmuxp-demo, tmuxp-shell, tmuxp-dev-screenshot) - Update conf.py: css/custom.css → css/tmuxp.css, add theme_options={"mask_icon": "/_static/img/tmuxp.svg"} - Update uv.lock to gp-sphinx init-2 commit c2fe249 (theme: move mask-icon outside show_meta_app_icon_tags guard) --- docs/_static/css/argparse-highlight.css | 437 ------------------------ docs/_static/css/custom.css | 246 ------------- docs/_static/css/tmuxp.css | 12 + docs/_templates/page.html | 79 ----- docs/_templates/sidebar/brand.html | 18 - docs/_templates/sidebar/projects.html | 84 ----- docs/conf.py | 3 +- 7 files changed, 14 insertions(+), 865 deletions(-) delete mode 100644 docs/_static/css/argparse-highlight.css delete mode 100644 docs/_static/css/custom.css create mode 100644 docs/_static/css/tmuxp.css delete mode 100644 docs/_templates/page.html delete mode 100644 docs/_templates/sidebar/brand.html delete mode 100644 docs/_templates/sidebar/projects.html diff --git a/docs/_static/css/argparse-highlight.css b/docs/_static/css/argparse-highlight.css deleted file mode 100644 index f232c71c8c..0000000000 --- a/docs/_static/css/argparse-highlight.css +++ /dev/null @@ -1,437 +0,0 @@ -/* - * Argparse/CLI Highlighting Styles - * - * Styles for CLI inline roles and argparse help output highlighting. - * Uses "One Dark" inspired color palette (Python 3.14 argparse style). - * - * Color Palette: - * Background: #282C34 - * Default text: #CCCED4 - * Usage label: #61AFEF (blue, bold) - * Program name: #C678DD (purple, bold) - * Subcommands: #98C379 (green) - * Options: #56B6C2 (teal) - * Metavars: #E5C07B (yellow, italic) - * Choices: #98C379 (green) - * Headings: #E5E5E5 (bright, bold) - * Punctuation: #CCCED4 - */ - -/* ========================================================================== - Inline Role Styles - ========================================================================== */ - -/* - * Shared monospace font and code font-size for all CLI inline roles - */ -.cli-option, -.cli-metavar, -.cli-command, -.cli-default, -.cli-choice { - font-family: var(--font-stack--monospace); - font-size: var(--code-font-size); -} - -/* - * CLI Options - * - * Long options (--verbose) and short options (-h) both use teal color. - */ -.cli-option-long, -.cli-option-short { - color: #56b6c2; -} - -/* - * CLI Metavars - * - * Placeholder values like FILE, PATH, DIRECTORY. - * Yellow/amber to indicate "replace me" - distinct from flags (teal). - */ -.cli-metavar { - color: #e5c07b; - font-style: italic; -} - -/* - * CLI Commands and Choices - * - * Both use green to indicate valid enumerated values. - * Commands: subcommand names like sync, add, list - * Choices: enumeration values like json, yaml, table - */ -.cli-command, -.cli-choice { - color: #98c379; -} - -.cli-command { - font-weight: bold; -} - -/* - * CLI Default Values - * - * Default values shown in help text like None, "auto". - * Subtle styling to not distract from options. - */ -.cli-default { - color: #ccced4; - font-style: italic; -} - -/* ========================================================================== - Argparse Code Block Highlighting - ========================================================================== */ - -/* - * These styles apply within Pygments-highlighted code blocks using the - * argparse, argparse-usage, or argparse-help lexers. - */ - -/* Usage heading "usage:" - bold blue */ -.highlight-argparse .gh, -.highlight-argparse-usage .gh, -.highlight-argparse-help .gh { - color: #61afef; - font-weight: bold; -} - -/* Section headers like "positional arguments:", "options:" - neutral bright */ -.highlight-argparse .gs, -.highlight-argparse-help .gs { - color: #e5e5e5; - font-weight: bold; -} - -/* Long options --foo - teal */ -.highlight-argparse .nt, -.highlight-argparse-usage .nt, -.highlight-argparse-help .nt { - color: #56b6c2; - font-weight: normal; -} - -/* Short options -h - teal (same as long) */ -.highlight-argparse .na, -.highlight-argparse-usage .na, -.highlight-argparse-help .na { - color: #56b6c2; - font-weight: normal; -} - -/* Metavar placeholders FILE, PATH - yellow/amber italic */ -.highlight-argparse .nv, -.highlight-argparse-usage .nv, -.highlight-argparse-help .nv { - color: #e5c07b; - font-style: italic; -} - -/* Command/program names - purple bold */ -.highlight-argparse .nl, -.highlight-argparse-usage .nl, -.highlight-argparse-help .nl { - color: #c678dd; - font-weight: bold; -} - -/* Subcommands - bold green */ -.highlight-argparse .nf, -.highlight-argparse-usage .nf, -.highlight-argparse-help .nf { - color: #98c379; - font-weight: bold; -} - -/* Choice values - green */ -.highlight-argparse .no, -.highlight-argparse-usage .no, -.highlight-argparse-help .no, -.highlight-argparse .nc, -.highlight-argparse-usage .nc, -.highlight-argparse-help .nc { - color: #98c379; -} - -/* Punctuation [], {}, () - neutral gray */ -.highlight-argparse .p, -.highlight-argparse-usage .p, -.highlight-argparse-help .p { - color: #ccced4; -} - -/* Operators like | - neutral gray */ -.highlight-argparse .o, -.highlight-argparse-usage .o, -.highlight-argparse-help .o { - color: #ccced4; - font-weight: normal; -} - -/* ========================================================================== - Argparse Directive Highlighting (.. argparse:: output) - ========================================================================== */ - -/* - * These styles apply to the argparse directive output which uses custom - * nodes rendered by sphinx_argparse_neo. The directive adds highlight spans - * directly to the HTML output. - */ - -/* - * Usage Block (.argparse-usage) - * - * The usage block now has both .argparse-usage and .highlight-argparse-usage - * classes. The .highlight-argparse-usage selectors above already handle the - * token highlighting. These selectors provide fallback and ensure consistent - * styling. - */ - -/* Usage block container - match Pygments monokai background and code block styling */ -pre.argparse-usage { - background: var(--argparse-code-background); - font-size: var(--code-font-size); - padding: 0.625rem 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; - scrollbar-color: var(--color-foreground-border) transparent; - scrollbar-width: thin; -} - -.argparse-usage .gh { - color: #61afef; - font-weight: bold; -} - -.argparse-usage .nt { - color: #56b6c2; - font-weight: normal; -} - -.argparse-usage .na { - color: #56b6c2; - font-weight: normal; -} - -.argparse-usage .nv { - color: #e5c07b; - font-style: italic; -} - -.argparse-usage .nl { - color: #c678dd; - font-weight: bold; -} - -.argparse-usage .nf { - color: #98c379; - font-weight: bold; -} - -.argparse-usage .no, -.argparse-usage .nc { - color: #98c379; -} - -.argparse-usage .o { - color: #ccced4; - font-weight: normal; -} - -.argparse-usage .p { - color: #ccced4; -} - -/* - * Argument Name (
    ) - * - * The argument names in the dl/dt structure are highlighted with - * semantic spans for options and metavars. - */ -.argparse-argument-name .nt { - color: #56b6c2; - font-weight: normal; -} - -.argparse-argument-name .na { - color: #56b6c2; - font-weight: normal; -} - -.argparse-argument-name .nv { - color: #e5c07b; - font-style: italic; -} - -.argparse-argument-name .nl { - color: #c678dd; - font-weight: bold; -} - -/* ========================================================================== - Argument Wrapper and Linking Styles - ========================================================================== */ - -/* - * Argparse-specific code background (monokai #272822) - * Uses a custom variable to avoid affecting Furo's --color-inline-code-background. - */ -:root { - --argparse-code-background: #272822; -} - -/* - * Background styling for argument names - subtle background like code.literal - * This provides visual weight and hierarchy for argument definitions. - */ -.argparse-argument-name { - background: var(--argparse-code-background); - border-radius: 0.2rem; - padding: 0.485rem 0.875rem; - font-family: var(--font-stack--monospace); - font-size: var(--code-font-size); - width: fit-content; - position: relative; -} - -/* - * Wrapper for linking - enables scroll-margin for fixed header navigation - * and :target pseudo-class for highlighting when linked. - */ -.argparse-argument-wrapper { - scroll-margin-top: 2.5rem; -} - -/* - * Headerlink anchor (¶) - hidden until hover - * Positioned outside the dt element to the right. - * Follows Sphinx documentation convention for linkable headings. - */ -.argparse-argument-name .headerlink { - visibility: hidden; - position: absolute; - right: -1.5rem; - top: 50%; - transform: translateY(-50%); - color: var(--color-foreground-secondary); - text-decoration: none; -} - -/* - * Show headerlink on hover or when targeted via URL fragment - */ -.argparse-argument-wrapper:hover .headerlink, -.argparse-argument-wrapper:target .headerlink { - visibility: visible; -} - -.argparse-argument-name .headerlink:hover:not(:visited) { - color: var(--color-foreground-primary); -} - -/* - * Light mode headerlink color overrides - * Needed because code block has dark background regardless of theme - */ -body[data-theme="light"] .argparse-argument-name .headerlink { - color: #9ca0a5; - - &:hover:not(:visited) { - color: #cfd0d0; - } -} - -@media (prefers-color-scheme: light) { - body:not([data-theme="dark"]) .argparse-argument-name .headerlink { - color: #9ca0a5; - - &:hover:not(:visited) { - color: #cfd0d0; - } - } -} - -/* - * Highlight when targeted via URL fragment - * Uses Furo's highlight-on-target color for consistency. - */ -.argparse-argument-wrapper:target .argparse-argument-name { - background-color: var(--color-highlight-on-target); -} - -/* - * Argument metadata definition list - * - * Renders metadata (Default, Type, Choices, Required) as a horizontal - * flexbox of key-value pairs and standalone tags. - */ -.argparse-argument-meta { - margin: 0.5rem 0 0 0; - padding: 0; - display: flex; - flex-wrap: wrap; - gap: 0.5rem 1rem; - align-items: center; -} - -.argparse-meta-item { - display: flex; - align-items: center; - gap: 0.25rem; -} - -.argparse-meta-key { - color: var(--color-foreground-secondary, #6c757d); - font-size: var(--code-font-size); -} - -.argparse-meta-key::after { - content: ":"; -} - -.argparse-meta-value .nv { - background: var(--argparse-code-background); - border-radius: 0.2rem; - padding: 0.1rem 0.3rem; - font-family: var(--font-stack--monospace); - font-size: var(--code-font-size); - color: #e5c07b; -} - -/* - * Meta tag (e.g., "Required") - follows Furo's guilabel pattern - * Uses semi-transparent amber background with border for visibility - * without the harshness of solid fills. Amber conveys "needs attention". - */ -.argparse-meta-tag { - background-color: #fef3c780; - border: 1px solid #fcd34d80; - color: var(--color-foreground-primary); - font-size: var(--code-font-size); - padding: 0.1rem 0.4rem; - border-radius: 0.2rem; - font-weight: 500; -} - -/* Dark mode: darker amber with adjusted border */ -body[data-theme="dark"] .argparse-meta-tag { - background-color: #78350f60; - border-color: #b4530980; -} - -@media (prefers-color-scheme: dark) { - body:not([data-theme="light"]) .argparse-meta-tag { - background-color: #78350f60; - border-color: #b4530980; - } -} - -/* - * Help text description - * Adds spacing above for visual separation from argument name. - */ -.argparse-argument-help { - padding-block-start: 0.5rem; -} diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css deleted file mode 100644 index ed6640c746..0000000000 --- a/docs/_static/css/custom.css +++ /dev/null @@ -1,246 +0,0 @@ -.sidebar-tree p.indented-block { - padding: var(--sidebar-item-spacing-vertical) - var(--sidebar-item-spacing-horizontal) 0 - var(--sidebar-item-spacing-horizontal); - margin-bottom: 0; -} - -.sidebar-tree p.indented-block span.indent { - margin-left: var(--sidebar-item-spacing-horizontal); - display: block; -} - -.sidebar-tree p.indented-block .project-name { - font-size: var(--sidebar-item-font-size); - font-weight: bold; - margin-right: calc(var(--sidebar-item-spacing-horizontal) / 2.5); -} - -#sidebar-projects:not(.ready) { - visibility: hidden; -} - -.sidebar-tree .active { - font-weight: bold; -} - -/* ── Global heading refinements ───────────────────────────── - * Biome-inspired scale: medium weight (500) throughout — size - * and spacing carry hierarchy, not boldness. H4-H6 add eyebrow - * treatment (uppercase, muted). `article` prefix overrides - * Furo's bare h1-h6 selectors. - * ────────────────────────────────────────────────────────── */ -article h1 { - font-size: 1.8em; - font-weight: 500; - margin-top: 1.5rem; - margin-bottom: 0.75rem; -} - -article h2 { - font-size: 1.6em; - font-weight: 500; - margin-top: 2.5rem; - margin-bottom: 0.5rem; -} - -article h3 { - font-size: 1.15em; - font-weight: 500; - margin-top: 1.5rem; - margin-bottom: 0.375rem; -} - -article h4 { - font-size: 0.85em; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.05em; - color: var(--color-foreground-secondary); - margin-top: 1rem; - margin-bottom: 0.25rem; -} - -article h5 { - font-size: 0.8em; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.05em; - color: var(--color-foreground-secondary); -} - -article h6 { - font-size: 0.75em; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.05em; - color: var(--color-foreground-secondary); -} - -/* ── Changelog heading extras ─────────────────────────────── - * Vertical spacing separates consecutive version entries. - * Category headings (h3) are muted. Item headings (h4) are - * subtle. Targets #history section from CHANGES markdown. - * ────────────────────────────────────────────────────────── */ - -/* Spacing between consecutive version entries */ -#history > section + section { - margin-top: 2.5rem; -} - -/* Category headings — muted secondary color */ -#history h3 { - color: var(--color-foreground-secondary); - margin-top: 1.25rem; -} - -/* Item headings — subtle, same size as body */ -#history h4 { - font-size: 1em; - margin-top: 1rem; - text-transform: none; - letter-spacing: normal; - color: inherit; -} - -/* ── Right-panel TOC refinements ──────────────────────────── - * Adjust Furo's table-of-contents proportions for better - * readability. Inspired by Starlight defaults (Biome docs). - * Uses Furo CSS variable overrides where possible. - * ────────────────────────────────────────────────────────── */ - -/* TOC font sizes: override Furo defaults (75% → 87.5%) */ -:root { - --toc-font-size: var(--font-size--small); /* 87.5% = 14px */ - --toc-title-font-size: var(--font-size--small); /* 87.5% = 14px */ -} - -/* More generous line-height for wrapped TOC entries */ -.toc-tree { - line-height: 1.4; -} - -/* ── Flexible right-panel TOC (inner-panel padding) ───────── - * Furo hardcodes .toc-drawer to width: 15em (SASS, compiled). - * min-width: 18em overrides it; long TOC entries wrap inside - * the box instead of blowing past the viewport. - * - * Padding lives on .toc-sticky (the inner panel), not on - * .toc-drawer (the outer aside). This matches Biome/Starlight - * where the aside defines dimensions and an inner wrapper - * (.right-sidebar-panel) controls content insets. The - * scrollbar sits naturally between content and viewport edge. - * - * Content area gets flex: 1 to absorb extra space on wide - * screens. At ≤82em Furo collapses the TOC to position: fixed; - * override right offset so the drawer fully hides off-screen. - * ────────────────────────────────────────────────────────── */ -.toc-drawer { - min-width: 18em; - flex-shrink: 0; - padding-right: 0; -} - -.toc-sticky { - padding-right: 1.5em; -} - -.content { - width: auto; - max-width: 46em; - flex: 1 1 46em; - padding: 0 2em; -} - -@media (max-width: 82em) { - .toc-drawer { - right: -18em; - } -} - -/* ── Body typography refinements ──────────────────────────── - * Improve paragraph readability with wider line-height and - * sharper text rendering. Furo already sets font-smoothing. - * - * IBM Plex tracks slightly wide at default spacing; -0.01em - * tightens it to feel more natural (matches tony.sh/tony.nl). - * Kerning + ligatures polish AV/To pairs and fi/fl combos. - * ────────────────────────────────────────────────────────── */ -body { - text-rendering: optimizeLegibility; - font-kerning: normal; - font-variant-ligatures: common-ligatures; - letter-spacing: -0.01em; -} - -/* ── Code block text rendering ──────────────────────────── - * Monospace needs fixed-width columns: disable kerning, - * ligatures, and letter-spacing that body sets for prose. - * optimizeSpeed skips heuristics that can shift the grid. - * ────────────────────────────────────────────────────────── */ -pre, -code, -kbd, -samp { - text-rendering: optimizeSpeed; - font-kerning: none; - font-variant-ligatures: none; - letter-spacing: normal; -} - -article { - line-height: 1.6; -} - -/* ── Image layout shift prevention ──────────────────────── - * Reserve space for images before they load. Furo already - * sets max-width: 100%; height: auto on img. We add - * content-visibility and badge-specific height to prevent CLS. - * ────────────────────────────────────────────────────────── */ - -img { - content-visibility: auto; -} - -/* Docutils emits :width:/:height: as inline CSS (style="width: Xpx; - * height: Ypx;") rather than HTML attributes. When Furo's - * max-width: 100% constrains width below the declared value, - * the fixed height causes distortion. height: auto + aspect-ratio - * lets the browser compute the correct height from the intrinsic - * ratio once loaded; before load, aspect-ratio reserves space - * at the intended proportion — preventing both CLS and distortion. */ -article img[loading="lazy"] { - height: auto !important; -} - -/* Per-image aspect ratios for CLS reservation before load */ -img[src*="tmuxp-demo"] { - aspect-ratio: 888 / 589; -} - -img[src*="tmuxp-shell"] { - aspect-ratio: 878 / 109; -} - -img[src*="tmuxp-dev-screenshot"] { - aspect-ratio: 1030 / 605; -} - -img[src*="shields.io"], -img[src*="badge.svg"], -img[src*="codecov.io"] { - height: 20px; - width: auto; - min-width: 60px; - border-radius: 3px; - background: var(--color-background-secondary); -} - -/* ── View Transitions (SPA navigation) ──────────────────── - * Crossfade between pages during SPA navigation. - * Browsers without View Transitions API get instant swap. - * ────────────────────────────────────────────────────────── */ -::view-transition-old(root), -::view-transition-new(root) { - animation-duration: 150ms; -} diff --git a/docs/_static/css/tmuxp.css b/docs/_static/css/tmuxp.css new file mode 100644 index 0000000000..326a8e765b --- /dev/null +++ b/docs/_static/css/tmuxp.css @@ -0,0 +1,12 @@ +/* Per-image aspect ratios for CLS reservation before load */ +img[src*="tmuxp-demo"] { + aspect-ratio: 888 / 589; +} + +img[src*="tmuxp-shell"] { + aspect-ratio: 878 / 109; +} + +img[src*="tmuxp-dev-screenshot"] { + aspect-ratio: 1030 / 605; +} diff --git a/docs/_templates/page.html b/docs/_templates/page.html deleted file mode 100644 index 0c1ad27ea1..0000000000 --- a/docs/_templates/page.html +++ /dev/null @@ -1,79 +0,0 @@ -{% extends "!page.html" %} -{%- block extrahead %} - {{ super() }} - {%- for href in font_preload_hrefs|default([]) %} - - {%- endfor %} - {%- if font_faces is defined and font_faces %} - - {%- endif %} - {%- if theme_show_meta_manifest_tag == true %} - - {% endif -%} - {%- if theme_show_meta_og_tags == true %} - - - - - - - - - - - - - - - - {% endif -%} - {%- if theme_show_meta_app_icon_tags == true %} - - - - - - - - - - - - - - - - - - - - {% endif -%} -{% endblock %} diff --git a/docs/_templates/sidebar/brand.html b/docs/_templates/sidebar/brand.html deleted file mode 100644 index 7fe241c009..0000000000 --- a/docs/_templates/sidebar/brand.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/docs/_templates/sidebar/projects.html b/docs/_templates/sidebar/projects.html deleted file mode 100644 index f70e6fe032..0000000000 --- a/docs/_templates/sidebar/projects.html +++ /dev/null @@ -1,84 +0,0 @@ - - diff --git a/docs/conf.py b/docs/conf.py index 208f183724..4451c405fb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -38,7 +38,8 @@ }, linkcode_resolve=make_linkcode_resolve(tmuxp, about["__github__"]), # tmuxp-specific overrides - html_css_files=["css/custom.css"], + theme_options={"mask_icon": "/_static/img/tmuxp.svg"}, + html_css_files=["css/tmuxp.css"], html_extra_path=["manifest.json"], html_favicon="_static/favicon.ico", aafig_format={"latex": "pdf", "html": "gif"}, From 7b8b142c887c2117fd19d84a10aaedb7f466eb9b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 29 Mar 2026 10:24:57 -0500 Subject: [PATCH 2803/2998] =?UTF-8?q?docs(chore):=20Drop=20tmuxp.css=20?= =?UTF-8?q?=E2=80=94=20project-specific=20CLS=20rules=20not=20needed=20for?= =?UTF-8?q?=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/_static/css/tmuxp.css | 12 ------------ docs/conf.py | 1 - 2 files changed, 13 deletions(-) delete mode 100644 docs/_static/css/tmuxp.css diff --git a/docs/_static/css/tmuxp.css b/docs/_static/css/tmuxp.css deleted file mode 100644 index 326a8e765b..0000000000 --- a/docs/_static/css/tmuxp.css +++ /dev/null @@ -1,12 +0,0 @@ -/* Per-image aspect ratios for CLS reservation before load */ -img[src*="tmuxp-demo"] { - aspect-ratio: 888 / 589; -} - -img[src*="tmuxp-shell"] { - aspect-ratio: 878 / 109; -} - -img[src*="tmuxp-dev-screenshot"] { - aspect-ratio: 1030 / 605; -} diff --git a/docs/conf.py b/docs/conf.py index 4451c405fb..c2afba8c45 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -39,7 +39,6 @@ linkcode_resolve=make_linkcode_resolve(tmuxp, about["__github__"]), # tmuxp-specific overrides theme_options={"mask_icon": "/_static/img/tmuxp.svg"}, - html_css_files=["css/tmuxp.css"], html_extra_path=["manifest.json"], html_favicon="_static/favicon.ico", aafig_format={"latex": "pdf", "html": "gif"}, From ff9580d4956f537a7fe7e296d2b2389496efe518 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Apr 2026 06:24:14 -0500 Subject: [PATCH 2804/2998] test(sphinx_fonts): Remove tests for APIs not in packaged sphinx_fonts why: After rebasing onto master, trunk's unicode-range/multi-subset tests reference _unicode_range, _UNICODE_RANGES, and subset-aware _on_builder_inited which existed in the local docs/_ext/sphinx_fonts.py but are not yet in the packaged sphinx_fonts from gp-sphinx. what: - Remove 4 _unicode_range / _UNICODE_RANGES unit tests - Remove 2 _on_builder_inited tests for multi-subset and unicode_range support --- tests/docs/_ext/test_sphinx_fonts.py | 98 ---------------------------- 1 file changed, 98 deletions(-) diff --git a/tests/docs/_ext/test_sphinx_fonts.py b/tests/docs/_ext/test_sphinx_fonts.py index 67c2f31216..df59c5208a 100644 --- a/tests/docs/_ext/test_sphinx_fonts.py +++ b/tests/docs/_ext/test_sphinx_fonts.py @@ -96,36 +96,6 @@ def test_cdn_url_matches_template() -> None: assert url.endswith(".woff2") -# --- _unicode_range tests --- - - -def test_unicode_range_latin() -> None: - """_unicode_range returns a non-empty range for 'latin'.""" - result = sphinx_fonts._unicode_range("latin") - assert result.startswith("U+") - assert "U+0000" in result - - -def test_unicode_range_latin_ext() -> None: - """_unicode_range returns a non-empty range for 'latin-ext'.""" - result = sphinx_fonts._unicode_range("latin-ext") - assert result.startswith("U+") - assert result != sphinx_fonts._unicode_range("latin") - - -def test_unicode_range_unknown_subset() -> None: - """_unicode_range returns empty string for unknown subsets.""" - result = sphinx_fonts._unicode_range("klingon") - assert result == "" - - -def test_unicode_range_all_known_subsets_non_empty() -> None: - """Every subset in _UNICODE_RANGES produces a non-empty range.""" - for subset, urange in sphinx_fonts._UNICODE_RANGES.items(): - assert urange.startswith("U+"), f"subset {subset!r} has invalid range" - assert sphinx_fonts._unicode_range(subset) == urange - - # --- _download_font tests --- @@ -367,74 +337,6 @@ def test_on_builder_inited_explicit_subset( assert app._font_faces[0]["filename"] == "noto-sans-latin-ext-400-normal.woff2" -def test_on_builder_inited_multiple_subsets( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited downloads files for each subset and includes unicode_range.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/ibm-plex-sans", - "version": "5.2.8", - "family": "IBM Plex Sans", - "subsets": ["latin", "latin-ext"], - "weights": [400], - "styles": ["normal"], - }, - ] - app = _make_app(tmp_path, fonts=fonts) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "ibm-plex-sans-latin-400-normal.woff2").write_bytes(b"data") - (cache / "ibm-plex-sans-latin-ext-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert len(app._font_faces) == 2 - filenames = [f["filename"] for f in app._font_faces] - assert "ibm-plex-sans-latin-400-normal.woff2" in filenames - assert "ibm-plex-sans-latin-ext-400-normal.woff2" in filenames - - # unicode_range should be populated for known subsets - latin_face = next(f for f in app._font_faces if "latin-400" in f["filename"]) - assert latin_face["unicode_range"].startswith("U+") - latin_ext_face = next(f for f in app._font_faces if "latin-ext" in f["filename"]) - assert latin_ext_face["unicode_range"].startswith("U+") - assert latin_face["unicode_range"] != latin_ext_face["unicode_range"] - - -def test_on_builder_inited_legacy_subset_gets_unicode_range( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """Legacy single 'subset' config still produces unicode_range in font_faces.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/noto-sans", - "version": "5.0.0", - "family": "Noto Sans", - "subset": "latin", - "weights": [400], - "styles": ["normal"], - }, - ] - app = _make_app(tmp_path, fonts=fonts) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "noto-sans-latin-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert len(app._font_faces) == 1 - assert app._font_faces[0]["unicode_range"].startswith("U+") - - def test_on_builder_inited_preload_uses_primary_subset( tmp_path: pathlib.Path, monkeypatch: pytest.MonkeyPatch, From 52b16afd274c5ebaed5aefa43e86b28bd16b01c7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Apr 2026 06:31:17 -0500 Subject: [PATCH 2805/2998] chore(mypy): Remove unused ignore_missing_imports overrides why: After gp-sphinx migration, these modules are only imported in docs/ and tests/docs/ which are excluded from mypy scanning. what: - Remove aafigure, sphinx_argparse_neo, sphinx_fonts, docutils, pygments from mypy overrides --- pyproject.toml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 50327c2125..9920ead065 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -152,18 +152,10 @@ enable_incomplete_feature = [] [[tool.mypy.overrides]] module = [ "shtab", - "aafigure", "IPython.*", "ptpython.*", "prompt_toolkit.*", "bpython", - "sphinx_argparse_neo", - "sphinx_argparse_neo.*", - "sphinx_fonts", - "docutils", - "docutils.*", - "pygments", - "pygments.*", ] ignore_missing_imports = true From 202af50760544c6a8862078c5cf98f671870e0da Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 05:39:11 -0500 Subject: [PATCH 2806/2998] fix(mypy): Add aafigure to ignore_missing_imports overrides --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 9920ead065..a2ac7eb53e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -156,6 +156,7 @@ module = [ "ptpython.*", "prompt_toolkit.*", "bpython", + "aafigure", ] ignore_missing_imports = true From 7a2d63bd7113ee95e4453b4c15c17d70c63925fb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 06:00:16 -0500 Subject: [PATCH 2807/2998] test(docs/_ext): Remove upstream extension tests now covered by PyPI packages why: sphinx-fonts and sphinx-argparse-neo are now standalone PyPI packages (0.0.1a0). Their test suites live upstream; tmuxp should not duplicate or maintain them. what: - Remove tests/docs/_ext/test_sphinx_fonts.py - Remove tests/docs/_ext/sphinx_argparse_neo/ (7 test files) - Remove tests/docs/_ext/test_argparse_{exemplar,lexer,roles}.py - Remove tests/docs/_ext/test_cli_usage_lexer.py - Remove tests/docs/__init__.py and supporting conftest/init files --- tests/docs/__init__.py | 3 - tests/docs/_ext/__init__.py | 3 - tests/docs/_ext/conftest.py | 3 - .../docs/_ext/sphinx_argparse_neo/__init__.py | 3 - .../docs/_ext/sphinx_argparse_neo/conftest.py | 237 ---- .../_ext/sphinx_argparse_neo/test_compat.py | 330 ----- .../_ext/sphinx_argparse_neo/test_nodes.py | 614 ---------- .../_ext/sphinx_argparse_neo/test_parser.py | 524 -------- .../_ext/sphinx_argparse_neo/test_renderer.py | 498 -------- .../_ext/sphinx_argparse_neo/test_utils.py | 162 --- tests/docs/_ext/test_argparse_exemplar.py | 1073 ----------------- tests/docs/_ext/test_argparse_lexer.py | 825 ------------- tests/docs/_ext/test_argparse_roles.py | 439 ------- tests/docs/_ext/test_cli_usage_lexer.py | 358 ------ tests/docs/_ext/test_sphinx_fonts.py | 576 --------- 15 files changed, 5648 deletions(-) delete mode 100644 tests/docs/__init__.py delete mode 100644 tests/docs/_ext/__init__.py delete mode 100644 tests/docs/_ext/conftest.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/__init__.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/conftest.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/test_compat.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/test_nodes.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/test_parser.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/test_renderer.py delete mode 100644 tests/docs/_ext/sphinx_argparse_neo/test_utils.py delete mode 100644 tests/docs/_ext/test_argparse_exemplar.py delete mode 100644 tests/docs/_ext/test_argparse_lexer.py delete mode 100644 tests/docs/_ext/test_argparse_roles.py delete mode 100644 tests/docs/_ext/test_cli_usage_lexer.py delete mode 100644 tests/docs/_ext/test_sphinx_fonts.py diff --git a/tests/docs/__init__.py b/tests/docs/__init__.py deleted file mode 100644 index b6723bfd09..0000000000 --- a/tests/docs/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Tests for documentation extensions.""" - -from __future__ import annotations diff --git a/tests/docs/_ext/__init__.py b/tests/docs/_ext/__init__.py deleted file mode 100644 index 56548488ec..0000000000 --- a/tests/docs/_ext/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Tests for docs/_ext Sphinx extensions.""" - -from __future__ import annotations diff --git a/tests/docs/_ext/conftest.py b/tests/docs/_ext/conftest.py deleted file mode 100644 index 3124d5b7b7..0000000000 --- a/tests/docs/_ext/conftest.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Fixtures and configuration for docs extension tests.""" - -from __future__ import annotations diff --git a/tests/docs/_ext/sphinx_argparse_neo/__init__.py b/tests/docs/_ext/sphinx_argparse_neo/__init__.py deleted file mode 100644 index 259f37c931..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Tests for sphinx_argparse_neo extension.""" - -from __future__ import annotations diff --git a/tests/docs/_ext/sphinx_argparse_neo/conftest.py b/tests/docs/_ext/sphinx_argparse_neo/conftest.py deleted file mode 100644 index c805df1f30..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/conftest.py +++ /dev/null @@ -1,237 +0,0 @@ -"""Fixtures and configuration for sphinx_argparse_neo tests.""" - -from __future__ import annotations - -import argparse -import pathlib -import sys - -import pytest - -# Add docs/_ext to path so we can import the extension module -docs_ext_path = ( - pathlib.Path(__file__).parent.parent.parent.parent.parent / "docs" / "_ext" -) -if str(docs_ext_path) not in sys.path: - sys.path.insert(0, str(docs_ext_path)) - - -@pytest.fixture -def simple_parser() -> argparse.ArgumentParser: - """Create a simple parser with basic arguments. - - Returns - ------- - argparse.ArgumentParser - Parser with a positional argument and a couple of options. - """ - parser = argparse.ArgumentParser( - prog="myapp", - description="A simple test application", - ) - parser.add_argument("filename", help="Input file to process") - parser.add_argument( - "-v", "--verbose", action="store_true", help="Enable verbose mode" - ) - parser.add_argument("-o", "--output", metavar="FILE", help="Output file") - return parser - - -@pytest.fixture -def parser_with_groups() -> argparse.ArgumentParser: - """Create a parser with custom argument groups. - - Returns - ------- - argparse.ArgumentParser - Parser with multiple argument groups. - """ - parser = argparse.ArgumentParser(prog="grouped", description="Parser with groups") - - input_group = parser.add_argument_group("Input Options", "Options for input") - input_group.add_argument("--input", "-i", required=True, help="Input file") - input_group.add_argument("--format", choices=["json", "yaml"], help="Input format") - - output_group = parser.add_argument_group("Output Options", "Options for output") - output_group.add_argument("--output", "-o", help="Output file") - output_group.add_argument("--pretty", action="store_true", help="Pretty print") - - return parser - - -@pytest.fixture -def parser_with_subcommands() -> argparse.ArgumentParser: - """Create a parser with subcommands. - - Returns - ------- - argparse.ArgumentParser - Parser with subparsers. - """ - parser = argparse.ArgumentParser(prog="cli", description="CLI with subcommands") - parser.add_argument("-v", "--verbose", action="store_true", help="Verbose mode") - - subparsers = parser.add_subparsers(dest="command", help="Available commands") - - # Sync subcommand - sync_parser = subparsers.add_parser("sync", help="Synchronize repositories") - sync_parser.add_argument("repo", nargs="?", help="Repository to sync") - sync_parser.add_argument("-f", "--force", action="store_true", help="Force sync") - - # Add subcommand - add_parser = subparsers.add_parser("add", aliases=["a"], help="Add a repository") - add_parser.add_argument("url", help="Repository URL") - add_parser.add_argument("-n", "--name", help="Repository name") - - return parser - - -@pytest.fixture -def parser_with_mutex() -> argparse.ArgumentParser: - """Create a parser with mutually exclusive arguments. - - Returns - ------- - argparse.ArgumentParser - Parser with mutually exclusive group. - """ - parser = argparse.ArgumentParser(prog="mutex", description="Parser with mutex") - - mutex = parser.add_mutually_exclusive_group(required=True) - mutex.add_argument("-v", "--verbose", action="store_true", help="Verbose output") - mutex.add_argument("-q", "--quiet", action="store_true", help="Quiet output") - - return parser - - -@pytest.fixture -def parser_with_all_actions() -> argparse.ArgumentParser: - """Create a parser with all action types. - - Returns - ------- - argparse.ArgumentParser - Parser demonstrating all action types. - """ - parser = argparse.ArgumentParser(prog="actions", description="All action types") - - # store (default) - parser.add_argument("--name", help="Store action") - - # store_const - parser.add_argument( - "--enable", action="store_const", const="enabled", help="Store const" - ) - - # store_true / store_false - parser.add_argument("--flag", action="store_true", help="Store true") - parser.add_argument("--no-flag", action="store_false", help="Store false") - - # append - parser.add_argument("--item", action="append", help="Append action") - - # append_const - parser.add_argument( - "--debug", - action="append_const", - const="debug", - dest="features", - help="Append const", - ) - - # count - parser.add_argument("-v", "--verbose", action="count", default=0, help="Count") - - # BooleanOptionalAction (Python 3.9+) - parser.add_argument( - "--option", action=argparse.BooleanOptionalAction, help="Boolean optional" - ) - - return parser - - -@pytest.fixture -def parser_with_types() -> argparse.ArgumentParser: - """Create a parser with typed arguments. - - Returns - ------- - argparse.ArgumentParser - Parser with various type specifications. - """ - parser = argparse.ArgumentParser(prog="types", description="Typed arguments") - - parser.add_argument("--count", type=int, help="Integer argument") - parser.add_argument("--ratio", type=float, help="Float argument") - parser.add_argument("--path", type=pathlib.Path, help="Path argument") - parser.add_argument("--choice", type=str, choices=["a", "b", "c"], help="Choices") - - return parser - - -@pytest.fixture -def parser_with_nargs() -> argparse.ArgumentParser: - """Create a parser demonstrating nargs variants. - - Returns - ------- - argparse.ArgumentParser - Parser with various nargs specifications. - """ - parser = argparse.ArgumentParser(prog="nargs", description="Nargs variants") - - parser.add_argument("single", help="Single positional") - parser.add_argument("optional", nargs="?", default="default", help="Optional") - parser.add_argument("zero_or_more", nargs="*", help="Zero or more") - parser.add_argument("--one-or-more", nargs="+", help="One or more") - parser.add_argument("--exactly-two", nargs=2, metavar=("A", "B"), help="Exactly 2") - parser.add_argument("remainder", nargs=argparse.REMAINDER, help="Remainder") - - return parser - - -@pytest.fixture -def parser_with_defaults() -> argparse.ArgumentParser: - """Create a parser with various default values. - - Returns - ------- - argparse.ArgumentParser - Parser demonstrating default handling. - """ - parser = argparse.ArgumentParser(prog="defaults") - - parser.add_argument("--none-default", default=None, help="None default") - parser.add_argument("--string-default", default="hello", help="String default") - parser.add_argument("--int-default", default=42, type=int, help="Int default") - parser.add_argument("--list-default", default=[1, 2], help="List default") - parser.add_argument("--suppress", default=argparse.SUPPRESS, help=argparse.SUPPRESS) - - return parser - - -@pytest.fixture -def nested_subcommands_parser() -> argparse.ArgumentParser: - """Create a parser with nested subcommands. - - Returns - ------- - argparse.ArgumentParser - Parser with multiple levels of subparsers. - """ - parser = argparse.ArgumentParser(prog="nested", description="Nested subcommands") - - level1 = parser.add_subparsers(dest="level1") - - # First level: repo - repo = level1.add_parser("repo", help="Repository commands") - repo_subs = repo.add_subparsers(dest="level2") - - # Second level: repo clone - clone = repo_subs.add_parser("clone", help="Clone a repository") - clone.add_argument("url", help="Repository URL") - - # Second level: repo list - repo_subs.add_parser("list", help="List repositories") - - return parser diff --git a/tests/docs/_ext/sphinx_argparse_neo/test_compat.py b/tests/docs/_ext/sphinx_argparse_neo/test_compat.py deleted file mode 100644 index 417e29a6e1..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/test_compat.py +++ /dev/null @@ -1,330 +0,0 @@ -"""Tests for sphinx_argparse_neo.compat module.""" - -from __future__ import annotations - -import sys -import typing as t - -import pytest -from sphinx_argparse_neo.compat import ( - MockModule, - get_parser_from_entry_point, - get_parser_from_module, - import_module, - mock_imports, -) - -# --- MockModule tests --- - - -def test_mock_module_name() -> None: - """Test MockModule name attribute.""" - mock = MockModule("mypackage.submodule") - assert mock.__name__ == "mypackage.submodule" - - -def test_mock_module_repr() -> None: - """Test MockModule string representation.""" - mock = MockModule("mypackage") - assert repr(mock) == "" - - -def test_mock_module_getattr() -> None: - """Test MockModule attribute access.""" - mock = MockModule("mypackage") - child = mock.submodule - - assert isinstance(child, MockModule) - assert child.__name__ == "mypackage.submodule" - - -def test_mock_module_nested_getattr() -> None: - """Test MockModule nested attribute access.""" - mock = MockModule("pkg") - deep = mock.level1.level2.level3 - - assert deep.__name__ == "pkg.level1.level2.level3" - - -def test_mock_module_callable() -> None: - """Test MockModule is callable.""" - mock = MockModule("mypackage") - result = mock() - - assert result is mock - - -def test_mock_module_callable_with_args() -> None: - """Test MockModule callable with arguments.""" - mock = MockModule("mypackage") - result = mock(1, 2, 3, key="value") - - assert result is mock - - -def test_mock_module_chained_call() -> None: - """Test MockModule chained attribute access and call.""" - mock = MockModule("pkg") - result = mock.SomeClass() - - assert isinstance(result, MockModule) - - -# --- mock_imports context manager tests --- - - -def test_mock_imports_adds_to_sys_modules() -> None: - """Test that mock_imports adds modules to sys.modules.""" - module_name = "test_fake_module_xyz" - - assert module_name not in sys.modules - - with mock_imports([module_name]): - assert module_name in sys.modules - assert isinstance(sys.modules[module_name], MockModule) - - assert module_name not in sys.modules - - -def test_mock_imports_multiple_modules() -> None: - """Test mocking multiple modules.""" - modules = ["fake_a", "fake_b", "fake_c"] - - with mock_imports(modules): - for name in modules: - assert name in sys.modules - - for name in modules: - assert name not in sys.modules - - -def test_mock_imports_nested_modules() -> None: - """Test mocking nested module paths.""" - modules = ["fake_pkg", "fake_pkg.sub", "fake_pkg.sub.deep"] - - with mock_imports(modules): - for name in modules: - assert name in sys.modules - - for name in modules: - assert name not in sys.modules - - -def test_mock_imports_does_not_override_existing() -> None: - """Test that mock_imports doesn't override existing modules.""" - # argparse is already imported - original = sys.modules["argparse"] - - with mock_imports(["argparse"]): - # Should not be replaced - assert sys.modules["argparse"] is original - - assert sys.modules["argparse"] is original - - -def test_mock_imports_cleanup_on_exception() -> None: - """Test that mock_imports cleans up even on exception.""" - module_name = "fake_exception_test" - exc_msg = "Test exception" - - with pytest.raises(ValueError), mock_imports([module_name]): - assert module_name in sys.modules - raise ValueError(exc_msg) - - assert module_name not in sys.modules - - -def test_mock_imports_allows_import() -> None: - """Test that mocked modules can be imported.""" - module_name = "fake_importable" - - with mock_imports([module_name]): - # This should work without ImportError - import fake_importable # type: ignore[import-not-found] - - assert fake_importable.__name__ == "fake_importable" - - -# --- import_module tests --- - - -def test_import_module_builtin() -> None: - """Test importing a built-in module.""" - mod = import_module("argparse") - assert hasattr(mod, "ArgumentParser") - - -def test_import_module_stdlib() -> None: - """Test importing a stdlib module.""" - mod = import_module("os.path") - assert hasattr(mod, "join") - - -def test_import_module_not_found() -> None: - """Test importing a non-existent module.""" - with pytest.raises(ModuleNotFoundError): - import_module("nonexistent_module_xyz") - - -# --- get_parser_from_module tests --- - - -def test_get_parser_from_module_argparse() -> None: - """Test getting parser from argparse module itself.""" - # Create a test module with a parser factory - import types - - test_module = types.ModuleType("test_parser_module") - - def create_parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="test") - - test_module.create_parser = create_parser # type: ignore[attr-defined] - sys.modules["test_parser_module"] = test_module - - try: - parser = get_parser_from_module("test_parser_module", "create_parser") - assert parser.prog == "test" - finally: - del sys.modules["test_parser_module"] - - -def test_get_parser_from_module_with_mock() -> None: - """Test getting parser with mocked dependencies.""" - import types - - test_module = types.ModuleType("test_mock_parser") - - def create_parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="mocked") - - test_module.create_parser = create_parser # type: ignore[attr-defined] - sys.modules["test_mock_parser"] = test_module - - try: - parser = get_parser_from_module( - "test_mock_parser", - "create_parser", - mock_modules=["fake_dependency"], - ) - assert parser.prog == "mocked" - finally: - del sys.modules["test_mock_parser"] - - -def test_get_parser_from_module_dotted_path() -> None: - """Test getting parser from class method.""" - import types - - test_module = types.ModuleType("test_class_parser") - - class CLI: - @staticmethod - def create_parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="from_class") - - test_module.CLI = CLI # type: ignore[attr-defined] - sys.modules["test_class_parser"] = test_module - - try: - parser = get_parser_from_module("test_class_parser", "CLI.create_parser") - assert parser.prog == "from_class" - finally: - del sys.modules["test_class_parser"] - - -def test_get_parser_from_module_not_found() -> None: - """Test error when module not found.""" - with pytest.raises(ModuleNotFoundError): - get_parser_from_module("nonexistent_xyz", "func") - - -def test_get_parser_from_module_func_not_found() -> None: - """Test error when function not found.""" - with pytest.raises(AttributeError): - get_parser_from_module("argparse", "nonexistent_func") - - -# --- get_parser_from_entry_point tests --- - - -def test_get_parser_from_entry_point_valid() -> None: - """Test parsing valid entry point format.""" - import types - - test_module = types.ModuleType("test_entry_point") - - def get_parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="entry") - - test_module.get_parser = get_parser # type: ignore[attr-defined] - sys.modules["test_entry_point"] = test_module - - try: - parser = get_parser_from_entry_point("test_entry_point:get_parser") - assert parser.prog == "entry" - finally: - del sys.modules["test_entry_point"] - - -def test_get_parser_from_entry_point_invalid_format() -> None: - """Test error on invalid entry point format.""" - with pytest.raises(ValueError) as exc_info: - get_parser_from_entry_point("no_colon_separator") - - assert "Invalid entry point format" in str(exc_info.value) - - -def test_get_parser_from_entry_point_with_class() -> None: - """Test entry point with class method.""" - import types - - test_module = types.ModuleType("test_entry_class") - - class Factory: - @staticmethod - def parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="factory") - - test_module.Factory = Factory # type: ignore[attr-defined] - sys.modules["test_entry_class"] = test_module - - try: - parser = get_parser_from_entry_point("test_entry_class:Factory.parser") - assert parser.prog == "factory" - finally: - del sys.modules["test_entry_class"] - - -def test_get_parser_from_entry_point_with_mock() -> None: - """Test entry point with mocked modules.""" - import types - - test_module = types.ModuleType("test_entry_mock") - - def make_parser() -> t.Any: - import argparse - - return argparse.ArgumentParser(prog="with_mock") - - test_module.make_parser = make_parser # type: ignore[attr-defined] - sys.modules["test_entry_mock"] = test_module - - try: - parser = get_parser_from_entry_point( - "test_entry_mock:make_parser", - mock_modules=["some_optional_dep"], - ) - assert parser.prog == "with_mock" - finally: - del sys.modules["test_entry_mock"] diff --git a/tests/docs/_ext/sphinx_argparse_neo/test_nodes.py b/tests/docs/_ext/sphinx_argparse_neo/test_nodes.py deleted file mode 100644 index f00594c1dd..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/test_nodes.py +++ /dev/null @@ -1,614 +0,0 @@ -"""Tests for sphinx_argparse_neo.nodes module.""" - -from __future__ import annotations - -import re -import typing as t - -import pytest -from docutils import nodes -from sphinx_argparse_neo.nodes import ( - _generate_argument_id, - argparse_argument, - argparse_group, - argparse_program, - argparse_subcommand, - argparse_subcommands, - argparse_usage, -) - -# --- Node creation tests --- - - -def test_argparse_program_creation() -> None: - """Test creating argparse_program node.""" - node = argparse_program() - node["prog"] = "myapp" - - assert node["prog"] == "myapp" - assert isinstance(node, nodes.General) - assert isinstance(node, nodes.Element) - - -def test_argparse_usage_creation() -> None: - """Test creating argparse_usage node.""" - node = argparse_usage() - node["usage"] = "myapp [-h] [--verbose] command" - - assert node["usage"] == "myapp [-h] [--verbose] command" - - -def test_argparse_group_creation() -> None: - """Test creating argparse_group node.""" - node = argparse_group() - node["title"] = "Output Options" - node["description"] = "Control output format" - - assert node["title"] == "Output Options" - assert node["description"] == "Control output format" - - -def test_argparse_argument_creation() -> None: - """Test creating argparse_argument node.""" - node = argparse_argument() - node["names"] = ["-v", "--verbose"] - node["help"] = "Enable verbose mode" - node["metavar"] = None - node["required"] = False - - assert node["names"] == ["-v", "--verbose"] - assert node["help"] == "Enable verbose mode" - - -def test_argparse_subcommands_creation() -> None: - """Test creating argparse_subcommands node.""" - node = argparse_subcommands() - node["title"] = "Commands" - - assert node["title"] == "Commands" - - -def test_argparse_subcommand_creation() -> None: - """Test creating argparse_subcommand node.""" - node = argparse_subcommand() - node["name"] = "sync" - node["aliases"] = ["s"] - node["help"] = "Synchronize repositories" - - assert node["name"] == "sync" - assert node["aliases"] == ["s"] - - -# --- Node nesting tests --- - - -def test_program_can_contain_usage() -> None: - """Test that program node can contain usage node.""" - program = argparse_program() - program["prog"] = "myapp" - - usage = argparse_usage() - usage["usage"] = "myapp [-h]" - - program.append(usage) - - assert len(program.children) == 1 - assert isinstance(program.children[0], argparse_usage) - - -def test_program_can_contain_groups() -> None: - """Test that program node can contain group nodes.""" - program = argparse_program() - - group1 = argparse_group() - group1["title"] = "Positional Arguments" - - group2 = argparse_group() - group2["title"] = "Optional Arguments" - - program.append(group1) - program.append(group2) - - assert len(program.children) == 2 - - -def test_group_can_contain_arguments() -> None: - """Test that group node can contain argument nodes.""" - group = argparse_group() - group["title"] = "Options" - - arg1 = argparse_argument() - arg1["names"] = ["-v"] - - arg2 = argparse_argument() - arg2["names"] = ["-o"] - - group.append(arg1) - group.append(arg2) - - assert len(group.children) == 2 - - -def test_subcommands_can_contain_subcommand() -> None: - """Test that subcommands container can contain subcommand nodes.""" - container = argparse_subcommands() - container["title"] = "Commands" - - sub1 = argparse_subcommand() - sub1["name"] = "sync" - - sub2 = argparse_subcommand() - sub2["name"] = "add" - - container.append(sub1) - container.append(sub2) - - assert len(container.children) == 2 - - -def test_subcommand_can_contain_program() -> None: - """Test that subcommand can contain nested program (for recursion).""" - subcommand = argparse_subcommand() - subcommand["name"] = "sync" - - nested_program = argparse_program() - nested_program["prog"] = "myapp sync" - - subcommand.append(nested_program) - - assert len(subcommand.children) == 1 - assert isinstance(subcommand.children[0], argparse_program) - - -# --- Attribute handling tests --- - - -def test_argument_with_all_attributes() -> None: - """Test argument node with all possible attributes.""" - node = argparse_argument() - node["names"] = ["-f", "--file"] - node["help"] = "Input file" - node["metavar"] = "FILE" - node["required"] = True - node["default_string"] = "input.txt" - node["choices"] = ["a", "b", "c"] - node["type_name"] = "str" - node["mutex"] = False - node["mutex_required"] = False - - assert node["names"] == ["-f", "--file"] - assert node["help"] == "Input file" - assert node["metavar"] == "FILE" - assert node["required"] is True - assert node["default_string"] == "input.txt" - assert node["choices"] == ["a", "b", "c"] - assert node["type_name"] == "str" - - -def test_argument_with_mutex_marker() -> None: - """Test argument node marked as part of mutex group.""" - node = argparse_argument() - node["names"] = ["-v"] - node["mutex"] = True - node["mutex_required"] = True - - assert node["mutex"] is True - assert node["mutex_required"] is True - - -def test_node_get_with_default() -> None: - """Test getting attributes with defaults.""" - node = argparse_argument() - node["names"] = ["-v"] - - # Attribute that exists - assert node.get("names") == ["-v"] - - # Attribute that doesn't exist - get() returns None - assert node.get("nonexistent") is None - - # Attribute with explicit default - assert node.get("help", "default help") == "default help" - - -# --- Full tree construction test --- - - -def test_full_node_tree() -> None: - """Test constructing a complete node tree.""" - # Root program - program = argparse_program() - program["prog"] = "myapp" - - # Usage - usage = argparse_usage() - usage["usage"] = "myapp [-h] [-v] command" - program.append(usage) - - # Positional group - pos_group = argparse_group() - pos_group["title"] = "Positional Arguments" - - cmd_arg = argparse_argument() - cmd_arg["names"] = ["command"] - cmd_arg["help"] = "Command to run" - pos_group.append(cmd_arg) - program.append(pos_group) - - # Optional group - opt_group = argparse_group() - opt_group["title"] = "Optional Arguments" - - verbose = argparse_argument() - verbose["names"] = ["-v", "--verbose"] - verbose["help"] = "Verbose mode" - opt_group.append(verbose) - program.append(opt_group) - - # Subcommands - subs = argparse_subcommands() - subs["title"] = "Commands" - - sync_sub = argparse_subcommand() - sync_sub["name"] = "sync" - sync_sub["help"] = "Sync repos" - subs.append(sync_sub) - - program.append(subs) - - # Verify tree structure - assert len(program.children) == 4 # usage, pos_group, opt_group, subs - assert isinstance(program.children[0], argparse_usage) - assert isinstance(program.children[1], argparse_group) - assert isinstance(program.children[2], argparse_group) - assert isinstance(program.children[3], argparse_subcommands) - - -# --- ID generation tests --- - - -def test_generate_argument_id_short_option() -> None: - """Test ID generation for short option.""" - assert _generate_argument_id(["-L"]) == "L" - - -def test_generate_argument_id_long_option() -> None: - """Test ID generation for long option.""" - assert _generate_argument_id(["--help"]) == "help" - - -def test_generate_argument_id_multiple_names() -> None: - """Test ID generation for argument with multiple names.""" - assert _generate_argument_id(["-v", "--verbose"]) == "v-verbose" - - -def test_generate_argument_id_with_prefix() -> None: - """Test ID generation with prefix for namespace isolation.""" - assert _generate_argument_id(["-L"], "shell") == "shell-L" - assert _generate_argument_id(["--help"], "load") == "load-help" - - -def test_generate_argument_id_positional() -> None: - """Test ID generation for positional argument.""" - assert _generate_argument_id(["filename"]) == "filename" - - -def test_generate_argument_id_empty() -> None: - """Test ID generation with empty names list.""" - assert _generate_argument_id([]) == "" - - -def test_generate_argument_id_prefix_no_names() -> None: - """Test that prefix alone doesn't create ID when no names.""" - assert _generate_argument_id([], "shell") == "" - - -# --- HTML rendering tests using NamedTuple for parametrization --- - - -class ArgumentHTMLCase(t.NamedTuple): - """Test case for argument HTML rendering.""" - - test_id: str - names: list[str] - metavar: str | None - help_text: str | None - default: str | None - type_name: str | None - required: bool - id_prefix: str - expected_patterns: list[str] # Regex patterns to match - - -ARGUMENT_HTML_CASES = [ - ArgumentHTMLCase( - test_id="short_option_with_metavar", - names=["-L"], - metavar="socket-name", - help_text="pass-through for tmux -L", - default="None", - type_name=None, - required=False, - id_prefix="shell", - expected_patterns=[ - r'
    ', - r'
    ', - r'-L', - r'socket-name', - r'', - r'
    ', - r'
    Default
    ', - r'
    None
    ', - r"
    ", - ], - ), - ArgumentHTMLCase( - test_id="long_option", - names=["--help"], - metavar=None, - help_text="show help", - default=None, - type_name=None, - required=False, - id_prefix="", - expected_patterns=[ - r'--help', - r'id="help"', - r'href="#help"', - ], - ), - ArgumentHTMLCase( - test_id="positional_argument", - names=["filename"], - metavar=None, - help_text="input file", - default=None, - type_name=None, - required=False, - id_prefix="", - expected_patterns=[ - r'filename', - r'id="filename"', - ], - ), - ArgumentHTMLCase( - test_id="multiple_names", - names=["-v", "--verbose"], - metavar=None, - help_text="Enable verbose mode", - default=None, - type_name=None, - required=False, - id_prefix="load", - expected_patterns=[ - r'id="load-v-verbose"', - r'-v', - r'--verbose', - r'href="#load-v-verbose"', - ], - ), - ArgumentHTMLCase( - test_id="metadata_definition_list", - names=["workspace_file"], - metavar="workspace-file", - help_text="checks current tmuxp for workspace files.", - default="None", - type_name="str", - required=True, - id_prefix="edit", - expected_patterns=[ - r'
    ', - r'
    Default
    ', - r'
    None
    ', - r'
    Type
    ', - r'
    str
    ', - r'
    Required
    ', - r"
    ", - ], - ), -] - - -class MockTranslator: - """Mock HTML5Translator for testing HTML generation.""" - - def __init__(self) -> None: - """Initialize mock translator.""" - self.body: list[str] = [] - - def encode(self, text: str) -> str: - """HTML encode text.""" - return str(text).replace("&", "&").replace("<", "<").replace(">", ">") - - -def render_argument_to_html( - names: list[str], - metavar: str | None, - help_text: str | None, - default: str | None, - type_name: str | None, - required: bool, - id_prefix: str, -) -> str: - """Render an argument node to HTML string for testing. - - Parameters - ---------- - names - Argument names (e.g., ["-v", "--verbose"]). - metavar - Optional metavar (e.g., "FILE"). - help_text - Help text for the argument. - default - Default value string. - type_name - Type name for the argument (e.g., "str", "int"). - required - Whether the argument is required. - id_prefix - Prefix for the argument ID. - - Returns - ------- - str - HTML string from the mock translator's body. - """ - from sphinx_argparse_neo.nodes import ( - depart_argparse_argument_html, - visit_argparse_argument_html, - ) - - node = argparse_argument() - node["names"] = names - node["metavar"] = metavar - node["help"] = help_text - node["default_string"] = default - node["type_name"] = type_name - node["required"] = required - node["id_prefix"] = id_prefix - - translator = MockTranslator() - visit_argparse_argument_html(translator, node) - depart_argparse_argument_html(translator, node) - - return "".join(translator.body) - - -@pytest.mark.parametrize( - "case", - ARGUMENT_HTML_CASES, - ids=lambda c: c.test_id, -) -def test_argument_html_rendering(case: ArgumentHTMLCase) -> None: - """Test HTML output for argument nodes.""" - html = render_argument_to_html( - names=case.names, - metavar=case.metavar, - help_text=case.help_text, - default=case.default, - type_name=case.type_name, - required=case.required, - id_prefix=case.id_prefix, - ) - - for pattern in case.expected_patterns: - assert re.search(pattern, html), f"Pattern not found: {pattern}\nHTML: {html}" - - -def test_argument_wrapper_has_id() -> None: - """Verify wrapper div has correct ID attribute.""" - html = render_argument_to_html( - names=["-f", "--file"], - metavar="PATH", - help_text="Input file", - default=None, - type_name=None, - required=False, - id_prefix="convert", - ) - - assert 'id="convert-f-file"' in html - assert '
    None: - """Verify headerlink anchor exists with correct href.""" - html = render_argument_to_html( - names=["--output"], - metavar="FILE", - help_text="Output file", - default=None, - type_name=None, - required=False, - id_prefix="freeze", - ) - - assert '' in html - - -def test_default_value_styled() -> None: - """Verify default value is wrapped in nv span within definition list.""" - html = render_argument_to_html( - names=["--format"], - metavar=None, - help_text="Output format", - default="json", - type_name=None, - required=False, - id_prefix="", - ) - - assert '
    ' in html - assert '
    Default
    ' in html - assert '
    json
    ' in html - - -def test_wrapper_div_closed() -> None: - """Verify wrapper div is properly closed.""" - html = render_argument_to_html( - names=["-v"], - metavar=None, - help_text="Verbose", - default=None, - type_name=None, - required=False, - id_prefix="", - ) - - # Count opening and closing div tags - open_divs = html.count("") - assert open_divs == close_divs, f"Unbalanced divs in HTML: {html}" - - -def test_argument_no_id_prefix() -> None: - """Test argument rendering without ID prefix.""" - html = render_argument_to_html( - names=["--debug"], - metavar=None, - help_text="Enable debug mode", - default=None, - type_name=None, - required=False, - id_prefix="", - ) - - assert 'id="debug"' in html - assert 'href="#debug"' in html - - -def test_metadata_uses_definition_list() -> None: - """Verify metadata renders as definition list, not inline paragraph.""" - html = render_argument_to_html( - names=["--format"], - metavar=None, - help_text="Output format", - default="json", - type_name="str", - required=False, - id_prefix="", - ) - - assert '
    ' in html - assert '
    Default
    ' in html - assert '
    json
    ' in html - assert '
    Type
    ' in html - assert '
    str
    ' in html - - -def test_required_renders_as_tag() -> None: - """Verify Required renders as standalone tag, not key-value.""" - html = render_argument_to_html( - names=["--config"], - metavar="FILE", - help_text="Config file", - default=None, - type_name=None, - required=True, - id_prefix="", - ) - - assert '
    Required
    ' in html - # Should NOT have a matching dd for Required - assert 'argparse-meta-value">Required' not in html diff --git a/tests/docs/_ext/sphinx_argparse_neo/test_parser.py b/tests/docs/_ext/sphinx_argparse_neo/test_parser.py deleted file mode 100644 index 48f43d937f..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/test_parser.py +++ /dev/null @@ -1,524 +0,0 @@ -"""Tests for sphinx_argparse_neo.parser module.""" - -from __future__ import annotations - -import argparse -import typing as t - -import pytest -from sphinx_argparse_neo.parser import ( - ArgumentInfo, - ParserInfo, - SubcommandInfo, - _extract_argument, - _format_default, - _get_action_name, - _get_type_name, - extract_parser, -) - -# --- _format_default tests --- - - -class FormatDefaultFixture(t.NamedTuple): - """Test fixture for _format_default function.""" - - test_id: str - default: t.Any - expected: str | None - - -FORMAT_DEFAULT_FIXTURES: list[FormatDefaultFixture] = [ - FormatDefaultFixture( - test_id="none_value", - default=None, - expected="None", - ), - FormatDefaultFixture( - test_id="string_value", - default="hello", - expected="hello", - ), - FormatDefaultFixture( - test_id="integer_value", - default=42, - expected="42", - ), - FormatDefaultFixture( - test_id="float_value", - default=3.14, - expected="3.14", - ), - FormatDefaultFixture( - test_id="list_value", - default=[1, 2, 3], - expected="[1, 2, 3]", - ), - FormatDefaultFixture( - test_id="suppress_value", - default=argparse.SUPPRESS, - expected=None, - ), - FormatDefaultFixture( - test_id="empty_string", - default="", - expected="", - ), - FormatDefaultFixture( - test_id="boolean_true", - default=True, - expected="True", - ), - FormatDefaultFixture( - test_id="boolean_false", - default=False, - expected="False", - ), -] - - -@pytest.mark.parametrize( - FormatDefaultFixture._fields, - FORMAT_DEFAULT_FIXTURES, - ids=[f.test_id for f in FORMAT_DEFAULT_FIXTURES], -) -def test_format_default(test_id: str, default: t.Any, expected: str | None) -> None: - """Test default value formatting.""" - assert _format_default(default) == expected - - -# --- _get_type_name tests --- - - -def test_get_type_name_int() -> None: - """Test type name extraction for int.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--count", type=int) - assert _get_type_name(action) == "int" - - -def test_get_type_name_float() -> None: - """Test type name extraction for float.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--ratio", type=float) - assert _get_type_name(action) == "float" - - -def test_get_type_name_str() -> None: - """Test type name extraction for str.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--name", type=str) - assert _get_type_name(action) == "str" - - -def test_get_type_name_none() -> None: - """Test type name extraction when no type specified.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--name") - assert _get_type_name(action) is None - - -def test_get_type_name_callable() -> None: - """Test type name extraction for callable types.""" - from pathlib import Path - - parser = argparse.ArgumentParser() - action = parser.add_argument("--path", type=Path) - assert _get_type_name(action) == "Path" - - -# --- _get_action_name tests --- - - -class ActionNameFixture(t.NamedTuple): - """Test fixture for _get_action_name function.""" - - test_id: str - action_kwargs: dict[str, t.Any] - expected: str - - -ACTION_NAME_FIXTURES: list[ActionNameFixture] = [ - ActionNameFixture( - test_id="store_default", - action_kwargs={"dest": "name"}, - expected="store", - ), - ActionNameFixture( - test_id="store_true", - action_kwargs={"action": "store_true", "dest": "flag"}, - expected="store_true", - ), - ActionNameFixture( - test_id="store_false", - action_kwargs={"action": "store_false", "dest": "flag"}, - expected="store_false", - ), - ActionNameFixture( - test_id="store_const", - action_kwargs={"action": "store_const", "const": "value", "dest": "const"}, - expected="store_const", - ), - ActionNameFixture( - test_id="append", - action_kwargs={"action": "append", "dest": "items"}, - expected="append", - ), - ActionNameFixture( - test_id="count", - action_kwargs={"action": "count", "dest": "verbose"}, - expected="count", - ), -] - - -@pytest.mark.parametrize( - ActionNameFixture._fields, - ACTION_NAME_FIXTURES, - ids=[f.test_id for f in ACTION_NAME_FIXTURES], -) -def test_get_action_name( - test_id: str, action_kwargs: dict[str, t.Any], expected: str -) -> None: - """Test action name extraction.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--test", **action_kwargs) - assert _get_action_name(action) == expected - - -# --- _extract_argument tests --- - - -def test_extract_argument_positional() -> None: - """Test extracting a positional argument.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("filename", help="Input file") - info = _extract_argument(action) - - assert info.names == ["filename"] - assert info.help == "Input file" - assert info.is_positional is True - assert info.required is True - - -def test_extract_argument_optional() -> None: - """Test extracting an optional argument.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("-v", "--verbose", action="store_true", help="Verbose") - info = _extract_argument(action) - - assert info.names == ["-v", "--verbose"] - assert info.action == "store_true" - assert info.is_positional is False - assert info.required is False - - -def test_extract_argument_with_choices() -> None: - """Test extracting argument with choices.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--format", choices=["json", "yaml", "xml"]) - info = _extract_argument(action) - - assert info.choices == ["json", "yaml", "xml"] - - -def test_extract_argument_with_metavar() -> None: - """Test extracting argument with metavar.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--output", metavar="FILE") - info = _extract_argument(action) - - assert info.metavar == "FILE" - - -def test_extract_argument_tuple_metavar() -> None: - """Test extracting argument with tuple metavar.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--range", nargs=2, metavar=("MIN", "MAX")) - info = _extract_argument(action) - - assert info.metavar == "MIN MAX" - - -def test_extract_argument_suppressed_help() -> None: - """Test extracting argument with suppressed help.""" - parser = argparse.ArgumentParser() - action = parser.add_argument("--secret", help=argparse.SUPPRESS) - info = _extract_argument(action) - - assert info.help is None - - -# --- extract_parser integration tests --- - - -def test_extract_parser_simple(simple_parser: argparse.ArgumentParser) -> None: - """Test extracting a simple parser.""" - info = extract_parser(simple_parser) - - assert info.prog == "myapp" - assert info.description == "A simple test application" - assert len(info.argument_groups) >= 1 - - # Find arguments - all_args = [arg for group in info.argument_groups for arg in group.arguments] - arg_names = [name for arg in all_args for name in arg.names] - - assert "filename" in arg_names - assert "--verbose" in arg_names or "-v" in arg_names - - -def test_extract_parser_with_groups( - parser_with_groups: argparse.ArgumentParser, -) -> None: - """Test extracting parser with custom groups.""" - info = extract_parser(parser_with_groups) - - group_titles = [g.title for g in info.argument_groups] - assert "Input Options" in group_titles - assert "Output Options" in group_titles - - -def test_extract_parser_with_subcommands( - parser_with_subcommands: argparse.ArgumentParser, -) -> None: - """Test extracting parser with subcommands.""" - info = extract_parser(parser_with_subcommands) - - assert info.subcommands is not None - assert len(info.subcommands) == 2 - - subcmd_names = [s.name for s in info.subcommands] - assert "sync" in subcmd_names - assert "add" in subcmd_names - - # Check alias - add_cmd = next(s for s in info.subcommands if s.name == "add") - assert "a" in add_cmd.aliases - - -def test_extract_parser_with_mutex(parser_with_mutex: argparse.ArgumentParser) -> None: - """Test extracting parser with mutually exclusive group.""" - info = extract_parser(parser_with_mutex) - - # Find the group with mutex - for group in info.argument_groups: - if group.mutually_exclusive: - mutex = group.mutually_exclusive[0] - assert mutex.required is True - assert len(mutex.arguments) == 2 - return - - pytest.fail("No mutually exclusive group found") - - -def test_extract_parser_with_all_actions( - parser_with_all_actions: argparse.ArgumentParser, -) -> None: - """Test extracting parser with all action types.""" - info = extract_parser(parser_with_all_actions) - - all_args = [arg for group in info.argument_groups for arg in group.arguments] - actions = {arg.dest: arg.action for arg in all_args} - - assert actions.get("name") == "store" - assert actions.get("enable") == "store_const" - assert actions.get("flag") == "store_true" - assert actions.get("item") == "append" - assert actions.get("verbose") == "count" - - -def test_extract_parser_with_types( - parser_with_types: argparse.ArgumentParser, -) -> None: - """Test extracting parser with typed arguments.""" - info = extract_parser(parser_with_types) - - all_args = [arg for group in info.argument_groups for arg in group.arguments] - types = {arg.dest: arg.type_name for arg in all_args} - - assert types.get("count") == "int" - assert types.get("ratio") == "float" - assert types.get("path") == "Path" - - -def test_extract_parser_with_nargs( - parser_with_nargs: argparse.ArgumentParser, -) -> None: - """Test extracting parser with nargs variants.""" - info = extract_parser(parser_with_nargs) - - all_args = [arg for group in info.argument_groups for arg in group.arguments] - nargs_map = {arg.dest: arg.nargs for arg in all_args} - - assert nargs_map.get("optional") == "?" - assert nargs_map.get("zero_or_more") == "*" - assert nargs_map.get("one_or_more") == "+" - assert nargs_map.get("exactly_two") == 2 - - -def test_extract_parser_with_defaults( - parser_with_defaults: argparse.ArgumentParser, -) -> None: - """Test extracting parser with various defaults.""" - info = extract_parser(parser_with_defaults) - - all_args = [arg for group in info.argument_groups for arg in group.arguments] - defaults = {arg.dest: arg.default_string for arg in all_args} - - assert defaults.get("none_default") == "None" - assert defaults.get("string_default") == "hello" - assert defaults.get("int_default") == "42" - # Suppressed default should have None default_string - assert "suppress" not in defaults or defaults.get("suppress") is None - - -def test_extract_parser_nested_subcommands( - nested_subcommands_parser: argparse.ArgumentParser, -) -> None: - """Test extracting parser with nested subcommands.""" - info = extract_parser(nested_subcommands_parser) - - assert info.subcommands is not None - assert len(info.subcommands) == 1 - - repo = info.subcommands[0] - assert repo.name == "repo" - assert repo.parser.subcommands is not None - assert len(repo.parser.subcommands) == 2 - - -def test_extract_parser_usage_generation() -> None: - """Test usage string generation.""" - parser = argparse.ArgumentParser(prog="test") - parser.add_argument("file") - parser.add_argument("-v", "--verbose", action="store_true") - - info = extract_parser(parser) - - assert "test" in info.bare_usage - assert "file" in info.bare_usage - - -def test_extract_parser_custom_usage() -> None: - """Test parser with custom usage string.""" - parser = argparse.ArgumentParser(prog="test", usage="test [options] file") - - info = extract_parser(parser) - - assert info.usage == "test [options] file" - - -def test_extract_parser_with_epilog() -> None: - """Test parser with epilog.""" - parser = argparse.ArgumentParser( - prog="test", - epilog="For more info, see docs.", - ) - - info = extract_parser(parser) - - assert info.epilog == "For more info, see docs." - - -# --- ArgumentInfo property tests --- - - -def test_argument_info_is_positional_true() -> None: - """Test is_positional for positional argument.""" - info = ArgumentInfo( - names=["filename"], - help=None, - default=None, - default_string=None, - choices=None, - required=True, - metavar=None, - nargs=None, - action="store", - type_name=None, - const=None, - dest="filename", - ) - assert info.is_positional is True - - -def test_argument_info_is_positional_false() -> None: - """Test is_positional for optional argument.""" - info = ArgumentInfo( - names=["-f", "--file"], - help=None, - default=None, - default_string=None, - choices=None, - required=False, - metavar=None, - nargs=None, - action="store", - type_name=None, - const=None, - dest="file", - ) - assert info.is_positional is False - - -def test_argument_info_empty_names() -> None: - """Test is_positional with empty names list.""" - info = ArgumentInfo( - names=[], - help=None, - default=None, - default_string=None, - choices=None, - required=False, - metavar=None, - nargs=None, - action="store", - type_name=None, - const=None, - dest="empty", - ) - assert info.is_positional is False - - -# --- Dataclass tests --- - - -def test_parser_info_dataclass() -> None: - """Test ParserInfo dataclass creation.""" - info = ParserInfo( - prog="test", - usage=None, - bare_usage="test [-h]", - description="Test description", - epilog="Test epilog", - argument_groups=[], - subcommands=None, - subcommand_dest=None, - ) - - assert info.prog == "test" - assert info.description == "Test description" - - -def test_subcommand_info_recursive() -> None: - """Test SubcommandInfo with nested parser.""" - nested_info = ParserInfo( - prog="nested", - usage=None, - bare_usage="nested [-h]", - description=None, - epilog=None, - argument_groups=[], - subcommands=None, - subcommand_dest=None, - ) - - sub = SubcommandInfo( - name="sub", - aliases=[], - help="Subcommand help", - parser=nested_info, - ) - - assert sub.parser.prog == "nested" diff --git a/tests/docs/_ext/sphinx_argparse_neo/test_renderer.py b/tests/docs/_ext/sphinx_argparse_neo/test_renderer.py deleted file mode 100644 index 0a0b0da698..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/test_renderer.py +++ /dev/null @@ -1,498 +0,0 @@ -"""Tests for sphinx_argparse_neo.renderer module.""" - -from __future__ import annotations - -import argparse -import typing as t - -from docutils import nodes -from sphinx_argparse_neo.nodes import ( - argparse_argument, - argparse_group, - argparse_program, - argparse_subcommand, - argparse_subcommands, - argparse_usage, -) -from sphinx_argparse_neo.parser import ( - ArgumentGroup, - ArgumentInfo, - MutuallyExclusiveGroup, - ParserInfo, - SubcommandInfo, - extract_parser, -) -from sphinx_argparse_neo.renderer import ( - ArgparseRenderer, - RenderConfig, - create_renderer, -) - -# --- RenderConfig tests --- - - -def test_render_config_defaults() -> None: - """Test RenderConfig default values.""" - config = RenderConfig() - - assert config.group_title_prefix == "" - assert config.show_defaults is True - assert config.show_choices is True - assert config.show_types is True - - -def test_render_config_custom_values() -> None: - """Test RenderConfig with custom values.""" - config = RenderConfig( - group_title_prefix="CLI ", - show_defaults=False, - show_choices=False, - show_types=False, - ) - - assert config.group_title_prefix == "CLI " - assert config.show_defaults is False - assert config.show_choices is False - assert config.show_types is False - - -# --- ArgparseRenderer basic tests --- - - -def test_renderer_creation_default_config() -> None: - """Test creating renderer with default config.""" - renderer = ArgparseRenderer() - - assert renderer.config is not None - assert renderer.config.show_defaults is True - - -def test_renderer_creation_custom_config() -> None: - """Test creating renderer with custom config.""" - config = RenderConfig(group_title_prefix="CLI ") - renderer = ArgparseRenderer(config=config) - - assert renderer.config.group_title_prefix == "CLI " - - -def test_create_renderer_factory() -> None: - """Test create_renderer factory function.""" - renderer = create_renderer() - assert isinstance(renderer, ArgparseRenderer) - - -def test_create_renderer_with_config() -> None: - """Test create_renderer with custom config.""" - config = RenderConfig(show_types=False) - renderer = create_renderer(config=config) - - assert renderer.config.show_types is False - - -# --- Render method tests --- - - -def test_render_simple_parser(simple_parser: argparse.ArgumentParser) -> None: - """Test rendering a simple parser produces sibling nodes for TOC. - - The renderer now outputs sections as siblings of argparse_program: - - argparse_program (description only) - - section#usage - - section#positional-arguments - - section#options - """ - parser_info = extract_parser(simple_parser) - renderer = ArgparseRenderer() - rendered_nodes = renderer.render(parser_info) - - # Should have multiple nodes: program + usage section + group sections - assert len(rendered_nodes) >= 3 - - # First node is argparse_program - assert isinstance(rendered_nodes[0], argparse_program) - assert rendered_nodes[0]["prog"] == "myapp" - - # Second node should be usage section - assert isinstance(rendered_nodes[1], nodes.section) - assert "usage" in rendered_nodes[1]["ids"] - - -def test_render_includes_usage(simple_parser: argparse.ArgumentParser) -> None: - """Test that render includes usage as a sibling section.""" - parser_info = extract_parser(simple_parser) - renderer = ArgparseRenderer() - rendered_nodes = renderer.render(parser_info) - - # Find the usage section (sibling of program, not child) - usage_sections = [ - n - for n in rendered_nodes - if isinstance(n, nodes.section) and "usage" in n.get("ids", []) - ] - - assert len(usage_sections) == 1 - - # Usage section should contain argparse_usage node - usage_section = usage_sections[0] - usage_node = [c for c in usage_section.children if isinstance(c, argparse_usage)] - assert len(usage_node) == 1 - assert "myapp" in usage_node[0]["usage"] - - -def test_render_includes_groups(simple_parser: argparse.ArgumentParser) -> None: - """Test that render includes argument groups as sibling sections.""" - parser_info = extract_parser(simple_parser) - renderer = ArgparseRenderer() - rendered_nodes = renderer.render(parser_info) - - # Groups are now wrapped in sections and are siblings of program - # Find sections that contain argparse_group nodes - group_sections = [ - n - for n in rendered_nodes - if isinstance(n, nodes.section) - and any(isinstance(c, argparse_group) for c in n.children) - ] - - assert len(group_sections) >= 1 - - -def test_render_groups_contain_arguments( - simple_parser: argparse.ArgumentParser, -) -> None: - """Test that rendered groups contain argument nodes.""" - parser_info = extract_parser(simple_parser) - renderer = ArgparseRenderer() - rendered_nodes = renderer.render(parser_info) - - # Find sections that contain argparse_group nodes - group_sections = [ - n - for n in rendered_nodes - if isinstance(n, nodes.section) - and any(isinstance(c, argparse_group) for c in n.children) - ] - - # Collect all arguments from groups inside sections - all_args: list[argparse_argument] = [] - for section in group_sections: - for child in section.children: - if isinstance(child, argparse_group): - all_args.extend( - arg for arg in child.children if isinstance(arg, argparse_argument) - ) - - assert len(all_args) >= 1 - - -def test_render_with_subcommands( - parser_with_subcommands: argparse.ArgumentParser, -) -> None: - """Test rendering parser with subcommands.""" - parser_info = extract_parser(parser_with_subcommands) - renderer = ArgparseRenderer() - rendered_nodes = renderer.render(parser_info) - - # Subcommands node is a sibling of program - subcommands_nodes = [ - n for n in rendered_nodes if isinstance(n, argparse_subcommands) - ] - - assert len(subcommands_nodes) == 1 - - # Check subcommand children - subs_container = subcommands_nodes[0] - subcmd_nodes = [ - c for c in subs_container.children if isinstance(c, argparse_subcommand) - ] - assert len(subcmd_nodes) == 2 - - -# --- Config option effect tests --- - - -def _collect_args_from_rendered_nodes( - rendered_nodes: list[nodes.Node], -) -> list[argparse_argument]: - """Collect all argparse_argument nodes from rendered output.""" - all_args: list[argparse_argument] = [] - for node in rendered_nodes: - if isinstance(node, nodes.section): - for child in node.children: - if isinstance(child, argparse_group): - all_args.extend( - arg - for arg in child.children - if isinstance(arg, argparse_argument) - ) - return all_args - - -def test_render_group_title_prefix() -> None: - """Test that group_title_prefix is applied to section titles.""" - parser = argparse.ArgumentParser(prog="test") - parser.add_argument("--opt") - parser_info = extract_parser(parser) - - config = RenderConfig(group_title_prefix="CLI: ") - renderer = ArgparseRenderer(config=config) - rendered_nodes = renderer.render(parser_info) - - # Find sections that contain argparse_group - group_sections = [ - n - for n in rendered_nodes - if isinstance(n, nodes.section) - and any(isinstance(c, argparse_group) for c in n.children) - ] - - # Section IDs should include the prefix (normalized) - ids = [section["ids"][0] for section in group_sections if section["ids"]] - assert any("cli:" in id_str.lower() for id_str in ids) - - -def test_render_show_defaults_false() -> None: - """Test that show_defaults=False hides defaults.""" - parser = argparse.ArgumentParser(prog="test") - parser.add_argument("--opt", default="value") - parser_info = extract_parser(parser) - - config = RenderConfig(show_defaults=False) - renderer = ArgparseRenderer(config=config) - rendered_nodes = renderer.render(parser_info) - - all_args = _collect_args_from_rendered_nodes(rendered_nodes) - - # Default string should not be set - for arg in all_args: - assert arg.get("default_string") is None - - -def test_render_show_choices_false() -> None: - """Test that show_choices=False hides choices.""" - parser = argparse.ArgumentParser(prog="test") - parser.add_argument("--format", choices=["json", "yaml"]) - parser_info = extract_parser(parser) - - config = RenderConfig(show_choices=False) - renderer = ArgparseRenderer(config=config) - rendered_nodes = renderer.render(parser_info) - - all_args = _collect_args_from_rendered_nodes(rendered_nodes) - - # Choices should not be set - for arg in all_args: - assert arg.get("choices") is None - - -def test_render_show_types_false() -> None: - """Test that show_types=False hides type info.""" - parser = argparse.ArgumentParser(prog="test") - parser.add_argument("--count", type=int) - parser_info = extract_parser(parser) - - config = RenderConfig(show_types=False) - renderer = ArgparseRenderer(config=config) - rendered_nodes = renderer.render(parser_info) - - all_args = _collect_args_from_rendered_nodes(rendered_nodes) - - # Type name should not be set - for arg in all_args: - assert arg.get("type_name") is None - - -# --- Individual render method tests --- - - -def test_render_usage_method() -> None: - """Test render_usage method directly.""" - parser_info = ParserInfo( - prog="test", - usage=None, - bare_usage="test [-h] [-v]", - description=None, - epilog=None, - argument_groups=[], - subcommands=None, - subcommand_dest=None, - ) - - renderer = ArgparseRenderer() - usage_node = renderer.render_usage(parser_info) - - assert isinstance(usage_node, argparse_usage) - assert usage_node["usage"] == "test [-h] [-v]" - - -def test_render_argument_method() -> None: - """Test render_argument method directly.""" - arg_info = ArgumentInfo( - names=["-v", "--verbose"], - help="Enable verbose mode", - default=False, - default_string="False", - choices=None, - required=False, - metavar=None, - nargs=None, - action="store_true", - type_name=None, - const=True, - dest="verbose", - ) - - renderer = ArgparseRenderer() - arg_node = renderer.render_argument(arg_info) - - assert isinstance(arg_node, argparse_argument) - assert arg_node["names"] == ["-v", "--verbose"] - assert arg_node["help"] == "Enable verbose mode" - - -def test_render_group_method() -> None: - """Test render_group method directly.""" - group_info = ArgumentGroup( - title="Options", - description="Available options", - arguments=[ - ArgumentInfo( - names=["-v"], - help="Verbose", - default=False, - default_string="False", - choices=None, - required=False, - metavar=None, - nargs=None, - action="store_true", - type_name=None, - const=True, - dest="verbose", - ), - ], - mutually_exclusive=[], - ) - - renderer = ArgparseRenderer() - group_node = renderer.render_group(group_info) - - assert isinstance(group_node, argparse_group) - assert group_node["title"] == "Options" - assert group_node["description"] == "Available options" - assert len(group_node.children) == 1 - - -def test_render_mutex_group_method() -> None: - """Test render_mutex_group method.""" - mutex = MutuallyExclusiveGroup( - arguments=[ - ArgumentInfo( - names=["-v"], - help="Verbose", - default=False, - default_string="False", - choices=None, - required=False, - metavar=None, - nargs=None, - action="store_true", - type_name=None, - const=True, - dest="verbose", - ), - ArgumentInfo( - names=["-q"], - help="Quiet", - default=False, - default_string="False", - choices=None, - required=False, - metavar=None, - nargs=None, - action="store_true", - type_name=None, - const=True, - dest="quiet", - ), - ], - required=True, - ) - - renderer = ArgparseRenderer() - nodes = renderer.render_mutex_group(mutex) - - assert len(nodes) == 2 - assert all(isinstance(n, argparse_argument) for n in nodes) - assert all(n.get("mutex") is True for n in nodes) - assert all(n.get("mutex_required") is True for n in nodes) - - -def test_render_subcommand_method() -> None: - """Test render_subcommand method.""" - nested_parser = ParserInfo( - prog="myapp sub", - usage=None, - bare_usage="myapp sub [-h]", - description="Subcommand description", - epilog=None, - argument_groups=[], - subcommands=None, - subcommand_dest=None, - ) - - subcmd_info = SubcommandInfo( - name="sub", - aliases=["s"], - help="Subcommand help", - parser=nested_parser, - ) - - renderer = ArgparseRenderer() - subcmd_node = renderer.render_subcommand(subcmd_info) - - assert isinstance(subcmd_node, argparse_subcommand) - assert subcmd_node["name"] == "sub" - assert subcmd_node["aliases"] == ["s"] - assert subcmd_node["help"] == "Subcommand help" - - # Should have nested program - nested = [c for c in subcmd_node.children if isinstance(c, argparse_program)] - assert len(nested) == 1 - - -# --- Post-process hook test --- - - -def test_post_process_default() -> None: - """Test that default post_process returns nodes unchanged.""" - renderer = ArgparseRenderer() - - from docutils import nodes as dn - - input_nodes = [dn.paragraph(text="test")] - - result = renderer.post_process(input_nodes) - - assert result == input_nodes - - -def test_post_process_custom() -> None: - """Test custom post_process implementation.""" - - class CustomRenderer(ArgparseRenderer): # type: ignore[misc] - def post_process(self, result_nodes: list[t.Any]) -> list[t.Any]: - # Add a marker to each node - for node in result_nodes: - node["custom_marker"] = True - return result_nodes - - renderer = CustomRenderer() - - from docutils import nodes as dn - - input_nodes = [dn.paragraph(text="test")] - - result = renderer.post_process(input_nodes) - - assert result[0].get("custom_marker") is True diff --git a/tests/docs/_ext/sphinx_argparse_neo/test_utils.py b/tests/docs/_ext/sphinx_argparse_neo/test_utils.py deleted file mode 100644 index 129a8fd36d..0000000000 --- a/tests/docs/_ext/sphinx_argparse_neo/test_utils.py +++ /dev/null @@ -1,162 +0,0 @@ -"""Tests for sphinx_argparse_neo text processing utilities.""" - -from __future__ import annotations - -import typing as t - -import pytest -from sphinx_argparse_neo.utils import escape_rst_emphasis, strip_ansi - -# --- strip_ansi tests --- - - -class StripAnsiFixture(t.NamedTuple): - """Test fixture for strip_ansi function.""" - - test_id: str - input_text: str - expected: str - - -STRIP_ANSI_FIXTURES: list[StripAnsiFixture] = [ - StripAnsiFixture( - test_id="plain_text", - input_text="hello", - expected="hello", - ), - StripAnsiFixture( - test_id="green_color", - input_text="\033[32mgreen\033[0m", - expected="green", - ), - StripAnsiFixture( - test_id="bold_blue", - input_text="\033[1;34mbold\033[0m", - expected="bold", - ), - StripAnsiFixture( - test_id="multiple_codes", - input_text="\033[1m\033[32mtest\033[0m", - expected="test", - ), - StripAnsiFixture( - test_id="empty_string", - input_text="", - expected="", - ), - StripAnsiFixture( - test_id="mixed_content", - input_text="pre\033[31mred\033[0mpost", - expected="preredpost", - ), - StripAnsiFixture( - test_id="reset_only", - input_text="\033[0m", - expected="", - ), - StripAnsiFixture( - test_id="sgr_params", - input_text="\033[38;5;196mred256\033[0m", - expected="red256", - ), -] - - -@pytest.mark.parametrize( - StripAnsiFixture._fields, - STRIP_ANSI_FIXTURES, - ids=[f.test_id for f in STRIP_ANSI_FIXTURES], -) -def test_strip_ansi(test_id: str, input_text: str, expected: str) -> None: - """Test ANSI escape code stripping.""" - assert strip_ansi(input_text) == expected - - -# --- escape_rst_emphasis tests --- - - -class EscapeRstEmphasisFixture(t.NamedTuple): - """Test fixture for escape_rst_emphasis function.""" - - test_id: str - input_text: str - expected: str - - -ESCAPE_RST_EMPHASIS_FIXTURES: list[EscapeRstEmphasisFixture] = [ - EscapeRstEmphasisFixture( - test_id="glob_pattern_quoted", - input_text='tmuxp load "my-*"', - expected='tmuxp load "my-\\*"', - ), - EscapeRstEmphasisFixture( - test_id="glob_pattern_django", - input_text="django-*", - expected="django-\\*", - ), - EscapeRstEmphasisFixture( - test_id="glob_pattern_flask", - input_text="flask-*", - expected="flask-\\*", - ), - EscapeRstEmphasisFixture( - test_id="multiple_patterns", - input_text="match django-* or flask-* packages", - expected="match django-\\* or flask-\\* packages", - ), - EscapeRstEmphasisFixture( - test_id="plain_text", - input_text="plain text without patterns", - expected="plain text without patterns", - ), - EscapeRstEmphasisFixture( - test_id="rst_emphasis_unchanged", - input_text="*emphasis* is ok", - expected="*emphasis* is ok", - ), - EscapeRstEmphasisFixture( - test_id="already_escaped", - input_text="django-\\*", - expected="django-\\*", - ), - EscapeRstEmphasisFixture( - test_id="empty_string", - input_text="", - expected="", - ), - EscapeRstEmphasisFixture( - test_id="pattern_at_end", - input_text="ending with pattern-*", - expected="ending with pattern-\\*", - ), - EscapeRstEmphasisFixture( - test_id="hyphen_without_asterisk", - input_text="word-with-hyphens", - expected="word-with-hyphens", - ), - EscapeRstEmphasisFixture( - test_id="asterisk_without_hyphen", - input_text="asterisk * alone", - expected="asterisk * alone", - ), - EscapeRstEmphasisFixture( - test_id="double_asterisk", - input_text="glob-** pattern", - expected="glob-** pattern", - ), - EscapeRstEmphasisFixture( - test_id="space_after_asterisk", - input_text="word-* followed by space", - expected="word-\\* followed by space", - ), -] - - -@pytest.mark.parametrize( - EscapeRstEmphasisFixture._fields, - ESCAPE_RST_EMPHASIS_FIXTURES, - ids=[f.test_id for f in ESCAPE_RST_EMPHASIS_FIXTURES], -) -def test_escape_rst_emphasis(test_id: str, input_text: str, expected: str) -> None: - """Test RST emphasis escaping for glob patterns.""" - assert escape_rst_emphasis(input_text) == expected diff --git a/tests/docs/_ext/test_argparse_exemplar.py b/tests/docs/_ext/test_argparse_exemplar.py deleted file mode 100644 index c25b48f9da..0000000000 --- a/tests/docs/_ext/test_argparse_exemplar.py +++ /dev/null @@ -1,1073 +0,0 @@ -"""Tests for argparse_exemplar sphinx extension. - -This tests the examples transformation functionality that converts argparse -epilog definition lists into proper documentation sections. - -Note: Tests for strip_ansi have moved to -tests/docs/_ext/sphinx_argparse_neo/test_utils.py since that utility -now lives in sphinx_argparse_neo.utils. -""" - -from __future__ import annotations - -import typing as t - -import pytest -from docutils import nodes -from sphinx_argparse_neo.exemplar import ( - ExemplarConfig, - _extract_sections_from_container, - _is_examples_section, - _is_usage_block, - _reorder_nodes, - is_base_examples_term, - is_examples_term, - make_section_id, - make_section_title, - process_node, - transform_definition_list, -) - -# --- is_examples_term tests --- - - -class IsExamplesTermFixture(t.NamedTuple): - """Test fixture for is_examples_term function.""" - - test_id: str - term_text: str - expected: bool - - -IS_EXAMPLES_TERM_FIXTURES: list[IsExamplesTermFixture] = [ - IsExamplesTermFixture( - test_id="base_examples_colon", - term_text="examples:", - expected=True, - ), - IsExamplesTermFixture( - test_id="base_examples_no_colon", - term_text="examples", - expected=True, - ), - IsExamplesTermFixture( - test_id="prefixed_machine_readable", - term_text="Machine-readable output examples:", - expected=True, - ), - IsExamplesTermFixture( - test_id="prefixed_field_scoped", - term_text="Field-scoped search examples:", - expected=True, - ), - IsExamplesTermFixture( - test_id="colon_pattern", - term_text="Machine-readable output: examples:", - expected=True, - ), - IsExamplesTermFixture( - test_id="usage_not_examples", - term_text="Usage:", - expected=False, - ), - IsExamplesTermFixture( - test_id="arguments_not_examples", - term_text="Named Arguments:", - expected=False, - ), - IsExamplesTermFixture( - test_id="case_insensitive_upper", - term_text="EXAMPLES:", - expected=True, - ), - IsExamplesTermFixture( - test_id="case_insensitive_mixed", - term_text="Examples:", - expected=True, - ), -] - - -@pytest.mark.parametrize( - IsExamplesTermFixture._fields, - IS_EXAMPLES_TERM_FIXTURES, - ids=[f.test_id for f in IS_EXAMPLES_TERM_FIXTURES], -) -def test_is_examples_term(test_id: str, term_text: str, expected: bool) -> None: - """Test examples term detection.""" - assert is_examples_term(term_text) == expected - - -# --- is_base_examples_term tests --- - - -class IsBaseExamplesTermFixture(t.NamedTuple): - """Test fixture for is_base_examples_term function.""" - - test_id: str - term_text: str - expected: bool - - -IS_BASE_EXAMPLES_TERM_FIXTURES: list[IsBaseExamplesTermFixture] = [ - IsBaseExamplesTermFixture( - test_id="base_with_colon", - term_text="examples:", - expected=True, - ), - IsBaseExamplesTermFixture( - test_id="base_no_colon", - term_text="examples", - expected=True, - ), - IsBaseExamplesTermFixture( - test_id="uppercase", - term_text="EXAMPLES", - expected=True, - ), - IsBaseExamplesTermFixture( - test_id="mixed_case", - term_text="Examples:", - expected=True, - ), - IsBaseExamplesTermFixture( - test_id="prefixed_not_base", - term_text="Field-scoped examples:", - expected=False, - ), - IsBaseExamplesTermFixture( - test_id="output_examples_not_base", - term_text="Machine-readable output examples:", - expected=False, - ), - IsBaseExamplesTermFixture( - test_id="colon_pattern_not_base", - term_text="Output: examples:", - expected=False, - ), -] - - -@pytest.mark.parametrize( - IsBaseExamplesTermFixture._fields, - IS_BASE_EXAMPLES_TERM_FIXTURES, - ids=[f.test_id for f in IS_BASE_EXAMPLES_TERM_FIXTURES], -) -def test_is_base_examples_term(test_id: str, term_text: str, expected: bool) -> None: - """Test base examples term detection.""" - assert is_base_examples_term(term_text) == expected - - -# --- make_section_id tests --- - - -class MakeSectionIdFixture(t.NamedTuple): - """Test fixture for make_section_id function.""" - - test_id: str - term_text: str - counter: int - is_subsection: bool - expected: str - - -MAKE_SECTION_ID_FIXTURES: list[MakeSectionIdFixture] = [ - MakeSectionIdFixture( - test_id="base_examples", - term_text="examples:", - counter=0, - is_subsection=False, - expected="examples", - ), - MakeSectionIdFixture( - test_id="prefixed_standard", - term_text="Machine-readable output examples:", - counter=0, - is_subsection=False, - expected="machine-readable-output-examples", - ), - MakeSectionIdFixture( - test_id="subsection_omits_suffix", - term_text="Field-scoped examples:", - counter=0, - is_subsection=True, - expected="field-scoped", - ), - MakeSectionIdFixture( - test_id="with_counter", - term_text="examples:", - counter=2, - is_subsection=False, - expected="examples-2", - ), - MakeSectionIdFixture( - test_id="counter_zero_no_suffix", - term_text="examples:", - counter=0, - is_subsection=False, - expected="examples", - ), - MakeSectionIdFixture( - test_id="colon_pattern", - term_text="Machine-readable output: examples:", - counter=0, - is_subsection=False, - expected="machine-readable-output-examples", - ), - MakeSectionIdFixture( - test_id="subsection_with_counter", - term_text="Field-scoped examples:", - counter=1, - is_subsection=True, - expected="field-scoped-1", - ), -] - - -@pytest.mark.parametrize( - MakeSectionIdFixture._fields, - MAKE_SECTION_ID_FIXTURES, - ids=[f.test_id for f in MAKE_SECTION_ID_FIXTURES], -) -def test_make_section_id( - test_id: str, - term_text: str, - counter: int, - is_subsection: bool, - expected: str, -) -> None: - """Test section ID generation.""" - assert make_section_id(term_text, counter, is_subsection=is_subsection) == expected - - -def test_make_section_id_with_page_prefix() -> None: - """Test section ID generation with page_prefix for cross-page uniqueness.""" - # Base "examples:" with page_prefix becomes "sync-examples" - assert make_section_id("examples:", page_prefix="sync") == "sync-examples" - assert make_section_id("examples:", page_prefix="add") == "add-examples" - - # Prefixed examples already unique - page_prefix not added - assert ( - make_section_id("Machine-readable output examples:", page_prefix="sync") - == "machine-readable-output-examples" - ) - - # Subsection with page_prefix - result = make_section_id( - "Field-scoped examples:", is_subsection=True, page_prefix="sync" - ) - assert result == "field-scoped" - - # Empty page_prefix behaves like before - assert make_section_id("examples:", page_prefix="") == "examples" - - -# --- make_section_title tests --- - - -class MakeSectionTitleFixture(t.NamedTuple): - """Test fixture for make_section_title function.""" - - test_id: str - term_text: str - is_subsection: bool - expected: str - - -MAKE_SECTION_TITLE_FIXTURES: list[MakeSectionTitleFixture] = [ - MakeSectionTitleFixture( - test_id="base_examples", - term_text="examples:", - is_subsection=False, - expected="Examples", - ), - MakeSectionTitleFixture( - test_id="prefixed_with_examples_suffix", - term_text="Machine-readable output examples:", - is_subsection=False, - expected="Machine-Readable Output Examples", - ), - MakeSectionTitleFixture( - test_id="subsection_omits_examples", - term_text="Field-scoped examples:", - is_subsection=True, - expected="Field-Scoped", - ), - MakeSectionTitleFixture( - test_id="colon_pattern", - term_text="Machine-readable output: examples:", - is_subsection=False, - expected="Machine-Readable Output Examples", - ), - MakeSectionTitleFixture( - test_id="subsection_colon_pattern", - term_text="Machine-readable output: examples:", - is_subsection=True, - expected="Machine-Readable Output", - ), - MakeSectionTitleFixture( - test_id="base_examples_no_colon", - term_text="examples", - is_subsection=False, - expected="Examples", - ), -] - - -@pytest.mark.parametrize( - MakeSectionTitleFixture._fields, - MAKE_SECTION_TITLE_FIXTURES, - ids=[f.test_id for f in MAKE_SECTION_TITLE_FIXTURES], -) -def test_make_section_title( - test_id: str, - term_text: str, - is_subsection: bool, - expected: str, -) -> None: - """Test section title generation.""" - assert make_section_title(term_text, is_subsection=is_subsection) == expected - - -# --- transform_definition_list integration tests --- - - -def _make_dl_item(term: str, definition: str) -> nodes.definition_list_item: - """Create a definition list item for testing. - - Parameters - ---------- - term : str - The definition term text. - definition : str - The definition content text. - - Returns - ------- - nodes.definition_list_item - A definition list item with term and definition. - """ - item = nodes.definition_list_item() - term_node = nodes.term(text=term) - def_node = nodes.definition() - def_node += nodes.paragraph(text=definition) - item += term_node - item += def_node - return item - - -def test_transform_definition_list_single_examples() -> None: - """Single examples section creates one section node.""" - dl = nodes.definition_list() - dl += _make_dl_item("examples:", "vcspull ls") - - result = transform_definition_list(dl) - - assert len(result) == 1 - assert isinstance(result[0], nodes.section) - assert result[0]["ids"] == ["examples"] - - -def test_transform_definition_list_nested_examples() -> None: - """Base examples with category creates nested sections.""" - dl = nodes.definition_list() - dl += _make_dl_item("examples:", "vcspull ls") - dl += _make_dl_item("Machine-readable output examples:", "vcspull ls --json") - - result = transform_definition_list(dl) - - # Should have single parent section containing nested subsection - assert len(result) == 1 - parent = result[0] - assert isinstance(parent, nodes.section) - assert parent["ids"] == ["examples"] - - # Find nested subsection - subsections = [c for c in parent.children if isinstance(c, nodes.section)] - assert len(subsections) == 1 - assert subsections[0]["ids"] == ["machine-readable-output"] - - -def test_transform_definition_list_multiple_categories() -> None: - """Multiple example categories all nest under parent.""" - dl = nodes.definition_list() - dl += _make_dl_item("examples:", "vcspull ls") - dl += _make_dl_item("Field-scoped examples:", "vcspull ls --field name") - dl += _make_dl_item("Machine-readable output examples:", "vcspull ls --json") - - result = transform_definition_list(dl) - - assert len(result) == 1 - parent = result[0] - assert isinstance(parent, nodes.section) - - subsections = [c for c in parent.children if isinstance(c, nodes.section)] - assert len(subsections) == 2 - - -def test_transform_definition_list_preserves_non_examples() -> None: - """Non-example items preserved as definition list.""" - dl = nodes.definition_list() - dl += _make_dl_item("Usage:", "How to use this command") - dl += _make_dl_item("examples:", "vcspull ls") - - result = transform_definition_list(dl) - - # Should have both definition list (non-examples) and section (examples) - has_dl = any(isinstance(n, nodes.definition_list) for n in result) - has_section = any(isinstance(n, nodes.section) for n in result) - assert has_dl, "Non-example items should be preserved as definition list" - assert has_section, "Example items should become sections" - - -def test_transform_definition_list_no_examples() -> None: - """Definition list without examples returns empty list.""" - dl = nodes.definition_list() - dl += _make_dl_item("Usage:", "How to use") - dl += _make_dl_item("Options:", "Available options") - - result = transform_definition_list(dl) - - # All items are non-examples, should return definition list - assert len(result) == 1 - assert isinstance(result[0], nodes.definition_list) - - -def test_transform_definition_list_only_category_no_base() -> None: - """Single category example without base examples stays flat.""" - dl = nodes.definition_list() - dl += _make_dl_item("Machine-readable output examples:", "vcspull ls --json") - - result = transform_definition_list(dl) - - # Without base "examples:", no nesting - just single section - assert len(result) == 1 - assert isinstance(result[0], nodes.section) - # Should have full title since it's not nested - assert result[0]["ids"] == ["machine-readable-output-examples"] - - -def test_transform_definition_list_code_blocks_created() -> None: - """Each command line becomes a separate code block.""" - dl = nodes.definition_list() - dl += _make_dl_item("examples:", "cmd1\ncmd2\ncmd3") - - result = transform_definition_list(dl) - - section = result[0] - code_blocks = [c for c in section.children if isinstance(c, nodes.literal_block)] - assert len(code_blocks) == 3 - assert code_blocks[0].astext() == "$ cmd1" - assert code_blocks[1].astext() == "$ cmd2" - assert code_blocks[2].astext() == "$ cmd3" - - -# --- _is_usage_block tests --- - - -class IsUsageBlockFixture(t.NamedTuple): - """Test fixture for _is_usage_block function.""" - - test_id: str - node_type: str - node_text: str - expected: bool - - -IS_USAGE_BLOCK_FIXTURES: list[IsUsageBlockFixture] = [ - IsUsageBlockFixture( - test_id="literal_block_usage_lowercase", - node_type="literal_block", - node_text="usage: cmd [-h]", - expected=True, - ), - IsUsageBlockFixture( - test_id="literal_block_usage_uppercase", - node_type="literal_block", - node_text="Usage: vcspull sync", - expected=True, - ), - IsUsageBlockFixture( - test_id="literal_block_usage_leading_space", - node_type="literal_block", - node_text=" usage: cmd", - expected=True, - ), - IsUsageBlockFixture( - test_id="literal_block_not_usage", - node_type="literal_block", - node_text="some other text", - expected=False, - ), - IsUsageBlockFixture( - test_id="literal_block_usage_in_middle", - node_type="literal_block", - node_text="see usage: for more", - expected=False, - ), - IsUsageBlockFixture( - test_id="paragraph_with_usage", - node_type="paragraph", - node_text="usage: cmd", - expected=False, - ), - IsUsageBlockFixture( - test_id="section_node", - node_type="section", - node_text="", - expected=False, - ), -] - - -def _make_test_node(node_type: str, node_text: str) -> nodes.Node: - """Create a test node of the specified type. - - Parameters - ---------- - node_type : str - Type of node to create ("literal_block", "paragraph", "section"). - node_text : str - Text content for the node. - - Returns - ------- - nodes.Node - The created node. - """ - if node_type == "literal_block": - return nodes.literal_block(text=node_text) - if node_type == "paragraph": - return nodes.paragraph(text=node_text) - if node_type == "section": - return nodes.section() - msg = f"Unknown node type: {node_type}" - raise ValueError(msg) - - -@pytest.mark.parametrize( - IsUsageBlockFixture._fields, - IS_USAGE_BLOCK_FIXTURES, - ids=[f.test_id for f in IS_USAGE_BLOCK_FIXTURES], -) -def test_is_usage_block( - test_id: str, - node_type: str, - node_text: str, - expected: bool, -) -> None: - """Test usage block detection.""" - node = _make_test_node(node_type, node_text) - assert _is_usage_block(node) == expected - - -# --- _is_examples_section tests --- - - -class IsExamplesSectionFixture(t.NamedTuple): - """Test fixture for _is_examples_section function.""" - - test_id: str - node_type: str - section_ids: list[str] - expected: bool - - -IS_EXAMPLES_SECTION_FIXTURES: list[IsExamplesSectionFixture] = [ - IsExamplesSectionFixture( - test_id="section_with_examples_id", - node_type="section", - section_ids=["examples"], - expected=True, - ), - IsExamplesSectionFixture( - test_id="section_with_prefixed_examples", - node_type="section", - section_ids=["machine-readable-output-examples"], - expected=True, - ), - IsExamplesSectionFixture( - test_id="section_with_uppercase_examples", - node_type="section", - section_ids=["EXAMPLES"], - expected=True, - ), - IsExamplesSectionFixture( - test_id="section_without_examples", - node_type="section", - section_ids=["positional-arguments"], - expected=False, - ), - IsExamplesSectionFixture( - test_id="section_with_multiple_ids", - node_type="section", - section_ids=["main-id", "examples-alias"], - expected=True, - ), - IsExamplesSectionFixture( - test_id="section_empty_ids", - node_type="section", - section_ids=[], - expected=False, - ), - IsExamplesSectionFixture( - test_id="paragraph_node", - node_type="paragraph", - section_ids=[], - expected=False, - ), - IsExamplesSectionFixture( - test_id="literal_block_node", - node_type="literal_block", - section_ids=[], - expected=False, - ), -] - - -def _make_section_node(node_type: str, section_ids: list[str]) -> nodes.Node: - """Create a test node with optional section IDs. - - Parameters - ---------- - node_type : str - Type of node to create. - section_ids : list[str] - IDs to assign if creating a section. - - Returns - ------- - nodes.Node - The created node. - """ - if node_type == "section": - section = nodes.section() - section["ids"] = section_ids - return section - if node_type == "paragraph": - return nodes.paragraph() - if node_type == "literal_block": - return nodes.literal_block(text="examples") - msg = f"Unknown node type: {node_type}" - raise ValueError(msg) - - -@pytest.mark.parametrize( - IsExamplesSectionFixture._fields, - IS_EXAMPLES_SECTION_FIXTURES, - ids=[f.test_id for f in IS_EXAMPLES_SECTION_FIXTURES], -) -def test_is_examples_section( - test_id: str, - node_type: str, - section_ids: list[str], - expected: bool, -) -> None: - """Test examples section detection.""" - node = _make_section_node(node_type, section_ids) - assert _is_examples_section(node) == expected - - -# --- _reorder_nodes tests --- - - -def _make_usage_node(text: str = "usage: cmd [-h]") -> nodes.literal_block: - """Create a usage block node. - - Parameters - ---------- - text : str - Text content for the usage block. - - Returns - ------- - nodes.literal_block - A literal block node with usage text. - """ - return nodes.literal_block(text=text) - - -def _make_examples_section(section_id: str = "examples") -> nodes.section: - """Create an examples section node. - - Parameters - ---------- - section_id : str - The ID for the section. - - Returns - ------- - nodes.section - A section node with the specified ID. - """ - section = nodes.section() - section["ids"] = [section_id] - return section - - -def test_reorder_nodes_usage_after_examples() -> None: - """Usage block after examples gets moved before examples.""" - desc = nodes.paragraph(text="Description") - examples = _make_examples_section() - usage = _make_usage_node() - - # Create a non-examples section - args_section = nodes.section() - args_section["ids"] = ["arguments"] - - result = _reorder_nodes([desc, examples, usage, args_section]) - - # Should be: desc, usage, examples, args - assert len(result) == 4 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.literal_block) - assert isinstance(result[2], nodes.section) - assert result[2]["ids"] == ["examples"] - assert isinstance(result[3], nodes.section) - assert result[3]["ids"] == ["arguments"] - - -def test_reorder_nodes_no_examples() -> None: - """Without examples, original order is preserved.""" - desc = nodes.paragraph(text="Description") - usage = _make_usage_node() - args = nodes.section() - args["ids"] = ["arguments"] - - result = _reorder_nodes([desc, usage, args]) - - # Order unchanged: desc, usage, args - assert len(result) == 3 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.literal_block) - assert isinstance(result[2], nodes.section) - - -def test_reorder_nodes_usage_already_before_examples() -> None: - """When usage is already before examples, order is preserved.""" - desc = nodes.paragraph(text="Description") - usage = _make_usage_node() - examples = _make_examples_section() - args = nodes.section() - args["ids"] = ["arguments"] - - result = _reorder_nodes([desc, usage, examples, args]) - - # Order should be: desc, usage, examples, args - assert len(result) == 4 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.literal_block) - assert isinstance(result[2], nodes.section) - assert result[2]["ids"] == ["examples"] - - -def test_reorder_nodes_empty_list() -> None: - """Empty input returns empty output.""" - result = _reorder_nodes([]) - assert result == [] - - -def test_reorder_nodes_multiple_usage_blocks() -> None: - """Multiple usage blocks are all moved before examples.""" - desc = nodes.paragraph(text="Description") - examples = _make_examples_section() - usage1 = _make_usage_node("usage: cmd1 [-h]") - usage2 = _make_usage_node("usage: cmd2 [-v]") - - result = _reorder_nodes([desc, examples, usage1, usage2]) - - # Should be: desc, usage1, usage2, examples - assert len(result) == 4 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.literal_block) - assert isinstance(result[2], nodes.literal_block) - assert isinstance(result[3], nodes.section) - - -def test_reorder_nodes_multiple_examples_sections() -> None: - """Multiple examples sections are grouped together.""" - desc = nodes.paragraph(text="Description") - examples1 = _make_examples_section("examples") - usage = _make_usage_node() - examples2 = _make_examples_section("machine-readable-output-examples") - args = nodes.section() - args["ids"] = ["arguments"] - - result = _reorder_nodes([desc, examples1, usage, examples2, args]) - - # Should be: desc, usage, examples1, examples2, args - assert len(result) == 5 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.literal_block) - assert result[2]["ids"] == ["examples"] - assert result[3]["ids"] == ["machine-readable-output-examples"] - assert result[4]["ids"] == ["arguments"] - - -def test_reorder_nodes_preserves_non_examples_after() -> None: - """Non-examples nodes after examples stay at the end.""" - desc = nodes.paragraph(text="Description") - examples = _make_examples_section() - usage = _make_usage_node() - epilog = nodes.paragraph(text="Epilog") - - result = _reorder_nodes([desc, examples, usage, epilog]) - - # Should be: desc, usage, examples, epilog - assert len(result) == 4 - assert result[0].astext() == "Description" - assert isinstance(result[1], nodes.literal_block) - assert isinstance(result[2], nodes.section) - assert result[3].astext() == "Epilog" - - -# --- ExemplarConfig tests --- - - -def test_exemplar_config_defaults() -> None: - """ExemplarConfig has sensible defaults.""" - config = ExemplarConfig() - - assert config.examples_term_suffix == "examples" - assert config.examples_base_term == "examples" - assert config.examples_section_title == "Examples" - assert config.usage_pattern == "usage:" - assert config.command_prefix == "$ " - assert config.code_language == "console" - assert config.code_classes == ("highlight-console",) - assert config.usage_code_language == "cli-usage" - assert config.reorder_usage_before_examples is True - - -def test_exemplar_config_custom_values() -> None: - """ExemplarConfig accepts custom values.""" - config = ExemplarConfig( - examples_term_suffix="demos", - examples_base_term="demos", - examples_section_title="Demos", - usage_pattern="synopsis:", - command_prefix="> ", - code_language="bash", - code_classes=("highlight-bash",), - usage_code_language="cli-synopsis", - reorder_usage_before_examples=False, - ) - - assert config.examples_term_suffix == "demos" - assert config.examples_base_term == "demos" - assert config.examples_section_title == "Demos" - assert config.usage_pattern == "synopsis:" - assert config.command_prefix == "> " - assert config.code_language == "bash" - assert config.code_classes == ("highlight-bash",) - assert config.usage_code_language == "cli-synopsis" - assert config.reorder_usage_before_examples is False - - -# --- Config integration tests --- - - -def test_is_examples_term_with_custom_config() -> None: - """is_examples_term respects custom config.""" - config = ExemplarConfig(examples_term_suffix="demos") - - # Custom term should match - assert is_examples_term("demos:", config=config) is True - assert is_examples_term("Machine-readable output demos:", config=config) is True - - # Default term should not match - assert is_examples_term("examples:", config=config) is False - - -def test_is_base_examples_term_with_custom_config() -> None: - """is_base_examples_term respects custom config.""" - config = ExemplarConfig(examples_base_term="demos") - - # Custom term should match - assert is_base_examples_term("demos:", config=config) is True - assert is_base_examples_term("Demos", config=config) is True - - # Default term should not match - assert is_base_examples_term("examples:", config=config) is False - - # Prefixed term should not match (not base) - assert is_base_examples_term("Output demos:", config=config) is False - - -def test_make_section_id_with_custom_config() -> None: - """make_section_id respects custom config.""" - config = ExemplarConfig(examples_term_suffix="demos") - - assert make_section_id("demos:", config=config) == "demos" - assert ( - make_section_id("Machine-readable output demos:", config=config) - == "machine-readable-output-demos" - ) - assert ( - make_section_id("Field-scoped demos:", is_subsection=True, config=config) - == "field-scoped" - ) - - -def test_make_section_title_with_custom_config() -> None: - """make_section_title respects custom config.""" - config = ExemplarConfig( - examples_base_term="demos", - examples_term_suffix="demos", - examples_section_title="Demos", - ) - - assert make_section_title("demos:", config=config) == "Demos" - assert ( - make_section_title("Machine-readable output demos:", config=config) - == "Machine-Readable Output Demos" - ) - assert ( - make_section_title("Field-scoped demos:", is_subsection=True, config=config) - == "Field-Scoped" - ) - - -def test_is_usage_block_with_custom_config() -> None: - """_is_usage_block respects custom config.""" - config = ExemplarConfig(usage_pattern="synopsis:") - - # Custom pattern should match - assert ( - _is_usage_block(nodes.literal_block(text="synopsis: cmd [-h]"), config=config) - is True - ) - assert ( - _is_usage_block(nodes.literal_block(text="Synopsis: cmd"), config=config) - is True - ) - - # Default pattern should not match - assert ( - _is_usage_block(nodes.literal_block(text="usage: cmd [-h]"), config=config) - is False - ) - - -def test_is_examples_section_with_custom_config() -> None: - """_is_examples_section respects custom config.""" - config = ExemplarConfig(examples_term_suffix="demos") - - # Custom term should match - demos_section = nodes.section() - demos_section["ids"] = ["demos"] - assert _is_examples_section(demos_section, config=config) is True - - prefixed_demos = nodes.section() - prefixed_demos["ids"] = ["output-demos"] - assert _is_examples_section(prefixed_demos, config=config) is True - - # Default term should not match - examples_section = nodes.section() - examples_section["ids"] = ["examples"] - assert _is_examples_section(examples_section, config=config) is False - - -def test_reorder_nodes_disabled_via_config() -> None: - """Reordering can be disabled via config.""" - config = ExemplarConfig(reorder_usage_before_examples=False) - - desc = nodes.paragraph(text="Description") - examples = _make_examples_section() - usage = _make_usage_node() - - # Original order: desc, examples, usage - result = _reorder_nodes([desc, examples, usage], config=config) - - # Order should be preserved (not reordered) - assert len(result) == 3 - assert isinstance(result[0], nodes.paragraph) - assert isinstance(result[1], nodes.section) # examples still in position 1 - assert isinstance(result[2], nodes.literal_block) # usage still at end - - -def test_transform_definition_list_with_custom_config() -> None: - """transform_definition_list respects custom config.""" - config = ExemplarConfig( - examples_term_suffix="demos", - examples_base_term="demos", - examples_section_title="Demos", - command_prefix="> ", - code_language="bash", - code_classes=("highlight-bash",), - ) - - dl = nodes.definition_list() - dl += _make_dl_item("demos:", "cmd1") - - result = transform_definition_list(dl, config=config) - - # Should create a section with "demos" id - assert len(result) == 1 - section = result[0] - assert isinstance(section, nodes.section) - assert section["ids"] == ["demos"] - - # Find the title - titles = [c for c in section.children if isinstance(c, nodes.title)] - assert len(titles) == 1 - assert titles[0].astext() == "Demos" - - # Find code blocks - code_blocks = [c for c in section.children if isinstance(c, nodes.literal_block)] - assert len(code_blocks) == 1 - assert code_blocks[0].astext() == "> cmd1" # Custom prefix - assert code_blocks[0]["language"] == "bash" - assert "highlight-bash" in code_blocks[0]["classes"] - - -# --- Parent reference maintenance tests --- - - -def test_process_node_maintains_parent_reference() -> None: - """Verify process_node maintains parent references after child replacement. - - When children are replaced in a container node, the docutils protocol - requires using extend() rather than direct assignment to node.children - to ensure parent-child relationships are properly maintained. - """ - # Create a container with ANSI-encoded text children - container = nodes.container() - text_with_ansi = nodes.Text("\033[32mgreen text\033[0m") - container += text_with_ansi - - # Process the node (will strip ANSI and replace children) - process_node(container) - - # Verify children have correct parent reference - for child in container.children: - assert child.parent is container, ( - f"Child {child!r} should have parent reference to container" - ) - - -def test_extract_sections_maintains_parent_reference() -> None: - """Verify _extract_sections_from_container maintains parent references. - - When remaining children are reassigned to the container, the docutils - protocol requires using extend() to maintain parent-child relationships. - """ - from sphinx_argparse_neo.nodes import argparse_program - - # Create container with mixed children - container = argparse_program() - para = nodes.paragraph(text="Description") - section = nodes.section() - section["ids"] = ["examples"] - - container += para - container += section - - # Extract sections - modified, _extracted = _extract_sections_from_container(container) - - # Verify remaining children have correct parent reference - for child in modified.children: - assert child.parent is modified, ( - f"Child {child!r} should have parent reference to modified container" - ) diff --git a/tests/docs/_ext/test_argparse_lexer.py b/tests/docs/_ext/test_argparse_lexer.py deleted file mode 100644 index d5966007a8..0000000000 --- a/tests/docs/_ext/test_argparse_lexer.py +++ /dev/null @@ -1,825 +0,0 @@ -"""Tests for argparse_lexer Pygments extension.""" - -from __future__ import annotations - -import typing as t - -import pytest -from sphinx_argparse_neo.lexer import ( - ArgparseHelpLexer, - ArgparseLexer, - ArgparseUsageLexer, - tokenize_argparse, - tokenize_usage, -) - -# --- Helper to extract token type names --- - - -def get_tokens(text: str, lexer_class: type = ArgparseLexer) -> list[tuple[str, str]]: - """Get tokens as (type_name, value) tuples. - - Examples - -------- - >>> tokens = get_tokens("usage: cmd [-h]") - >>> any(t[0] == "Token.Name.Attribute" for t in tokens) - True - """ - lexer = lexer_class() - return [ - (str(tok_type), tok_value) for tok_type, tok_value in lexer.get_tokens(text) - ] - - -def get_usage_tokens(text: str) -> list[tuple[str, str]]: - """Get tokens using ArgparseUsageLexer. - - Examples - -------- - >>> tokens = get_usage_tokens("usage: cmd") - >>> tokens[0] - ('Token.Generic.Heading', 'usage:') - """ - return get_tokens(text, ArgparseUsageLexer) - - -def get_help_tokens(text: str) -> list[tuple[str, str]]: - """Get tokens using ArgparseHelpLexer. - - Examples - -------- - >>> tokens = get_help_tokens("positional arguments:") - >>> any("Subheading" in t[0] for t in tokens) - True - """ - return get_tokens(text, ArgparseHelpLexer) - - -# --- Token type fixtures --- - - -class TokenTypeFixture(t.NamedTuple): - """Test fixture for verifying specific token types.""" - - test_id: str - input_text: str - expected_token_type: str - expected_value: str - - -TOKEN_TYPE_FIXTURES: list[TokenTypeFixture] = [ - TokenTypeFixture( - test_id="usage_heading", - input_text="usage:", - expected_token_type="Token.Generic.Heading", - expected_value="usage:", - ), - TokenTypeFixture( - test_id="short_option", - input_text="-h", - expected_token_type="Token.Name.Attribute", - expected_value="-h", - ), - TokenTypeFixture( - test_id="short_option_v", - input_text="-v", - expected_token_type="Token.Name.Attribute", - expected_value="-v", - ), - TokenTypeFixture( - test_id="long_option", - input_text="--verbose", - expected_token_type="Token.Name.Tag", - expected_value="--verbose", - ), - TokenTypeFixture( - test_id="long_option_with_dashes", - input_text="--no-color", - expected_token_type="Token.Name.Tag", - expected_value="--no-color", - ), - TokenTypeFixture( - test_id="uppercase_metavar", - input_text="FILE", - expected_token_type="Token.Name.Variable", - expected_value="FILE", - ), - TokenTypeFixture( - test_id="uppercase_metavar_path", - input_text="PATH", - expected_token_type="Token.Name.Variable", - expected_value="PATH", - ), - TokenTypeFixture( - test_id="uppercase_metavar_with_underscore", - input_text="FILE_PATH", - expected_token_type="Token.Name.Variable", - expected_value="FILE_PATH", - ), - TokenTypeFixture( - test_id="command_name", - input_text="sync", - expected_token_type="Token.Name.Label", - expected_value="sync", - ), - TokenTypeFixture( - test_id="command_with_dash", - input_text="repo-name", - expected_token_type="Token.Name.Label", - expected_value="repo-name", - ), - TokenTypeFixture( - test_id="open_bracket", - input_text="[", - expected_token_type="Token.Punctuation", - expected_value="[", - ), - TokenTypeFixture( - test_id="close_bracket", - input_text="]", - expected_token_type="Token.Punctuation", - expected_value="]", - ), - TokenTypeFixture( - test_id="open_paren", - input_text="(", - expected_token_type="Token.Punctuation", - expected_value="(", - ), - TokenTypeFixture( - test_id="close_paren", - input_text=")", - expected_token_type="Token.Punctuation", - expected_value=")", - ), - TokenTypeFixture( - test_id="open_brace", - input_text="{", - expected_token_type="Token.Punctuation", - expected_value="{", - ), - TokenTypeFixture( - test_id="pipe_operator", - input_text="|", - expected_token_type="Token.Operator", - expected_value="|", - ), - TokenTypeFixture( - test_id="ellipsis", - input_text="...", - expected_token_type="Token.Punctuation", - expected_value="...", - ), -] - - -@pytest.mark.parametrize( - list(TokenTypeFixture._fields), - TOKEN_TYPE_FIXTURES, - ids=[f.test_id for f in TOKEN_TYPE_FIXTURES], -) -def test_token_type( - test_id: str, - input_text: str, - expected_token_type: str, - expected_value: str, -) -> None: - """Test individual token type detection.""" - tokens = get_usage_tokens(input_text) - # Find the expected token (skip whitespace) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t and v.strip()] - assert len(non_ws_tokens) >= 1, f"No non-whitespace tokens found for '{input_text}'" - token_type, token_value = non_ws_tokens[0] - assert token_type == expected_token_type, ( - f"Expected {expected_token_type}, got {token_type}" - ) - assert token_value == expected_value - - -# --- Choice fixtures --- - - -class ChoiceFixture(t.NamedTuple): - """Test fixture for choice enumeration patterns.""" - - test_id: str - input_text: str - expected_choices: list[str] - - -CHOICE_FIXTURES: list[ChoiceFixture] = [ - ChoiceFixture( - test_id="simple_choices", - input_text="{json,yaml,table}", - expected_choices=["json", "yaml", "table"], - ), - ChoiceFixture( - test_id="numeric_choices", - input_text="{1,2,3}", - expected_choices=["1", "2", "3"], - ), - ChoiceFixture( - test_id="auto_always_never", - input_text="{auto,always,never}", - expected_choices=["auto", "always", "never"], - ), - ChoiceFixture( - test_id="two_choices", - input_text="{a,b}", - expected_choices=["a", "b"], - ), -] - - -@pytest.mark.parametrize( - list(ChoiceFixture._fields), - CHOICE_FIXTURES, - ids=[f.test_id for f in CHOICE_FIXTURES], -) -def test_choices( - test_id: str, - input_text: str, - expected_choices: list[str], -) -> None: - """Test choice enumeration tokenization.""" - tokens = get_usage_tokens(input_text) - # Extract choice values (Name.Constant tokens) - choice_tokens = [v for t, v in tokens if t == "Token.Name.Constant"] - assert choice_tokens == expected_choices - - -# --- Mutex group fixtures --- - - -class MutexGroupFixture(t.NamedTuple): - """Test fixture for mutually exclusive group patterns.""" - - test_id: str - input_text: str - expected_options: list[str] - is_required: bool - - -MUTEX_GROUP_FIXTURES: list[MutexGroupFixture] = [ - MutexGroupFixture( - test_id="optional_short", - input_text="[-a | -b | -c]", - expected_options=["-a", "-b", "-c"], - is_required=False, - ), - MutexGroupFixture( - test_id="optional_long", - input_text="[--foo FOO | --bar BAR]", - expected_options=["--foo", "--bar"], - is_required=False, - ), - MutexGroupFixture( - test_id="required_long", - input_text="(--foo | --bar)", - expected_options=["--foo", "--bar"], - is_required=True, - ), - MutexGroupFixture( - test_id="required_with_metavar", - input_text="(--input FILE | --stdin)", - expected_options=["--input", "--stdin"], - is_required=True, - ), - MutexGroupFixture( - test_id="optional_output_formats", - input_text="[--json | --ndjson | --table]", - expected_options=["--json", "--ndjson", "--table"], - is_required=False, - ), -] - - -@pytest.mark.parametrize( - list(MutexGroupFixture._fields), - MUTEX_GROUP_FIXTURES, - ids=[f.test_id for f in MUTEX_GROUP_FIXTURES], -) -def test_mutex_groups( - test_id: str, - input_text: str, - expected_options: list[str], - is_required: bool, -) -> None: - """Test mutually exclusive group tokenization.""" - tokens = get_usage_tokens(input_text) - - # Check for proper brackets (required uses parens, optional uses brackets) - if is_required: - assert ("Token.Punctuation", "(") in tokens - assert ("Token.Punctuation", ")") in tokens - else: - assert ("Token.Punctuation", "[") in tokens - assert ("Token.Punctuation", "]") in tokens - - # Check pipe operators present - pipe_count = sum(1 for t, v in tokens if t == "Token.Operator" and v == "|") - assert pipe_count == len(expected_options) - 1 - - # Check options are present - for opt in expected_options: - if opt.startswith("--"): - assert ("Token.Name.Tag", opt) in tokens - else: - assert ("Token.Name.Attribute", opt) in tokens - - -# --- Nargs pattern fixtures --- - - -class NargsFixture(t.NamedTuple): - """Test fixture for nargs/variadic patterns.""" - - test_id: str - input_text: str - has_ellipsis: bool - has_metavar: str | None - - -NARGS_FIXTURES: list[NargsFixture] = [ - NargsFixture( - test_id="nargs_plus", - input_text="FILE ...", - has_ellipsis=True, - has_metavar="FILE", - ), - NargsFixture( - test_id="nargs_star", - input_text="[FILE ...]", - has_ellipsis=True, - has_metavar="FILE", - ), - NargsFixture( - test_id="nargs_question", - input_text="[--foo [FOO]]", - has_ellipsis=False, - has_metavar="FOO", - ), - NargsFixture( - test_id="nargs_plus_with_option", - input_text="[--bar X [X ...]]", - has_ellipsis=True, - has_metavar="X", - ), -] - - -@pytest.mark.parametrize( - list(NargsFixture._fields), - NARGS_FIXTURES, - ids=[f.test_id for f in NARGS_FIXTURES], -) -def test_nargs_patterns( - test_id: str, - input_text: str, - has_ellipsis: bool, - has_metavar: str | None, -) -> None: - """Test nargs/variadic pattern tokenization.""" - tokens = get_usage_tokens(input_text) - - # Check ellipsis - ellipsis_present = ("Token.Punctuation", "...") in tokens - assert ellipsis_present == has_ellipsis - - # Check metavar - if has_metavar: - assert ("Token.Name.Variable", has_metavar) in tokens - - -# --- Long option with value fixtures --- - - -class LongOptionValueFixture(t.NamedTuple): - """Test fixture for long options with = values.""" - - test_id: str - input_text: str - option: str - value: str - - -LONG_OPTION_VALUE_FIXTURES: list[LongOptionValueFixture] = [ - LongOptionValueFixture( - test_id="config_file", - input_text="--config=FILE", - option="--config", - value="FILE", - ), - LongOptionValueFixture( - test_id="log_level", - input_text="--log-level=DEBUG", - option="--log-level", - value="DEBUG", - ), - LongOptionValueFixture( - test_id="lowercase_value", - input_text="--output=path", - option="--output", - value="path", - ), -] - - -@pytest.mark.parametrize( - list(LongOptionValueFixture._fields), - LONG_OPTION_VALUE_FIXTURES, - ids=[f.test_id for f in LONG_OPTION_VALUE_FIXTURES], -) -def test_long_option_with_equals_value( - test_id: str, - input_text: str, - option: str, - value: str, -) -> None: - """Test long option with = value tokenization.""" - tokens = get_usage_tokens(input_text) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t] - - assert len(non_ws_tokens) >= 3 - assert non_ws_tokens[0] == ("Token.Name.Tag", option) - assert non_ws_tokens[1] == ("Token.Operator", "=") - assert non_ws_tokens[2][1] == value - - -# --- Short option with value fixtures --- - - -class ShortOptionValueFixture(t.NamedTuple): - """Test fixture for short options with space-separated values.""" - - test_id: str - input_text: str - option: str - value: str - - -SHORT_OPTION_VALUE_FIXTURES: list[ShortOptionValueFixture] = [ - ShortOptionValueFixture( - test_id="config_path", - input_text="-c config-path", - option="-c", - value="config-path", - ), - ShortOptionValueFixture( - test_id="directory", - input_text="-d DIRECTORY", - option="-d", - value="DIRECTORY", - ), - ShortOptionValueFixture( - test_id="simple_name", - input_text="-r name", - option="-r", - value="name", - ), - ShortOptionValueFixture( - test_id="underscore_metavar", - input_text="-L socket_name", - option="-L", - value="socket_name", - ), - ShortOptionValueFixture( - test_id="multiple_underscores", - input_text="-f tmux_config_file", - option="-f", - value="tmux_config_file", - ), -] - - -@pytest.mark.parametrize( - list(ShortOptionValueFixture._fields), - SHORT_OPTION_VALUE_FIXTURES, - ids=[f.test_id for f in SHORT_OPTION_VALUE_FIXTURES], -) -def test_short_option_with_value( - test_id: str, - input_text: str, - option: str, - value: str, -) -> None: - """Test short option followed by value tokenization.""" - tokens = get_usage_tokens(input_text) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t] - - assert len(non_ws_tokens) >= 2 - assert non_ws_tokens[0] == ("Token.Name.Attribute", option) - assert non_ws_tokens[1][1] == value - - -# --- Full usage string fixtures --- - - -class UsageStringFixture(t.NamedTuple): - """Test fixture for full usage string tokenization.""" - - test_id: str - input_text: str - expected_contains: list[tuple[str, str]] - - -USAGE_STRING_FIXTURES: list[UsageStringFixture] = [ - UsageStringFixture( - test_id="simple_usage", - input_text="usage: cmd [-h]", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "cmd"), - ("Token.Punctuation", "["), - ("Token.Name.Attribute", "-h"), - ("Token.Punctuation", "]"), - ], - ), - UsageStringFixture( - test_id="mutually_exclusive", - input_text="[--json | --ndjson | --table]", - expected_contains=[ - ("Token.Name.Tag", "--json"), - ("Token.Operator", "|"), - ("Token.Name.Tag", "--ndjson"), - ("Token.Operator", "|"), - ("Token.Name.Tag", "--table"), - ], - ), - UsageStringFixture( - test_id="subcommand", - input_text="usage: vcspull sync", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "vcspull"), - # Subcommands now use Name.Function per 30ea233 - ("Token.Name.Function", "sync"), - ], - ), - UsageStringFixture( - test_id="with_choices", - input_text="usage: cmd {a,b,c}", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Constant", "a"), - ("Token.Name.Constant", "b"), - ("Token.Name.Constant", "c"), - ], - ), - UsageStringFixture( - test_id="complex_usage", - input_text="usage: prog [-h] [--verbose] FILE ...", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "prog"), - ("Token.Name.Attribute", "-h"), - ("Token.Name.Tag", "--verbose"), - ("Token.Name.Variable", "FILE"), - ("Token.Punctuation", "..."), - ], - ), -] - - -@pytest.mark.parametrize( - list(UsageStringFixture._fields), - USAGE_STRING_FIXTURES, - ids=[f.test_id for f in USAGE_STRING_FIXTURES], -) -def test_usage_string( - test_id: str, - input_text: str, - expected_contains: list[tuple[str, str]], -) -> None: - """Test full usage string tokenization contains expected tokens.""" - tokens = get_usage_tokens(input_text) - for expected_type, expected_value in expected_contains: - assert (expected_type, expected_value) in tokens, ( - f"Expected ({expected_type}, {expected_value!r}) not found in tokens" - ) - - -# --- Section header fixtures --- - - -class SectionHeaderFixture(t.NamedTuple): - """Test fixture for section header recognition.""" - - test_id: str - input_text: str - expected_header: str - - -SECTION_HEADER_FIXTURES: list[SectionHeaderFixture] = [ - SectionHeaderFixture( - test_id="positional_arguments", - input_text="positional arguments:", - expected_header="positional arguments:", - ), - SectionHeaderFixture( - test_id="options", - input_text="options:", - expected_header="options:", - ), - SectionHeaderFixture( - test_id="optional_arguments", - input_text="optional arguments:", - expected_header="optional arguments:", - ), - SectionHeaderFixture( - test_id="custom_section", - input_text="advanced options:", - expected_header="advanced options:", - ), -] - - -@pytest.mark.parametrize( - list(SectionHeaderFixture._fields), - SECTION_HEADER_FIXTURES, - ids=[f.test_id for f in SECTION_HEADER_FIXTURES], -) -def test_section_headers( - test_id: str, - input_text: str, - expected_header: str, -) -> None: - """Test section header tokenization.""" - tokens = get_help_tokens(input_text) - # Section headers should be Generic.Subheading - # Strip newlines from token values (lexer may include trailing \n) - subheading_tokens = [ - v.strip() for t, v in tokens if t == "Token.Generic.Subheading" - ] - assert expected_header in subheading_tokens - - -# --- Full help output test --- - - -def test_full_help_output() -> None: - """Test full argparse -h output tokenization.""" - help_text = """\ -usage: vcspull sync [-h] [-c CONFIG] [-d DIRECTORY] - [--json | --ndjson | --table] - [repo-name] [path] - -positional arguments: - repo-name repository name filter - path path filter - -options: - -h, --help show this help message and exit - -c CONFIG, --config CONFIG - config file path - --json output as JSON -""" - tokens = get_help_tokens(help_text) - - # Check usage heading - assert ("Token.Generic.Heading", "usage:") in tokens - - # Check section headers - subheadings = [v for t, v in tokens if t == "Token.Generic.Subheading"] - assert "positional arguments:" in subheadings - assert "options:" in subheadings - - # Check options are recognized - assert ("Token.Name.Attribute", "-h") in tokens - assert ("Token.Name.Tag", "--help") in tokens - assert ("Token.Name.Tag", "--config") in tokens - assert ("Token.Name.Tag", "--json") in tokens - - # Check command/positional names - assert ("Token.Name.Label", "vcspull") in tokens - # Subcommands now use Name.Function per 30ea233 - assert ("Token.Name.Function", "sync") in tokens - - -# --- Real vcspull usage output test --- - - -def test_vcspull_sync_usage() -> None: - """Test real vcspull sync usage output tokenization.""" - usage_text = """\ -usage: vcspull sync [-h] [-c CONFIG] [-d DIRECTORY] - [--json | --ndjson | --table] [--color {auto,always,never}] - [--no-progress] [--verbose] - [repo-name] [path]""" - - tokens = get_usage_tokens(usage_text) - - expected = [ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "vcspull"), - # Subcommands now use Name.Function per 30ea233 - ("Token.Name.Function", "sync"), - ("Token.Name.Attribute", "-h"), - ("Token.Name.Attribute", "-c"), - ("Token.Name.Variable", "CONFIG"), - ("Token.Name.Attribute", "-d"), - ("Token.Name.Variable", "DIRECTORY"), - ("Token.Name.Tag", "--json"), - ("Token.Name.Tag", "--ndjson"), - ("Token.Name.Tag", "--table"), - ("Token.Name.Tag", "--color"), - ("Token.Name.Tag", "--no-progress"), - ("Token.Name.Tag", "--verbose"), - # Optional positional args in brackets also use Name.Function per 30ea233 - ("Token.Name.Function", "repo-name"), - ("Token.Name.Function", "path"), - ] - - for expected_type, expected_value in expected: - assert (expected_type, expected_value) in tokens, ( - f"Expected ({expected_type}, {expected_value!r}) not in tokens" - ) - - # Check choices are properly tokenized - assert ("Token.Name.Constant", "auto") in tokens - assert ("Token.Name.Constant", "always") in tokens - assert ("Token.Name.Constant", "never") in tokens - - -# --- tokenize_argparse helper function test --- - - -def test_tokenize_argparse_helper() -> None: - """Test the tokenize_argparse helper function.""" - result = tokenize_argparse("usage: cmd [-h]") - - assert result[0] == ("Token.Generic.Heading", "usage:") - assert ("Token.Name.Label", "cmd") in result - assert ("Token.Name.Attribute", "-h") in result - - -def test_tokenize_usage_helper() -> None: - """Test the tokenize_usage helper function.""" - result = tokenize_usage("usage: cmd [-h]") - - assert result[0] == ("Token.Generic.Heading", "usage:") - assert ("Token.Name.Label", "cmd") in result - assert ("Token.Name.Attribute", "-h") in result - - -# --- Lexer class selection tests --- - - -def test_argparse_lexer_usage_detection() -> None: - """Test ArgparseLexer handles usage lines correctly.""" - lexer = ArgparseLexer() - tokens = list(lexer.get_tokens("usage: cmd [-h]")) - token_types = [str(t) for t, v in tokens] - assert "Token.Generic.Heading" in token_types - - -def test_argparse_lexer_section_detection() -> None: - """Test ArgparseLexer handles section headers correctly.""" - lexer = ArgparseLexer() - tokens = list(lexer.get_tokens("positional arguments:")) - token_types = [str(t) for t, v in tokens] - assert "Token.Generic.Subheading" in token_types - - -def test_argparse_usage_lexer_standalone() -> None: - """Test ArgparseUsageLexer works standalone.""" - lexer = ArgparseUsageLexer() - tokens = list(lexer.get_tokens("usage: cmd [-h] --foo FILE")) - token_types = [str(t) for t, v in tokens] - - assert "Token.Generic.Heading" in token_types - assert "Token.Name.Label" in token_types # cmd - assert "Token.Name.Attribute" in token_types # -h - assert "Token.Name.Tag" in token_types # --foo - - -def test_argparse_help_lexer_multiline() -> None: - """Test ArgparseHelpLexer handles multiline help.""" - lexer = ArgparseHelpLexer() - help_text = """usage: cmd - -options: - -h help -""" - tokens = list(lexer.get_tokens(help_text)) - token_values = [v for t, v in tokens] - - assert "usage:" in token_values - assert "options:" in token_values or any( - "options:" in v for v in token_values if isinstance(v, str) - ) - - -def test_lowercase_metavar_with_underscores() -> None: - """Test lowercase metavars with underscores are fully captured. - - Regression test: previously `socket_name` was tokenized as `socket` + `_name`. - Example from tmuxp load usage. - """ - usage = "usage: prog [-L socket_name] [-S socket_path] [-f config_file]" - tokens = get_usage_tokens(usage) - - # All underscore metavars should be fully captured - assert ("Token.Name.Variable", "socket_name") in tokens - assert ("Token.Name.Variable", "socket_path") in tokens - assert ("Token.Name.Variable", "config_file") in tokens diff --git a/tests/docs/_ext/test_argparse_roles.py b/tests/docs/_ext/test_argparse_roles.py deleted file mode 100644 index 08093c2481..0000000000 --- a/tests/docs/_ext/test_argparse_roles.py +++ /dev/null @@ -1,439 +0,0 @@ -"""Tests for argparse_roles docutils extension.""" - -from __future__ import annotations - -import typing as t - -import pytest -from docutils import nodes -from sphinx_argparse_neo.roles import ( - cli_choice_role, - cli_command_role, - cli_default_role, - cli_metavar_role, - cli_option_role, - normalize_options, - register_roles, -) - -# --- normalize_options tests --- - - -def test_normalize_options_none() -> None: - """Test normalize_options with None input.""" - assert normalize_options(None) == {} - - -def test_normalize_options_dict() -> None: - """Test normalize_options with dict input.""" - opts = {"class": "custom"} - assert normalize_options(opts) == {"class": "custom"} - - -def test_normalize_options_empty_dict() -> None: - """Test normalize_options with empty dict input.""" - assert normalize_options({}) == {} - - -# --- CLI Option Role Tests --- - - -class OptionRoleFixture(t.NamedTuple): - """Test fixture for CLI option role.""" - - test_id: str - text: str - expected_classes: list[str] - - -OPTION_ROLE_FIXTURES: list[OptionRoleFixture] = [ - OptionRoleFixture( - test_id="long_option", - text="--verbose", - expected_classes=["cli-option", "cli-option-long"], - ), - OptionRoleFixture( - test_id="long_option_with_dash", - text="--no-color", - expected_classes=["cli-option", "cli-option-long"], - ), - OptionRoleFixture( - test_id="short_option", - text="-h", - expected_classes=["cli-option", "cli-option-short"], - ), - OptionRoleFixture( - test_id="short_option_v", - text="-v", - expected_classes=["cli-option", "cli-option-short"], - ), - OptionRoleFixture( - test_id="no_dash_prefix", - text="option", - expected_classes=["cli-option"], - ), -] - - -@pytest.mark.parametrize( - list(OptionRoleFixture._fields), - OPTION_ROLE_FIXTURES, - ids=[f.test_id for f in OPTION_ROLE_FIXTURES], -) -def test_cli_option_role( - test_id: str, - text: str, - expected_classes: list[str], -) -> None: - """Test CLI option role generates correct node classes.""" - node_list, messages = cli_option_role( - "cli-option", - f":cli-option:`{text}`", - text, - 1, - None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - node = node_list[0] - assert isinstance(node, nodes.literal) - assert node.astext() == text - assert node["classes"] == expected_classes - - -def test_cli_option_role_with_options() -> None: - """Test CLI option role accepts options parameter.""" - node_list, _messages = cli_option_role( - "cli-option", - ":cli-option:`--test`", - "--test", - 1, - None, - options={"class": "extra"}, - ) - - assert len(node_list) == 1 - # Options are normalized but classes come from role logic - assert "cli-option" in node_list[0]["classes"] - - -# --- CLI Metavar Role Tests --- - - -class MetavarRoleFixture(t.NamedTuple): - """Test fixture for CLI metavar role.""" - - test_id: str - text: str - - -METAVAR_ROLE_FIXTURES: list[MetavarRoleFixture] = [ - MetavarRoleFixture(test_id="file", text="FILE"), - MetavarRoleFixture(test_id="path", text="PATH"), - MetavarRoleFixture(test_id="directory", text="DIRECTORY"), - MetavarRoleFixture(test_id="config", text="CONFIG"), - MetavarRoleFixture(test_id="lowercase", text="value"), -] - - -@pytest.mark.parametrize( - list(MetavarRoleFixture._fields), - METAVAR_ROLE_FIXTURES, - ids=[f.test_id for f in METAVAR_ROLE_FIXTURES], -) -def test_cli_metavar_role( - test_id: str, - text: str, -) -> None: - """Test CLI metavar role generates correct node.""" - node_list, messages = cli_metavar_role( - "cli-metavar", - f":cli-metavar:`{text}`", - text, - 1, - None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - node = node_list[0] - assert isinstance(node, nodes.literal) - assert node.astext() == text - assert node["classes"] == ["cli-metavar"] - - -# --- CLI Command Role Tests --- - - -class CommandRoleFixture(t.NamedTuple): - """Test fixture for CLI command role.""" - - test_id: str - text: str - - -COMMAND_ROLE_FIXTURES: list[CommandRoleFixture] = [ - CommandRoleFixture(test_id="sync", text="sync"), - CommandRoleFixture(test_id="add", text="add"), - CommandRoleFixture(test_id="vcspull", text="vcspull"), - CommandRoleFixture(test_id="list", text="list"), - CommandRoleFixture(test_id="with_dash", text="repo-add"), -] - - -@pytest.mark.parametrize( - list(CommandRoleFixture._fields), - COMMAND_ROLE_FIXTURES, - ids=[f.test_id for f in COMMAND_ROLE_FIXTURES], -) -def test_cli_command_role( - test_id: str, - text: str, -) -> None: - """Test CLI command role generates correct node.""" - node_list, messages = cli_command_role( - "cli-command", - f":cli-command:`{text}`", - text, - 1, - None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - node = node_list[0] - assert isinstance(node, nodes.literal) - assert node.astext() == text - assert node["classes"] == ["cli-command"] - - -# --- CLI Default Role Tests --- - - -class DefaultRoleFixture(t.NamedTuple): - """Test fixture for CLI default role.""" - - test_id: str - text: str - - -DEFAULT_ROLE_FIXTURES: list[DefaultRoleFixture] = [ - DefaultRoleFixture(test_id="none", text="None"), - DefaultRoleFixture(test_id="quoted_auto", text='"auto"'), - DefaultRoleFixture(test_id="number", text="0"), - DefaultRoleFixture(test_id="empty_string", text='""'), - DefaultRoleFixture(test_id="true", text="True"), - DefaultRoleFixture(test_id="false", text="False"), -] - - -@pytest.mark.parametrize( - list(DefaultRoleFixture._fields), - DEFAULT_ROLE_FIXTURES, - ids=[f.test_id for f in DEFAULT_ROLE_FIXTURES], -) -def test_cli_default_role( - test_id: str, - text: str, -) -> None: - """Test CLI default role generates correct node.""" - node_list, messages = cli_default_role( - "cli-default", - f":cli-default:`{text}`", - text, - 1, - None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - node = node_list[0] - assert isinstance(node, nodes.literal) - assert node.astext() == text - assert node["classes"] == ["cli-default"] - - -# --- CLI Choice Role Tests --- - - -class ChoiceRoleFixture(t.NamedTuple): - """Test fixture for CLI choice role.""" - - test_id: str - text: str - - -CHOICE_ROLE_FIXTURES: list[ChoiceRoleFixture] = [ - ChoiceRoleFixture(test_id="json", text="json"), - ChoiceRoleFixture(test_id="yaml", text="yaml"), - ChoiceRoleFixture(test_id="table", text="table"), - ChoiceRoleFixture(test_id="auto", text="auto"), - ChoiceRoleFixture(test_id="always", text="always"), - ChoiceRoleFixture(test_id="never", text="never"), -] - - -@pytest.mark.parametrize( - list(ChoiceRoleFixture._fields), - CHOICE_ROLE_FIXTURES, - ids=[f.test_id for f in CHOICE_ROLE_FIXTURES], -) -def test_cli_choice_role( - test_id: str, - text: str, -) -> None: - """Test CLI choice role generates correct node.""" - node_list, messages = cli_choice_role( - "cli-choice", - f":cli-choice:`{text}`", - text, - 1, - None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - node = node_list[0] - assert isinstance(node, nodes.literal) - assert node.astext() == text - assert node["classes"] == ["cli-choice"] - - -# --- Register Roles Test --- - - -def test_register_roles() -> None: - """Test register_roles doesn't raise errors.""" - # This should not raise any exceptions - register_roles() - - -# --- Role Return Type Tests --- - - -def test_all_roles_return_correct_types() -> None: - """Test all roles return proper tuple of (nodes, messages).""" - role_functions = [ - cli_option_role, - cli_metavar_role, - cli_command_role, - cli_default_role, - cli_choice_role, - ] - - for role_func in role_functions: - result = role_func("test", ":test:`value`", "value", 1, None) - - assert isinstance(result, tuple), f"{role_func.__name__} should return tuple" - assert len(result) == 2, f"{role_func.__name__} should return 2-tuple" - - node_list, messages = result - assert isinstance(node_list, list), ( - f"{role_func.__name__} first element should be list" - ) - assert isinstance(messages, list), ( - f"{role_func.__name__} second element should be list" - ) - assert len(node_list) == 1, f"{role_func.__name__} should return one node" - assert len(messages) == 0, ( - f"{role_func.__name__} should return no error messages" - ) - - -# --- Node Structure Tests --- - - -def test_cli_option_node_structure() -> None: - """Test CLI option node has expected structure.""" - node_list, _ = cli_option_role( - "cli-option", - ":cli-option:`--test`", - "--test", - 1, - None, - ) - - node = node_list[0] - - # Check node type - assert isinstance(node, nodes.literal) - - # Check rawsource is preserved - assert node.rawsource == ":cli-option:`--test`" - - # Check text content - assert len(node.children) == 1 - assert isinstance(node.children[0], nodes.Text) - assert str(node.children[0]) == "--test" - - -def test_roles_with_none_content_parameter() -> None: - """Test roles handle None content parameter correctly.""" - node_list, messages = cli_option_role( - "cli-option", - ":cli-option:`--test`", - "--test", - 1, - None, - options=None, - content=None, - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - -def test_roles_with_empty_content_parameter() -> None: - """Test roles handle empty content parameter correctly.""" - node_list, messages = cli_option_role( - "cli-option", - ":cli-option:`--test`", - "--test", - 1, - None, - options={}, - content=[], - ) - - assert len(node_list) == 1 - assert len(messages) == 0 - - -# --- Edge Case Tests --- - - -def test_cli_option_role_empty_text() -> None: - """Test CLI option role with empty text.""" - node_list, _messages = cli_option_role( - "cli-option", - ":cli-option:``", - "", - 1, - None, - ) - - assert len(node_list) == 1 - assert node_list[0].astext() == "" - # No dash prefix, so only base class - assert node_list[0]["classes"] == ["cli-option"] - - -def test_cli_option_role_special_characters() -> None: - """Test CLI option role with special characters in text.""" - node_list, _messages = cli_option_role( - "cli-option", - ":cli-option:`--foo-bar_baz`", - "--foo-bar_baz", - 1, - None, - ) - - assert len(node_list) == 1 - assert node_list[0].astext() == "--foo-bar_baz" - assert "cli-option-long" in node_list[0]["classes"] diff --git a/tests/docs/_ext/test_cli_usage_lexer.py b/tests/docs/_ext/test_cli_usage_lexer.py deleted file mode 100644 index fab92a3d14..0000000000 --- a/tests/docs/_ext/test_cli_usage_lexer.py +++ /dev/null @@ -1,358 +0,0 @@ -"""Tests for cli_usage_lexer Pygments extension.""" - -from __future__ import annotations - -import typing as t - -import pytest -from sphinx_argparse_neo.cli_usage_lexer import ( - CLIUsageLexer, - tokenize_usage, -) - -# --- Helper to extract token type names --- - - -def get_tokens(text: str) -> list[tuple[str, str]]: - """Get tokens as (type_name, value) tuples.""" - lexer = CLIUsageLexer() - return [ - (str(tok_type), tok_value) for tok_type, tok_value in lexer.get_tokens(text) - ] - - -# --- Token type fixtures --- - - -class TokenTypeFixture(t.NamedTuple): - """Test fixture for verifying specific token types.""" - - test_id: str - input_text: str - expected_token_type: str - expected_value: str - - -TOKEN_TYPE_FIXTURES: list[TokenTypeFixture] = [ - TokenTypeFixture( - test_id="usage_heading", - input_text="usage:", - expected_token_type="Token.Generic.Heading", - expected_value="usage:", - ), - TokenTypeFixture( - test_id="short_option", - input_text="-h", - expected_token_type="Token.Name.Attribute", - expected_value="-h", - ), - TokenTypeFixture( - test_id="long_option", - input_text="--verbose", - expected_token_type="Token.Name.Tag", - expected_value="--verbose", - ), - TokenTypeFixture( - test_id="long_option_with_dashes", - input_text="--no-color", - expected_token_type="Token.Name.Tag", - expected_value="--no-color", - ), - TokenTypeFixture( - test_id="uppercase_metavar", - input_text="COMMAND", - expected_token_type="Token.Name.Constant", - expected_value="COMMAND", - ), - TokenTypeFixture( - test_id="uppercase_metavar_with_underscore", - input_text="FILE_PATH", - expected_token_type="Token.Name.Constant", - expected_value="FILE_PATH", - ), - TokenTypeFixture( - test_id="positional_arg", - input_text="repo-name", - expected_token_type="Token.Name.Label", - expected_value="repo-name", - ), - TokenTypeFixture( - test_id="command_name", - input_text="vcspull", - expected_token_type="Token.Name.Label", - expected_value="vcspull", - ), - TokenTypeFixture( - test_id="open_bracket", - input_text="[", - expected_token_type="Token.Punctuation", - expected_value="[", - ), - TokenTypeFixture( - test_id="close_bracket", - input_text="]", - expected_token_type="Token.Punctuation", - expected_value="]", - ), - TokenTypeFixture( - test_id="pipe_operator", - input_text="|", - expected_token_type="Token.Operator", - expected_value="|", - ), -] - - -@pytest.mark.parametrize( - TokenTypeFixture._fields, - TOKEN_TYPE_FIXTURES, - ids=[f.test_id for f in TOKEN_TYPE_FIXTURES], -) -def test_token_type( - test_id: str, - input_text: str, - expected_token_type: str, - expected_value: str, -) -> None: - """Test individual token type detection.""" - tokens = get_tokens(input_text) - # Find the expected token (skip whitespace) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t and v.strip()] - assert len(non_ws_tokens) >= 1, f"No non-whitespace tokens found for '{input_text}'" - token_type, token_value = non_ws_tokens[0] - assert token_type == expected_token_type, ( - f"Expected {expected_token_type}, got {token_type}" - ) - assert token_value == expected_value - - -# --- Short option with value fixtures --- - - -class ShortOptionValueFixture(t.NamedTuple): - """Test fixture for short options with values.""" - - test_id: str - input_text: str - option: str - value: str - - -SHORT_OPTION_VALUE_FIXTURES: list[ShortOptionValueFixture] = [ - ShortOptionValueFixture( - test_id="lowercase_value", - input_text="-c config-path", - option="-c", - value="config-path", - ), - ShortOptionValueFixture( - test_id="uppercase_value", - input_text="-d DIRECTORY", - option="-d", - value="DIRECTORY", - ), - ShortOptionValueFixture( - test_id="simple_value", - input_text="-r name", - option="-r", - value="name", - ), -] - - -@pytest.mark.parametrize( - ShortOptionValueFixture._fields, - SHORT_OPTION_VALUE_FIXTURES, - ids=[f.test_id for f in SHORT_OPTION_VALUE_FIXTURES], -) -def test_short_option_with_value( - test_id: str, - input_text: str, - option: str, - value: str, -) -> None: - """Test short option followed by value tokenization.""" - tokens = get_tokens(input_text) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t] - - assert len(non_ws_tokens) >= 2 - assert non_ws_tokens[0] == ("Token.Name.Attribute", option) - # Value could be Name.Variable or Name.Constant depending on case - assert non_ws_tokens[1][1] == value - - -# --- Long option with value fixtures --- - - -class LongOptionValueFixture(t.NamedTuple): - """Test fixture for long options with = values.""" - - test_id: str - input_text: str - option: str - value: str - - -LONG_OPTION_VALUE_FIXTURES: list[LongOptionValueFixture] = [ - LongOptionValueFixture( - test_id="uppercase_value", - input_text="--config=FILE", - option="--config", - value="FILE", - ), - LongOptionValueFixture( - test_id="lowercase_value", - input_text="--output=path", - option="--output", - value="path", - ), -] - - -@pytest.mark.parametrize( - LongOptionValueFixture._fields, - LONG_OPTION_VALUE_FIXTURES, - ids=[f.test_id for f in LONG_OPTION_VALUE_FIXTURES], -) -def test_long_option_with_value( - test_id: str, - input_text: str, - option: str, - value: str, -) -> None: - """Test long option with = value tokenization.""" - tokens = get_tokens(input_text) - non_ws_tokens = [(t, v) for t, v in tokens if "Whitespace" not in t] - - assert len(non_ws_tokens) >= 3 - assert non_ws_tokens[0] == ("Token.Name.Tag", option) - assert non_ws_tokens[1] == ("Token.Operator", "=") - assert non_ws_tokens[2][1] == value - - -# --- Full usage string fixtures --- - - -class UsageStringFixture(t.NamedTuple): - """Test fixture for full usage string tokenization.""" - - test_id: str - input_text: str - expected_contains: list[tuple[str, str]] - - -USAGE_STRING_FIXTURES: list[UsageStringFixture] = [ - UsageStringFixture( - test_id="simple_usage", - input_text="usage: cmd [-h]", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "cmd"), - ("Token.Punctuation", "["), - ("Token.Name.Attribute", "-h"), - ("Token.Punctuation", "]"), - ], - ), - UsageStringFixture( - test_id="mutually_exclusive", - input_text="[--json | --ndjson | --table]", - expected_contains=[ - ("Token.Name.Tag", "--json"), - ("Token.Operator", "|"), - ("Token.Name.Tag", "--ndjson"), - ("Token.Operator", "|"), - ("Token.Name.Tag", "--table"), - ], - ), - UsageStringFixture( - test_id="subcommand", - input_text="usage: vcspull sync", - expected_contains=[ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "vcspull"), - ("Token.Name.Label", "sync"), - ], - ), - UsageStringFixture( - test_id="positional_args", - input_text="[repo-name] [path]", - expected_contains=[ - ("Token.Punctuation", "["), - ("Token.Name.Label", "repo-name"), - ("Token.Punctuation", "]"), - ("Token.Punctuation", "["), - ("Token.Name.Label", "path"), - ("Token.Punctuation", "]"), - ], - ), -] - - -@pytest.mark.parametrize( - UsageStringFixture._fields, - USAGE_STRING_FIXTURES, - ids=[f.test_id for f in USAGE_STRING_FIXTURES], -) -def test_usage_string( - test_id: str, - input_text: str, - expected_contains: list[tuple[str, str]], -) -> None: - """Test full usage string tokenization contains expected tokens.""" - tokens = get_tokens(input_text) - for expected_type, expected_value in expected_contains: - assert (expected_type, expected_value) in tokens, ( - f"Expected ({expected_type}, {expected_value!r}) not found in tokens" - ) - - -# --- Real vcspull usage output test --- - - -def test_vcspull_sync_usage() -> None: - """Test real vcspull sync usage output tokenization.""" - usage_text = """\ -usage: vcspull sync [-h] [-c CONFIG] [-d DIRECTORY] - [--json | --ndjson | --table] [--color {auto,always,never}] - [--no-progress] [--verbose] - [repo-name] [path]""" - - tokens = get_tokens(usage_text) - - # Check key elements are present - # Note: DIRECTORY after -d is Name.Variable (option value), not Name.Constant - expected = [ - ("Token.Generic.Heading", "usage:"), - ("Token.Name.Label", "vcspull"), - ("Token.Name.Label", "sync"), - ("Token.Name.Attribute", "-h"), - ("Token.Name.Attribute", "-c"), - ("Token.Name.Variable", "CONFIG"), # Option value, not standalone metavar - ("Token.Name.Attribute", "-d"), - ("Token.Name.Variable", "DIRECTORY"), # Option value, not standalone metavar - ("Token.Name.Tag", "--json"), - ("Token.Name.Tag", "--ndjson"), - ("Token.Name.Tag", "--table"), - ("Token.Name.Tag", "--color"), - ("Token.Name.Tag", "--no-progress"), - ("Token.Name.Tag", "--verbose"), - ("Token.Name.Label", "repo-name"), - ("Token.Name.Label", "path"), - ] - - for expected_type, expected_value in expected: - assert (expected_type, expected_value) in tokens, ( - f"Expected ({expected_type}, {expected_value!r}) not in tokens" - ) - - -# --- tokenize_usage helper function test --- - - -def test_tokenize_usage_helper() -> None: - """Test the tokenize_usage helper function.""" - result = tokenize_usage("usage: cmd [-h]") - - assert result[0] == ("Token.Generic.Heading", "usage:") - assert ("Token.Name.Label", "cmd") in result - assert ("Token.Name.Attribute", "-h") in result diff --git a/tests/docs/_ext/test_sphinx_fonts.py b/tests/docs/_ext/test_sphinx_fonts.py deleted file mode 100644 index df59c5208a..0000000000 --- a/tests/docs/_ext/test_sphinx_fonts.py +++ /dev/null @@ -1,576 +0,0 @@ -"""Tests for sphinx_fonts Sphinx extension.""" - -from __future__ import annotations - -import logging -import pathlib -import types -import typing as t -import urllib.error - -import pytest -import sphinx_fonts - -# --- _cache_dir tests --- - - -def test_cache_dir_returns_home_cache_path() -> None: - """_cache_dir returns ~/.cache/sphinx-fonts.""" - result = sphinx_fonts._cache_dir() - assert result == pathlib.Path.home() / ".cache" / "sphinx-fonts" - - -# --- _cdn_url tests --- - - -class CdnUrlFixture(t.NamedTuple): - """Test fixture for CDN URL generation.""" - - test_id: str - package: str - version: str - font_id: str - subset: str - weight: int - style: str - expected_url: str - - -CDN_URL_FIXTURES: list[CdnUrlFixture] = [ - CdnUrlFixture( - test_id="normal_weight", - package="@fontsource/open-sans", - version="5.2.5", - font_id="open-sans", - subset="latin", - weight=400, - style="normal", - expected_url=( - "https://cdn.jsdelivr.net/npm/@fontsource/open-sans@5.2.5" - "/files/open-sans-latin-400-normal.woff2" - ), - ), - CdnUrlFixture( - test_id="bold_italic", - package="@fontsource/roboto", - version="5.0.0", - font_id="roboto", - subset="latin-ext", - weight=700, - style="italic", - expected_url=( - "https://cdn.jsdelivr.net/npm/@fontsource/roboto@5.0.0" - "/files/roboto-latin-ext-700-italic.woff2" - ), - ), -] - - -@pytest.mark.parametrize( - list(CdnUrlFixture._fields), - CDN_URL_FIXTURES, - ids=[f.test_id for f in CDN_URL_FIXTURES], -) -def test_cdn_url( - test_id: str, - package: str, - version: str, - font_id: str, - subset: str, - weight: int, - style: str, - expected_url: str, -) -> None: - """_cdn_url formats the CDN URL template correctly.""" - result = sphinx_fonts._cdn_url(package, version, font_id, subset, weight, style) - assert result == expected_url - - -def test_cdn_url_matches_template() -> None: - """_cdn_url produces URLs matching CDN_TEMPLATE structure.""" - url = sphinx_fonts._cdn_url( - "@fontsource/inter", "5.1.0", "inter", "latin", 400, "normal" - ) - assert url.startswith("https://cdn.jsdelivr.net/npm/") - assert "@fontsource/inter@5.1.0" in url - assert url.endswith(".woff2") - - -# --- _download_font tests --- - - -def test_download_font_cached( - tmp_path: pathlib.Path, - caplog: pytest.LogCaptureFixture, -) -> None: - """_download_font returns True and logs debug when file exists.""" - dest = tmp_path / "font.woff2" - dest.write_bytes(b"cached-data") - - with caplog.at_level(logging.DEBUG, logger="sphinx_fonts"): - result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) - - assert result is True - debug_records = [r for r in caplog.records if r.levelno == logging.DEBUG] - assert any("cached" in r.message for r in debug_records) - - -def test_download_font_success( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, - caplog: pytest.LogCaptureFixture, -) -> None: - """_download_font downloads and returns True on success.""" - dest = tmp_path / "subdir" / "font.woff2" - - def fake_urlretrieve(url: str, filename: t.Any) -> tuple[str, t.Any]: - pathlib.Path(filename).write_bytes(b"font-data") - return (str(filename), None) - - monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) - - with caplog.at_level(logging.INFO, logger="sphinx_fonts"): - result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) - - assert result is True - info_records = [r for r in caplog.records if r.levelno == logging.INFO] - assert any("downloaded" in r.message for r in info_records) - - -def test_download_font_url_error( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, - caplog: pytest.LogCaptureFixture, -) -> None: - """_download_font returns False and warns on URLError.""" - dest = tmp_path / "font.woff2" - - msg = "network error" - - def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: - raise urllib.error.URLError(msg) - - monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) - - with caplog.at_level(logging.WARNING, logger="sphinx_fonts"): - result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) - - assert result is False - warning_records = [r for r in caplog.records if r.levelno == logging.WARNING] - assert any("failed" in r.message for r in warning_records) - - -def test_download_font_os_error( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, - caplog: pytest.LogCaptureFixture, -) -> None: - """_download_font returns False and warns on OSError.""" - dest = tmp_path / "font.woff2" - - msg = "disk full" - - def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: - raise OSError(msg) - - monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) - - with caplog.at_level(logging.WARNING, logger="sphinx_fonts"): - result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) - - assert result is False - warning_records = [r for r in caplog.records if r.levelno == logging.WARNING] - assert any("failed" in r.message for r in warning_records) - - -def test_download_font_partial_file_cleanup( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_download_font removes partial file on failure.""" - dest = tmp_path / "cache" / "partial.woff2" - - msg = "disk full" - - def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: - pathlib.Path(filename).write_bytes(b"partial") - raise OSError(msg) - - monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) - - result = sphinx_fonts._download_font("https://example.com/font.woff2", dest) - - assert result is False - assert not dest.exists() - - -# --- _on_builder_inited tests --- - - -def _make_app( - tmp_path: pathlib.Path, - *, - builder_format: str = "html", - fonts: list[dict[str, t.Any]] | None = None, - preload: list[tuple[str, int, str]] | None = None, - fallbacks: list[dict[str, str]] | None = None, - variables: dict[str, str] | None = None, -) -> types.SimpleNamespace: - """Create a fake Sphinx app namespace for testing.""" - config = types.SimpleNamespace( - sphinx_fonts=fonts if fonts is not None else [], - sphinx_font_preload=preload if preload is not None else [], - sphinx_font_fallbacks=fallbacks if fallbacks is not None else [], - sphinx_font_css_variables=variables if variables is not None else {}, - ) - builder = types.SimpleNamespace(format=builder_format) - return types.SimpleNamespace( - builder=builder, - config=config, - outdir=str(tmp_path / "output"), - ) - - -def test_on_builder_inited_non_html(tmp_path: pathlib.Path) -> None: - """_on_builder_inited returns early for non-HTML builders.""" - app = _make_app(tmp_path, builder_format="latex") - sphinx_fonts._on_builder_inited(app) - assert not hasattr(app, "_font_faces") - - -def test_on_builder_inited_empty_fonts(tmp_path: pathlib.Path) -> None: - """_on_builder_inited returns early when no fonts configured.""" - app = _make_app(tmp_path, fonts=[]) - sphinx_fonts._on_builder_inited(app) - assert not hasattr(app, "_font_faces") - - -def test_on_builder_inited_with_fonts( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited processes fonts and stores results on app.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/open-sans", - "version": "5.2.5", - "family": "Open Sans", - "weights": [400, 700], - "styles": ["normal"], - }, - ] - app = _make_app(tmp_path, fonts=fonts) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - for weight in [400, 700]: - (cache / f"open-sans-latin-{weight}-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert len(app._font_faces) == 2 - assert app._font_faces[0]["family"] == "Open Sans" - assert app._font_faces[0]["weight"] == "400" - assert app._font_faces[1]["weight"] == "700" - assert app._font_preload_hrefs == [] - assert app._font_fallbacks == [] - assert app._font_css_variables == {} - - -def test_on_builder_inited_download_failure( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited skips font_faces entry on download failure.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - msg = "offline" - - def fake_urlretrieve(url: str, filename: t.Any) -> t.NoReturn: - raise urllib.error.URLError(msg) - - monkeypatch.setattr("sphinx_fonts.urllib.request.urlretrieve", fake_urlretrieve) - - fonts = [ - { - "package": "@fontsource/inter", - "version": "5.0.0", - "family": "Inter", - "weights": [400], - "styles": ["normal"], - }, - ] - app = _make_app(tmp_path, fonts=fonts) - - sphinx_fonts._on_builder_inited(app) - - assert len(app._font_faces) == 0 - - -def test_on_builder_inited_explicit_subset( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited respects explicit subset in font config.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/noto-sans", - "version": "5.0.0", - "family": "Noto Sans", - "subset": "latin-ext", - "weights": [400], - "styles": ["normal"], - }, - ] - app = _make_app(tmp_path, fonts=fonts) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "noto-sans-latin-ext-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert app._font_faces[0]["filename"] == "noto-sans-latin-ext-400-normal.woff2" - - -def test_on_builder_inited_preload_uses_primary_subset( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """Preload uses the first (primary) subset when multiple are configured.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/ibm-plex-sans", - "version": "5.2.8", - "family": "IBM Plex Sans", - "subsets": ["latin", "latin-ext"], - "weights": [400], - "styles": ["normal"], - }, - ] - preload = [("IBM Plex Sans", 400, "normal")] - app = _make_app(tmp_path, fonts=fonts, preload=preload) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "ibm-plex-sans-latin-400-normal.woff2").write_bytes(b"data") - (cache / "ibm-plex-sans-latin-ext-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - # Preload should only include the primary (first) subset - assert app._font_preload_hrefs == ["ibm-plex-sans-latin-400-normal.woff2"] - - -def test_on_builder_inited_preload_match( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited builds preload_hrefs for matching preload specs.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/open-sans", - "version": "5.2.5", - "family": "Open Sans", - "weights": [400], - "styles": ["normal"], - }, - ] - preload = [("Open Sans", 400, "normal")] - app = _make_app(tmp_path, fonts=fonts, preload=preload) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "open-sans-latin-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert app._font_preload_hrefs == ["open-sans-latin-400-normal.woff2"] - - -def test_on_builder_inited_preload_no_match( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited produces empty preload when family doesn't match.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/open-sans", - "version": "5.2.5", - "family": "Open Sans", - "weights": [400], - "styles": ["normal"], - }, - ] - preload = [("Nonexistent Font", 400, "normal")] - app = _make_app(tmp_path, fonts=fonts, preload=preload) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "open-sans-latin-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert app._font_preload_hrefs == [] - - -def test_on_builder_inited_fallbacks_and_variables( - tmp_path: pathlib.Path, - monkeypatch: pytest.MonkeyPatch, -) -> None: - """_on_builder_inited stores fallbacks and CSS variables on app.""" - monkeypatch.setattr("sphinx_fonts._cache_dir", lambda: tmp_path / "cache") - - fonts = [ - { - "package": "@fontsource/inter", - "version": "5.0.0", - "family": "Inter", - "weights": [400], - "styles": ["normal"], - }, - ] - fallbacks = [{"family": "system-ui", "style": "normal", "weight": "400"}] - variables = {"--font-body": "Inter, system-ui"} - app = _make_app(tmp_path, fonts=fonts, fallbacks=fallbacks, variables=variables) - - cache = tmp_path / "cache" - cache.mkdir(parents=True) - (cache / "inter-latin-400-normal.woff2").write_bytes(b"data") - - sphinx_fonts._on_builder_inited(app) - - assert app._font_fallbacks == fallbacks - assert app._font_css_variables == variables - - -# --- _on_html_page_context tests --- - - -def test_on_html_page_context_with_attrs() -> None: - """_on_html_page_context injects font data from app attributes.""" - app = types.SimpleNamespace( - _font_preload_hrefs=["font-400.woff2"], - _font_faces=[ - { - "family": "Inter", - "weight": "400", - "style": "normal", - "filename": "font-400.woff2", - }, - ], - _font_fallbacks=[{"family": "system-ui"}], - _font_css_variables={"--font-body": "Inter"}, - ) - context: dict[str, t.Any] = {} - - sphinx_fonts._on_html_page_context( - app, - "index", - "page.html", - context, - None, - ) - - assert context["font_preload_hrefs"] == ["font-400.woff2"] - assert context["font_faces"] == app._font_faces - assert context["font_fallbacks"] == [{"family": "system-ui"}] - assert context["font_css_variables"] == {"--font-body": "Inter"} - - -def test_on_html_page_context_without_attrs() -> None: - """_on_html_page_context uses defaults when app attrs are missing.""" - app = types.SimpleNamespace() - context: dict[str, t.Any] = {} - - sphinx_fonts._on_html_page_context( - app, - "index", - "page.html", - context, - None, - ) - - assert context["font_preload_hrefs"] == [] - assert context["font_faces"] == [] - assert context["font_fallbacks"] == [] - assert context["font_css_variables"] == {} - - -# --- setup tests --- - - -def test_setup_return_value() -> None: - """Verify setup() returns correct metadata dict.""" - config_values: list[tuple[str, t.Any, str]] = [] - connections: list[tuple[str, t.Any]] = [] - - app = types.SimpleNamespace( - add_config_value=lambda name, default, rebuild: config_values.append( - (name, default, rebuild) - ), - connect=lambda event, handler: connections.append((event, handler)), - ) - - result = sphinx_fonts.setup(app) - - assert result == { - "version": sphinx_fonts.__version__, - "parallel_read_safe": True, - "parallel_write_safe": True, - } - - -def test_setup_config_values() -> None: - """Verify setup() registers all expected config values.""" - config_values: list[tuple[str, t.Any, str]] = [] - connections: list[tuple[str, t.Any]] = [] - - app = types.SimpleNamespace( - add_config_value=lambda name, default, rebuild: config_values.append( - (name, default, rebuild) - ), - connect=lambda event, handler: connections.append((event, handler)), - ) - - sphinx_fonts.setup(app) - - config_names = [c[0] for c in config_values] - assert "sphinx_fonts" in config_names - assert "sphinx_font_fallbacks" in config_names - assert "sphinx_font_css_variables" in config_names - assert "sphinx_font_preload" in config_names - assert all(c[2] == "html" for c in config_values) - - -def test_setup_event_connections() -> None: - """Verify setup() connects to builder-inited and html-page-context events.""" - config_values: list[tuple[str, t.Any, str]] = [] - connections: list[tuple[str, t.Any]] = [] - - app = types.SimpleNamespace( - add_config_value=lambda name, default, rebuild: config_values.append( - (name, default, rebuild) - ), - connect=lambda event, handler: connections.append((event, handler)), - ) - - sphinx_fonts.setup(app) - - event_names = [c[0] for c in connections] - assert "builder-inited" in event_names - assert "html-page-context" in event_names - - handlers = {c[0]: c[1] for c in connections} - assert handlers["builder-inited"] is sphinx_fonts._on_builder_inited - assert handlers["html-page-context"] is sphinx_fonts._on_html_page_context From 090ac1a5a639a3b5be91d0f2d6a20759cde4fc0a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Apr 2026 06:00:29 -0500 Subject: [PATCH 2808/2998] chore(mypy): Remove tests/docs/ exclude now that directory is deleted why: mypy exclude was added specifically to silence type errors in the upstream extension tests. With tests/docs/ removed, the exclusion is unnecessary. what: - Remove exclude = ["tests/docs/"] from [tool.mypy] --- pyproject.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a2ac7eb53e..38b552781f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -144,9 +144,6 @@ files = [ "src/", "tests/", ] -exclude = [ - "tests/docs/", -] enable_incomplete_feature = [] [[tool.mypy.overrides]] From e1514b6e1b8ee671be1b7fe5a6605ff69457097f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Apr 2026 12:39:52 -0500 Subject: [PATCH 2809/2998] docs(feat[api-style]): Enable API badge styling via sphinx-autodoc-api-style why: Add type and modifier badges to autodoc entries. what: - Add sphinx_autodoc_api_style to extra_extensions in docs/conf.py --- docs/conf.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index c2afba8c45..155ab83bd0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,11 @@ source_branch="master", light_logo="img/tmuxp.svg", dark_logo="img/tmuxp.svg", - extra_extensions=["aafig", "sphinx_argparse_neo.exemplar"], + extra_extensions=[ + "sphinx_autodoc_api_style", + "aafig", + "sphinx_argparse_neo.exemplar", + ], intersphinx_mapping={ "python": ("https://docs.python.org/", None), "libtmux": ("https://libtmux.git-pull.com/", None), From 120d80cb08ce878d3b896d40ba15a664c8e0d3fe Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Apr 2026 12:39:52 -0500 Subject: [PATCH 2810/2998] py(deps[dev]): Add sphinx-autodoc-api-style, bump gp-sphinx packages to 0.0.1a5 why: Align docs dependencies with latest gp-sphinx workspace releases. what: - Pin sphinx-autodoc-api-style and bump gp-sphinx packages to 0.0.1a5 - Regenerate uv.lock --- pyproject.toml | 10 ++++++---- uv.lock | 49 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 38b552781f..ba28c66b00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,8 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a0", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a0", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a5", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a5", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a5", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -82,8 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a0", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a0", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a5", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a5", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a5", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 32264f4b46..02c8420d46 100644 --- a/uv.lock +++ b/uv.lock @@ -393,7 +393,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a0" +version = "0.0.1a5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -414,9 +414,9 @@ dependencies = [ { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/57/7a8ea21c53c83e7c54b17610ed0c48e8db6254c2ff017c1e44ae4f7132ca/gp_sphinx-0.0.1a0.tar.gz", hash = "sha256:5cf583c06dffe6697b05a9a5f0593aa41cfe35fed8a1577324ccc87e0c0c92f7", size = 13989, upload-time = "2026-04-05T10:10:23.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/56/a3685ca51045e183caae9d0d996c3edf76653a3851e64ba91e1f2450ffa5/gp_sphinx-0.0.1a5.tar.gz", hash = "sha256:29998304bccc32d0f869109d1ee945263a528765a536665a5dc016fef30decee", size = 13992, upload-time = "2026-04-06T16:55:43.075Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/8e/5e0a0364be9c80e18bd07ec2bf43fd760c5938629035a356c172f1234daa/gp_sphinx-0.0.1a0-py3-none-any.whl", hash = "sha256:fb8310dd73ffb52827ed834f49d2e769ed3136359b54879aadd9d55ff7c6048d", size = 14399, upload-time = "2026-04-05T10:04:29.578Z" }, + { url = "https://files.pythonhosted.org/packages/0c/65/917059394919f7909536fe5a881dd10c7e105a92cba0b5c0eb9c82d85459/gp_sphinx-0.0.1a5-py3-none-any.whl", hash = "sha256:15574494dd25049cf9d7ae47bd892db9cef53a08f5f3129a2cf90ddca4a32bd5", size = 14410, upload-time = "2026-04-06T16:55:32.866Z" }, ] [[package]] @@ -1231,7 +1231,7 @@ wheels = [ [[package]] name = "sphinx-argparse-neo" -version = "0.0.1a0" +version = "0.0.1a5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1239,9 +1239,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/37/83215aabda61647f0fb0ab489e0c7227a59e041f565e9b44f2af073f6008/sphinx_argparse_neo-0.0.1a0.tar.gz", hash = "sha256:d40c931a687fe79dc465d850fb9904f552de575952b6dee291de61149c7bc66a", size = 37123, upload-time = "2026-04-05T10:10:23.969Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/f5/9d236e2534e7d6c7e5b9cee3576884a9875b576c87626ad0b1d58ee70ab8/sphinx_argparse_neo-0.0.1a5.tar.gz", hash = "sha256:3d1539c548efd1deb8c1b9dfbf50d3edcf37148921363f6b81933e28e786b5f7", size = 37140, upload-time = "2026-04-06T16:55:43.936Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/4c/6b9ac99f0639eebcecef7d294c079b66c06d56f0cc9a285ebbe2b05c68c9/sphinx_argparse_neo-0.0.1a0-py3-none-any.whl", hash = "sha256:19cf9ba32d14ca686112c1d8509f268f0ab2b1822a003875de64bbd9449ab5ef", size = 41428, upload-time = "2026-04-05T10:04:31.212Z" }, + { url = "https://files.pythonhosted.org/packages/ad/2d/e60dc03d1e770f9374a286808f4e699eaaed2e3cea5df9fe9bf915ea9703/sphinx_argparse_neo-0.0.1a5-py3-none-any.whl", hash = "sha256:660d039c89c32dcafa1ae0170b999dd224b74d2a5c781af37a1a2ce1c0508b66", size = 41434, upload-time = "2026-04-06T16:55:34.341Z" }, ] [[package]] @@ -1285,6 +1285,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/20/56411b52f917696995f5ad27d2ea7e9492c84a043c5b49a3a3173573cd93/sphinx_autobuild-2025.8.25-py3-none-any.whl", hash = "sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a", size = 12535, upload-time = "2025-08-25T18:44:54.164Z" }, ] +[[package]] +name = "sphinx-autodoc-api-style" +version = "0.0.1a5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/b9/b980057e09b7b5f6502b78e10193113e594a20117b863edc3b030565f668/sphinx_autodoc_api_style-0.0.1a5.tar.gz", hash = "sha256:d775bcccb24bc7b886fd1a9f4f60be3ed1b7c857d486662c385b5cfd5ad63c4b", size = 11088, upload-time = "2026-04-06T16:55:45.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/04/53160196a2a8dee73669894d1c34aa478e81af0701640323341a1627c118/sphinx_autodoc_api_style-0.0.1a5-py3-none-any.whl", hash = "sha256:a78d0f83a5038c89daa0cf55c9175bb8aabb9eb47e68ca02a705f478afd30c3c", size = 11679, upload-time = "2026-04-06T16:55:35.855Z" }, +] + [[package]] name = "sphinx-autodoc-typehints" version = "3.0.1" @@ -1375,27 +1388,27 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a0" +version = "0.0.1a5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/4f/be4fe35f90d0bc5090a8bd1367c53d063d5808e367e22274f16cc6978796/sphinx_fonts-0.0.1a0.tar.gz", hash = "sha256:9ca77ba151fa27963e90f899d92b1e43680e223efa3acdd3c532d5e4f0b29eed", size = 5628, upload-time = "2026-04-05T10:10:28.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/bd/c419420467fe1b249a8261f5253dfe5e17cf3a315cf98f5ce2bd32b85be2/sphinx_fonts-0.0.1a5.tar.gz", hash = "sha256:3e031378a973a6682e866b0260a8ce937276de571f69135bcbcaedfa905da395", size = 5624, upload-time = "2026-04-06T16:55:48.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/68/c8793bc5a08aee5644aed1ac0eb1ef2368cc61e31d4c1d6fd6cc52192a15/sphinx_fonts-0.0.1a0-py3-none-any.whl", hash = "sha256:aae888b35cc901ad2947c3d171a0bf02b724bc78d2677827673113c8c73e11fd", size = 4345, upload-time = "2026-04-05T10:09:11.134Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6c/6619babd3902262b7159d61f64a183194ee5670c45ab8353b5713e8a5856/sphinx_fonts-0.0.1a5-py3-none-any.whl", hash = "sha256:e8ce3cc7691fcab19cf44c069af4b24b37c0501add6cb8b60f9bbc858f0fb873", size = 4349, upload-time = "2026-04-06T16:55:40.747Z" }, ] [[package]] name = "sphinx-gptheme" -version = "0.0.1a0" +version = "0.0.1a5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/7c/71908e74939fd4d33d83bc39d31398deae895218dd319f626f6a3e4a1068/sphinx_gptheme-0.0.1a0.tar.gz", hash = "sha256:06f222f557dbd0e3256494f145cdbc1bc971d665e9203db19bc9c105283132ac", size = 13697, upload-time = "2026-04-05T10:10:29.63Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/fb/276020fdaae69e0fd2ac326888e0a478cc594678ff434f5c121457a08dcf/sphinx_gptheme-0.0.1a5.tar.gz", hash = "sha256:ba0303604641efa6a7ebf1f29c6d016abc4d29cf12770223fbc56fccbcba407e", size = 14569, upload-time = "2026-04-06T16:55:49.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/ec/7fe7909d31da9007232a77ac5750da9b9329921e938c3d73d409e4caa4ec/sphinx_gptheme-0.0.1a0-py3-none-any.whl", hash = "sha256:da0e6bb047b01c93a7df2f81be693e46b0709a1960b250991597648f7b320dfa", size = 14690, upload-time = "2026-04-05T10:10:21.577Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/d17927243ee476e7909d93d966bb03c8eef5454fc40ac41401e36a7e0dfd/sphinx_gptheme-0.0.1a5-py3-none-any.whl", hash = "sha256:39771734aefe093d3c80060095921f4ff1e276123f5b5f92dc4327996d0e5a94", size = 15628, upload-time = "2026-04-06T16:55:41.81Z" }, ] [[package]] @@ -1536,6 +1549,7 @@ dev = [ { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autodoc-api-style" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1548,6 +1562,7 @@ docs = [ { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autodoc-api-style" }, ] lint = [ { name = "mypy" }, @@ -1581,7 +1596,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a0" }, + { name = "gp-sphinx", specifier = "==0.0.1a5" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1590,8 +1605,9 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a0" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a5" }, { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a5" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1599,10 +1615,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a0" }, + { name = "gp-sphinx", specifier = "==0.0.1a5" }, { name = "pillow" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a0" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a5" }, { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a5" }, ] lint = [ { name = "mypy" }, From cfc2bdbb588450bc104ee18fc77fce6091b08dde Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 6 Apr 2026 20:51:29 -0500 Subject: [PATCH 2811/2998] py(deps): gp-sphinx 0.0.1a5 -> 0.0.1a6 why: Align dev docs dependencies with gp-sphinx 0.0.1a6 on PyPI. what: - Bump gp-sphinx ecosystem pins in pyproject.toml - Regenerate uv.lock --- pyproject.toml | 12 +++++------ uv.lock | 56 +++++++++++++++++++++++++++++++------------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ba28c66b00..6ff23f7375 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a5", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a5", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a5", + "gp-sphinx==0.0.1a6", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a6", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a6", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a5", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a5", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a5", + "gp-sphinx==0.0.1a6", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a6", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a6", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 02c8420d46..d6c31ca649 100644 --- a/uv.lock +++ b/uv.lock @@ -393,7 +393,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a5" +version = "0.0.1a6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -414,9 +414,9 @@ dependencies = [ { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/56/a3685ca51045e183caae9d0d996c3edf76653a3851e64ba91e1f2450ffa5/gp_sphinx-0.0.1a5.tar.gz", hash = "sha256:29998304bccc32d0f869109d1ee945263a528765a536665a5dc016fef30decee", size = 13992, upload-time = "2026-04-06T16:55:43.075Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/84/8bb79a1a7c3fb8da69c8afb776837cf0ac3fa8044ba79687daf30b1b101e/gp_sphinx-0.0.1a6.tar.gz", hash = "sha256:b0f8c9a9a49e5484523e3a9eb4776739a8724831b4912b61540ef6964d0a0478", size = 13993, upload-time = "2026-04-07T01:39:54.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/65/917059394919f7909536fe5a881dd10c7e105a92cba0b5c0eb9c82d85459/gp_sphinx-0.0.1a5-py3-none-any.whl", hash = "sha256:15574494dd25049cf9d7ae47bd892db9cef53a08f5f3129a2cf90ddca4a32bd5", size = 14410, upload-time = "2026-04-06T16:55:32.866Z" }, + { url = "https://files.pythonhosted.org/packages/12/15/04e2ebcaf8a19af509bc09f75fcfe14121a4201dc357d982e3b9b839dd82/gp_sphinx-0.0.1a6-py3-none-any.whl", hash = "sha256:c3021eab95e88fc29b3c08c183523d18c458abd2fbef2163e1e3938527d201a5", size = 14408, upload-time = "2026-04-07T01:36:41.362Z" }, ] [[package]] @@ -1231,7 +1231,7 @@ wheels = [ [[package]] name = "sphinx-argparse-neo" -version = "0.0.1a5" +version = "0.0.1a6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1239,9 +1239,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/f5/9d236e2534e7d6c7e5b9cee3576884a9875b576c87626ad0b1d58ee70ab8/sphinx_argparse_neo-0.0.1a5.tar.gz", hash = "sha256:3d1539c548efd1deb8c1b9dfbf50d3edcf37148921363f6b81933e28e786b5f7", size = 37140, upload-time = "2026-04-06T16:55:43.936Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/01/87e6afe4637fa17828205a8e9905ac60451bd278cf3a256ca15bccb02ae6/sphinx_argparse_neo-0.0.1a6.tar.gz", hash = "sha256:b9413e30557193a9f11cd70ae191becfb55a003116c94f483cd8cdcf44dfd60d", size = 37141, upload-time = "2026-04-07T01:39:55.263Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/2d/e60dc03d1e770f9374a286808f4e699eaaed2e3cea5df9fe9bf915ea9703/sphinx_argparse_neo-0.0.1a5-py3-none-any.whl", hash = "sha256:660d039c89c32dcafa1ae0170b999dd224b74d2a5c781af37a1a2ce1c0508b66", size = 41434, upload-time = "2026-04-06T16:55:34.341Z" }, + { url = "https://files.pythonhosted.org/packages/66/45/b3c4f8215a3a8d7742e452dcc23c3c8feba2ce854127d1b0319a7ee9f355/sphinx_argparse_neo-0.0.1a6-py3-none-any.whl", hash = "sha256:16c15c21dbba2b5fa533ee642f8902d3a7a05d104f15cd7514b08264de2813d3", size = 41435, upload-time = "2026-04-07T01:36:42.927Z" }, ] [[package]] @@ -1287,15 +1287,29 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a5" +version = "0.0.1a6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autodoc-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/b9/b980057e09b7b5f6502b78e10193113e594a20117b863edc3b030565f668/sphinx_autodoc_api_style-0.0.1a5.tar.gz", hash = "sha256:d775bcccb24bc7b886fd1a9f4f60be3ed1b7c857d486662c385b5cfd5ad63c4b", size = 11088, upload-time = "2026-04-06T16:55:45.024Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/74/725982d1e1c96441812ba4bafb962fb12dae03dc48bd4dae7ebb53913791/sphinx_autodoc_api_style-0.0.1a6.tar.gz", hash = "sha256:cdac8845321853e920c1e702ed221b85af841b6906b0a4c161f5ded42da0254f", size = 10923, upload-time = "2026-04-07T01:39:56.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/04/53160196a2a8dee73669894d1c34aa478e81af0701640323341a1627c118/sphinx_autodoc_api_style-0.0.1a5-py3-none-any.whl", hash = "sha256:a78d0f83a5038c89daa0cf55c9175bb8aabb9eb47e68ca02a705f478afd30c3c", size = 11679, upload-time = "2026-04-06T16:55:35.855Z" }, + { url = "https://files.pythonhosted.org/packages/d2/79/ab4332c04261393766646a45c707b5eb4e258ba993db0ce0e96c0b36027e/sphinx_autodoc_api_style-0.0.1a6-py3-none-any.whl", hash = "sha256:c2aea727076e566cac279be8877f8cb8d41bbc78e91730ec4b026d5e20afcd88", size = 11475, upload-time = "2026-04-07T01:36:44.336Z" }, +] + +[[package]] +name = "sphinx-autodoc-badges" +version = "0.0.1a6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/b4/95d4cf03ad5b80e24024b74a105cc3509f59f3923368f1c41480dea0c65f/sphinx_autodoc_badges-0.0.1a6.tar.gz", hash = "sha256:40883c7b4c0b250e7e9774b4bfa42c84703ce4375d23e24b6c2c38cd320e5ff6", size = 8042, upload-time = "2026-04-07T01:39:57.274Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/80/6e3fe1f7e65e218a534a9bcaf11394f30cba213c6dfc4de406f3b0d21ff7/sphinx_autodoc_badges-0.0.1a6-py3-none-any.whl", hash = "sha256:10718d58c8436a3b6855c39b83f4a149c6fcc26e3bc652ccecb5b9f8e5a0e7f3", size = 8365, upload-time = "2026-04-07T01:36:45.779Z" }, ] [[package]] @@ -1388,27 +1402,27 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a5" +version = "0.0.1a6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/bd/c419420467fe1b249a8261f5253dfe5e17cf3a315cf98f5ce2bd32b85be2/sphinx_fonts-0.0.1a5.tar.gz", hash = "sha256:3e031378a973a6682e866b0260a8ce937276de571f69135bcbcaedfa905da395", size = 5624, upload-time = "2026-04-06T16:55:48.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/4e/acac834c6244c4d7cf0ddd191fa70bdbaa5497c51205e77da99f697b2d64/sphinx_fonts-0.0.1a6.tar.gz", hash = "sha256:e8f2e6461998ab27f1603b8f32824e11ef690568d9b3e679fdb9d0389e26e197", size = 5626, upload-time = "2026-04-07T01:40:02.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/6c/6619babd3902262b7159d61f64a183194ee5670c45ab8353b5713e8a5856/sphinx_fonts-0.0.1a5-py3-none-any.whl", hash = "sha256:e8ce3cc7691fcab19cf44c069af4b24b37c0501add6cb8b60f9bbc858f0fb873", size = 4349, upload-time = "2026-04-06T16:55:40.747Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d9/cd9335becec5568fb1b8e1b58228bb0e09b3b37f543861bebd374dfecb64/sphinx_fonts-0.0.1a6-py3-none-any.whl", hash = "sha256:e6ec4866b7c8a13f5193c4adcf0d628a5f8683832d5239d75eee5bd909ae87f0", size = 4346, upload-time = "2026-04-07T01:39:52.244Z" }, ] [[package]] name = "sphinx-gptheme" -version = "0.0.1a5" +version = "0.0.1a6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/fb/276020fdaae69e0fd2ac326888e0a478cc594678ff434f5c121457a08dcf/sphinx_gptheme-0.0.1a5.tar.gz", hash = "sha256:ba0303604641efa6a7ebf1f29c6d016abc4d29cf12770223fbc56fccbcba407e", size = 14569, upload-time = "2026-04-06T16:55:49.674Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/f3/1a5e65c3c8c5d7e0c461a2ae6b6ee657713cb91330bf79f061f6f0678b5a/sphinx_gptheme-0.0.1a6.tar.gz", hash = "sha256:50e3ca26db9130c319116d8276e83261a225d32a349966218404b339fc45589a", size = 14568, upload-time = "2026-04-07T01:40:03.366Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/bb/d17927243ee476e7909d93d966bb03c8eef5454fc40ac41401e36a7e0dfd/sphinx_gptheme-0.0.1a5-py3-none-any.whl", hash = "sha256:39771734aefe093d3c80060095921f4ff1e276123f5b5f92dc4327996d0e5a94", size = 15628, upload-time = "2026-04-06T16:55:41.81Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/a5c9dabba700fe6dfaac4fb2a76b1f587f76179ca988e686a5b00b0f2be0/sphinx_gptheme-0.0.1a6-py3-none-any.whl", hash = "sha256:32bc5ee4daecf4ab2c187f9cacdee5824aca756d590d0d764827071ab92d8172", size = 15626, upload-time = "2026-04-07T01:39:53.351Z" }, ] [[package]] @@ -1596,7 +1610,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a5" }, + { name = "gp-sphinx", specifier = "==0.0.1a6" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1605,9 +1619,9 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a5" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a6" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a5" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a6" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1615,11 +1629,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a5" }, + { name = "gp-sphinx", specifier = "==0.0.1a6" }, { name = "pillow" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a5" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a6" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a5" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a6" }, ] lint = [ { name = "mypy" }, From 402c61f7d9e9b83f4347e2d2fee8e7ba04f1435e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 11 Apr 2026 08:21:33 -0500 Subject: [PATCH 2812/2998] py(deps): gp-sphinx 0.0.1a6 -> 0.0.1a7 why: Pick up the sphinx-argparse-neo multi-page duplicate-label scoping fix landed in gp-sphinx PR #16 so docs builds on this branch emit fewer duplicate label warnings. what: - Bump gp-sphinx and sibling package pins from 0.0.1a6 to 0.0.1a7 - Regenerate uv.lock --- pyproject.toml | 12 ++++++------ uv.lock | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6ff23f7375..ed022a872d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a6", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a6", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a6", + "gp-sphinx==0.0.1a7", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a7", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a7", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a6", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a6", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a6", + "gp-sphinx==0.0.1a7", # https://gp-sphinx.git-pull.com/ + "sphinx-argparse-neo==0.0.1a7", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a7", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index d6c31ca649..59fbe2162f 100644 --- a/uv.lock +++ b/uv.lock @@ -393,7 +393,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -414,9 +414,9 @@ dependencies = [ { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/84/8bb79a1a7c3fb8da69c8afb776837cf0ac3fa8044ba79687daf30b1b101e/gp_sphinx-0.0.1a6.tar.gz", hash = "sha256:b0f8c9a9a49e5484523e3a9eb4776739a8724831b4912b61540ef6964d0a0478", size = 13993, upload-time = "2026-04-07T01:39:54.402Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/04/c82ff029d74e0b0bf3e9ea29ec33af8036b07697ab9c5d96fd73ade46f38/gp_sphinx-0.0.1a7.tar.gz", hash = "sha256:c7eea8e35034a194848bb9102776aa11559a3545883f478f3c09b1a9beee06a4", size = 13992, upload-time = "2026-04-11T13:17:01.328Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/15/04e2ebcaf8a19af509bc09f75fcfe14121a4201dc357d982e3b9b839dd82/gp_sphinx-0.0.1a6-py3-none-any.whl", hash = "sha256:c3021eab95e88fc29b3c08c183523d18c458abd2fbef2163e1e3938527d201a5", size = 14408, upload-time = "2026-04-07T01:36:41.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/6b/01d8ab2777abeb83c34c9ddd1a8eea0f49d68c3ed95502ed50e666c71bcf/gp_sphinx-0.0.1a7-py3-none-any.whl", hash = "sha256:c8fda26b6a7213c4774449380059937f28b8e57190474fe2a2f691663a0b5212", size = 14411, upload-time = "2026-04-11T13:16:46.317Z" }, ] [[package]] @@ -1231,7 +1231,7 @@ wheels = [ [[package]] name = "sphinx-argparse-neo" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1239,9 +1239,9 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/01/87e6afe4637fa17828205a8e9905ac60451bd278cf3a256ca15bccb02ae6/sphinx_argparse_neo-0.0.1a6.tar.gz", hash = "sha256:b9413e30557193a9f11cd70ae191becfb55a003116c94f483cd8cdcf44dfd60d", size = 37141, upload-time = "2026-04-07T01:39:55.263Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/11/b55fd91b056b82628751715c0d464834ff0204fd083ace81b70b6fa6485a/sphinx_argparse_neo-0.0.1a7.tar.gz", hash = "sha256:7892418e39f37323820cbceef0a836825caace4d09b2d7dbb8583912f44265ac", size = 37374, upload-time = "2026-04-11T13:17:02.472Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/45/b3c4f8215a3a8d7742e452dcc23c3c8feba2ce854127d1b0319a7ee9f355/sphinx_argparse_neo-0.0.1a6-py3-none-any.whl", hash = "sha256:16c15c21dbba2b5fa533ee642f8902d3a7a05d104f15cd7514b08264de2813d3", size = 41435, upload-time = "2026-04-07T01:36:42.927Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d0/bbe9b7ae43464736067c9837aba673a636472d41fcef9bbc863a5d3ca8d6/sphinx_argparse_neo-0.0.1a7-py3-none-any.whl", hash = "sha256:3834c8e5032ec1d6997b30648370226e20f32c31d08c53e2f94b0ade602faae1", size = 41603, upload-time = "2026-04-11T13:16:47.978Z" }, ] [[package]] @@ -1287,29 +1287,29 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/74/725982d1e1c96441812ba4bafb962fb12dae03dc48bd4dae7ebb53913791/sphinx_autodoc_api_style-0.0.1a6.tar.gz", hash = "sha256:cdac8845321853e920c1e702ed221b85af841b6906b0a4c161f5ded42da0254f", size = 10923, upload-time = "2026-04-07T01:39:56.417Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ba/ac334df39fe2f25f7d5aa5bfc3cfe3ff1cda611f233bcd12118809fba564/sphinx_autodoc_api_style-0.0.1a7.tar.gz", hash = "sha256:8860616f0af7c8bfd340f65008c994e30bbf73a6fd3d851b3f181fceb664580a", size = 10923, upload-time = "2026-04-11T13:17:03.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/79/ab4332c04261393766646a45c707b5eb4e258ba993db0ce0e96c0b36027e/sphinx_autodoc_api_style-0.0.1a6-py3-none-any.whl", hash = "sha256:c2aea727076e566cac279be8877f8cb8d41bbc78e91730ec4b026d5e20afcd88", size = 11475, upload-time = "2026-04-07T01:36:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a3/ffb88b803d88374d2a0a361c5b82819a6e0fcbeebe16d368f81750dbc7a5/sphinx_autodoc_api_style-0.0.1a7-py3-none-any.whl", hash = "sha256:4627a148bab6889a0e2ec1b93c4ab12ee0438f04d6c8fbc350eda5c571f531cc", size = 11475, upload-time = "2026-04-11T13:16:49.713Z" }, ] [[package]] name = "sphinx-autodoc-badges" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/b4/95d4cf03ad5b80e24024b74a105cc3509f59f3923368f1c41480dea0c65f/sphinx_autodoc_badges-0.0.1a6.tar.gz", hash = "sha256:40883c7b4c0b250e7e9774b4bfa42c84703ce4375d23e24b6c2c38cd320e5ff6", size = 8042, upload-time = "2026-04-07T01:39:57.274Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/23/561cf78ae0b5891cf6722f749c36caaf656aa64b481b37a121414ac890d7/sphinx_autodoc_badges-0.0.1a7.tar.gz", hash = "sha256:7aa04ad728d59023b65a174512497915bc2a9ab6d3160457c4a709ba88d31666", size = 8044, upload-time = "2026-04-11T13:17:04.542Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/80/6e3fe1f7e65e218a534a9bcaf11394f30cba213c6dfc4de406f3b0d21ff7/sphinx_autodoc_badges-0.0.1a6-py3-none-any.whl", hash = "sha256:10718d58c8436a3b6855c39b83f4a149c6fcc26e3bc652ccecb5b9f8e5a0e7f3", size = 8365, upload-time = "2026-04-07T01:36:45.779Z" }, + { url = "https://files.pythonhosted.org/packages/43/6f/0c8100492c8567a6e1cd93b76834387e86947eda4e152357798d389d9c61/sphinx_autodoc_badges-0.0.1a7-py3-none-any.whl", hash = "sha256:902f5618cbec522f7aaad64c4fc613238bc3e9faa6085091000adc41eb95aa4d", size = 8365, upload-time = "2026-04-11T13:16:51.268Z" }, ] [[package]] @@ -1402,27 +1402,27 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/4e/acac834c6244c4d7cf0ddd191fa70bdbaa5497c51205e77da99f697b2d64/sphinx_fonts-0.0.1a6.tar.gz", hash = "sha256:e8f2e6461998ab27f1603b8f32824e11ef690568d9b3e679fdb9d0389e26e197", size = 5626, upload-time = "2026-04-07T01:40:02.301Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/8a/ea86daed70e0039aace2b8143610efebc1f8ce949c365e3907b2a0f58092/sphinx_fonts-0.0.1a7.tar.gz", hash = "sha256:7da3f383a225b623d38c263b3e805620fd0d9b262aa1f3a66bc9bbac2ba44a0b", size = 5624, upload-time = "2026-04-11T13:17:09.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/d9/cd9335becec5568fb1b8e1b58228bb0e09b3b37f543861bebd374dfecb64/sphinx_fonts-0.0.1a6-py3-none-any.whl", hash = "sha256:e6ec4866b7c8a13f5193c4adcf0d628a5f8683832d5239d75eee5bd909ae87f0", size = 4346, upload-time = "2026-04-07T01:39:52.244Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7c/a045b2021cc717cd474378e305e8df4f7b1a0971ef34096cbda8e0bd1c43/sphinx_fonts-0.0.1a7-py3-none-any.whl", hash = "sha256:68c109eb6a9b521e9d9105a08fd89b8dfd1012a058d9fcab49cfb05bd32eec11", size = 4348, upload-time = "2026-04-11T13:16:58.601Z" }, ] [[package]] name = "sphinx-gptheme" -version = "0.0.1a6" +version = "0.0.1a7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/f3/1a5e65c3c8c5d7e0c461a2ae6b6ee657713cb91330bf79f061f6f0678b5a/sphinx_gptheme-0.0.1a6.tar.gz", hash = "sha256:50e3ca26db9130c319116d8276e83261a225d32a349966218404b339fc45589a", size = 14568, upload-time = "2026-04-07T01:40:03.366Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/4d/277288688e242b96458ad79f07ce1a003c7d65b9f09c616337b799db8524/sphinx_gptheme-0.0.1a7.tar.gz", hash = "sha256:3b2dee7cdfe5206e0cd83d2ad9d0d44eb802fb0da4cc189b34a8d56ef9770ad6", size = 14569, upload-time = "2026-04-11T13:17:10.676Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/de/a5c9dabba700fe6dfaac4fb2a76b1f587f76179ca988e686a5b00b0f2be0/sphinx_gptheme-0.0.1a6-py3-none-any.whl", hash = "sha256:32bc5ee4daecf4ab2c187f9cacdee5824aca756d590d0d764827071ab92d8172", size = 15626, upload-time = "2026-04-07T01:39:53.351Z" }, + { url = "https://files.pythonhosted.org/packages/ad/34/5a88f8f90fd7f70a89834b386be91f110bec12726e747e1c483cb1cccf50/sphinx_gptheme-0.0.1a7-py3-none-any.whl", hash = "sha256:fc2c61d96e3a65c628ed0bc62b414d7cc69089a5be8873f500e6c8ef1a833cc0", size = 15628, upload-time = "2026-04-11T13:17:00.123Z" }, ] [[package]] @@ -1610,7 +1610,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a6" }, + { name = "gp-sphinx", specifier = "==0.0.1a7" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1619,9 +1619,9 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a6" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a7" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a6" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a7" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1629,11 +1629,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a6" }, + { name = "gp-sphinx", specifier = "==0.0.1a7" }, { name = "pillow" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a6" }, + { name = "sphinx-argparse-neo", specifier = "==0.0.1a7" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a6" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a7" }, ] lint = [ { name = "mypy" }, From 98f9ec277f24e2af2d25cc31e62ee8091f635e92 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 11 Apr 2026 08:58:14 -0500 Subject: [PATCH 2813/2998] docs(CHANGES) Visual API docs improvements via gp-sphinx why: Capture the api-styling migration to the gp-sphinx package stack in the unreleased notes. what: - Add a Documentation bullet under tmuxp (unreleased) linking to the project PR --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 0330651353..26072e7e48 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,11 @@ $ pipx install \ _Notes on the upcoming release will go here._ +### Documentation + +- Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#1035) + + ## tmuxp 1.67.0 (2026-03-08) ### What's new From a608eab0afe6d191c36c1bf72ed433a5a09e6b4b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 Apr 2026 16:17:59 -0500 Subject: [PATCH 2814/2998] chore(docs): bump gp-sphinx pins 0.0.1a7 -> 0.0.1a8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Adopt the v0.0.1a8 release of the shared docs platform — argparse domain, CSS namespace unification under gp-sphinx-*, sphinx>=8.1 floor, typed env.domains.* accessors, autodoc layout and badges package renames, py.typed marker for typehints-gp. what: - Bump gp-sphinx and sphinx-autodoc-api-style pins from 0.0.1a7 to 0.0.1a8 across every dependency group - Replace sphinx-argparse-neo==0.0.1a7 with sphinx-autodoc-argparse==0.0.1a8, and update the extension name in docs/conf.py from sphinx_argparse_neo.exemplar to sphinx_autodoc_argparse.exemplar - Refresh uv.lock against the published workspace See also: https://pypi.org/project/gp-sphinx/0.0.1a8/ --- docs/conf.py | 2 +- pyproject.toml | 12 ++--- uv.lock | 129 ++++++++++++++++++++++++------------------------- 3 files changed, 70 insertions(+), 73 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 155ab83bd0..4afd921ad2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -34,7 +34,7 @@ extra_extensions=[ "sphinx_autodoc_api_style", "aafig", - "sphinx_argparse_neo.exemplar", + "sphinx_autodoc_argparse.exemplar", ], intersphinx_mapping={ "python": ("https://docs.python.org/", None), diff --git a/pyproject.toml b/pyproject.toml index ed022a872d..ac8c5a0fe8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a7", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a7", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a7", + "gp-sphinx==0.0.1a8", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a8", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a8", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a7", # https://gp-sphinx.git-pull.com/ - "sphinx-argparse-neo==0.0.1a7", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a7", + "gp-sphinx==0.0.1a8", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a8", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a8", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 59fbe2162f..e334a2fe1b 100644 --- a/uv.lock +++ b/uv.lock @@ -393,7 +393,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a7" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -403,20 +403,19 @@ dependencies = [ { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autodoc-typehints-gp" }, { name = "sphinx-copybutton" }, { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-fonts" }, - { name = "sphinx-gptheme" }, + { name = "sphinx-gp-theme" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/04/c82ff029d74e0b0bf3e9ea29ec33af8036b07697ab9c5d96fd73ade46f38/gp_sphinx-0.0.1a7.tar.gz", hash = "sha256:c7eea8e35034a194848bb9102776aa11559a3545883f478f3c09b1a9beee06a4", size = 13992, upload-time = "2026-04-11T13:17:01.328Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/41/258387f53d70ed5f1299a54a252b558bbc0ab4b62a8097b6b8e1c981de9d/gp_sphinx-0.0.1a8.tar.gz", hash = "sha256:6c2c63850b5ab41d6f72f441e02bea5402a6d1b220248803d34a0ae51ad4500b", size = 13875, upload-time = "2026-04-12T20:12:02.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/6b/01d8ab2777abeb83c34c9ddd1a8eea0f49d68c3ed95502ed50e666c71bcf/gp_sphinx-0.0.1a7-py3-none-any.whl", hash = "sha256:c8fda26b6a7213c4774449380059937f28b8e57190474fe2a2f691663a0b5212", size = 14411, upload-time = "2026-04-11T13:16:46.317Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a9/4ffaef44e7f99c3bffe5d3d5bec53e2ce522191a90c248196ee68476bc40/gp_sphinx-0.0.1a8-py3-none-any.whl", hash = "sha256:e1907fbcadef83187db5ce159bed8d70ecbe5961a10977a5f0364913e1459931", size = 14219, upload-time = "2026-04-12T19:55:10.944Z" }, ] [[package]] @@ -1229,21 +1228,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, ] -[[package]] -name = "sphinx-argparse-neo" -version = "0.0.1a7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "pygments" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/11/b55fd91b056b82628751715c0d464834ff0204fd083ace81b70b6fa6485a/sphinx_argparse_neo-0.0.1a7.tar.gz", hash = "sha256:7892418e39f37323820cbceef0a836825caace4d09b2d7dbb8583912f44265ac", size = 37374, upload-time = "2026-04-11T13:17:02.472Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/d0/bbe9b7ae43464736067c9837aba673a636472d41fcef9bbc863a5d3ca8d6/sphinx_argparse_neo-0.0.1a7-py3-none-any.whl", hash = "sha256:3834c8e5032ec1d6997b30648370226e20f32c31d08c53e2f94b0ade602faae1", size = 41603, upload-time = "2026-04-11T13:16:47.978Z" }, -] - [[package]] name = "sphinx-autobuild" version = "2024.10.3" @@ -1287,60 +1271,45 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a7" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "sphinx-autodoc-badges" }, + { name = "sphinx-ux-autodoc-layout" }, + { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/ba/ac334df39fe2f25f7d5aa5bfc3cfe3ff1cda611f233bcd12118809fba564/sphinx_autodoc_api_style-0.0.1a7.tar.gz", hash = "sha256:8860616f0af7c8bfd340f65008c994e30bbf73a6fd3d851b3f181fceb664580a", size = 10923, upload-time = "2026-04-11T13:17:03.439Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/80/8e13c037f1ca35b69d86fc2209349a3f666b18cf216572a4f0c0fd1d592c/sphinx_autodoc_api_style-0.0.1a8.tar.gz", hash = "sha256:cad11308d1c57ce20d3d7fbad4e6878c831ea650c2020c84a531d2091f62fbfb", size = 8296, upload-time = "2026-04-12T20:12:03.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/a3/ffb88b803d88374d2a0a361c5b82819a6e0fcbeebe16d368f81750dbc7a5/sphinx_autodoc_api_style-0.0.1a7-py3-none-any.whl", hash = "sha256:4627a148bab6889a0e2ec1b93c4ab12ee0438f04d6c8fbc350eda5c571f531cc", size = 11475, upload-time = "2026-04-11T13:16:49.713Z" }, + { url = "https://files.pythonhosted.org/packages/e8/12/af096e9646e9c678d253dcb750a63b2f03c75352e00f9a41a474e572ec47/sphinx_autodoc_api_style-0.0.1a8-py3-none-any.whl", hash = "sha256:f1086e945b3a7144fe293a69422c904712ffd7737f52d227e83951532e08f919", size = 8328, upload-time = "2026-04-12T19:55:12.535Z" }, ] [[package]] -name = "sphinx-autodoc-badges" -version = "0.0.1a7" +name = "sphinx-autodoc-argparse" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "docutils" }, + { name = "pygments" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/23/561cf78ae0b5891cf6722f749c36caaf656aa64b481b37a121414ac890d7/sphinx_autodoc_badges-0.0.1a7.tar.gz", hash = "sha256:7aa04ad728d59023b65a174512497915bc2a9ab6d3160457c4a709ba88d31666", size = 8044, upload-time = "2026-04-11T13:17:04.542Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/99/ec0f64a3feee7f450d4d1f2d18bca00853651b85a8fb29004e2015aae063/sphinx_autodoc_argparse-0.0.1a8.tar.gz", hash = "sha256:2d2108a622cf1ba6e537b5ab0312dd6adf8160e7f0801604ac6a524f871d545b", size = 42333, upload-time = "2026-04-12T20:12:04.725Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/6f/0c8100492c8567a6e1cd93b76834387e86947eda4e152357798d389d9c61/sphinx_autodoc_badges-0.0.1a7-py3-none-any.whl", hash = "sha256:902f5618cbec522f7aaad64c4fc613238bc3e9faa6085091000adc41eb95aa4d", size = 8365, upload-time = "2026-04-11T13:16:51.268Z" }, + { url = "https://files.pythonhosted.org/packages/04/ff/2e35984a005c327be2fa5c62368abce695bd88f268041e3dd67ae81286c4/sphinx_autodoc_argparse-0.0.1a8-py3-none-any.whl", hash = "sha256:d733875205c8ec9e0da9221bbd7de810357aacb630be6a812d0ae5433f06f8c2", size = 47268, upload-time = "2026-04-12T19:59:38.909Z" }, ] [[package]] -name = "sphinx-autodoc-typehints" -version = "3.0.1" +name = "sphinx-autodoc-typehints-gp" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/f0/43c6a5ff3e7b08a8c3b32f81b859f1b518ccc31e45f22e2b41ced38be7b9/sphinx_autodoc_typehints-3.0.1.tar.gz", hash = "sha256:b9b40dd15dee54f6f810c924f863f9cf1c54f9f3265c495140ea01be7f44fa55", size = 36282, upload-time = "2025-01-16T18:25:30.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dc/dc46c5c7c566b7ec5e8f860f9c89533bf03c0e6aadc96fb9b337867e4460/sphinx_autodoc_typehints-3.0.1-py3-none-any.whl", hash = "sha256:4b64b676a14b5b79cefb6628a6dc8070e320d4963e8ff640a2f3e9390ae9045a", size = 20245, upload-time = "2025-01-16T18:25:27.394Z" }, -] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "3.5.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] -dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/4f/4fd5583678bb7dc8afa69e9b309e6a99ee8d79ad3a4728f4e52fd7cb37c7/sphinx_autodoc_typehints-3.5.2.tar.gz", hash = "sha256:5fcd4a3eb7aa89424c1e2e32bedca66edc38367569c9169a80f4b3e934171fdb", size = 37839, upload-time = "2025-10-16T00:50:15.743Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/8c/c1895efd033ff924a9a6d8cffcf199d422d28e5980dbbecaf5a314338f1f/sphinx_autodoc_typehints_gp-0.0.1a8.tar.gz", hash = "sha256:b3dd546b10199be3bf580c7d58af5fd2e62201079dad6328435b4e777f94c0d1", size = 17460, upload-time = "2026-04-12T20:12:10.715Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl", hash = "sha256:0accd043619f53c86705958e323b419e41667917045ac9215d7be1b493648d8c", size = 21184, upload-time = "2025-10-16T00:50:13.973Z" }, + { url = "https://files.pythonhosted.org/packages/8a/30/157db04084afabcf3b216d9411125881f162527acd506cf6315ba2be951f/sphinx_autodoc_typehints_gp-0.0.1a8-py3-none-any.whl", hash = "sha256:033c60d6ae786291e6ba7520664d7c80741388f9f98e5b14f218352b0a3aa5b2", size = 18020, upload-time = "2026-04-12T20:03:58.986Z" }, ] [[package]] @@ -1402,27 +1371,29 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a7" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/8a/ea86daed70e0039aace2b8143610efebc1f8ce949c365e3907b2a0f58092/sphinx_fonts-0.0.1a7.tar.gz", hash = "sha256:7da3f383a225b623d38c263b3e805620fd0d9b262aa1f3a66bc9bbac2ba44a0b", size = 5624, upload-time = "2026-04-11T13:17:09.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/52/0069db0e569d8b4bf60029a20dc7d4334c69f009b77d0cd6f1a4f9320e4c/sphinx_fonts-0.0.1a8.tar.gz", hash = "sha256:896dbb96e6b586fcbea9dc6fe23f218f5ae32437854236c4a87a2c6d1d0626ff", size = 5677, upload-time = "2026-04-12T20:12:11.665Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/7c/a045b2021cc717cd474378e305e8df4f7b1a0971ef34096cbda8e0bd1c43/sphinx_fonts-0.0.1a7-py3-none-any.whl", hash = "sha256:68c109eb6a9b521e9d9105a08fd89b8dfd1012a058d9fcab49cfb05bd32eec11", size = 4348, upload-time = "2026-04-11T13:16:58.601Z" }, + { url = "https://files.pythonhosted.org/packages/b4/eb/66157aa4781724e0b8a0a951ff53bda1ab95a9d259708d054f65ae50c8c3/sphinx_fonts-0.0.1a8-py3-none-any.whl", hash = "sha256:8e93c8c61c48f9deec5c4205ef9d113f8ddecefbf345bf279823eb7fb58f5b12", size = 4352, upload-time = "2026-04-12T20:04:00.323Z" }, ] [[package]] -name = "sphinx-gptheme" -version = "0.0.1a7" +name = "sphinx-gp-theme" +version = "0.0.1a8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/4d/277288688e242b96458ad79f07ce1a003c7d65b9f09c616337b799db8524/sphinx_gptheme-0.0.1a7.tar.gz", hash = "sha256:3b2dee7cdfe5206e0cd83d2ad9d0d44eb802fb0da4cc189b34a8d56ef9770ad6", size = 14569, upload-time = "2026-04-11T13:17:10.676Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/30/e1908b3a4eafc3c564f00815819ab7ee8cad749c17d81091926a07ba0540/sphinx_gp_theme-0.0.1a8.tar.gz", hash = "sha256:b694b5df1301aec9ef1912e9d47725c8ff31c2dbf486e554369da4edaa2a1c80", size = 14631, upload-time = "2026-04-12T20:12:12.545Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/34/5a88f8f90fd7f70a89834b386be91f110bec12726e747e1c483cb1cccf50/sphinx_gptheme-0.0.1a7-py3-none-any.whl", hash = "sha256:fc2c61d96e3a65c628ed0bc62b414d7cc69089a5be8873f500e6c8ef1a833cc0", size = 15628, upload-time = "2026-04-11T13:17:00.123Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0b/07e33934f81541b3fac687a18ae25108ce57852f12a7d4d5fa82090cd48a/sphinx_gp_theme-0.0.1a8-py3-none-any.whl", hash = "sha256:94f78e203797dc637ddf7a223d9960d75c993b2ab6214fe7af0e7998048a7253", size = 15681, upload-time = "2026-04-12T20:08:07.953Z" }, ] [[package]] @@ -1438,6 +1409,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/2b/e64e7de34663cff1df029ba4f05a86124315bd9eba3d3b78e64904bea7e0/sphinx_inline_tabs-2025.12.21.14-py3-none-any.whl", hash = "sha256:e685c782b58d4e01490bcc4e2367cf7135ec28e7283a05e89095394e4ca6e81a", size = 7082, upload-time = "2025-12-21T13:30:50.142Z" }, ] +[[package]] +name = "sphinx-ux-autodoc-layout" +version = "0.0.1a8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/00/10e666c41811a40033cbd13c45ec6f8ca278708cc3e3a62fd27eb8429262/sphinx_ux_autodoc_layout-0.0.1a8.tar.gz", hash = "sha256:abdddc91dc32174a40e207580d90129d66e1b190e9486e212350d12ed07c9f10", size = 20907, upload-time = "2026-04-12T20:12:13.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/71/d21ad70521b3967af590feeb1336a86fe6469708b3ea12c5d042fd58f5ba/sphinx_ux_autodoc_layout-0.0.1a8-py3-none-any.whl", hash = "sha256:a6cd213da18c2825f5dce6006f25acc801f353d3696de708b8ce3080768ea2bb", size = 24744, upload-time = "2026-04-12T20:10:05.656Z" }, +] + +[[package]] +name = "sphinx-ux-badges" +version = "0.0.1a8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/69/31e6ded298b46e4e7bbecb2332c3f45a11ecb94e364e3818fe2c832bc496/sphinx_ux_badges-0.0.1a8.tar.gz", hash = "sha256:9858dc3ca1ac27c39cf261e0c75407a0df693c1884f604c62e8f8bb2373399dc", size = 15281, upload-time = "2026-04-12T20:12:14.317Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/13/11713bc50829e01455cf0e3337256727b6a1104c29f20e586e77286bfbe9/sphinx_ux_badges-0.0.1a8-py3-none-any.whl", hash = "sha256:4d7b435632991962b28798da8510a13a1634c7164a8ea885f5e8075cbbfa53c8", size = 16272, upload-time = "2026-04-12T20:12:01.335Z" }, +] + [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" @@ -1560,10 +1557,10 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, + { name = "sphinx-autodoc-argparse" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1573,10 +1570,10 @@ docs = [ { name = "gp-libs" }, { name = "gp-sphinx" }, { name = "pillow" }, - { name = "sphinx-argparse-neo" }, { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, + { name = "sphinx-autodoc-argparse" }, ] lint = [ { name = "mypy" }, @@ -1610,7 +1607,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a7" }, + { name = "gp-sphinx", specifier = "==0.0.1a8" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1619,9 +1616,9 @@ dev = [ { name = "pytest-rerunfailures" }, { name = "pytest-watcher" }, { name = "ruff" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a7" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a7" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a8" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a8" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1629,11 +1626,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a7" }, + { name = "gp-sphinx", specifier = "==0.0.1a8" }, { name = "pillow" }, - { name = "sphinx-argparse-neo", specifier = "==0.0.1a7" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a7" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a8" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a8" }, ] lint = [ { name = "mypy" }, From f111878f44d0fa534cdce617a4d0abaec87ab40e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 Apr 2026 16:37:29 -0500 Subject: [PATCH 2815/2998] docs(CHANGES): note gp-sphinx v0.0.1a8 bump --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 26072e7e48..acdfe87145 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,7 @@ _Notes on the upcoming release will go here._ ### Documentation - Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#1035) +- Bump gp-sphinx docs stack to v0.0.1a8 (#1036) ## tmuxp 1.67.0 (2026-03-08) From 465529980cbe2719d3eb28f2693f5c3292ac486b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Apr 2026 17:42:14 -0500 Subject: [PATCH 2816/2998] ci(deps): bump codecov/codecov-action from 5 to 6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v6 moves the action runtime to Node 24, which GitHub-hosted `ubuntu-latest` runners support natively. The `action.yml` diff between v5.5.4 and v6.0.0 is purely an internal `actions/github-script` SHA bump (v7 → v8) — documented inputs are byte-identical. Tag: https://github.com/codecov/codecov-action/tree/v6 Changelog: https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 683b359067..ac83d5b923 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -83,7 +83,7 @@ jobs: tmux -V uv run py.test --cov=./ --cov-report=xml --verbose - - uses: codecov/codecov-action@v5 + - uses: codecov/codecov-action@v6 with: token: ${{ secrets.CODECOV_TOKEN }} From 8067532ed2fd2ab4d64643da6327318c0dbd6ec2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Apr 2026 17:42:14 -0500 Subject: [PATCH 2817/2998] ci(deps): bump aws-actions/configure-aws-credentials from 5 to 6 v6 moves the action runtime to Node 24, which GitHub-hosted `ubuntu-latest` runners support natively. The v6 changes are additive (transitive tag keys, corrected role-chaining outputs); existing inputs are byte-identical between v5 and v6. Tag: https://github.com/aws-actions/configure-aws-credentials/tree/v6 Changelog: https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d9dbf6716b..bebb318caf 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -78,7 +78,7 @@ jobs: - name: Configure AWS Credentials if: env.PUBLISH == 'true' - uses: aws-actions/configure-aws-credentials@v5 + uses: aws-actions/configure-aws-credentials@v6 with: role-to-assume: ${{ secrets.TMUXP_DOCS_ROLE_ARN }} aws-region: us-east-1 From 36c884f06473a24ffff262d20881c412612400bb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Apr 2026 17:42:14 -0500 Subject: [PATCH 2818/2998] ci(deps): bump dorny/paths-filter from 3.0.2 to 4.0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v4.0.0 moves the action runtime to Node 24, which GitHub-hosted `ubuntu-latest` runners support natively. v4.0.1 additionally adds `merge_group` event support. The `action.yml` diff introduces an optional `predicate-quantifier` input (default `'some'`) — the same matching semantics v3.x used by default — so existing filter outputs continue to fire identically. Tag: https://github.com/dorny/paths-filter/tree/v4.0.1 Changelog: https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index bebb318caf..0a727b2613 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@v6 - name: Filter changed file paths to outputs - uses: dorny/paths-filter@v3.0.2 + uses: dorny/paths-filter@v4.0.1 id: changes with: filters: | From c2b96cc6083e21dffd74231a052ae022eea288d9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 16 Apr 2026 17:42:14 -0500 Subject: [PATCH 2819/2998] ci(deps): bump extractions/setup-just from 3 to 4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v4 moves the underlying `extractions/setup-crate` pin from v1.4.0 to v2.0.0, which moves the action runtime to Node 24 — supported natively by GitHub-hosted `ubuntu-latest`. Both documented inputs (`just-version` and `github-token`) are byte-identical between v3 and v4. Tag: https://github.com/extractions/setup-just/tree/v4 Releases: https://github.com/extractions/setup-just/releases --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0a727b2613..4ccd9a8621 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -54,7 +54,7 @@ jobs: - name: Install just if: env.PUBLISH == 'true' - uses: extractions/setup-just@v3 + uses: extractions/setup-just@v4 - name: Print python versions if: env.PUBLISH == 'true' From a9d3ecc36474e489a531e7b8ca4d25817edf0d16 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 Apr 2026 08:42:45 -0500 Subject: [PATCH 2820/2998] .tool-versions(uv) uv 0.11.3 -> 0.11.7 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.7 - https://github.com/astral-sh/uv/blob/0.11.7/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 88d422f528..35d1382f54 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.49 -uv 0.11.3 +uv 0.11.7 python 3.14 3.13 3.12 3.11 3.10 From 8da9f0666a44456460bf04de64a3e3ff48e56107 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 Apr 2026 08:43:54 -0500 Subject: [PATCH 2821/2998] py(deps[dev]) Bump dev packages --- uv.lock | 352 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 173 insertions(+), 179 deletions(-) diff --git a/uv.lock b/uv.lock index e334a2fe1b..2bd495a6f7 100644 --- a/uv.lock +++ b/uv.lock @@ -2,8 +2,7 @@ version = 1 revision = 3 requires-python = ">=3.10, <4.0" resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", "python_full_version < '3.11'", ] @@ -353,7 +352,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -468,87 +467,87 @@ wheels = [ [[package]] name = "librt" -version = "0.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/9c/b4b0c54d84da4a94b37bd44151e46d5e583c9534c7e02250b961b1b6d8a8/librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73", size = 177471, upload-time = "2026-02-17T16:13:06.101Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/5f/63f5fa395c7a8a93558c0904ba8f1c8d1b997ca6a3de61bc7659970d66bf/librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc", size = 65697, upload-time = "2026-02-17T16:11:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e0/0472cf37267b5920eff2f292ccfaede1886288ce35b7f3203d8de00abfe6/librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7", size = 68376, upload-time = "2026-02-17T16:11:08.395Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8bd1359fdcd27ab897cd5963294fa4a7c83b20a8564678e4fd12157e56a5/librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6", size = 197084, upload-time = "2026-02-17T16:11:09.774Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fe/163e33fdd091d0c2b102f8a60cc0a61fd730ad44e32617cd161e7cd67a01/librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0", size = 207337, upload-time = "2026-02-17T16:11:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/f85130582f05dcf0c8902f3d629270231d2f4afdfc567f8305a952ac7f14/librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b", size = 219980, upload-time = "2026-02-17T16:11:12.499Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/cb5e4d03659e043a26c74e08206412ac9a3742f0477d96f9761a55313b5f/librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6", size = 212921, upload-time = "2026-02-17T16:11:14.484Z" }, - { url = "https://files.pythonhosted.org/packages/b1/81/a3a01e4240579c30f3487f6fed01eb4bc8ef0616da5b4ebac27ca19775f3/librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71", size = 221381, upload-time = "2026-02-17T16:11:17.459Z" }, - { url = "https://files.pythonhosted.org/packages/08/b0/fc2d54b4b1c6fb81e77288ff31ff25a2c1e62eaef4424a984f228839717b/librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7", size = 216714, upload-time = "2026-02-17T16:11:19.197Z" }, - { url = "https://files.pythonhosted.org/packages/96/96/85daa73ffbd87e1fb287d7af6553ada66bf25a2a6b0de4764344a05469f6/librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05", size = 214777, upload-time = "2026-02-17T16:11:20.443Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/c3aa7a2360383f4bf4f04d98195f2739a579128720c603f4807f006a4225/librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891", size = 237398, upload-time = "2026-02-17T16:11:22.083Z" }, - { url = "https://files.pythonhosted.org/packages/61/19/d350ea89e5274665185dabc4bbb9c3536c3411f862881d316c8b8e00eb66/librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7", size = 54285, upload-time = "2026-02-17T16:11:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/4f/d6/45d587d3d41c112e9543a0093d883eb57a24a03e41561c127818aa2a6bcc/librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2", size = 61352, upload-time = "2026-02-17T16:11:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/0e748af5e4fee180cf7cd12bd12b0513ad23b045dccb2a83191bde82d168/librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd", size = 65315, upload-time = "2026-02-17T16:11:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/9d/4d/7184806efda571887c798d573ca4134c80ac8642dcdd32f12c31b939c595/librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965", size = 68021, upload-time = "2026-02-17T16:11:26.129Z" }, - { url = "https://files.pythonhosted.org/packages/ae/88/c3c52d2a5d5101f28d3dc89298444626e7874aa904eed498464c2af17627/librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da", size = 194500, upload-time = "2026-02-17T16:11:27.177Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5d/6fb0a25b6a8906e85b2c3b87bee1d6ed31510be7605b06772f9374ca5cb3/librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0", size = 205622, upload-time = "2026-02-17T16:11:28.242Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a6/8006ae81227105476a45691f5831499e4d936b1c049b0c1feb17c11b02d1/librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e", size = 218304, upload-time = "2026-02-17T16:11:29.344Z" }, - { url = "https://files.pythonhosted.org/packages/ee/19/60e07886ad16670aae57ef44dada41912c90906a6fe9f2b9abac21374748/librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3", size = 211493, upload-time = "2026-02-17T16:11:30.445Z" }, - { url = "https://files.pythonhosted.org/packages/9c/cf/f666c89d0e861d05600438213feeb818c7514d3315bae3648b1fc145d2b6/librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac", size = 219129, upload-time = "2026-02-17T16:11:32.021Z" }, - { url = "https://files.pythonhosted.org/packages/8f/ef/f1bea01e40b4a879364c031476c82a0dc69ce068daad67ab96302fed2d45/librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596", size = 213113, upload-time = "2026-02-17T16:11:33.192Z" }, - { url = "https://files.pythonhosted.org/packages/9b/80/cdab544370cc6bc1b72ea369525f547a59e6938ef6863a11ab3cd24759af/librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99", size = 212269, upload-time = "2026-02-17T16:11:34.373Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9c/48d6ed8dac595654f15eceab2035131c136d1ae9a1e3548e777bb6dbb95d/librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe", size = 234673, upload-time = "2026-02-17T16:11:36.063Z" }, - { url = "https://files.pythonhosted.org/packages/16/01/35b68b1db517f27a01be4467593292eb5315def8900afad29fabf56304ba/librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb", size = 54597, upload-time = "2026-02-17T16:11:37.544Z" }, - { url = "https://files.pythonhosted.org/packages/71/02/796fe8f02822235966693f257bf2c79f40e11337337a657a8cfebba5febc/librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b", size = 61733, upload-time = "2026-02-17T16:11:38.691Z" }, - { url = "https://files.pythonhosted.org/packages/28/ad/232e13d61f879a42a4e7117d65e4984bb28371a34bb6fb9ca54ec2c8f54e/librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9", size = 52273, upload-time = "2026-02-17T16:11:40.308Z" }, - { url = "https://files.pythonhosted.org/packages/95/21/d39b0a87ac52fc98f621fb6f8060efb017a767ebbbac2f99fbcbc9ddc0d7/librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a", size = 66516, upload-time = "2026-02-17T16:11:41.604Z" }, - { url = "https://files.pythonhosted.org/packages/69/f1/46375e71441c43e8ae335905e069f1c54febee63a146278bcee8782c84fd/librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9", size = 68634, upload-time = "2026-02-17T16:11:43.268Z" }, - { url = "https://files.pythonhosted.org/packages/0a/33/c510de7f93bf1fa19e13423a606d8189a02624a800710f6e6a0a0f0784b3/librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb", size = 198941, upload-time = "2026-02-17T16:11:44.28Z" }, - { url = "https://files.pythonhosted.org/packages/dd/36/e725903416409a533d92398e88ce665476f275081d0d7d42f9c4951999e5/librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d", size = 209991, upload-time = "2026-02-17T16:11:45.462Z" }, - { url = "https://files.pythonhosted.org/packages/30/7a/8d908a152e1875c9f8eac96c97a480df425e657cdb47854b9efaa4998889/librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7", size = 224476, upload-time = "2026-02-17T16:11:46.542Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b8/a22c34f2c485b8903a06f3fe3315341fe6876ef3599792344669db98fcff/librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440", size = 217518, upload-time = "2026-02-17T16:11:47.746Z" }, - { url = "https://files.pythonhosted.org/packages/79/6f/5c6fea00357e4f82ba44f81dbfb027921f1ab10e320d4a64e1c408d035d9/librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9", size = 225116, upload-time = "2026-02-17T16:11:49.298Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a0/95ced4e7b1267fe1e2720a111685bcddf0e781f7e9e0ce59d751c44dcfe5/librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972", size = 217751, upload-time = "2026-02-17T16:11:50.49Z" }, - { url = "https://files.pythonhosted.org/packages/93/c2/0517281cb4d4101c27ab59472924e67f55e375bc46bedae94ac6dc6e1902/librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921", size = 218378, upload-time = "2026-02-17T16:11:51.783Z" }, - { url = "https://files.pythonhosted.org/packages/43/e8/37b3ac108e8976888e559a7b227d0ceac03c384cfd3e7a1c2ee248dbae79/librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0", size = 241199, upload-time = "2026-02-17T16:11:53.561Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/35812d041c53967fedf551a39399271bbe4257e681236a2cf1a69c8e7fa1/librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a", size = 54917, upload-time = "2026-02-17T16:11:54.758Z" }, - { url = "https://files.pythonhosted.org/packages/de/d1/fa5d5331b862b9775aaf2a100f5ef86854e5d4407f71bddf102f4421e034/librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444", size = 62017, upload-time = "2026-02-17T16:11:55.748Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7c/c614252f9acda59b01a66e2ddfd243ed1c7e1deab0293332dfbccf862808/librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d", size = 52441, upload-time = "2026-02-17T16:11:56.801Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3c/f614c8e4eaac7cbf2bbdf9528790b21d89e277ee20d57dc6e559c626105f/librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35", size = 66529, upload-time = "2026-02-17T16:11:57.809Z" }, - { url = "https://files.pythonhosted.org/packages/ab/96/5836544a45100ae411eda07d29e3d99448e5258b6e9c8059deb92945f5c2/librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583", size = 68669, upload-time = "2026-02-17T16:11:58.843Z" }, - { url = "https://files.pythonhosted.org/packages/06/53/f0b992b57af6d5531bf4677d75c44f095f2366a1741fb695ee462ae04b05/librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c", size = 199279, upload-time = "2026-02-17T16:11:59.862Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ad/4848cc16e268d14280d8168aee4f31cea92bbd2b79ce33d3e166f2b4e4fc/librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04", size = 210288, upload-time = "2026-02-17T16:12:00.954Z" }, - { url = "https://files.pythonhosted.org/packages/52/05/27fdc2e95de26273d83b96742d8d3b7345f2ea2bdbd2405cc504644f2096/librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363", size = 224809, upload-time = "2026-02-17T16:12:02.108Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d0/78200a45ba3240cb042bc597d6f2accba9193a2c57d0356268cbbe2d0925/librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0", size = 218075, upload-time = "2026-02-17T16:12:03.631Z" }, - { url = "https://files.pythonhosted.org/packages/af/72/a210839fa74c90474897124c064ffca07f8d4b347b6574d309686aae7ca6/librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012", size = 225486, upload-time = "2026-02-17T16:12:04.725Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c1/a03cc63722339ddbf087485f253493e2b013039f5b707e8e6016141130fa/librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb", size = 218219, upload-time = "2026-02-17T16:12:05.828Z" }, - { url = "https://files.pythonhosted.org/packages/58/f5/fff6108af0acf941c6f274a946aea0e484bd10cd2dc37610287ce49388c5/librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b", size = 218750, upload-time = "2026-02-17T16:12:07.09Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/5a387bfef30ec1e4b4f30562c8586566faf87e47d696768c19feb49e3646/librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d", size = 241624, upload-time = "2026-02-17T16:12:08.43Z" }, - { url = "https://files.pythonhosted.org/packages/d4/be/24f8502db11d405232ac1162eb98069ca49c3306c1d75c6ccc61d9af8789/librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a", size = 54969, upload-time = "2026-02-17T16:12:09.633Z" }, - { url = "https://files.pythonhosted.org/packages/5c/73/c9fdf6cb2a529c1a092ce769a12d88c8cca991194dfe641b6af12fa964d2/librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79", size = 62000, upload-time = "2026-02-17T16:12:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/d3/97/68f80ca3ac4924f250cdfa6e20142a803e5e50fca96ef5148c52ee8c10ea/librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0", size = 52495, upload-time = "2026-02-17T16:12:11.633Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6a/907ef6800f7bca71b525a05f1839b21f708c09043b1c6aa77b6b827b3996/librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f", size = 66081, upload-time = "2026-02-17T16:12:12.766Z" }, - { url = "https://files.pythonhosted.org/packages/1b/18/25e991cd5640c9fb0f8d91b18797b29066b792f17bf8493da183bf5caabe/librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c", size = 68309, upload-time = "2026-02-17T16:12:13.756Z" }, - { url = "https://files.pythonhosted.org/packages/a4/36/46820d03f058cfb5a9de5940640ba03165ed8aded69e0733c417bb04df34/librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc", size = 196804, upload-time = "2026-02-17T16:12:14.818Z" }, - { url = "https://files.pythonhosted.org/packages/59/18/5dd0d3b87b8ff9c061849fbdb347758d1f724b9a82241aa908e0ec54ccd0/librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c", size = 206907, upload-time = "2026-02-17T16:12:16.513Z" }, - { url = "https://files.pythonhosted.org/packages/d1/96/ef04902aad1424fd7299b62d1890e803e6ab4018c3044dca5922319c4b97/librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3", size = 221217, upload-time = "2026-02-17T16:12:17.906Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ff/7e01f2dda84a8f5d280637a2e5827210a8acca9a567a54507ef1c75b342d/librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14", size = 214622, upload-time = "2026-02-17T16:12:19.108Z" }, - { url = "https://files.pythonhosted.org/packages/1e/8c/5b093d08a13946034fed57619742f790faf77058558b14ca36a6e331161e/librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7", size = 221987, upload-time = "2026-02-17T16:12:20.331Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cc/86b0b3b151d40920ad45a94ce0171dec1aebba8a9d72bb3fa00c73ab25dd/librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6", size = 215132, upload-time = "2026-02-17T16:12:21.54Z" }, - { url = "https://files.pythonhosted.org/packages/fc/be/8588164a46edf1e69858d952654e216a9a91174688eeefb9efbb38a9c799/librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071", size = 215195, upload-time = "2026-02-17T16:12:23.073Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f2/0b9279bea735c734d69344ecfe056c1ba211694a72df10f568745c899c76/librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78", size = 237946, upload-time = "2026-02-17T16:12:24.275Z" }, - { url = "https://files.pythonhosted.org/packages/e9/cc/5f2a34fbc8aeb35314a3641f9956fa9051a947424652fad9882be7a97949/librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023", size = 50689, upload-time = "2026-02-17T16:12:25.766Z" }, - { url = "https://files.pythonhosted.org/packages/a0/76/cd4d010ab2147339ca2b93e959c3686e964edc6de66ddacc935c325883d7/librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730", size = 57875, upload-time = "2026-02-17T16:12:27.465Z" }, - { url = "https://files.pythonhosted.org/packages/84/0f/2143cb3c3ca48bd3379dcd11817163ca50781927c4537345d608b5045998/librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3", size = 48058, upload-time = "2026-02-17T16:12:28.556Z" }, - { url = "https://files.pythonhosted.org/packages/d2/0e/9b23a87e37baf00311c3efe6b48d6b6c168c29902dfc3f04c338372fd7db/librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1", size = 68313, upload-time = "2026-02-17T16:12:29.659Z" }, - { url = "https://files.pythonhosted.org/packages/db/9a/859c41e5a4f1c84200a7d2b92f586aa27133c8243b6cac9926f6e54d01b9/librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee", size = 70994, upload-time = "2026-02-17T16:12:31.516Z" }, - { url = "https://files.pythonhosted.org/packages/4c/28/10605366ee599ed34223ac2bf66404c6fb59399f47108215d16d5ad751a8/librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7", size = 220770, upload-time = "2026-02-17T16:12:33.294Z" }, - { url = "https://files.pythonhosted.org/packages/af/8d/16ed8fd452dafae9c48d17a6bc1ee3e818fd40ef718d149a8eff2c9f4ea2/librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040", size = 235409, upload-time = "2026-02-17T16:12:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/89/1b/7bdf3e49349c134b25db816e4a3db6b94a47ac69d7d46b1e682c2c4949be/librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e", size = 246473, upload-time = "2026-02-17T16:12:36.656Z" }, - { url = "https://files.pythonhosted.org/packages/4e/8a/91fab8e4fd2a24930a17188c7af5380eb27b203d72101c9cc000dbdfd95a/librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732", size = 238866, upload-time = "2026-02-17T16:12:37.849Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e0/c45a098843fc7c07e18a7f8a24ca8496aecbf7bdcd54980c6ca1aaa79a8e/librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624", size = 250248, upload-time = "2026-02-17T16:12:39.445Z" }, - { url = "https://files.pythonhosted.org/packages/82/30/07627de23036640c952cce0c1fe78972e77d7d2f8fd54fa5ef4554ff4a56/librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4", size = 240629, upload-time = "2026-02-17T16:12:40.889Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c1/55bfe1ee3542eba055616f9098eaf6eddb966efb0ca0f44eaa4aba327307/librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382", size = 239615, upload-time = "2026-02-17T16:12:42.446Z" }, - { url = "https://files.pythonhosted.org/packages/2b/39/191d3d28abc26c9099b19852e6c99f7f6d400b82fa5a4e80291bd3803e19/librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994", size = 263001, upload-time = "2026-02-17T16:12:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/b9/eb/7697f60fbe7042ab4e88f4ee6af496b7f222fffb0a4e3593ef1f29f81652/librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a", size = 51328, upload-time = "2026-02-17T16:12:45.148Z" }, - { url = "https://files.pythonhosted.org/packages/7c/72/34bf2eb7a15414a23e5e70ecb9440c1d3179f393d9349338a91e2781c0fb/librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4", size = 58722, upload-time = "2026-02-17T16:12:46.85Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c8/d148e041732d631fc76036f8b30fae4e77b027a1e95b7a84bb522481a940/librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61", size = 48755, upload-time = "2026-02-17T16:12:47.943Z" }, +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/6b/3d5c13fb3e3c4f43206c8f9dfed13778c2ed4f000bacaa0b7ce3c402a265/librt-0.9.0.tar.gz", hash = "sha256:a0951822531e7aee6e0dfb556b30d5ee36bbe234faf60c20a16c01be3530869d", size = 184368, upload-time = "2026-04-09T16:06:26.173Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/4a/c64265d71b84030174ff3ac2cd16d8b664072afab8c41fccd8e2ee5a6f8d/librt-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443", size = 67529, upload-time = "2026-04-09T16:04:27.373Z" }, + { url = "https://files.pythonhosted.org/packages/23/b1/30ca0b3a8bdac209a00145c66cf42e5e7da2cc056ffc6ebc5c7b430ddd34/librt-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c", size = 70248, upload-time = "2026-04-09T16:04:28.758Z" }, + { url = "https://files.pythonhosted.org/packages/fa/fc/c6018dc181478d6ac5aa24a5846b8185101eb90894346db239eb3ea53209/librt-0.9.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:de7dac64e3eb832ffc7b840eb8f52f76420cde1b845be51b2a0f6b870890645e", size = 202184, upload-time = "2026-04-09T16:04:29.893Z" }, + { url = "https://files.pythonhosted.org/packages/bf/58/d69629f002203370ef41ea69ff71c49a2c618aec39b226ff49986ecd8623/librt-0.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22a904cbdb678f7cb348c90d543d3c52f581663d687992fee47fd566dcbf5285", size = 212926, upload-time = "2026-04-09T16:04:31.126Z" }, + { url = "https://files.pythonhosted.org/packages/cc/55/01d859f57824e42bd02465c77bec31fa5ef9d8c2bcee702ccf8ef1b9f508/librt-0.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:224b9727eb8bc188bc3bcf29d969dba0cd61b01d9bac80c41575520cc4baabb2", size = 225664, upload-time = "2026-04-09T16:04:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/9b/02/32f63ad0ef085a94a70315291efe1151a48b9947af12261882f8445b2a30/librt-0.9.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e94cbc6ad9a6aeea46d775cbb11f361022f778a9cc8cc90af653d3a594b057ce", size = 219534, upload-time = "2026-04-09T16:04:33.667Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5a/9d77111a183c885acf3b3b6e4c00f5b5b07b5817028226499a55f1fedc59/librt-0.9.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7bc30ad339f4e1a01d4917d645e522a0bc0030644d8973f6346397c93ba1503f", size = 227322, upload-time = "2026-04-09T16:04:34.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e7/05d700c93063753e12ab230b972002a3f8f3b9c95d8a980c2f646c8b6963/librt-0.9.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:56d65b583cf43b8cf4c8fbe1e1da20fa3076cc32a1149a141507af1062718236", size = 223407, upload-time = "2026-04-09T16:04:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/c0/26/26c3124823c67c987456977c683da9a27cc874befc194ddcead5f9988425/librt-0.9.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0a1be03168b2691ba61927e299b352a6315189199ca18a57b733f86cb3cc8d38", size = 221302, upload-time = "2026-04-09T16:04:37.62Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/c7cc2be5cf4ff7b017d948a789256288cb33a517687ff1995e72a7eea79f/librt-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63c12efcd160e1d14da11af0c46c0217473e1e0d2ae1acbccc83f561ea4c2a7b", size = 243893, upload-time = "2026-04-09T16:04:38.909Z" }, + { url = "https://files.pythonhosted.org/packages/62/d3/da553d37417a337d12660450535d5fd51373caffbedf6962173c87867246/librt-0.9.0-cp310-cp310-win32.whl", hash = "sha256:e9002e98dcb1c0a66723592520decd86238ddcef168b37ff6cfb559200b4b774", size = 55375, upload-time = "2026-04-09T16:04:40.148Z" }, + { url = "https://files.pythonhosted.org/packages/9b/5a/46fa357bab8311b6442a83471591f2f9e5b15ecc1d2121a43725e0c529b8/librt-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9fcb461fbf70654a52a7cc670e606f04449e2374c199b1825f754e16dacfedd8", size = 62581, upload-time = "2026-04-09T16:04:41.452Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1e/2ec7afcebcf3efea593d13aee18bbcfdd3a243043d848ebf385055e9f636/librt-0.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90904fac73c478f4b83f4ed96c99c8208b75e6f9a8a1910548f69a00f1eaa671", size = 67155, upload-time = "2026-04-09T16:04:42.933Z" }, + { url = "https://files.pythonhosted.org/packages/18/77/72b85afd4435268338ad4ec6231b3da8c77363f212a0227c1ff3b45e4d35/librt-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789fff71757facc0738e8d89e3b84e4f0251c1c975e85e81b152cdaca927cc2d", size = 69916, upload-time = "2026-04-09T16:04:44.042Z" }, + { url = "https://files.pythonhosted.org/packages/27/fb/948ea0204fbe2e78add6d46b48330e58d39897e425560674aee302dca81c/librt-0.9.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1bf465d1e5b0a27713862441f6467b5ab76385f4ecf8f1f3a44f8aa3c695b4b6", size = 199635, upload-time = "2026-04-09T16:04:45.5Z" }, + { url = "https://files.pythonhosted.org/packages/ac/cd/894a29e251b296a27957856804cfd21e93c194aa131de8bb8032021be07e/librt-0.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f819e0c6413e259a17a7c0d49f97f405abadd3c2a316a3b46c6440b7dbbedbb1", size = 211051, upload-time = "2026-04-09T16:04:47.016Z" }, + { url = "https://files.pythonhosted.org/packages/18/8f/dcaed0bc084a35f3721ff2d081158db569d2c57ea07d35623ddaca5cfc8e/librt-0.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0785c2fb4a81e1aece366aa3e2e039f4a4d7d21aaaded5227d7f3c703427882", size = 224031, upload-time = "2026-04-09T16:04:48.207Z" }, + { url = "https://files.pythonhosted.org/packages/03/44/88f6c1ed1132cd418601cc041fbd92fed28b3a09f39de81978e0822d13ff/librt-0.9.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80b25c7b570a86c03b5da69e665809deb39265476e8e21d96a9328f9762f9990", size = 218069, upload-time = "2026-04-09T16:04:50.025Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/7d02e981c2db12188d82b4410ff3e35bfdb844b26aecd02233626f46af2b/librt-0.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d4d16b608a1c43d7e33142099a75cd93af482dadce0bf82421e91cad077157f4", size = 224857, upload-time = "2026-04-09T16:04:51.684Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/c77e706b7215ca32e928d47535cf13dbc3d25f096f84ddf8fbc06693e229/librt-0.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:194fc1a32e1e21fe809d38b5faea66cc65eaa00217c8901fbdb99866938adbdb", size = 219865, upload-time = "2026-04-09T16:04:52.949Z" }, + { url = "https://files.pythonhosted.org/packages/52/d1/32b0c1a0eb8461c70c11656c46a29f760b7c7edf3c36d6f102470c17170f/librt-0.9.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8c6bc1384d9738781cfd41d09ad7f6e8af13cfea2c75ece6bd6d2566cdea2076", size = 218451, upload-time = "2026-04-09T16:04:54.174Z" }, + { url = "https://files.pythonhosted.org/packages/74/d1/adfd0f9c44761b1d49b1bec66173389834c33ee2bd3c7fd2e2367f1942d4/librt-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cb151e52a044f06e54ac7f7b47adbfc89b5c8e2b63e1175a9d587c43e8942a", size = 241300, upload-time = "2026-04-09T16:04:55.452Z" }, + { url = "https://files.pythonhosted.org/packages/09/b0/9074b64407712f0003c27f5b1d7655d1438979155f049720e8a1abd9b1a1/librt-0.9.0-cp311-cp311-win32.whl", hash = "sha256:f100bfe2acf8a3689af9d0cc660d89f17286c9c795f9f18f7b62dd1a6b247ae6", size = 55668, upload-time = "2026-04-09T16:04:56.689Z" }, + { url = "https://files.pythonhosted.org/packages/24/19/40b77b77ce80b9389fb03971431b09b6b913911c38d412059e0b3e2a9ef2/librt-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:0b73e4266307e51c95e09c0750b7ec383c561d2e97d58e473f6f6a209952fbb8", size = 62976, upload-time = "2026-04-09T16:04:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/70/9d/9fa7a64041e29035cb8c575af5f0e3840be1b97b4c4d9061e0713f171849/librt-0.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc5518873822d2faa8ebdd2c1a4d7c8ef47b01a058495ab7924cb65bdbf5fc9a", size = 53502, upload-time = "2026-04-09T16:04:58.806Z" }, + { url = "https://files.pythonhosted.org/packages/bf/90/89ddba8e1c20b0922783cd93ed8e64f34dc05ab59c38a9c7e313632e20ff/librt-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b3e3bc363f71bda1639a4ee593cb78f7fbfeacc73411ec0d4c92f00730010a4", size = 68332, upload-time = "2026-04-09T16:05:00.09Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/7aa4da1fb08bdeeb540cb07bfc8207cb32c5c41642f2594dbd0098a0662d/librt-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a09c2f5869649101738653a9b7ab70cf045a1105ac66cbb8f4055e61df78f2d", size = 70581, upload-time = "2026-04-09T16:05:01.213Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/73a2187e1031041e93b7e3a25aae37aa6f13b838c550f7e0f06f66766212/librt-0.9.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ca8e133d799c948db2ab1afc081c333a825b5540475164726dcbf73537e5c2f", size = 203984, upload-time = "2026-04-09T16:05:02.542Z" }, + { url = "https://files.pythonhosted.org/packages/5e/3d/23460d571e9cbddb405b017681df04c142fb1b04cbfce77c54b08e28b108/librt-0.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:603138ee838ee1583f1b960b62d5d0007845c5c423feb68e44648b1359014e27", size = 215762, upload-time = "2026-04-09T16:05:04.127Z" }, + { url = "https://files.pythonhosted.org/packages/de/1e/42dc7f8ab63e65b20640d058e63e97fd3e482c1edbda3570d813b4d0b927/librt-0.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4003f70c56a5addd6aa0897f200dd59afd3bf7bcd5b3cce46dd21f925743bc2", size = 230288, upload-time = "2026-04-09T16:05:05.883Z" }, + { url = "https://files.pythonhosted.org/packages/dc/08/ca812b6d8259ad9ece703397f8ad5c03af5b5fedfce64279693d3ce4087c/librt-0.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78042f6facfd98ecb25e9829c7e37cce23363d9d7c83bc5f72702c5059eb082b", size = 224103, upload-time = "2026-04-09T16:05:07.148Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3f/620490fb2fa66ffd44e7f900254bc110ebec8dac6c1b7514d64662570e6f/librt-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a361c9434a64d70a7dbb771d1de302c0cc9f13c0bffe1cf7e642152814b35265", size = 232122, upload-time = "2026-04-09T16:05:08.386Z" }, + { url = "https://files.pythonhosted.org/packages/e9/83/12864700a1b6a8be458cf5d05db209b0d8e94ae281e7ec261dbe616597b4/librt-0.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd2c7e082b0b92e1baa4da28163a808672485617bc855cc22a2fd06978fa9084", size = 225045, upload-time = "2026-04-09T16:05:09.707Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1b/845d339c29dc7dbc87a2e992a1ba8d28d25d0e0372f9a0a2ecebde298186/librt-0.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7e6274fd33fc5b2a14d41c9119629d3ff395849d8bcbc80cf637d9e8d2034da8", size = 227372, upload-time = "2026-04-09T16:05:10.942Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fe/277985610269d926a64c606f761d58d3db67b956dbbf40024921e95e7fcb/librt-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5093043afb226ecfa1400120d1ebd4442b4f99977783e4f4f7248879009b227f", size = 248224, upload-time = "2026-04-09T16:05:12.254Z" }, + { url = "https://files.pythonhosted.org/packages/92/1b/ee486d244b8de6b8b5dbaefabe6bfdd4a72e08f6353edf7d16d27114da8d/librt-0.9.0-cp312-cp312-win32.whl", hash = "sha256:9edcc35d1cae9fd5320171b1a838c7da8a5c968af31e82ecc3dff30b4be0957f", size = 55986, upload-time = "2026-04-09T16:05:13.529Z" }, + { url = "https://files.pythonhosted.org/packages/89/7a/ba1737012308c17dc6d5516143b5dce9a2c7ba3474afd54e11f44a4d1ef3/librt-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc2917258e131ae5f958a4d872e07555b51cb7466a43433218061c74ef33745", size = 63260, upload-time = "2026-04-09T16:05:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/e4/01752c113da15127f18f7bf11142f5640038f062407a611c059d0036c6aa/librt-0.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:90e6d5420fc8a300518d4d2288154ff45005e920425c22cbbfe8330f3f754bd9", size = 53694, upload-time = "2026-04-09T16:05:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d7/1b3e26fffde1452d82f5666164858a81c26ebe808e7ae8c9c88628981540/librt-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29b68cd9714531672db62cc54f6e8ff981900f824d13fa0e00749189e13778e", size = 68367, upload-time = "2026-04-09T16:05:17.243Z" }, + { url = "https://files.pythonhosted.org/packages/a5/5b/c61b043ad2e091fbe1f2d35d14795e545d0b56b03edaa390fa1dcee3d160/librt-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d5c8a5929ac325729f6119802070b561f4db793dffc45e9ac750992a4ed4d22", size = 70595, upload-time = "2026-04-09T16:05:18.471Z" }, + { url = "https://files.pythonhosted.org/packages/a3/22/2448471196d8a73370aa2f23445455dc42712c21404081fcd7a03b9e0749/librt-0.9.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:756775d25ec8345b837ab52effee3ad2f3b2dfd6bbee3e3f029c517bd5d8f05a", size = 204354, upload-time = "2026-04-09T16:05:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5e/39fc4b153c78cfd2c8a2dcb32700f2d41d2312aa1050513183be4540930d/librt-0.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8f5d00b49818f4e2b1667db994488b045835e0ac16fe2f924f3871bd2b8ac5", size = 216238, upload-time = "2026-04-09T16:05:20.868Z" }, + { url = "https://files.pythonhosted.org/packages/d7/42/bc2d02d0fa7badfa63aa8d6dcd8793a9f7ef5a94396801684a51ed8d8287/librt-0.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c81aef782380f0f13ead670aae01825eb653b44b046aa0e5ebbb79f76ed4aa11", size = 230589, upload-time = "2026-04-09T16:05:22.305Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7b/e2d95cc513866373692aa5edf98080d5602dd07cabfb9e5d2f70df2f25f7/librt-0.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66b58fed90a545328e80d575467244de3741e088c1af928f0b489ebec3ef3858", size = 224610, upload-time = "2026-04-09T16:05:23.647Z" }, + { url = "https://files.pythonhosted.org/packages/31/d5/6cec4607e998eaba57564d06a1295c21b0a0c8de76e4e74d699e627bd98c/librt-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e78fb7419e07d98c2af4b8567b72b3eaf8cb05caad642e9963465569c8b2d87e", size = 232558, upload-time = "2026-04-09T16:05:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/95/8c/27f1d8d3aaf079d3eb26439bf0b32f1482340c3552e324f7db9dca858671/librt-0.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c3786f0f4490a5cd87f1ed6cefae833ad6b1060d52044ce0434a2e85893afd0", size = 225521, upload-time = "2026-04-09T16:05:26.311Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d8/1e0d43b1c329b416017619469b3c3801a25a6a4ef4a1c68332aeaa6f72ca/librt-0.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8494cfc61e03542f2d381e71804990b3931175a29b9278fdb4a5459948778dc2", size = 227789, upload-time = "2026-04-09T16:05:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/2c/b4/d3d842e88610fcd4c8eec7067b0c23ef2d7d3bff31496eded6a83b0f99be/librt-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07cf11f769831186eeac424376e6189f20ace4f7263e2134bdb9757340d84d4d", size = 248616, upload-time = "2026-04-09T16:05:29.181Z" }, + { url = "https://files.pythonhosted.org/packages/ec/28/527df8ad0d1eb6c8bdfa82fc190f1f7c4cca5a1b6d7b36aeabf95b52d74d/librt-0.9.0-cp313-cp313-win32.whl", hash = "sha256:850d6d03177e52700af605fd60db7f37dcb89782049a149674d1a9649c2138fd", size = 56039, upload-time = "2026-04-09T16:05:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a7/413652ad0d92273ee5e30c000fc494b361171177c83e57c060ecd3c21538/librt-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:a5af136bfba820d592f86c67affcef9b3ff4d4360ac3255e341e964489b48519", size = 63264, upload-time = "2026-04-09T16:05:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c1/184e539543f06ea2912f4b92a5ffaede4f9b392689e3f00acbf8134bee92/librt-0.9.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:3f05d145df35dca5056a8bc3838e940efebd893a54b3e19b2dda39ceaa299bcb", size = 67830, upload-time = "2026-04-09T16:05:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ad/23399bdcb7afca819acacdef31b37ee59de261bd66b503a7995c03c4b0dc/librt-0.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1c587494461ebd42229d0f1739f3aa34237dd9980623ecf1be8d3bcba79f4499", size = 70280, upload-time = "2026-04-09T16:05:35.649Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0b/4542dc5a2b8772dbf92cafb9194701230157e73c14b017b6961a23598b03/librt-0.9.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0a2040f801406b93657a70b72fa12311063a319fee72ce98e1524da7200171f", size = 201925, upload-time = "2026-04-09T16:05:36.739Z" }, + { url = "https://files.pythonhosted.org/packages/31/d4/8ee7358b08fd0cfce051ef96695380f09b3c2c11b77c9bfbc367c921cce5/librt-0.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f38bc489037eca88d6ebefc9c4d41a4e07c8e8b4de5188a9e6d290273ad7ebb1", size = 212381, upload-time = "2026-04-09T16:05:38.043Z" }, + { url = "https://files.pythonhosted.org/packages/f2/94/a2025fe442abedf8b038038dab3dba942009ad42b38ea064a1a9e6094241/librt-0.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3fd278f5e6bf7c75ccd6d12344eb686cc020712683363b66f46ac79d37c799f", size = 227065, upload-time = "2026-04-09T16:05:39.394Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e9/b9fcf6afa909f957cfbbf918802f9dada1bd5d3c1da43d722fd6a310dc3f/librt-0.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fcbdf2a9ca24e87bbebb47f1fe34e531ef06f104f98c9ccfc953a3f3344c567a", size = 221333, upload-time = "2026-04-09T16:05:40.999Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7c/ba54cd6aa6a3c8cd12757a6870e0c79a64b1e6327f5248dcff98423f4d43/librt-0.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e306d956cfa027fe041585f02a1602c32bfa6bb8ebea4899d373383295a6c62f", size = 229051, upload-time = "2026-04-09T16:05:42.605Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4b/8cfdbad314c8677a0148bf0b70591d6d18587f9884d930276098a235461b/librt-0.9.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:465814ab157986acb9dfa5ccd7df944be5eefc0d08d31ec6e8d88bc71251d845", size = 222492, upload-time = "2026-04-09T16:05:43.842Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d1/2eda69563a1a88706808decdce035e4b32755dbfbb0d05e1a65db9547ed1/librt-0.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:703f4ae36d6240bfe24f542bac784c7e4194ec49c3ba5a994d02891649e2d85b", size = 223849, upload-time = "2026-04-09T16:05:45.054Z" }, + { url = "https://files.pythonhosted.org/packages/04/44/b2ed37df6be5b3d42cfe36318e0598e80843d5c6308dd63d0bf4e0ce5028/librt-0.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3be322a15ee5e70b93b7a59cfd074614f22cc8c9ff18bd27f474e79137ea8d3b", size = 245001, upload-time = "2026-04-09T16:05:46.34Z" }, + { url = "https://files.pythonhosted.org/packages/47/e7/617e412426df89169dd2a9ed0cc8752d5763336252c65dbf945199915119/librt-0.9.0-cp314-cp314-win32.whl", hash = "sha256:b8da9f8035bb417770b1e1610526d87ad4fc58a2804dc4d79c53f6d2cf5a6eb9", size = 51799, upload-time = "2026-04-09T16:05:47.738Z" }, + { url = "https://files.pythonhosted.org/packages/24/ed/c22ca4db0ca3cbc285e4d9206108746beda561a9792289c3c31281d7e9df/librt-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:b8bd70d5d816566a580d193326912f4a76ec2d28a97dc4cd4cc831c0af8e330e", size = 59165, upload-time = "2026-04-09T16:05:49.198Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/875398fafa4cbc8f15b89366fc3287304ddd3314d861f182a4b87595ace0/librt-0.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:fc5758e2b7a56532dc33e3c544d78cbaa9ecf0a0f2a2da2df882c1d6b99a317f", size = 49292, upload-time = "2026-04-09T16:05:50.362Z" }, + { url = "https://files.pythonhosted.org/packages/4c/61/bc448ecbf9b2d69c5cff88fe41496b19ab2a1cbda0065e47d4d0d51c0867/librt-0.9.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f24b90b0e0c8cc9491fb1693ae91fe17cb7963153a1946395acdbdd5818429a4", size = 70175, upload-time = "2026-04-09T16:05:51.564Z" }, + { url = "https://files.pythonhosted.org/packages/60/f2/c47bb71069a73e2f04e70acbd196c1e5cc411578ac99039a224b98920fd4/librt-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fe56e80badb66fdcde06bef81bbaa5bfcf6fbd7aefb86222d9e369c38c6b228", size = 72951, upload-time = "2026-04-09T16:05:52.699Z" }, + { url = "https://files.pythonhosted.org/packages/29/19/0549df59060631732df758e8886d92088da5fdbedb35b80e4643664e8412/librt-0.9.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:527b5b820b47a09e09829051452bb0d1dd2122261254e2a6f674d12f1d793d54", size = 225864, upload-time = "2026-04-09T16:05:53.895Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f8/3b144396d302ac08e50f89e64452c38db84bc7b23f6c60479c5d3abd303c/librt-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d429bdd4ac0ab17c8e4a8af0ed2a7440b16eba474909ab357131018fe8c7e71", size = 241155, upload-time = "2026-04-09T16:05:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ce/ee67ec14581de4043e61d05786d2aed6c9b5338816b7859bcf07455c6a9f/librt-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7202bdcac47d3a708271c4304a474a8605a4a9a4a709e954bf2d3241140aa938", size = 252235, upload-time = "2026-04-09T16:05:56.549Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fa/0ead15daa2b293a54101550b08d4bafe387b7d4a9fc6d2b985602bae69b6/librt-0.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0d620e74897f8c2613b3c4e2e9c1e422eb46d2ddd07df540784d44117836af3", size = 244963, upload-time = "2026-04-09T16:05:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/29/68/9fbf9a9aa704ba87689e40017e720aced8d9a4d2b46b82451d8142f91ec9/librt-0.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d69fc39e627908f4c03297d5a88d9284b73f4d90b424461e32e8c2485e21c283", size = 257364, upload-time = "2026-04-09T16:05:59.686Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8d/9d60869f1b6716c762e45f66ed945b1e5dd649f7377684c3b176ae424648/librt-0.9.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c2640e23d2b7c98796f123ffd95cf2022c7777aa8a4a3b98b36c570d37e85eee", size = 247661, upload-time = "2026-04-09T16:06:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/a5c365093962310bfdb4f6af256f191085078ffb529b3f0cbebb5b33ebe2/librt-0.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:451daa98463b7695b0a30aa56bf637831ea559e7b8101ac2ef6382e8eb15e29c", size = 248238, upload-time = "2026-04-09T16:06:02.537Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/2d34365177f412c9e19c0a29f969d70f5343f27634b76b765a54d8b27705/librt-0.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:928bd06eca2c2bbf4349e5b817f837509b0604342e65a502de1d50a7570afd15", size = 269457, upload-time = "2026-04-09T16:06:03.833Z" }, + { url = "https://files.pythonhosted.org/packages/bc/cd/de45b239ea3bdf626f982a00c14bfcf2e12d261c510ba7db62c5969a27cd/librt-0.9.0-cp314-cp314t-win32.whl", hash = "sha256:a9c63e04d003bc0fb6a03b348018b9a3002f98268200e22cc80f146beac5dc40", size = 52453, upload-time = "2026-04-09T16:06:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f9/bfb32ae428aa75c0c533915622176f0a17d6da7b72b5a3c6363685914f70/librt-0.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f162af66a2ed3f7d1d161a82ca584efd15acd9c1cff190a373458c32f7d42118", size = 60044, upload-time = "2026-04-09T16:06:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/aa/47/7d70414bcdbb3bc1f458a8d10558f00bbfdb24e5a11740fc8197e12c3255/librt-0.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a4b25c6c25cac5d0d9d6d6da855195b254e0021e513e0249f0e3b444dc6e0e61", size = 50009, upload-time = "2026-04-09T16:06:07.995Z" }, ] [[package]] @@ -592,8 +591,7 @@ name = "markdown-it-py" version = "4.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ { name = "mdurl", marker = "python_full_version >= '3.11'" }, @@ -712,7 +710,7 @@ wheels = [ [[package]] name = "mypy" -version = "1.20.0" +version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, @@ -721,51 +719,51 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/b0089fe7fef0a994ae5ee07029ced0526082c6cfaaa4c10d40a10e33b097/mypy-1.20.0.tar.gz", hash = "sha256:eb96c84efcc33f0b5e0e04beacf00129dd963b67226b01c00b9dfc8affb464c3", size = 3815028, upload-time = "2026-03-31T16:55:14.959Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/a2/a965c8c3fcd4fa8b84ba0d46606181b0d0a1d50f274c67877f3e9ed4882c/mypy-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99f515f95fd03a90875fdb2cca12ff074aa04490db4d190905851bdf8a549a8", size = 14430138, upload-time = "2026-03-31T16:52:37.843Z" }, - { url = "https://files.pythonhosted.org/packages/53/6e/043477501deeb8eabbab7f1a2f6cac62cfb631806dc1d6862a04a7f5011b/mypy-1.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd0212976dc57a5bfeede7c219e7cd66568a32c05c9129686dd487c059c1b88a", size = 13311282, upload-time = "2026-03-31T16:55:11.021Z" }, - { url = "https://files.pythonhosted.org/packages/65/aa/bd89b247b83128197a214f29f0632ff3c14f54d4cd70d144d157bd7d7d6e/mypy-1.20.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8426d4d75d68714abc17a4292d922f6ba2cfb984b72c2278c437f6dae797865", size = 13750889, upload-time = "2026-03-31T16:52:02.909Z" }, - { url = "https://files.pythonhosted.org/packages/fa/9d/2860be7355c45247ccc0be1501c91176318964c2a137bd4743f58ce6200e/mypy-1.20.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02cca0761c75b42a20a2757ae58713276605eb29a08dd8a6e092aa347c4115ca", size = 14619788, upload-time = "2026-03-31T16:50:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/75/7f/3ef3e360c91f3de120f205c8ce405e9caf9fc52ef14b65d37073e322c114/mypy-1.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3a49064504be59e59da664c5e149edc1f26c67c4f8e8456f6ba6aba55033018", size = 14918849, upload-time = "2026-03-31T16:51:10.478Z" }, - { url = "https://files.pythonhosted.org/packages/ae/72/af970dfe167ef788df7c5e6109d2ed0229f164432ce828bc9741a4250e64/mypy-1.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebea00201737ad4391142808ed16e875add5c17f676e0912b387739f84991e13", size = 10822007, upload-time = "2026-03-31T16:50:25.268Z" }, - { url = "https://files.pythonhosted.org/packages/93/94/ba9065c2ebe5421619aff684b793d953e438a8bfe31a320dd6d1e0706e81/mypy-1.20.0-cp310-cp310-win_arm64.whl", hash = "sha256:e80cf77847d0d3e6e3111b7b25db32a7f8762fd4b9a3a72ce53fe16a2863b281", size = 9756158, upload-time = "2026-03-31T16:48:36.213Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1c/74cb1d9993236910286865679d1c616b136b2eae468493aa939431eda410/mypy-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4525e7010b1b38334516181c5b81e16180b8e149e6684cee5a727c78186b4e3b", size = 14343972, upload-time = "2026-03-31T16:49:04.887Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/01399515eca280386e308cf57901e68d3a52af18691941b773b3380c1df8/mypy-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a17c5d0bdcca61ce24a35beb828a2d0d323d3fcf387d7512206888c900193367", size = 13225007, upload-time = "2026-03-31T16:50:08.151Z" }, - { url = "https://files.pythonhosted.org/packages/56/ac/b4ba5094fb2d7fe9d2037cd8d18bbe02bcf68fd22ab9ff013f55e57ba095/mypy-1.20.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75ff57defcd0f1d6e006d721ccdec6c88d4f6a7816eb92f1c4890d979d9ee62", size = 13663752, upload-time = "2026-03-31T16:49:26.064Z" }, - { url = "https://files.pythonhosted.org/packages/db/a7/460678d3cf7da252d2288dad0c602294b6ec22a91932ec368cc11e44bb6e/mypy-1.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b503ab55a836136b619b5fc21c8803d810c5b87551af8600b72eecafb0059cb0", size = 14532265, upload-time = "2026-03-31T16:53:55.077Z" }, - { url = "https://files.pythonhosted.org/packages/a3/3e/051cca8166cf0438ae3ea80e0e7c030d7a8ab98dffc93f80a1aa3f23c1a2/mypy-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1973868d2adbb4584a3835780b27436f06d1dc606af5be09f187aaa25be1070f", size = 14768476, upload-time = "2026-03-31T16:50:34.587Z" }, - { url = "https://files.pythonhosted.org/packages/be/66/8e02ec184f852ed5c4abb805583305db475930854e09964b55e107cdcbc4/mypy-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:2fcedb16d456106e545b2bfd7ef9d24e70b38ec252d2a629823a4d07ebcdb69e", size = 10818226, upload-time = "2026-03-31T16:53:15.624Z" }, - { url = "https://files.pythonhosted.org/packages/13/4b/383ad1924b28f41e4879a74151e7a5451123330d45652da359f9183bcd45/mypy-1.20.0-cp311-cp311-win_arm64.whl", hash = "sha256:379edf079ce44ac8d2805bcf9b3dd7340d4f97aad3a5e0ebabbf9d125b84b442", size = 9750091, upload-time = "2026-03-31T16:54:12.162Z" }, - { url = "https://files.pythonhosted.org/packages/be/dd/3afa29b58c2e57c79116ed55d700721c3c3b15955e2b6251dd165d377c0e/mypy-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:002b613ae19f4ac7d18b7e168ffe1cb9013b37c57f7411984abbd3b817b0a214", size = 14509525, upload-time = "2026-03-31T16:55:01.824Z" }, - { url = "https://files.pythonhosted.org/packages/54/eb/227b516ab8cad9f2a13c5e7a98d28cd6aa75e9c83e82776ae6c1c4c046c7/mypy-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9336b5e6712f4adaf5afc3203a99a40b379049104349d747eb3e5a3aa23ac2e", size = 13326469, upload-time = "2026-03-31T16:51:41.23Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/1ddb799860c1b5ac6117ec307b965f65deeb47044395ff01ab793248a591/mypy-1.20.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f13b3e41bce9d257eded794c0f12878af3129d80aacd8a3ee0dee51f3a978651", size = 13705953, upload-time = "2026-03-31T16:48:55.69Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b7/54a720f565a87b893182a2a393370289ae7149e4715859e10e1c05e49154/mypy-1.20.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9804c3ad27f78e54e58b32e7cb532d128b43dbfb9f3f9f06262b821a0f6bd3f5", size = 14710363, upload-time = "2026-03-31T16:53:26.948Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2a/74810274848d061f8a8ea4ac23aaad43bd3d8c1882457999c2e568341c57/mypy-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:697f102c5c1d526bdd761a69f17c6070f9892eebcb94b1a5963d679288c09e78", size = 14947005, upload-time = "2026-03-31T16:50:17.591Z" }, - { url = "https://files.pythonhosted.org/packages/77/91/21b8ba75f958bcda75690951ce6fa6b7138b03471618959529d74b8544e2/mypy-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ecd63f75fdd30327e4ad8b5704bd6d91fc6c1b2e029f8ee14705e1207212489", size = 10880616, upload-time = "2026-03-31T16:52:19.986Z" }, - { url = "https://files.pythonhosted.org/packages/8a/15/3d8198ef97c1ca03aea010cce4f1d4f3bc5d9849e8c0140111ca2ead9fdd/mypy-1.20.0-cp312-cp312-win_arm64.whl", hash = "sha256:f194db59657c58593a3c47c6dfd7bad4ef4ac12dbc94d01b3a95521f78177e33", size = 9813091, upload-time = "2026-03-31T16:53:44.385Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a7/f64ea7bd592fa431cb597418b6dec4a47f7d0c36325fec7ac67bc8402b94/mypy-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b20c8b0fd5877abdf402e79a3af987053de07e6fb208c18df6659f708b535134", size = 14485344, upload-time = "2026-03-31T16:49:16.78Z" }, - { url = "https://files.pythonhosted.org/packages/bb/72/8927d84cfc90c6abea6e96663576e2e417589347eb538749a464c4c218a0/mypy-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:367e5c993ba34d5054d11937d0485ad6dfc60ba760fa326c01090fc256adf15c", size = 13327400, upload-time = "2026-03-31T16:53:08.02Z" }, - { url = "https://files.pythonhosted.org/packages/ab/4a/11ab99f9afa41aa350178d24a7d2da17043228ea10f6456523f64b5a6cf6/mypy-1.20.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f799d9db89fc00446f03281f84a221e50018fc40113a3ba9864b132895619ebe", size = 13706384, upload-time = "2026-03-31T16:52:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/42/79/694ca73979cfb3535ebfe78733844cd5aff2e63304f59bf90585110d975a/mypy-1.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555658c611099455b2da507582ea20d2043dfdfe7f5ad0add472b1c6238b433f", size = 14700378, upload-time = "2026-03-31T16:48:45.527Z" }, - { url = "https://files.pythonhosted.org/packages/84/24/a022ccab3a46e3d2cdf2e0e260648633640eb396c7e75d5a42818a8d3971/mypy-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:efe8d70949c3023698c3fca1e94527e7e790a361ab8116f90d11221421cd8726", size = 14932170, upload-time = "2026-03-31T16:49:36.038Z" }, - { url = "https://files.pythonhosted.org/packages/d8/9b/549228d88f574d04117e736f55958bd4908f980f9f5700a07aeb85df005b/mypy-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:f49590891d2c2f8a9de15614e32e459a794bcba84693c2394291a2038bbaaa69", size = 10888526, upload-time = "2026-03-31T16:50:59.827Z" }, - { url = "https://files.pythonhosted.org/packages/91/17/15095c0e54a8bc04d22d4ff06b2139d5f142c2e87520b4e39010c4862771/mypy-1.20.0-cp313-cp313-win_arm64.whl", hash = "sha256:76a70bf840495729be47510856b978f1b0ec7d08f257ca38c9d932720bf6b43e", size = 9816456, upload-time = "2026-03-31T16:49:59.537Z" }, - { url = "https://files.pythonhosted.org/packages/4e/0e/6ca4a84cbed9e62384bc0b2974c90395ece5ed672393e553996501625fc5/mypy-1.20.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0f42dfaab7ec1baff3b383ad7af562ab0de573c5f6edb44b2dab016082b89948", size = 14483331, upload-time = "2026-03-31T16:52:57.999Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c5/5fe9d8a729dd9605064691816243ae6c49fde0bd28f6e5e17f6a24203c43/mypy-1.20.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:31b5dbb55293c1bd27c0fc813a0d2bb5ceef9d65ac5afa2e58f829dab7921fd5", size = 13342047, upload-time = "2026-03-31T16:54:21.555Z" }, - { url = "https://files.pythonhosted.org/packages/4c/33/e18bcfa338ca4e6b2771c85d4c5203e627d0c69d9de5c1a2cf2ba13320ba/mypy-1.20.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49d11c6f573a5a08f77fad13faff2139f6d0730ebed2cfa9b3d2702671dd7188", size = 13719585, upload-time = "2026-03-31T16:51:53.89Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8d/93491ff7b79419edc7eabf95cb3b3f7490e2e574b2855c7c7e7394ff933f/mypy-1.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d3243c406773185144527f83be0e0aefc7bf4601b0b2b956665608bf7c98a83", size = 14685075, upload-time = "2026-03-31T16:54:04.464Z" }, - { url = "https://files.pythonhosted.org/packages/b5/9d/d924b38a4923f8d164bf2b4ec98bf13beaf6e10a5348b4b137eadae40a6e/mypy-1.20.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a79c1eba7ac4209f2d850f0edd0a2f8bba88cbfdfefe6fb76a19e9d4fe5e71a2", size = 14919141, upload-time = "2026-03-31T16:54:51.785Z" }, - { url = "https://files.pythonhosted.org/packages/59/98/1da9977016678c0b99d43afe52ed00bb3c1a0c4c995d3e6acca1a6ebb9b4/mypy-1.20.0-cp314-cp314-win_amd64.whl", hash = "sha256:00e047c74d3ec6e71a2eb88e9ea551a2edb90c21f993aefa9e0d2a898e0bb732", size = 11050925, upload-time = "2026-03-31T16:51:30.758Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e3/ba0b7a3143e49a9c4f5967dde6ea4bf8e0b10ecbbcca69af84027160ee89/mypy-1.20.0-cp314-cp314-win_arm64.whl", hash = "sha256:931a7630bba591593dcf6e97224a21ff80fb357e7982628d25e3c618e7f598ef", size = 10001089, upload-time = "2026-03-31T16:49:43.632Z" }, - { url = "https://files.pythonhosted.org/packages/12/28/e617e67b3be9d213cda7277913269c874eb26472489f95d09d89765ce2d8/mypy-1.20.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:26c8b52627b6552f47ff11adb4e1509605f094e29815323e487fc0053ebe93d1", size = 15534710, upload-time = "2026-03-31T16:52:12.506Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0c/3b5f2d3e45dc7169b811adce8451679d9430399d03b168f9b0489f43adaa/mypy-1.20.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:39362cdb4ba5f916e7976fccecaab1ba3a83e35f60fa68b64e9a70e221bb2436", size = 14393013, upload-time = "2026-03-31T16:54:41.186Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/edc8b0aa145cc09c1c74f7ce2858eead9329931dcbbb26e2ad40906daa4e/mypy-1.20.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34506397dbf40c15dc567635d18a21d33827e9ab29014fb83d292a8f4f8953b6", size = 15047240, upload-time = "2026-03-31T16:54:31.955Z" }, - { url = "https://files.pythonhosted.org/packages/42/37/a946bb416e37a57fa752b3100fd5ede0e28df94f92366d1716555d47c454/mypy-1.20.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555493c44a4f5a1b58d611a43333e71a9981c6dbe26270377b6f8174126a0526", size = 15858565, upload-time = "2026-03-31T16:53:36.997Z" }, - { url = "https://files.pythonhosted.org/packages/2f/99/7690b5b5b552db1bd4ff362e4c0eb3107b98d680835e65823fbe888c8b78/mypy-1.20.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2721f0ce49cb74a38f00c50da67cb7d36317b5eda38877a49614dc018e91c787", size = 16087874, upload-time = "2026-03-31T16:52:48.313Z" }, - { url = "https://files.pythonhosted.org/packages/aa/76/53e893a498138066acd28192b77495c9357e5a58cc4be753182846b43315/mypy-1.20.0-cp314-cp314t-win_amd64.whl", hash = "sha256:47781555a7aa5fedcc2d16bcd72e0dc83eb272c10dd657f9fb3f9cc08e2e6abb", size = 12572380, upload-time = "2026-03-31T16:49:52.454Z" }, - { url = "https://files.pythonhosted.org/packages/76/9c/6dbdae21f01b7aacddc2c0bbf3c5557aa547827fdf271770fe1e521e7093/mypy-1.20.0-cp314-cp314t-win_arm64.whl", hash = "sha256:c70380fe5d64010f79fb863b9081c7004dd65225d2277333c219d93a10dad4dd", size = 10381174, upload-time = "2026-03-31T16:51:20.179Z" }, - { url = "https://files.pythonhosted.org/packages/21/66/4d734961ce167f0fd8380769b3b7c06dbdd6ff54c2190f3f2ecd22528158/mypy-1.20.0-py3-none-any.whl", hash = "sha256:a6e0641147cbfa7e4e94efdb95c2dab1aff8cfc159ded13e07f308ddccc8c48e", size = 2636365, upload-time = "2026-03-31T16:51:44.911Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0b/3d/5b373635b3146264eb7a68d09e5ca11c305bbb058dfffbb47c47daf4f632/mypy-1.20.1.tar.gz", hash = "sha256:6fc3f4ecd52de81648fed1945498bf42fa2993ddfad67c9056df36ae5757f804", size = 3815892, upload-time = "2026-04-13T02:46:51.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/4b/b1fa23297c8a5c403aabaac0649549efc5a0af7095f3dd33e7482863f973/mypy-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3ba5d1e712ada9c3b6223dcbc5a31dac334ed62991e5caa17bcf5a4ddc349af0", size = 14426426, upload-time = "2026-04-13T02:46:37.828Z" }, + { url = "https://files.pythonhosted.org/packages/22/53/82923480aee5507a46df22428316e28b2b710d08506a128b2acef81ab18e/mypy-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e731284c117b0987fb1e6c5013a56f33e7faa1fce594066ab83876183ce1c66", size = 13307651, upload-time = "2026-04-13T02:46:22.676Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0c/91905b393c790440fa273f0903ee2b07cce95bb6deccac87e6eb343d077a/mypy-1.20.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8e945b872a05f4fbefabe2249c0b07b6b194e5e11a86ebee9edf855de09806c", size = 13746066, upload-time = "2026-04-13T02:45:15.345Z" }, + { url = "https://files.pythonhosted.org/packages/88/b9/8a7017270438e34544e19dd6284cad54fd65dde3c35418a2ce07a1897804/mypy-1.20.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fc88acef0dc9b15246502b418980478c1bfc9702057a0e1e7598d01a7af8937", size = 14617944, upload-time = "2026-04-13T02:45:44.954Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cf/5a61ceec3fc133e0f559d1e1f9adf4150abdbc2ad8eb831ec26fc8459196/mypy-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:14911a115c73608f155f648b978c5055d16ff974e6b1b5512d7fedf4fa8b15c6", size = 14918205, upload-time = "2026-04-13T02:45:42.653Z" }, + { url = "https://files.pythonhosted.org/packages/6f/80/afb1c665e9c426c78e4711cce04e446b645867bfb97936158886103c1648/mypy-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:76d9b4c992cca3331d9793ef197ae360ea44953cf35beb2526e95b9e074f2866", size = 10823344, upload-time = "2026-04-13T02:46:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/11/68/7ad64b49b7663c88fef76a2ac689ea73e17804832ac4cb5416bcff17775b/mypy-1.20.1-cp310-cp310-win_arm64.whl", hash = "sha256:b408722f80be44845da555671a5ef3a0c63f51ca5752b0c20e992dc9c0fbd3cd", size = 9760694, upload-time = "2026-04-13T02:46:49.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/0d/555ab7453cc4a4a8643b7f21c842b1a84c36b15392061ae7b052ee119320/mypy-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c01eb9bac2c6a962d00f9d23421cd2913840e65bba365167d057bd0b4171a92e", size = 14336012, upload-time = "2026-04-13T02:45:39.935Z" }, + { url = "https://files.pythonhosted.org/packages/57/26/85a28893f7db8a16ebb41d1e9dfcb4475844d06a88480b6639e32a74d6ef/mypy-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55d12ddbd8a9cac5b276878bd534fa39fff5bf543dc6ae18f25d30c8d7d27fca", size = 13224636, upload-time = "2026-04-13T02:45:49.659Z" }, + { url = "https://files.pythonhosted.org/packages/93/41/bd4cd3c2caeb6c448b669222b8cfcbdee4a03b89431527b56fca9e56b6f3/mypy-1.20.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0aa322c1468b6cdfc927a44ce130f79bb44bcd34eb4a009eb9f96571fd80955", size = 13663471, upload-time = "2026-04-13T02:46:20.276Z" }, + { url = "https://files.pythonhosted.org/packages/3e/56/7ee8c471e10402d64b6517ae10434541baca053cffd81090e4097d5609d4/mypy-1.20.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f8bc95899cf676b6e2285779a08a998cc3a7b26f1026752df9d2741df3c79e8", size = 14532344, upload-time = "2026-04-13T02:46:44.205Z" }, + { url = "https://files.pythonhosted.org/packages/b5/95/b37d1fa859a433f6156742e12f62b0bb75af658544fb6dada9363918743a/mypy-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:47c2b90191a870a04041e910277494b0d92f0711be9e524d45c074fe60c00b65", size = 14776670, upload-time = "2026-04-13T02:45:52.481Z" }, + { url = "https://files.pythonhosted.org/packages/03/77/b302e4cb0b80d2bdf6bf4fce5864bb4cbfa461f7099cea544eaf2457df78/mypy-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:9857dc8d2ec1a392ffbda518075beb00ac58859979c79f9e6bdcb7277082c2f2", size = 10816524, upload-time = "2026-04-13T02:45:37.711Z" }, + { url = "https://files.pythonhosted.org/packages/7f/21/d969d7a68eb964993ebcc6170d5ecaf0cf65830c58ac3344562e16dc42a9/mypy-1.20.1-cp311-cp311-win_arm64.whl", hash = "sha256:09d8df92bb25b6065ab91b178da843dda67b33eb819321679a6e98a907ce0e10", size = 9750419, upload-time = "2026-04-13T02:45:08.542Z" }, + { url = "https://files.pythonhosted.org/packages/69/1b/75a7c825a02781ca10bc2f2f12fba2af5202f6d6005aad8d2d1f264d8d78/mypy-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:36ee2b9c6599c230fea89bbd79f401f9f9f8e9fcf0c777827789b19b7da90f51", size = 14494077, upload-time = "2026-04-13T02:45:55.085Z" }, + { url = "https://files.pythonhosted.org/packages/b0/54/5e5a569ea5c2b4d48b729fb32aa936eeb4246e4fc3e6f5b3d36a2dfbefb9/mypy-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fba3fb0968a7b48806b0c90f38d39296f10766885a94c83bd21399de1e14eb28", size = 13319495, upload-time = "2026-04-13T02:45:29.674Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a4/a1945b19f33e91721b59deee3abb484f2fa5922adc33bb166daf5325d76d/mypy-1.20.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef1415a637cd3627d6304dfbeddbadd21079dafc2a8a753c477ce4fc0c2af54f", size = 13696948, upload-time = "2026-04-13T02:46:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/75e969781c2359b2f9c15b061f28ec6d67c8b61865ceda176e85c8e7f2de/mypy-1.20.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef3461b1ad5cd446e540016e90b5984657edda39f982f4cc45ca317b628f5a37", size = 14706744, upload-time = "2026-04-13T02:46:00.482Z" }, + { url = "https://files.pythonhosted.org/packages/a8/6e/b221b1de981fc4262fe3e0bf9ec272d292dfe42394a689c2d49765c144c4/mypy-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:542dd63c9e1339b6092eb25bd515f3a32a1453aee8c9521d2ddb17dacd840237", size = 14949035, upload-time = "2026-04-13T02:45:06.021Z" }, + { url = "https://files.pythonhosted.org/packages/ca/4b/298ba2de0aafc0da3ff2288da06884aae7ba6489bc247c933f87847c41b3/mypy-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d55c7cd8ca22e31f93af2a01160a9e95465b5878de23dba7e48116052f20a8d", size = 10883216, upload-time = "2026-04-13T02:45:47.232Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f9/5e25b8f0b8cb92f080bfed9c21d3279b2a0b6a601cdca369a039ba84789d/mypy-1.20.1-cp312-cp312-win_arm64.whl", hash = "sha256:f5b84a79070586e0d353ee07b719d9d0a4aa7c8ee90c0ea97747e98cbe193019", size = 9814299, upload-time = "2026-04-13T02:45:21.934Z" }, + { url = "https://files.pythonhosted.org/packages/21/e8/ef0991aa24c8f225df10b034f3c2681213cb54cf247623c6dec9a5744e70/mypy-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f3886c03e40afefd327bd70b3f634b39ea82e87f314edaa4d0cce4b927ddcc1", size = 14500739, upload-time = "2026-04-13T02:46:05.442Z" }, + { url = "https://files.pythonhosted.org/packages/23/73/416ebec3047636ed89fa871dc8c54bf05e9e20aa9499da59790d7adb312d/mypy-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e860eb3904f9764e83bafd70c8250bdffdc7dde6b82f486e8156348bf7ceb184", size = 13314735, upload-time = "2026-04-13T02:46:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/10/1e/1505022d9c9ac2e014a384eb17638fb37bf8e9d0a833ea60605b66f8f7ba/mypy-1.20.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4b5aac6e785719da51a84f5d09e9e843d473170a9045b1ea7ea1af86225df4b", size = 13704356, upload-time = "2026-04-13T02:45:19.773Z" }, + { url = "https://files.pythonhosted.org/packages/98/91/275b01f5eba5c467a3318ec214dd865abb66e9c811231c8587287b92876a/mypy-1.20.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f37b6cd0fe2ad3a20f05ace48ca3523fc52ff86940e34937b439613b6854472e", size = 14696420, upload-time = "2026-04-13T02:45:24.205Z" }, + { url = "https://files.pythonhosted.org/packages/a1/57/b3779e134e1b7250d05f874252780d0a88c068bc054bcff99ca20a3a2986/mypy-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4bbb0f6b54ce7cc350ef4a770650d15fa70edd99ad5267e227133eda9c94218", size = 14936093, upload-time = "2026-04-13T02:45:32.087Z" }, + { url = "https://files.pythonhosted.org/packages/be/33/81b64991b0f3f278c3b55c335888794af190b2d59031a5ad1401bcb69f1e/mypy-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:c3dc20f8ec76eecd77148cdd2f1542ed496e51e185713bf488a414f862deb8f2", size = 10889659, upload-time = "2026-04-13T02:46:02.926Z" }, + { url = "https://files.pythonhosted.org/packages/1b/fd/7adcb8053572edf5ef8f3db59599dfeeee3be9cc4c8c97e2d28f66f42ac5/mypy-1.20.1-cp313-cp313-win_arm64.whl", hash = "sha256:a9d62bbac5d6d46718e2b0330b25e6264463ed832722b8f7d4440ff1be3ca895", size = 9815515, upload-time = "2026-04-13T02:46:32.103Z" }, + { url = "https://files.pythonhosted.org/packages/40/cd/db831e84c81d57d4886d99feee14e372f64bbec6a9cb1a88a19e243f2ef5/mypy-1.20.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:12927b9c0ed794daedcf1dab055b6c613d9d5659ac511e8d936d96f19c087d12", size = 14483064, upload-time = "2026-04-13T02:45:26.901Z" }, + { url = "https://files.pythonhosted.org/packages/d5/82/74e62e7097fa67da328ac8ece8de09133448c04d20ddeaeba251a3000f01/mypy-1.20.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:752507dd481e958b2c08fc966d3806c962af5a9433b5bf8f3bdd7175c20e34fe", size = 13335694, upload-time = "2026-04-13T02:46:12.514Z" }, + { url = "https://files.pythonhosted.org/packages/74/c4/97e9a0abe4f3cdbbf4d079cb87a03b786efeccf5bf2b89fe4f96939ab2e6/mypy-1.20.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c614655b5a065e56274c6cbbe405f7cf7e96c0654db7ba39bc680238837f7b08", size = 13726365, upload-time = "2026-04-13T02:45:17.422Z" }, + { url = "https://files.pythonhosted.org/packages/d7/aa/a19d884a8d28fcd3c065776323029f204dbc774e70ec9c85eba228b680de/mypy-1.20.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c3f6221a76f34d5100c6d35b3ef6b947054123c3f8d6938a4ba00b1308aa572", size = 14693472, upload-time = "2026-04-13T02:46:41.253Z" }, + { url = "https://files.pythonhosted.org/packages/84/44/cc9324bd21cf786592b44bf3b5d224b3923c1230ec9898d508d00241d465/mypy-1.20.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4bdfc06303ac06500af71ea0cdbe995c502b3c9ba32f3f8313523c137a25d1b6", size = 14919266, upload-time = "2026-04-13T02:46:28.37Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dc/779abb25a8c63e8f44bf5a336217fa92790fa17e0c40e0c725d10cb01bbd/mypy-1.20.1-cp314-cp314-win_amd64.whl", hash = "sha256:0131edd7eba289973d1ba1003d1a37c426b85cdef76650cd02da6420898a5eb3", size = 11049713, upload-time = "2026-04-13T02:45:57.673Z" }, + { url = "https://files.pythonhosted.org/packages/28/08/4172be2ad7de9119b5a92ca36abbf641afdc5cb1ef4ae0c3a8182f29674f/mypy-1.20.1-cp314-cp314-win_arm64.whl", hash = "sha256:33f02904feb2c07e1fdf7909026206396c9deeb9e6f34d466b4cfedb0aadbbe4", size = 9999819, upload-time = "2026-04-13T02:46:35.039Z" }, + { url = "https://files.pythonhosted.org/packages/2d/af/af9e46b0c8eabbce9fc04a477564170f47a1c22b308822282a59b7ff315f/mypy-1.20.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:168472149dd8cc505c98cefd21ad77e4257ed6022cd5ed2fe2999bed56977a5a", size = 15547508, upload-time = "2026-04-13T02:46:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/a7/cd/39c9e4ad6ba33e069e5837d772a9e6c304b4a5452a14a975d52b36444650/mypy-1.20.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:eb674600309a8f22790cca883a97c90299f948183ebb210fbef6bcee07cb1986", size = 14399557, upload-time = "2026-04-13T02:46:10.021Z" }, + { url = "https://files.pythonhosted.org/packages/83/c1/3fd71bdc118ffc502bf57559c909927bb7e011f327f7bb8e0488e98a5870/mypy-1.20.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef2b2e4cc464ba9795459f2586923abd58a0055487cbe558cb538ea6e6bc142a", size = 15045789, upload-time = "2026-04-13T02:45:10.81Z" }, + { url = "https://files.pythonhosted.org/packages/8e/73/6f07ff8b57a7d7b3e6e5bf34685d17632382395c8bb53364ec331661f83e/mypy-1.20.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee461d396dd46b3f0ed5a098dbc9b8860c81c46ad44fa071afcfbc149f167c9", size = 15850795, upload-time = "2026-04-13T02:45:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e2/f7dffec1c7767078f9e9adf0c786d1fe0ff30964a77eb213c09b8b58cb76/mypy-1.20.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e364926308b3e66f1361f81a566fc1b2f8cd47fc8525e8136d4058a65a4b4f02", size = 16088539, upload-time = "2026-04-13T02:46:17.841Z" }, + { url = "https://files.pythonhosted.org/packages/1a/76/e0dee71035316e75a69d73aec2f03c39c21c967b97e277fd0ef8fd6aec66/mypy-1.20.1-cp314-cp314t-win_amd64.whl", hash = "sha256:a0c17fbd746d38c70cbc42647cfd884f845a9708a4b160a8b4f7e70d41f4d7fa", size = 12575567, upload-time = "2026-04-13T02:45:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/22/a8/7ed43c9d9c3d1468f86605e323a5d97e411a448790a00f07e779f3211a46/mypy-1.20.1-cp314-cp314t-win_arm64.whl", hash = "sha256:db2cb89654626a912efda69c0d5c1d22d948265e2069010d3dde3abf751c7d08", size = 10378823, upload-time = "2026-04-13T02:45:13.35Z" }, + { url = "https://files.pythonhosted.org/packages/d8/28/926bd972388e65a39ee98e188ccf67e81beb3aacfd5d6b310051772d974b/mypy-1.20.1-py3-none-any.whl", hash = "sha256:1aae28507f253fe82d883790d1c0a0d35798a810117c88184097fe8881052f06", size = 2636553, upload-time = "2026-04-13T02:46:30.45Z" }, ] [[package]] @@ -802,8 +800,7 @@ name = "myst-parser" version = "5.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ { name = "docutils", marker = "python_full_version >= '3.11'" }, @@ -820,11 +817,11 @@ wheels = [ [[package]] name = "packaging" -version = "26.0" +version = "26.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, ] [[package]] @@ -954,7 +951,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.2" +version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -965,9 +962,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] @@ -1124,27 +1121,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/97/e9f1ca355108ef7194e38c812ef40ba98c7208f47b13ad78d023caa583da/ruff-0.15.9.tar.gz", hash = "sha256:29cbb1255a9797903f6dde5ba0188c707907ff44a9006eb273b5a17bfa0739a2", size = 4617361, upload-time = "2026-04-02T18:17:20.829Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/1f/9cdfd0ac4b9d1e5a6cf09bedabdf0b56306ab5e333c85c87281273e7b041/ruff-0.15.9-py3-none-linux_armv6l.whl", hash = "sha256:6efbe303983441c51975c243e26dff328aca11f94b70992f35b093c2e71801e1", size = 10511206, upload-time = "2026-04-02T18:16:41.574Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f6/32bfe3e9c136b35f02e489778d94384118bb80fd92c6d92e7ccd97db12ce/ruff-0.15.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4965bac6ac9ea86772f4e23587746f0b7a395eccabb823eb8bfacc3fa06069f7", size = 10923307, upload-time = "2026-04-02T18:17:08.645Z" }, - { url = "https://files.pythonhosted.org/packages/ca/25/de55f52ab5535d12e7aaba1de37a84be6179fb20bddcbe71ec091b4a3243/ruff-0.15.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf05aad70ca5b5a0a4b0e080df3a6b699803916d88f006efd1f5b46302daab8", size = 10316722, upload-time = "2026-04-02T18:16:44.206Z" }, - { url = "https://files.pythonhosted.org/packages/48/11/690d75f3fd6278fe55fff7c9eb429c92d207e14b25d1cae4064a32677029/ruff-0.15.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9439a342adb8725f32f92732e2bafb6d5246bd7a5021101166b223d312e8fc59", size = 10623674, upload-time = "2026-04-02T18:16:50.951Z" }, - { url = "https://files.pythonhosted.org/packages/bd/ec/176f6987be248fc5404199255522f57af1b4a5a1b57727e942479fec98ad/ruff-0.15.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5e6faf9d97c8edc43877c3f406f47446fc48c40e1442d58cfcdaba2acea745", size = 10351516, upload-time = "2026-04-02T18:16:57.206Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fc/51cffbd2b3f240accc380171d51446a32aa2ea43a40d4a45ada67368fbd2/ruff-0.15.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b34a9766aeec27a222373d0b055722900fbc0582b24f39661aa96f3fe6ad901", size = 11150202, upload-time = "2026-04-02T18:17:06.452Z" }, - { url = "https://files.pythonhosted.org/packages/d6/d4/25292a6dfc125f6b6528fe6af31f5e996e19bf73ca8e3ce6eb7fa5b95885/ruff-0.15.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89dd695bc72ae76ff484ae54b7e8b0f6b50f49046e198355e44ea656e521fef9", size = 11988891, upload-time = "2026-04-02T18:17:18.575Z" }, - { url = "https://files.pythonhosted.org/packages/13/e1/1eebcb885c10e19f969dcb93d8413dfee8172578709d7ee933640f5e7147/ruff-0.15.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce187224ef1de1bd225bc9a152ac7102a6171107f026e81f317e4257052916d5", size = 11480576, upload-time = "2026-04-02T18:16:52.986Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/a1548ac378a78332a4c3dcf4a134c2475a36d2a22ddfa272acd574140b50/ruff-0.15.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6", size = 11254525, upload-time = "2026-04-02T18:17:02.041Z" }, - { url = "https://files.pythonhosted.org/packages/42/aa/4bb3af8e61acd9b1281db2ab77e8b2c3c5e5599bf2a29d4a942f1c62b8d6/ruff-0.15.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:55cc15eee27dc0eebdfcb0d185a6153420efbedc15eb1d38fe5e685657b0f840", size = 11204072, upload-time = "2026-04-02T18:17:13.581Z" }, - { url = "https://files.pythonhosted.org/packages/69/48/d550dc2aa6e423ea0bcc1d0ff0699325ffe8a811e2dba156bd80750b86dc/ruff-0.15.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6537f6eed5cda688c81073d46ffdfb962a5f29ecb6f7e770b2dc920598997ed", size = 10594998, upload-time = "2026-04-02T18:16:46.369Z" }, - { url = "https://files.pythonhosted.org/packages/63/47/321167e17f5344ed5ec6b0aa2cff64efef5f9e985af8f5622cfa6536043f/ruff-0.15.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6d3fcbca7388b066139c523bda744c822258ebdcfbba7d24410c3f454cc9af71", size = 10359769, upload-time = "2026-04-02T18:17:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/67/5e/074f00b9785d1d2c6f8c22a21e023d0c2c1817838cfca4c8243200a1fa87/ruff-0.15.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:058d8e99e1bfe79d8a0def0b481c56059ee6716214f7e425d8e737e412d69677", size = 10850236, upload-time = "2026-04-02T18:16:48.749Z" }, - { url = "https://files.pythonhosted.org/packages/76/37/804c4135a2a2caf042925d30d5f68181bdbd4461fd0d7739da28305df593/ruff-0.15.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8e1ddb11dbd61d5983fa2d7d6370ef3eb210951e443cace19594c01c72abab4c", size = 11358343, upload-time = "2026-04-02T18:16:55.068Z" }, - { url = "https://files.pythonhosted.org/packages/88/3d/1364fcde8656962782aa9ea93c92d98682b1ecec2f184e625a965ad3b4a6/ruff-0.15.9-py3-none-win32.whl", hash = "sha256:bde6ff36eaf72b700f32b7196088970bf8fdb2b917b7accd8c371bfc0fd573ec", size = 10583382, upload-time = "2026-04-02T18:17:04.261Z" }, - { url = "https://files.pythonhosted.org/packages/4c/56/5c7084299bd2cacaa07ae63a91c6f4ba66edc08bf28f356b24f6b717c799/ruff-0.15.9-py3-none-win_amd64.whl", hash = "sha256:45a70921b80e1c10cf0b734ef09421f71b5aa11d27404edc89d7e8a69505e43d", size = 11744969, upload-time = "2026-04-02T18:16:59.611Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" }, +version = "0.15.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/8d/192f3d7103816158dfd5ea50d098ef2aec19194e6cbccd4b3485bdb2eb2d/ruff-0.15.11.tar.gz", hash = "sha256:f092b21708bf0e7437ce9ada249dfe688ff9a0954fc94abab05dcea7dcd29c33", size = 4637264, upload-time = "2026-04-16T18:46:26.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/1e/6aca3427f751295ab011828e15e9bf452200ac74484f1db4be0197b8170b/ruff-0.15.11-py3-none-linux_armv6l.whl", hash = "sha256:e927cfff503135c558eb581a0c9792264aae9507904eb27809cdcff2f2c847b7", size = 10607943, upload-time = "2026-04-16T18:46:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/e7/26/1341c262e74f36d4e84f3d6f4df0ac68cd53331a66bfc5080daa17c84c0b/ruff-0.15.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7a1b5b2938d8f890b76084d4fa843604d787a912541eae85fd7e233398bbb73e", size = 10988592, upload-time = "2026-04-16T18:46:00.742Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/850b1d6ffa9564fbb6740429bad53df1094082fe515c8c1e74b6d8d05f18/ruff-0.15.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d4176f3d194afbdaee6e41b9ccb1a2c287dba8700047df474abfbe773825d1cb", size = 10338501, upload-time = "2026-04-16T18:46:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/f2/11/cc1284d3e298c45a817a6aadb6c3e1d70b45c9b36d8d9cce3387b495a03a/ruff-0.15.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b17c886fb88203ced3afe7f14e8d5ae96e9d2f4ccc0ee66aa19f2c2675a27e4", size = 10670693, upload-time = "2026-04-16T18:46:41.941Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9e/f8288b034ab72b371513c13f9a41d9ba3effac54e24bfb467b007daee2ca/ruff-0.15.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:49fafa220220afe7758a487b048de4c8f9f767f37dfefad46b9dd06759d003eb", size = 10416177, upload-time = "2026-04-16T18:46:21.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/71/504d79abfd3d92532ba6bbe3d1c19fada03e494332a59e37c7c2dabae427/ruff-0.15.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2ab8427e74a00d93b8bda1307b1e60970d40f304af38bccb218e056c220120d", size = 11221886, upload-time = "2026-04-16T18:46:15.086Z" }, + { url = "https://files.pythonhosted.org/packages/43/5a/947e6ab7a5ad603d65b474be15a4cbc6d29832db5d762cd142e4e3a74164/ruff-0.15.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:195072c0c8e1fc8f940652073df082e37a5d9cb43b4ab1e4d0566ab8977a13b7", size = 12075183, upload-time = "2026-04-16T18:46:07.944Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a1/0b7bb6268775fdd3a0818aee8efd8f5b4e231d24dd4d528ced2534023182/ruff-0.15.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a0996d486af3920dec930a2e7daed4847dfc12649b537a9335585ada163e9e", size = 11516575, upload-time = "2026-04-16T18:46:31.687Z" }, + { url = "https://files.pythonhosted.org/packages/30/c3/bb5168fc4d233cc06e95f482770d0f3c87945a0cd9f614b90ea8dc2f2833/ruff-0.15.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bef2cb556d509259f1fe440bb9cd33c756222cf0a7afe90d15edf0866702431", size = 11306537, upload-time = "2026-04-16T18:46:36.988Z" }, + { url = "https://files.pythonhosted.org/packages/e4/92/4cfae6441f3967317946f3b788136eecf093729b94d6561f963ed810c82e/ruff-0.15.11-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:030d921a836d7d4a12cf6e8d984a88b66094ccb0e0f17ddd55067c331191bf19", size = 11296813, upload-time = "2026-04-16T18:46:24.182Z" }, + { url = "https://files.pythonhosted.org/packages/43/26/972784c5dde8313acde8ac71ba8ac65475b85db4a2352a76c9934361f9bc/ruff-0.15.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0e783b599b4577788dbbb66b9addcef87e9a8832f4ce0c19e34bf55543a2f890", size = 10633136, upload-time = "2026-04-16T18:46:39.802Z" }, + { url = "https://files.pythonhosted.org/packages/5b/53/3985a4f185020c2f367f2e08a103032e12564829742a1b417980ce1514a0/ruff-0.15.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ae90592246625ba4a34349d68ec28d4400d75182b71baa196ddb9f82db025ef5", size = 10424701, upload-time = "2026-04-16T18:46:10.381Z" }, + { url = "https://files.pythonhosted.org/packages/d3/57/bf0dfb32241b56c83bb663a826133da4bf17f682ba8c096973065f6e6a68/ruff-0.15.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1f111d62e3c983ed20e0ca2e800f8d77433a5b1161947df99a5c2a3fb60514f0", size = 10873887, upload-time = "2026-04-16T18:46:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/e48076b2a57dc33ee8c7a957296f97c744ca891a8ffb4ffb1aaa3b3f517d/ruff-0.15.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:06f483d6646f59eaffba9ae30956370d3a886625f511a3108994000480621d1c", size = 11404316, upload-time = "2026-04-16T18:46:19.462Z" }, + { url = "https://files.pythonhosted.org/packages/88/27/0195d15fe7a897cbcba0904792c4b7c9fdd958456c3a17d2ea6093716a9a/ruff-0.15.11-py3-none-win32.whl", hash = "sha256:476a2aa56b7da0b73a3ee80b6b2f0e19cce544245479adde7baa65466664d5f3", size = 10655535, upload-time = "2026-04-16T18:46:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5e/c927b325bd4c1d3620211a4b96f47864633199feed60fa936025ab27e090/ruff-0.15.11-py3-none-win_amd64.whl", hash = "sha256:8b6756d88d7e234fb0c98c91511aae3cd519d5e3ed271cae31b20f39cb2a12a3", size = 11779692, upload-time = "2026-04-16T18:46:17.268Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/aeadee5443e49baa2facd51131159fd6301cc4ccfc1541e4df7b021c37dd/ruff-0.15.11-py3-none-win_arm64.whl", hash = "sha256:063fed18cc1bbe0ee7393957284a6fe8b588c6a406a285af3ee3f46da2391ee4", size = 11032614, upload-time = "2026-04-16T18:46:34.487Z" }, ] [[package]] @@ -1201,8 +1198,7 @@ name = "sphinx" version = "8.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ { name = "alabaster", marker = "python_full_version >= '3.11'" }, @@ -1253,8 +1249,7 @@ name = "sphinx-autobuild" version = "2025.8.25" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.11'" }, @@ -1358,8 +1353,7 @@ name = "sphinx-design" version = "0.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.11'", ] dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -1703,32 +1697,32 @@ wheels = [ [[package]] name = "types-docutils" -version = "0.22.3.20260322" +version = "0.22.3.20260408" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/bb/243a87fc1605a4a94c2c343d6dbddbf0d7ef7c0b9550f360b8cda8e82c39/types_docutils-0.22.3.20260322.tar.gz", hash = "sha256:e2450bb997283c3141ec5db3e436b91f0aa26efe35eb9165178ca976ccb4930b", size = 57311, upload-time = "2026-03-22T04:08:44.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/49/48a386fe15539556de085b87a69568b028cca2fa4b92596a3d4f79ac6784/types_docutils-0.22.3.20260408.tar.gz", hash = "sha256:22d5d45e4e0d65a1bc8280987a73e28669bb1cc9d16b18d0afc91713d1be26da", size = 57383, upload-time = "2026-04-08T04:27:26.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/4a/22c090cd4615a16917dff817cbe7c5956da376c961e024c241cd962d2c3d/types_docutils-0.22.3.20260322-py3-none-any.whl", hash = "sha256:681d4510ce9b80a0c6a593f0f9843d81f8caa786db7b39ba04d9fd5480ac4442", size = 91978, upload-time = "2026-03-22T04:08:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/08/47/1667fda6e9fcb044f8fb797f6dc4367b88dc2ab40f1a035e387f5405e870/types_docutils-0.22.3.20260408-py3-none-any.whl", hash = "sha256:2545a86966022cdf1468d430b0007eba0837be77974a7f3fafa1b04a6815d531", size = 91981, upload-time = "2026-04-08T04:27:25.934Z" }, ] [[package]] name = "types-pygments" -version = "2.20.0.20260405" +version = "2.20.0.20260408" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/28/7a11c06b290e370eca368dd59d9738a79657a7518f5a4021b1e187c1a16d/types_pygments-2.20.0.20260405.tar.gz", hash = "sha256:f06fe34d6457044ce7587a5a6cf73e6bc5c769c933cd9edf033379bcd7ed2897", size = 19342, upload-time = "2026-04-05T04:27:06.184Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/89/4b443128fa540c54a8f7ecdeec225aab4818534167c4a2d133099dc00fa6/types_pygments-2.20.0.20260408.tar.gz", hash = "sha256:e8a56a3ab1aee7f4ed8f1876d2f62c96e0f41ede52405a7d30c888f3989d8f00", size = 21115, upload-time = "2026-04-08T04:34:24.29Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/51/dabb479c2cda4fbed99a0f2045aee2bb91487c50c654a7ad6dfa327c5b82/types_pygments-2.20.0.20260405-py3-none-any.whl", hash = "sha256:79dc975f7a9c6cbfdcc32f3d31b7eb507d39a41031c3b2124f16fc2e42326954", size = 26688, upload-time = "2026-04-05T04:27:05.215Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d8/30924b38eef70caef6b05af5440c84d7673cea2a042e206f404c8100a88d/types_pygments-2.20.0.20260408-py3-none-any.whl", hash = "sha256:6d347d5967b5f0654b659a8b8461a870b207b7e60cd4d646bbc047f6a8db8e1e", size = 29055, upload-time = "2026-04-08T04:34:23.412Z" }, ] [[package]] name = "types-pyyaml" -version = "6.0.12.20250915" +version = "6.0.12.20260408" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/69/3c51b36d04da19b92f9e815be12753125bd8bc247ba0470a982e6979e71c/types_pyyaml-6.0.12.20250915.tar.gz", hash = "sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3", size = 17522, upload-time = "2025-09-15T03:01:00.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/73/b759b1e413c31034cc01ecdfb96b38115d0ab4db55a752a3929f0cd449fd/types_pyyaml-6.0.12.20260408.tar.gz", hash = "sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307", size = 17735, upload-time = "2026-04-08T04:30:50.974Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/e0/1eed384f02555dde685fff1a1ac805c1c7dcb6dd019c916fe659b1c1f9ec/types_pyyaml-6.0.12.20250915-py3-none-any.whl", hash = "sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6", size = 20338, upload-time = "2025-09-15T03:00:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f0/c391068b86abb708882c6d75a08cd7d25b2c7227dab527b3a3685a3c635b/types_pyyaml-6.0.12.20260408-py3-none-any.whl", hash = "sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384", size = 20339, upload-time = "2026-04-08T04:30:50.113Z" }, ] [[package]] @@ -1760,16 +1754,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.43.0" +version = "0.44.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/f2/368268300fb8af33743508d738ef7bb4d56afdb46c6d9c0fa3dd515df171/uvicorn-0.43.0.tar.gz", hash = "sha256:ab1652d2fb23abf124f36ccc399828558880def222c3cb3d98d24021520dc6e8", size = 85686, upload-time = "2026-04-03T18:37:48.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/da/6eee1ff8b6cbeed47eeb5229749168e81eb4b7b999a1a15a7176e51410c9/uvicorn-0.44.0.tar.gz", hash = "sha256:6c942071b68f07e178264b9152f1f16dfac5da85880c4ce06366a96d70d4f31e", size = 86947, upload-time = "2026-04-06T09:23:22.826Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/df/0cf5b0c451602748fdc7a702d4667f6e209bf96aa6e3160d754234445f2a/uvicorn-0.43.0-py3-none-any.whl", hash = "sha256:46fac64f487fd968cd999e5e49efbbe64bd231b5bd8b4a0b482a23ebce499620", size = 68591, upload-time = "2026-04-03T18:37:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/b7/23/a5bbd9600dd607411fa644c06ff4951bec3a4d82c4b852374024359c19c0/uvicorn-0.44.0-py3-none-any.whl", hash = "sha256:ce937c99a2cc70279556967274414c087888e8cec9f9c94644dfca11bd3ced89", size = 69425, upload-time = "2026-04-06T09:23:21.524Z" }, ] [[package]] From 1c59da3ef42231a76357789be01038ea0aeaa9b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 Apr 2026 19:42:57 -0500 Subject: [PATCH 2822/2998] docs(index[toctree]): Add MCP and GitHub external links to sidebar why: Surface the MCP server and GitHub repo as first-class nav items directly below Glossary, inline with the normal toctree entries. what: - Add MCP to toctree in index.md - Add GitHub to toctree --- docs/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.md b/docs/index.md index 64308bd782..ddacba1bb4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,4 +103,6 @@ history about_tmux migration glossary +MCP +GitHub ``` From 51d936587c767e4156ca788463c58cc58b5a98ad Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Apr 2026 09:57:39 -0500 Subject: [PATCH 2823/2998] chore(deps): bump gp-sphinx 0.0.1a8 -> 0.0.1a9 why: Pick up the FastMCP prompts/resources autodoc surface and the companion typehints / theme / layout fixes shipped in gp-sphinx PR #21 (https://github.com/git-pull/gp-sphinx/pull/21). what: - Bump every gp-sphinx workspace pin from 0.0.1a8 to 0.0.1a9 in pyproject.toml - uv.lock refreshed to match --- pyproject.toml | 12 +++++----- uv.lock | 62 +++++++++++++++++++++++++------------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ac8c5a0fe8..1f9084d630 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a8", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a8", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a8", + "gp-sphinx==0.0.1a9", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a9", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a9", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a8", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a8", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a8", + "gp-sphinx==0.0.1a9", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a9", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a9", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 2bd495a6f7..d98be8030b 100644 --- a/uv.lock +++ b/uv.lock @@ -352,7 +352,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -392,7 +392,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -412,9 +412,9 @@ dependencies = [ { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/41/258387f53d70ed5f1299a54a252b558bbc0ab4b62a8097b6b8e1c981de9d/gp_sphinx-0.0.1a8.tar.gz", hash = "sha256:6c2c63850b5ab41d6f72f441e02bea5402a6d1b220248803d34a0ae51ad4500b", size = 13875, upload-time = "2026-04-12T20:12:02.422Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/0c/543fe746cab680d73365f08293391b935e4e8e1f4d34427e27b89d77d3c3/gp_sphinx-0.0.1a9.tar.gz", hash = "sha256:1403d71b107cc1b21967a7003c435d905c5b6d12eb7816e882b751ec6f3fa152", size = 14395, upload-time = "2026-04-19T14:52:43.57Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a9/4ffaef44e7f99c3bffe5d3d5bec53e2ce522191a90c248196ee68476bc40/gp_sphinx-0.0.1a8-py3-none-any.whl", hash = "sha256:e1907fbcadef83187db5ce159bed8d70ecbe5961a10977a5f0364913e1459931", size = 14219, upload-time = "2026-04-12T19:55:10.944Z" }, + { url = "https://files.pythonhosted.org/packages/8d/87/19f6965e800af4d840890c8465bd8397019e2e1a451e15b57d4efe39d3b3/gp_sphinx-0.0.1a9-py3-none-any.whl", hash = "sha256:d447cd17b65dfcacae2238d85f2002241dfeb1cc7c98df37184791b305512f39", size = 14753, upload-time = "2026-04-19T14:52:27.721Z" }, ] [[package]] @@ -1266,7 +1266,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1274,14 +1274,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/80/8e13c037f1ca35b69d86fc2209349a3f666b18cf216572a4f0c0fd1d592c/sphinx_autodoc_api_style-0.0.1a8.tar.gz", hash = "sha256:cad11308d1c57ce20d3d7fbad4e6878c831ea650c2020c84a531d2091f62fbfb", size = 8296, upload-time = "2026-04-12T20:12:03.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/61/b0ed6501666b8909918166aef96a2f67a69ccefbae55af02135141f3b19a/sphinx_autodoc_api_style-0.0.1a9.tar.gz", hash = "sha256:8294adec686147a09d40166cf7c1d3787795ee04883ed7f2367319283f3f6434", size = 8296, upload-time = "2026-04-19T14:52:45.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/12/af096e9646e9c678d253dcb750a63b2f03c75352e00f9a41a474e572ec47/sphinx_autodoc_api_style-0.0.1a8-py3-none-any.whl", hash = "sha256:f1086e945b3a7144fe293a69422c904712ffd7737f52d227e83951532e08f919", size = 8328, upload-time = "2026-04-12T19:55:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d2/8c588fcc4d778e36d9e1a1aae0f4334c585051d07fcec0689e4865975d5d/sphinx_autodoc_api_style-0.0.1a9-py3-none-any.whl", hash = "sha256:c8d809df9cf1738c8d9777c50cfcc354249b28ebf13e024be3a7a996d97f5494", size = 8329, upload-time = "2026-04-19T14:52:29.188Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1289,22 +1289,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/99/ec0f64a3feee7f450d4d1f2d18bca00853651b85a8fb29004e2015aae063/sphinx_autodoc_argparse-0.0.1a8.tar.gz", hash = "sha256:2d2108a622cf1ba6e537b5ab0312dd6adf8160e7f0801604ac6a524f871d545b", size = 42333, upload-time = "2026-04-12T20:12:04.725Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/35/a6a134f9a934dd3969a1461c15b30f6ce44657bf61ab19ce68f17b4effce/sphinx_autodoc_argparse-0.0.1a9.tar.gz", hash = "sha256:d9004bd8c0b96af930d3d64404362aee78ab04f98dcf309aff42a48d2a0efca0", size = 42333, upload-time = "2026-04-19T14:52:46.259Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/ff/2e35984a005c327be2fa5c62368abce695bd88f268041e3dd67ae81286c4/sphinx_autodoc_argparse-0.0.1a8-py3-none-any.whl", hash = "sha256:d733875205c8ec9e0da9221bbd7de810357aacb630be6a812d0ae5433f06f8c2", size = 47268, upload-time = "2026-04-12T19:59:38.909Z" }, + { url = "https://files.pythonhosted.org/packages/69/88/b5355677de48be9da5fe15d2d36971f9d3b60cda756cbe6b59762496f4c5/sphinx_autodoc_argparse-0.0.1a9-py3-none-any.whl", hash = "sha256:31464f8ec145078fcd22addc3d6534f031139665ac0a1484b9204188ae369be4", size = 47267, upload-time = "2026-04-19T14:52:30.553Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/8c/c1895efd033ff924a9a6d8cffcf199d422d28e5980dbbecaf5a314338f1f/sphinx_autodoc_typehints_gp-0.0.1a8.tar.gz", hash = "sha256:b3dd546b10199be3bf580c7d58af5fd2e62201079dad6328435b4e777f94c0d1", size = 17460, upload-time = "2026-04-12T20:12:10.715Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/f4/af8f771c18ae62ecffc4f48e3b6a0d361c424c06acee6de6fd81bf5f666b/sphinx_autodoc_typehints_gp-0.0.1a9.tar.gz", hash = "sha256:290eedc3690b944e1d872a652d0017e1ade53c3f6f294586ac60f66742be4d1f", size = 18467, upload-time = "2026-04-19T14:52:51.449Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/30/157db04084afabcf3b216d9411125881f162527acd506cf6315ba2be951f/sphinx_autodoc_typehints_gp-0.0.1a8-py3-none-any.whl", hash = "sha256:033c60d6ae786291e6ba7520664d7c80741388f9f98e5b14f218352b0a3aa5b2", size = 18020, upload-time = "2026-04-12T20:03:58.986Z" }, + { url = "https://files.pythonhosted.org/packages/58/a4/1d9f02794082df4984a9713de65ddb4db7ac8e2538bc4fae6879caeffe16/sphinx_autodoc_typehints_gp-0.0.1a9-py3-none-any.whl", hash = "sha256:0e7b82b7f02b2765e385bcb913dbc306b329f6260f1a635dc0226169fa917fce", size = 19001, upload-time = "2026-04-19T14:52:37.189Z" }, ] [[package]] @@ -1365,29 +1365,29 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/52/0069db0e569d8b4bf60029a20dc7d4334c69f009b77d0cd6f1a4f9320e4c/sphinx_fonts-0.0.1a8.tar.gz", hash = "sha256:896dbb96e6b586fcbea9dc6fe23f218f5ae32437854236c4a87a2c6d1d0626ff", size = 5677, upload-time = "2026-04-12T20:12:11.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/56/9b94748a4d83c5c179856ce4a2d29fa87d3528a70f1170f3eca9f52e30c8/sphinx_fonts-0.0.1a9.tar.gz", hash = "sha256:ef1732089b7d48cf31acadd44bc1c7f3205232347197a4fd00ea4503a4fef13e", size = 5675, upload-time = "2026-04-19T14:52:52.561Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/eb/66157aa4781724e0b8a0a951ff53bda1ab95a9d259708d054f65ae50c8c3/sphinx_fonts-0.0.1a8-py3-none-any.whl", hash = "sha256:8e93c8c61c48f9deec5c4205ef9d113f8ddecefbf345bf279823eb7fb58f5b12", size = 4352, upload-time = "2026-04-12T20:04:00.323Z" }, + { url = "https://files.pythonhosted.org/packages/84/8b/957a03e712bc4843fef2f15c8db80c2d1ccf388eda3b77c33476d580947c/sphinx_fonts-0.0.1a9-py3-none-any.whl", hash = "sha256:f39f6e05aea1b8e59f523dbbfc58f9062daa46239f286d66e10d4a613c852653", size = 4353, upload-time = "2026-04-19T14:52:38.57Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/30/e1908b3a4eafc3c564f00815819ab7ee8cad749c17d81091926a07ba0540/sphinx_gp_theme-0.0.1a8.tar.gz", hash = "sha256:b694b5df1301aec9ef1912e9d47725c8ff31c2dbf486e554369da4edaa2a1c80", size = 14631, upload-time = "2026-04-12T20:12:12.545Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c8/4189ea4aa18983200c47bbc04deb756f6eec7d2d4e5a830119acd48c4e49/sphinx_gp_theme-0.0.1a9.tar.gz", hash = "sha256:83ed973a633eb8b8b526a5a8551d801b089e8a48c945a6245e89f240387652f2", size = 15945, upload-time = "2026-04-19T14:52:53.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/0b/07e33934f81541b3fac687a18ae25108ce57852f12a7d4d5fa82090cd48a/sphinx_gp_theme-0.0.1a8-py3-none-any.whl", hash = "sha256:94f78e203797dc637ddf7a223d9960d75c993b2ab6214fe7af0e7998048a7253", size = 15681, upload-time = "2026-04-12T20:08:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f6/36f2318013e57355b33aabe31e1615beefa871110ae81424945bb3706b5b/sphinx_gp_theme-0.0.1a9-py3-none-any.whl", hash = "sha256:1df4cd76a529560a2e06f97535b4f6dbcb0d8a8f68401f637392e954483c4f2d", size = 17148, upload-time = "2026-04-19T14:52:39.661Z" }, ] [[package]] @@ -1405,28 +1405,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/00/10e666c41811a40033cbd13c45ec6f8ca278708cc3e3a62fd27eb8429262/sphinx_ux_autodoc_layout-0.0.1a8.tar.gz", hash = "sha256:abdddc91dc32174a40e207580d90129d66e1b190e9486e212350d12ed07c9f10", size = 20907, upload-time = "2026-04-12T20:12:13.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/66/a0651b6639b9d735bca594eff76020a8ab848f463ea78bdc31ae035b4d4e/sphinx_ux_autodoc_layout-0.0.1a9.tar.gz", hash = "sha256:cbefe0beb92abad93038de39777eaa57d0b3320e66accd51a166c306690b6277", size = 20929, upload-time = "2026-04-19T14:52:54.559Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/71/d21ad70521b3967af590feeb1336a86fe6469708b3ea12c5d042fd58f5ba/sphinx_ux_autodoc_layout-0.0.1a8-py3-none-any.whl", hash = "sha256:a6cd213da18c2825f5dce6006f25acc801f353d3696de708b8ce3080768ea2bb", size = 24744, upload-time = "2026-04-12T20:10:05.656Z" }, + { url = "https://files.pythonhosted.org/packages/97/04/bb89f3f905138a4af2ea93c90f2d37e304be0644fb8f53424541cdce9f93/sphinx_ux_autodoc_layout-0.0.1a9-py3-none-any.whl", hash = "sha256:32eaf43570dce4f3bed84c281bf7ba50190a9859a13a8968bdaad8c244cc421e", size = 24763, upload-time = "2026-04-19T14:52:41.084Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a8" +version = "0.0.1a9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c8/69/31e6ded298b46e4e7bbecb2332c3f45a11ecb94e364e3818fe2c832bc496/sphinx_ux_badges-0.0.1a8.tar.gz", hash = "sha256:9858dc3ca1ac27c39cf261e0c75407a0df693c1884f604c62e8f8bb2373399dc", size = 15281, upload-time = "2026-04-12T20:12:14.317Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/1a/09c2919c42570532f695559b5284a176130f6b715998896a5e10de9c1643/sphinx_ux_badges-0.0.1a9.tar.gz", hash = "sha256:e992367eb0864d3c7b60e09659b0438f57cbd833136915df85854d3995eb0851", size = 15281, upload-time = "2026-04-19T14:52:55.406Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/13/11713bc50829e01455cf0e3337256727b6a1104c29f20e586e77286bfbe9/sphinx_ux_badges-0.0.1a8-py3-none-any.whl", hash = "sha256:4d7b435632991962b28798da8510a13a1634c7164a8ea885f5e8075cbbfa53c8", size = 16272, upload-time = "2026-04-12T20:12:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/e8/10/0a1f38f3a2ee6d70eb28bfa309fcce05ff461712ac0ca566a25b2477dd83/sphinx_ux_badges-0.0.1a9-py3-none-any.whl", hash = "sha256:d8c2b1305ce9ecf88eb5571738ac1647edd6e227fe65a282576ffad20c901632", size = 16274, upload-time = "2026-04-19T14:52:42.507Z" }, ] [[package]] @@ -1601,7 +1601,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a8" }, + { name = "gp-sphinx", specifier = "==0.0.1a9" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1611,8 +1611,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a8" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a8" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a9" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a9" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1620,11 +1620,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a8" }, + { name = "gp-sphinx", specifier = "==0.0.1a9" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a8" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a8" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a9" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a9" }, ] lint = [ { name = "mypy" }, From 742cc9552f999efdaee981bd60990d8c89841ea0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Apr 2026 19:06:14 -0500 Subject: [PATCH 2824/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a10 why: gp-sphinx cut 0.0.1a10 covering the new sphinx-gp-opengraph and sphinx-gp-sitemap workspace packages, register-aware autodoc-docutils discovery, and a multi-round audit pass that fixed sitemap completeness on incremental and parallel builds, OpenGraph HTML escaping, urljoin path-component handling for docs_url with a path, and XHTML void self-close parsing in OG title extraction. Tracking the latest workspace alpha picks up both the new SEO emission and the corrected sitemap behaviour on the next docs build. what: - pyproject.toml: gp-sphinx and any pinned workspace siblings (sphinx-autodoc-*, sphinx-gp-*, sphinx-ux-*, sphinx-fonts) move 0.0.1a9 -> 0.0.1a10 in every dependency group that pins them. - uv.lock refresh deferred to the follow-up exclude-newer-package whitelist commit. Doing the lock there avoids two regenerations and lets uv sync resolve the new line cleanly once the cooldown is bypassed. --- pyproject.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1f9084d630..4515d25e82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a9", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a9", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a9", + "gp-sphinx==0.0.1a10", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a10", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a10", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a9", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a9", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a9", + "gp-sphinx==0.0.1a10", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a10", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a10", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] From 6c0a0b2d8a4cf11398b40be3ffde901cab8feb82 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 25 Apr 2026 19:06:15 -0500 Subject: [PATCH 2825/2998] py(deps[uv]) Whitelist git-pull packages from exclude-newer cooldown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: With gp-sphinx 0.0.1a10 just published (and any of its workspace siblings minted at the same time), the rolling exclude-newer = now − P3D window in the lockfile filters every release younger than 3 days. Until the window naturally clears, contributor uv sync --all-extras --dev --upgrade would fail with: × No solution found when resolving dependencies: ╰─▶ Because there is no version of gp-sphinx==0.0.1a10 ... hint: Consider using `exclude-newer-package` to override the cutoff for this package. The cooldown exists for supply-chain hygiene against unfamiliar upstreams. git-pull packages aren't an unfamiliar upstream — gp == git-pull, and so are we — so the cooldown adds friction without adding safety. Every workspace release would otherwise block every contributor's sync for three days. vcspull solved the identical pattern for libvcs in ~/work/python/vcspull/pyproject.toml; this commit mirrors that approach, extended to cover the full git-pull dep surface (gp-libs as a standalone utility, gp-sphinx plus its workspace siblings as the docs stack). what: - pyproject.toml: add a [tool.uv.exclude-newer-package] block exempting every git-pull-authored package from the cooldown. gp-libs leads as the standalone utility; gp-sphinx and its workspace packages (sphinx-autodoc-*, sphinx-gp-*, sphinx-ux-*, sphinx-fonts) follow in alphabetical order. Comment cites the vcspull/libvcs precedent so future maintainers know why the override exists. - uv.lock: regenerated. uv writes a matching [options.exclude-newer-package] block; the 0.0.1a10 line resolves cleanly from PyPI. --- pyproject.toml | 23 +++++++++ uv.lock | 123 +++++++++++++++++++++++++++++++------------------ 2 files changed, 102 insertions(+), 44 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4515d25e82..0721a5adb3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,6 +113,29 @@ lint = [ requires = ["hatchling"] build-backend = "hatchling.build" +[tool.uv.exclude-newer-package] +# git-pull packages release in lockstep with their workspaces, so a +# fresh release blocking on the 3-day cooldown blocks every +# contributor's `uv sync` until it clears. `false` exempts each +# from any `exclude-newer` constraint (global or per-user) without +# committing a date that would age into the lockfile. Mirrors the +# pattern at vcspull/pyproject.toml for libvcs. +gp-libs = false +gp-sphinx = false +sphinx-autodoc-api-style = false +sphinx-autodoc-argparse = false +sphinx-autodoc-docutils = false +sphinx-autodoc-fastmcp = false +sphinx-autodoc-pytest-fixtures = false +sphinx-autodoc-sphinx = false +sphinx-autodoc-typehints-gp = false +sphinx-fonts = false +sphinx-gp-opengraph = false +sphinx-gp-sitemap = false +sphinx-gp-theme = false +sphinx-ux-autodoc-layout = false +sphinx-ux-badges = false + [tool.coverage.run] branch = true source = [ diff --git a/uv.lock b/uv.lock index d98be8030b..afb0877182 100644 --- a/uv.lock +++ b/uv.lock @@ -6,6 +6,27 @@ resolution-markers = [ "python_full_version < '3.11'", ] +[options] +exclude-newer = "2026-04-23T00:06:14.879178848Z" +exclude-newer-span = "P3D" + +[options.exclude-newer-package] +gp-sphinx = false +sphinx-autodoc-sphinx = false +sphinx-autodoc-api-style = false +sphinx-autodoc-fastmcp = false +sphinx-autodoc-pytest-fixtures = false +sphinx-ux-autodoc-layout = false +sphinx-autodoc-argparse = false +sphinx-ux-badges = false +gp-libs = false +sphinx-autodoc-docutils = false +sphinx-gp-sitemap = false +sphinx-fonts = false +sphinx-autodoc-typehints-gp = false +sphinx-gp-opengraph = false +sphinx-gp-theme = false + [[package]] name = "aafigure" version = "0.6" @@ -392,7 +413,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -407,14 +428,15 @@ dependencies = [ { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-fonts" }, + { name = "sphinx-gp-opengraph" }, + { name = "sphinx-gp-sitemap" }, { name = "sphinx-gp-theme" }, { name = "sphinx-inline-tabs" }, - { name = "sphinxext-opengraph" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/0c/543fe746cab680d73365f08293391b935e4e8e1f4d34427e27b89d77d3c3/gp_sphinx-0.0.1a9.tar.gz", hash = "sha256:1403d71b107cc1b21967a7003c435d905c5b6d12eb7816e882b751ec6f3fa152", size = 14395, upload-time = "2026-04-19T14:52:43.57Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/5f/16afe16307c716f1ea7501f76cf278218e2bcb92d3001e5eaa18dd525a4e/gp_sphinx-0.0.1a10.tar.gz", hash = "sha256:13eeafcc860ed6b05ea1052b216c559e978928a9bc3abacff3f6b5481970ed4f", size = 14965, upload-time = "2026-04-25T23:13:41.395Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/87/19f6965e800af4d840890c8465bd8397019e2e1a451e15b57d4efe39d3b3/gp_sphinx-0.0.1a9-py3-none-any.whl", hash = "sha256:d447cd17b65dfcacae2238d85f2002241dfeb1cc7c98df37184791b305512f39", size = 14753, upload-time = "2026-04-19T14:52:27.721Z" }, + { url = "https://files.pythonhosted.org/packages/32/19/c51cdc0c007c9fb6fad4d1502d98eb4c2ae4c037467d7358e65f87fe9ff2/gp_sphinx-0.0.1a10-py3-none-any.whl", hash = "sha256:37f4d3048ece611b3b21133e24da965c0952598987e4297a75616fd71b7a4608", size = 15351, upload-time = "2026-04-25T23:09:08.839Z" }, ] [[package]] @@ -1266,7 +1288,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1274,14 +1296,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/61/b0ed6501666b8909918166aef96a2f67a69ccefbae55af02135141f3b19a/sphinx_autodoc_api_style-0.0.1a9.tar.gz", hash = "sha256:8294adec686147a09d40166cf7c1d3787795ee04883ed7f2367319283f3f6434", size = 8296, upload-time = "2026-04-19T14:52:45.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/19/c0dc6cb16fa4c2160dbf3e35049c52fe9c1195b72ff27a8ad570e365a517/sphinx_autodoc_api_style-0.0.1a10.tar.gz", hash = "sha256:3eb80bda832018fdd805133c19a32b09f6a6015d0b61369df7e885d9aaecab60", size = 8295, upload-time = "2026-04-25T23:13:42.658Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/d2/8c588fcc4d778e36d9e1a1aae0f4334c585051d07fcec0689e4865975d5d/sphinx_autodoc_api_style-0.0.1a9-py3-none-any.whl", hash = "sha256:c8d809df9cf1738c8d9777c50cfcc354249b28ebf13e024be3a7a996d97f5494", size = 8329, upload-time = "2026-04-19T14:52:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d7/cd4879bb8a3f879ed156810955baa0e8d95ca8119413fb9df7f2e26fe5d4/sphinx_autodoc_api_style-0.0.1a10-py3-none-any.whl", hash = "sha256:bd0486bce8ef390a803793821e6612991449ab4b8832d56ddaaea6fc97e5a1c4", size = 8332, upload-time = "2026-04-25T23:09:10.185Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1289,22 +1311,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/35/a6a134f9a934dd3969a1461c15b30f6ce44657bf61ab19ce68f17b4effce/sphinx_autodoc_argparse-0.0.1a9.tar.gz", hash = "sha256:d9004bd8c0b96af930d3d64404362aee78ab04f98dcf309aff42a48d2a0efca0", size = 42333, upload-time = "2026-04-19T14:52:46.259Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/67/c1ea6958e4e800e9ee26ed703cb0e4b823b2dbea1cf133c9b25cfcf06ff3/sphinx_autodoc_argparse-0.0.1a10.tar.gz", hash = "sha256:91052e40aaef5355cef1ebc3529482286d4a662becf6049b60787c9365b89529", size = 42323, upload-time = "2026-04-25T23:13:44.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/88/b5355677de48be9da5fe15d2d36971f9d3b60cda756cbe6b59762496f4c5/sphinx_autodoc_argparse-0.0.1a9-py3-none-any.whl", hash = "sha256:31464f8ec145078fcd22addc3d6534f031139665ac0a1484b9204188ae369be4", size = 47267, upload-time = "2026-04-19T14:52:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/10f9f4b2a8e677fc6fe2de3bd84c5f3f55bf24fa8fd2812efd73cca6877e/sphinx_autodoc_argparse-0.0.1a10-py3-none-any.whl", hash = "sha256:4c58ba98f245314535cbbe8eff91810590db2c48b4c8dc41226ef28708000f2b", size = 47274, upload-time = "2026-04-25T23:09:11.862Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/f4/af8f771c18ae62ecffc4f48e3b6a0d361c424c06acee6de6fd81bf5f666b/sphinx_autodoc_typehints_gp-0.0.1a9.tar.gz", hash = "sha256:290eedc3690b944e1d872a652d0017e1ade53c3f6f294586ac60f66742be4d1f", size = 18467, upload-time = "2026-04-19T14:52:51.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/5a/c312d8ae8bfccc323858e16583044bf91c5236ea6248672d90edd6133c3b/sphinx_autodoc_typehints_gp-0.0.1a10.tar.gz", hash = "sha256:4cc2f78a4fcd3cd09c7ed80ef331386cd4b724b9f91310bfaef6334aa32eca09", size = 18463, upload-time = "2026-04-25T23:13:50.195Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/a4/1d9f02794082df4984a9713de65ddb4db7ac8e2538bc4fae6879caeffe16/sphinx_autodoc_typehints_gp-0.0.1a9-py3-none-any.whl", hash = "sha256:0e7b82b7f02b2765e385bcb913dbc306b329f6260f1a635dc0226169fa917fce", size = 19001, upload-time = "2026-04-19T14:52:37.189Z" }, + { url = "https://files.pythonhosted.org/packages/c5/00/678d5cb51365b66a9cf4ef8c180f6192dd1d5c65e69e8c0469e6ede1932b/sphinx_autodoc_typehints_gp-0.0.1a10-py3-none-any.whl", hash = "sha256:ffa5707bfda9f2bf751df8137b1e93d46173db20760345e9519963df894327d8", size = 19007, upload-time = "2026-04-25T23:09:19.353Z" }, ] [[package]] @@ -1365,29 +1387,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a9" +version = "0.0.1a10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/04/17e9f6f573068b7097877003e7fe91fdb7f64dc2afe4d327bb379718268c/sphinx_fonts-0.0.1a10.tar.gz", hash = "sha256:69a35fa977c60dafd419eb37a5ee108c5bf5d8a05aad9d2d81908541d85a80ec", size = 5679, upload-time = "2026-04-25T23:13:51.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/02/01530c82ba4fecc6fa5ba72f2f3aa3000809b55f32f0be1db7d64a296acc/sphinx_fonts-0.0.1a10-py3-none-any.whl", hash = "sha256:b7759794a81b5327b2033fae84acfd7af9c9dfcd0f2367570c3af3dc2eb2cc6d", size = 4361, upload-time = "2026-04-25T23:09:20.647Z" }, +] + +[[package]] +name = "sphinx-gp-opengraph" +version = "0.0.1a10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/18/4c70742fbec11985fe1503dce2eb6ddbf29eb5c76b6190d774d481cb0e2e/sphinx_gp_opengraph-0.0.1a10.tar.gz", hash = "sha256:3a22b6c05851185f94775f468ef8d32b04d4682fc1547a867e13c25e86b4459a", size = 11815, upload-time = "2026-04-25T23:13:52.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/cc/f588228404e8ba6e38e0cd47dc09778b920a53ec0f4cc9b3737f98bf3897/sphinx_gp_opengraph-0.0.1a10-py3-none-any.whl", hash = "sha256:79aefc52f8a0d87ff571b335fba683234b722e78aad6b19a977c561f14d23da3", size = 12182, upload-time = "2026-04-25T23:11:16.437Z" }, +] + +[[package]] +name = "sphinx-gp-sitemap" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/56/9b94748a4d83c5c179856ce4a2d29fa87d3528a70f1170f3eca9f52e30c8/sphinx_fonts-0.0.1a9.tar.gz", hash = "sha256:ef1732089b7d48cf31acadd44bc1c7f3205232347197a4fd00ea4503a4fef13e", size = 5675, upload-time = "2026-04-19T14:52:52.561Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/f5/2e7733a1da9fd162a9f29696f01f7ba20f9662e8bd73e262d446e5072003/sphinx_gp_sitemap-0.0.1a10.tar.gz", hash = "sha256:9c3588e39611059b984baeb9738dd2ec52571c075fe6a7c6b35d20645a020fcd", size = 9860, upload-time = "2026-04-25T23:13:52.986Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/8b/957a03e712bc4843fef2f15c8db80c2d1ccf388eda3b77c33476d580947c/sphinx_fonts-0.0.1a9-py3-none-any.whl", hash = "sha256:f39f6e05aea1b8e59f523dbbfc58f9062daa46239f286d66e10d4a613c852653", size = 4353, upload-time = "2026-04-19T14:52:38.57Z" }, + { url = "https://files.pythonhosted.org/packages/88/29/fd8c73036cfed8ef1e1a77703dea146bbffc0c2d7d19dde09d92353240cb/sphinx_gp_sitemap-0.0.1a10-py3-none-any.whl", hash = "sha256:4b630d4306065dfe97db1cb08d7debeb5070afd46af693090bb62ac9ea3c4cb8", size = 8982, upload-time = "2026-04-25T23:13:35.054Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/c8/4189ea4aa18983200c47bbc04deb756f6eec7d2d4e5a830119acd48c4e49/sphinx_gp_theme-0.0.1a9.tar.gz", hash = "sha256:83ed973a633eb8b8b526a5a8551d801b089e8a48c945a6245e89f240387652f2", size = 15945, upload-time = "2026-04-19T14:52:53.412Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/6f/d5eebf76c492ac30e009749bf1c063c75101e68735dcfb760d4f799bc80e/sphinx_gp_theme-0.0.1a10.tar.gz", hash = "sha256:99cd3caf5ef36814e89494c7941b2b10770dc5b187ee55e02143889062b27eda", size = 15947, upload-time = "2026-04-25T23:13:53.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/f6/36f2318013e57355b33aabe31e1615beefa871110ae81424945bb3706b5b/sphinx_gp_theme-0.0.1a9-py3-none-any.whl", hash = "sha256:1df4cd76a529560a2e06f97535b4f6dbcb0d8a8f68401f637392e954483c4f2d", size = 17148, upload-time = "2026-04-19T14:52:39.661Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e9/3f257430838e0a085e2876e91b588a47ff994bc610eeb9869a6cef03e736/sphinx_gp_theme-0.0.1a10-py3-none-any.whl", hash = "sha256:94912582cf4bfa8441073f65b8aadca7e1dacb350bbdcb14e70fb29b73b9fc38", size = 17159, upload-time = "2026-04-25T23:13:36.778Z" }, ] [[package]] @@ -1405,28 +1453,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/66/a0651b6639b9d735bca594eff76020a8ab848f463ea78bdc31ae035b4d4e/sphinx_ux_autodoc_layout-0.0.1a9.tar.gz", hash = "sha256:cbefe0beb92abad93038de39777eaa57d0b3320e66accd51a166c306690b6277", size = 20929, upload-time = "2026-04-19T14:52:54.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/5c/2761c0d22679098251467fbfe54a6d669ee4809eb50b4de6624ff0deb663/sphinx_ux_autodoc_layout-0.0.1a10.tar.gz", hash = "sha256:5ddcfc61d23e839d30cef97a29752bff974d21cb902e8bb27b62bab5b0802cd6", size = 21346, upload-time = "2026-04-25T23:13:55.114Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/04/bb89f3f905138a4af2ea93c90f2d37e304be0644fb8f53424541cdce9f93/sphinx_ux_autodoc_layout-0.0.1a9-py3-none-any.whl", hash = "sha256:32eaf43570dce4f3bed84c281bf7ba50190a9859a13a8968bdaad8c244cc421e", size = 24763, upload-time = "2026-04-19T14:52:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1a/a7b4ef43201329bf35eef15c457a8bf27293a0f15e7fb14099b8a4603930/sphinx_ux_autodoc_layout-0.0.1a10-py3-none-any.whl", hash = "sha256:72484674a9cd7145b95077e4e7a847490c6d09a5461b04d1d70f4650800ce672", size = 25163, upload-time = "2026-04-25T23:13:38.3Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a9" +version = "0.0.1a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/1a/09c2919c42570532f695559b5284a176130f6b715998896a5e10de9c1643/sphinx_ux_badges-0.0.1a9.tar.gz", hash = "sha256:e992367eb0864d3c7b60e09659b0438f57cbd833136915df85854d3995eb0851", size = 15281, upload-time = "2026-04-19T14:52:55.406Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/53/cdaf697efe97a6e080497619bc653ae74f040aed85ea9f2d1c5d8ae459f0/sphinx_ux_badges-0.0.1a10.tar.gz", hash = "sha256:5d522fb52af59c35010fbfae7cdd5f871c5eb92839227232643667c5b71cba10", size = 15280, upload-time = "2026-04-25T23:13:56.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/10/0a1f38f3a2ee6d70eb28bfa309fcce05ff461712ac0ca566a25b2477dd83/sphinx_ux_badges-0.0.1a9-py3-none-any.whl", hash = "sha256:d8c2b1305ce9ecf88eb5571738ac1647edd6e227fe65a282576ffad20c901632", size = 16274, upload-time = "2026-04-19T14:52:42.507Z" }, + { url = "https://files.pythonhosted.org/packages/87/a4/3758c9d9b3e2a8367d3ed98576908be41aaae703bf1943a2cf2b9e8f7c6b/sphinx_ux_badges-0.0.1a10-py3-none-any.whl", hash = "sha256:391f83750070bac13ed49d36f16ea5324940ca8f45ab7f8f3963b3f25b8ccc4b", size = 16278, upload-time = "2026-04-25T23:13:39.84Z" }, ] [[package]] @@ -1483,19 +1531,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] -[[package]] -name = "sphinxext-opengraph" -version = "0.13.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/c0/eb6838e3bae624ce6c8b90b245d17e84252863150e95efdb88f92c8aa3fb/sphinxext_opengraph-0.13.0.tar.gz", hash = "sha256:103335d08567ad8468faf1425f575e3b698e9621f9323949a6c8b96d9793e80b", size = 1026875, upload-time = "2025-08-29T12:20:31.066Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/a4/66c1fd4f8fab88faf71cee04a945f9806ba0fef753f2cfc8be6353f64508/sphinxext_opengraph-0.13.0-py3-none-any.whl", hash = "sha256:936c07828edc9ad9a7b07908b29596dc84ed0b3ceaa77acdf51282d232d4d80e", size = 1004152, upload-time = "2025-08-29T12:20:29.072Z" }, -] - [[package]] name = "sphinxext-rediraffe" version = "0.3.0" @@ -1601,7 +1636,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a9" }, + { name = "gp-sphinx", specifier = "==0.0.1a10" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1611,8 +1646,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a9" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a9" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a10" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a10" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1620,11 +1655,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a9" }, + { name = "gp-sphinx", specifier = "==0.0.1a10" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a9" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a9" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a10" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a10" }, ] lint = [ { name = "mypy" }, From 7237fe6d0221c0a6dbef8fc0523c47c28ebe052d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Apr 2026 04:16:10 -0500 Subject: [PATCH 2826/2998] py(deps[dev]) Bump dev packages --- uv.lock | 150 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/uv.lock b/uv.lock index afb0877182..19f60dd3ba 100644 --- a/uv.lock +++ b/uv.lock @@ -2,12 +2,13 @@ version = 1 revision = 3 requires-python = ">=3.10, <4.0" resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", "python_full_version < '3.11'", ] [options] -exclude-newer = "2026-04-23T00:06:14.879178848Z" +exclude-newer = "2026-04-23T09:16:08.178787764Z" exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -95,11 +96,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] @@ -209,14 +210,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.2" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, + { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, ] [[package]] @@ -373,7 +374,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -450,11 +451,11 @@ wheels = [ [[package]] name = "idna" -version = "3.11" +version = "3.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, ] [[package]] @@ -574,11 +575,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.55.0" +version = "0.55.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/85/99932ac9ddb90821778f8cabe32b81bbbec280dd1a14a457c512693fb11b/libtmux-0.55.0.tar.gz", hash = "sha256:cdc4aa564b2325618d73d57cb0d7d92475d02026dba2b96a94f87ad328e7e79d", size = 420859, upload-time = "2026-03-08T00:57:55.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/01/fa4f839045d32576d4c193d85ba37e47908fea8227f18800847f589e2476/libtmux-0.55.1.tar.gz", hash = "sha256:dcee950537b8bda4337267bc2cb62b434c4c8da3a75c1546151674238ef14e20", size = 439372, upload-time = "2026-04-19T18:25:39.358Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/34/b11ab24abb78c73a1b82f6471c2d71bdd1bf2c8f30768ed2f26f1dddc083/libtmux-0.55.0-py3-none-any.whl", hash = "sha256:4b746533856e022c759e5c5cae97f4932e85dae316a2afd4391d6d0e891d6ab8", size = 80094, upload-time = "2026-03-08T00:57:54.141Z" }, + { url = "https://files.pythonhosted.org/packages/12/2e/819d7414b96f19ec4cafda95555246bdb9766dd7c0519b5b1bf4495789f7/libtmux-0.55.1-py3-none-any.whl", hash = "sha256:4382667d508610bdf71a7cc07d7a561d402fa2d5621cce299e7ae97b0cdcb93b", size = 80679, upload-time = "2026-04-19T18:25:37.61Z" }, ] [[package]] @@ -613,7 +614,8 @@ name = "markdown-it-py" version = "4.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ { name = "mdurl", marker = "python_full_version >= '3.11'" }, @@ -732,7 +734,7 @@ wheels = [ [[package]] name = "mypy" -version = "1.20.1" +version = "1.20.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, @@ -741,51 +743,51 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/3d/5b373635b3146264eb7a68d09e5ca11c305bbb058dfffbb47c47daf4f632/mypy-1.20.1.tar.gz", hash = "sha256:6fc3f4ecd52de81648fed1945498bf42fa2993ddfad67c9056df36ae5757f804", size = 3815892, upload-time = "2026-04-13T02:46:51.474Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/4b/b1fa23297c8a5c403aabaac0649549efc5a0af7095f3dd33e7482863f973/mypy-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3ba5d1e712ada9c3b6223dcbc5a31dac334ed62991e5caa17bcf5a4ddc349af0", size = 14426426, upload-time = "2026-04-13T02:46:37.828Z" }, - { url = "https://files.pythonhosted.org/packages/22/53/82923480aee5507a46df22428316e28b2b710d08506a128b2acef81ab18e/mypy-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e731284c117b0987fb1e6c5013a56f33e7faa1fce594066ab83876183ce1c66", size = 13307651, upload-time = "2026-04-13T02:46:22.676Z" }, - { url = "https://files.pythonhosted.org/packages/4e/0c/91905b393c790440fa273f0903ee2b07cce95bb6deccac87e6eb343d077a/mypy-1.20.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8e945b872a05f4fbefabe2249c0b07b6b194e5e11a86ebee9edf855de09806c", size = 13746066, upload-time = "2026-04-13T02:45:15.345Z" }, - { url = "https://files.pythonhosted.org/packages/88/b9/8a7017270438e34544e19dd6284cad54fd65dde3c35418a2ce07a1897804/mypy-1.20.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fc88acef0dc9b15246502b418980478c1bfc9702057a0e1e7598d01a7af8937", size = 14617944, upload-time = "2026-04-13T02:45:44.954Z" }, - { url = "https://files.pythonhosted.org/packages/0c/cf/5a61ceec3fc133e0f559d1e1f9adf4150abdbc2ad8eb831ec26fc8459196/mypy-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:14911a115c73608f155f648b978c5055d16ff974e6b1b5512d7fedf4fa8b15c6", size = 14918205, upload-time = "2026-04-13T02:45:42.653Z" }, - { url = "https://files.pythonhosted.org/packages/6f/80/afb1c665e9c426c78e4711cce04e446b645867bfb97936158886103c1648/mypy-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:76d9b4c992cca3331d9793ef197ae360ea44953cf35beb2526e95b9e074f2866", size = 10823344, upload-time = "2026-04-13T02:46:07.607Z" }, - { url = "https://files.pythonhosted.org/packages/11/68/7ad64b49b7663c88fef76a2ac689ea73e17804832ac4cb5416bcff17775b/mypy-1.20.1-cp310-cp310-win_arm64.whl", hash = "sha256:b408722f80be44845da555671a5ef3a0c63f51ca5752b0c20e992dc9c0fbd3cd", size = 9760694, upload-time = "2026-04-13T02:46:49.369Z" }, - { url = "https://files.pythonhosted.org/packages/82/0d/555ab7453cc4a4a8643b7f21c842b1a84c36b15392061ae7b052ee119320/mypy-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c01eb9bac2c6a962d00f9d23421cd2913840e65bba365167d057bd0b4171a92e", size = 14336012, upload-time = "2026-04-13T02:45:39.935Z" }, - { url = "https://files.pythonhosted.org/packages/57/26/85a28893f7db8a16ebb41d1e9dfcb4475844d06a88480b6639e32a74d6ef/mypy-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55d12ddbd8a9cac5b276878bd534fa39fff5bf543dc6ae18f25d30c8d7d27fca", size = 13224636, upload-time = "2026-04-13T02:45:49.659Z" }, - { url = "https://files.pythonhosted.org/packages/93/41/bd4cd3c2caeb6c448b669222b8cfcbdee4a03b89431527b56fca9e56b6f3/mypy-1.20.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0aa322c1468b6cdfc927a44ce130f79bb44bcd34eb4a009eb9f96571fd80955", size = 13663471, upload-time = "2026-04-13T02:46:20.276Z" }, - { url = "https://files.pythonhosted.org/packages/3e/56/7ee8c471e10402d64b6517ae10434541baca053cffd81090e4097d5609d4/mypy-1.20.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f8bc95899cf676b6e2285779a08a998cc3a7b26f1026752df9d2741df3c79e8", size = 14532344, upload-time = "2026-04-13T02:46:44.205Z" }, - { url = "https://files.pythonhosted.org/packages/b5/95/b37d1fa859a433f6156742e12f62b0bb75af658544fb6dada9363918743a/mypy-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:47c2b90191a870a04041e910277494b0d92f0711be9e524d45c074fe60c00b65", size = 14776670, upload-time = "2026-04-13T02:45:52.481Z" }, - { url = "https://files.pythonhosted.org/packages/03/77/b302e4cb0b80d2bdf6bf4fce5864bb4cbfa461f7099cea544eaf2457df78/mypy-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:9857dc8d2ec1a392ffbda518075beb00ac58859979c79f9e6bdcb7277082c2f2", size = 10816524, upload-time = "2026-04-13T02:45:37.711Z" }, - { url = "https://files.pythonhosted.org/packages/7f/21/d969d7a68eb964993ebcc6170d5ecaf0cf65830c58ac3344562e16dc42a9/mypy-1.20.1-cp311-cp311-win_arm64.whl", hash = "sha256:09d8df92bb25b6065ab91b178da843dda67b33eb819321679a6e98a907ce0e10", size = 9750419, upload-time = "2026-04-13T02:45:08.542Z" }, - { url = "https://files.pythonhosted.org/packages/69/1b/75a7c825a02781ca10bc2f2f12fba2af5202f6d6005aad8d2d1f264d8d78/mypy-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:36ee2b9c6599c230fea89bbd79f401f9f9f8e9fcf0c777827789b19b7da90f51", size = 14494077, upload-time = "2026-04-13T02:45:55.085Z" }, - { url = "https://files.pythonhosted.org/packages/b0/54/5e5a569ea5c2b4d48b729fb32aa936eeb4246e4fc3e6f5b3d36a2dfbefb9/mypy-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fba3fb0968a7b48806b0c90f38d39296f10766885a94c83bd21399de1e14eb28", size = 13319495, upload-time = "2026-04-13T02:45:29.674Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a4/a1945b19f33e91721b59deee3abb484f2fa5922adc33bb166daf5325d76d/mypy-1.20.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef1415a637cd3627d6304dfbeddbadd21079dafc2a8a753c477ce4fc0c2af54f", size = 13696948, upload-time = "2026-04-13T02:46:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c6/75e969781c2359b2f9c15b061f28ec6d67c8b61865ceda176e85c8e7f2de/mypy-1.20.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef3461b1ad5cd446e540016e90b5984657edda39f982f4cc45ca317b628f5a37", size = 14706744, upload-time = "2026-04-13T02:46:00.482Z" }, - { url = "https://files.pythonhosted.org/packages/a8/6e/b221b1de981fc4262fe3e0bf9ec272d292dfe42394a689c2d49765c144c4/mypy-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:542dd63c9e1339b6092eb25bd515f3a32a1453aee8c9521d2ddb17dacd840237", size = 14949035, upload-time = "2026-04-13T02:45:06.021Z" }, - { url = "https://files.pythonhosted.org/packages/ca/4b/298ba2de0aafc0da3ff2288da06884aae7ba6489bc247c933f87847c41b3/mypy-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d55c7cd8ca22e31f93af2a01160a9e95465b5878de23dba7e48116052f20a8d", size = 10883216, upload-time = "2026-04-13T02:45:47.232Z" }, - { url = "https://files.pythonhosted.org/packages/c7/f9/5e25b8f0b8cb92f080bfed9c21d3279b2a0b6a601cdca369a039ba84789d/mypy-1.20.1-cp312-cp312-win_arm64.whl", hash = "sha256:f5b84a79070586e0d353ee07b719d9d0a4aa7c8ee90c0ea97747e98cbe193019", size = 9814299, upload-time = "2026-04-13T02:45:21.934Z" }, - { url = "https://files.pythonhosted.org/packages/21/e8/ef0991aa24c8f225df10b034f3c2681213cb54cf247623c6dec9a5744e70/mypy-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f3886c03e40afefd327bd70b3f634b39ea82e87f314edaa4d0cce4b927ddcc1", size = 14500739, upload-time = "2026-04-13T02:46:05.442Z" }, - { url = "https://files.pythonhosted.org/packages/23/73/416ebec3047636ed89fa871dc8c54bf05e9e20aa9499da59790d7adb312d/mypy-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e860eb3904f9764e83bafd70c8250bdffdc7dde6b82f486e8156348bf7ceb184", size = 13314735, upload-time = "2026-04-13T02:46:47.154Z" }, - { url = "https://files.pythonhosted.org/packages/10/1e/1505022d9c9ac2e014a384eb17638fb37bf8e9d0a833ea60605b66f8f7ba/mypy-1.20.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4b5aac6e785719da51a84f5d09e9e843d473170a9045b1ea7ea1af86225df4b", size = 13704356, upload-time = "2026-04-13T02:45:19.773Z" }, - { url = "https://files.pythonhosted.org/packages/98/91/275b01f5eba5c467a3318ec214dd865abb66e9c811231c8587287b92876a/mypy-1.20.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f37b6cd0fe2ad3a20f05ace48ca3523fc52ff86940e34937b439613b6854472e", size = 14696420, upload-time = "2026-04-13T02:45:24.205Z" }, - { url = "https://files.pythonhosted.org/packages/a1/57/b3779e134e1b7250d05f874252780d0a88c068bc054bcff99ca20a3a2986/mypy-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4bbb0f6b54ce7cc350ef4a770650d15fa70edd99ad5267e227133eda9c94218", size = 14936093, upload-time = "2026-04-13T02:45:32.087Z" }, - { url = "https://files.pythonhosted.org/packages/be/33/81b64991b0f3f278c3b55c335888794af190b2d59031a5ad1401bcb69f1e/mypy-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:c3dc20f8ec76eecd77148cdd2f1542ed496e51e185713bf488a414f862deb8f2", size = 10889659, upload-time = "2026-04-13T02:46:02.926Z" }, - { url = "https://files.pythonhosted.org/packages/1b/fd/7adcb8053572edf5ef8f3db59599dfeeee3be9cc4c8c97e2d28f66f42ac5/mypy-1.20.1-cp313-cp313-win_arm64.whl", hash = "sha256:a9d62bbac5d6d46718e2b0330b25e6264463ed832722b8f7d4440ff1be3ca895", size = 9815515, upload-time = "2026-04-13T02:46:32.103Z" }, - { url = "https://files.pythonhosted.org/packages/40/cd/db831e84c81d57d4886d99feee14e372f64bbec6a9cb1a88a19e243f2ef5/mypy-1.20.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:12927b9c0ed794daedcf1dab055b6c613d9d5659ac511e8d936d96f19c087d12", size = 14483064, upload-time = "2026-04-13T02:45:26.901Z" }, - { url = "https://files.pythonhosted.org/packages/d5/82/74e62e7097fa67da328ac8ece8de09133448c04d20ddeaeba251a3000f01/mypy-1.20.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:752507dd481e958b2c08fc966d3806c962af5a9433b5bf8f3bdd7175c20e34fe", size = 13335694, upload-time = "2026-04-13T02:46:12.514Z" }, - { url = "https://files.pythonhosted.org/packages/74/c4/97e9a0abe4f3cdbbf4d079cb87a03b786efeccf5bf2b89fe4f96939ab2e6/mypy-1.20.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c614655b5a065e56274c6cbbe405f7cf7e96c0654db7ba39bc680238837f7b08", size = 13726365, upload-time = "2026-04-13T02:45:17.422Z" }, - { url = "https://files.pythonhosted.org/packages/d7/aa/a19d884a8d28fcd3c065776323029f204dbc774e70ec9c85eba228b680de/mypy-1.20.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c3f6221a76f34d5100c6d35b3ef6b947054123c3f8d6938a4ba00b1308aa572", size = 14693472, upload-time = "2026-04-13T02:46:41.253Z" }, - { url = "https://files.pythonhosted.org/packages/84/44/cc9324bd21cf786592b44bf3b5d224b3923c1230ec9898d508d00241d465/mypy-1.20.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4bdfc06303ac06500af71ea0cdbe995c502b3c9ba32f3f8313523c137a25d1b6", size = 14919266, upload-time = "2026-04-13T02:46:28.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/dc/779abb25a8c63e8f44bf5a336217fa92790fa17e0c40e0c725d10cb01bbd/mypy-1.20.1-cp314-cp314-win_amd64.whl", hash = "sha256:0131edd7eba289973d1ba1003d1a37c426b85cdef76650cd02da6420898a5eb3", size = 11049713, upload-time = "2026-04-13T02:45:57.673Z" }, - { url = "https://files.pythonhosted.org/packages/28/08/4172be2ad7de9119b5a92ca36abbf641afdc5cb1ef4ae0c3a8182f29674f/mypy-1.20.1-cp314-cp314-win_arm64.whl", hash = "sha256:33f02904feb2c07e1fdf7909026206396c9deeb9e6f34d466b4cfedb0aadbbe4", size = 9999819, upload-time = "2026-04-13T02:46:35.039Z" }, - { url = "https://files.pythonhosted.org/packages/2d/af/af9e46b0c8eabbce9fc04a477564170f47a1c22b308822282a59b7ff315f/mypy-1.20.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:168472149dd8cc505c98cefd21ad77e4257ed6022cd5ed2fe2999bed56977a5a", size = 15547508, upload-time = "2026-04-13T02:46:25.588Z" }, - { url = "https://files.pythonhosted.org/packages/a7/cd/39c9e4ad6ba33e069e5837d772a9e6c304b4a5452a14a975d52b36444650/mypy-1.20.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:eb674600309a8f22790cca883a97c90299f948183ebb210fbef6bcee07cb1986", size = 14399557, upload-time = "2026-04-13T02:46:10.021Z" }, - { url = "https://files.pythonhosted.org/packages/83/c1/3fd71bdc118ffc502bf57559c909927bb7e011f327f7bb8e0488e98a5870/mypy-1.20.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef2b2e4cc464ba9795459f2586923abd58a0055487cbe558cb538ea6e6bc142a", size = 15045789, upload-time = "2026-04-13T02:45:10.81Z" }, - { url = "https://files.pythonhosted.org/packages/8e/73/6f07ff8b57a7d7b3e6e5bf34685d17632382395c8bb53364ec331661f83e/mypy-1.20.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee461d396dd46b3f0ed5a098dbc9b8860c81c46ad44fa071afcfbc149f167c9", size = 15850795, upload-time = "2026-04-13T02:45:03.349Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e2/f7dffec1c7767078f9e9adf0c786d1fe0ff30964a77eb213c09b8b58cb76/mypy-1.20.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e364926308b3e66f1361f81a566fc1b2f8cd47fc8525e8136d4058a65a4b4f02", size = 16088539, upload-time = "2026-04-13T02:46:17.841Z" }, - { url = "https://files.pythonhosted.org/packages/1a/76/e0dee71035316e75a69d73aec2f03c39c21c967b97e277fd0ef8fd6aec66/mypy-1.20.1-cp314-cp314t-win_amd64.whl", hash = "sha256:a0c17fbd746d38c70cbc42647cfd884f845a9708a4b160a8b4f7e70d41f4d7fa", size = 12575567, upload-time = "2026-04-13T02:45:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/22/a8/7ed43c9d9c3d1468f86605e323a5d97e411a448790a00f07e779f3211a46/mypy-1.20.1-cp314-cp314t-win_arm64.whl", hash = "sha256:db2cb89654626a912efda69c0d5c1d22d948265e2069010d3dde3abf751c7d08", size = 10378823, upload-time = "2026-04-13T02:45:13.35Z" }, - { url = "https://files.pythonhosted.org/packages/d8/28/926bd972388e65a39ee98e188ccf67e81beb3aacfd5d6b310051772d974b/mypy-1.20.1-py3-none-any.whl", hash = "sha256:1aae28507f253fe82d883790d1c0a0d35798a810117c88184097fe8881052f06", size = 2636553, upload-time = "2026-04-13T02:46:30.45Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/04/af/e3d4b3e9ec91a0ff9aabfdb38692952acf49bbb899c2e4c29acb3a6da3ae/mypy-1.20.2.tar.gz", hash = "sha256:e8222c26daaafd9e8626dec58ae36029f82585890589576f769a650dd20fd665", size = 3817349, upload-time = "2026-04-21T17:12:28.473Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/97/ce2502df2cecf2ef997b6c6527c4a223b92feb9e7b790cdc8dcd683f3a8a/mypy-1.20.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cf5a4db6dca263010e2c7bff081c89383c72d187ba2cf4c44759aac970e2f0c4", size = 14457059, upload-time = "2026-04-21T17:06:14.935Z" }, + { url = "https://files.pythonhosted.org/packages/c9/34/417ee60b822cc80c0f3dc9f495ad7fd8dbb8d8b2cf4baf22d4046d25d01d/mypy-1.20.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b0e817b518bff7facd7f85ea05b643ad8bdcce684cf29784987b0a7c8e1f997", size = 13346816, upload-time = "2026-04-21T17:10:41.433Z" }, + { url = "https://files.pythonhosted.org/packages/4a/85/e20951978702df58379d0bcc2e8f7ccdca4e78cd7dc66dd3ddbf9b29d517/mypy-1.20.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97d7b9a485b40f8ca425460e89bf1da2814625b2da627c0dcc6aa46c92631d14", size = 13772593, upload-time = "2026-04-21T17:08:11.24Z" }, + { url = "https://files.pythonhosted.org/packages/63/a5/5441a13259ec516c56fd5de0fd96a69a9590ae6c5e5d3e5174aa84b97973/mypy-1.20.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e1c12f6d2db3d78b909b5f77513c11eb7f2dd2782b96a3ab6dffc7d44575c99", size = 14656635, upload-time = "2026-04-21T17:09:54.042Z" }, + { url = "https://files.pythonhosted.org/packages/3b/51/b89c69157c5e1f19fd125a65d991166a26906e7902f026f00feebbcfa2b9/mypy-1.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:89dce27e142d25ffbc154c1819383b69f2e9234dc4ed4766f42e0e8cb264ab5c", size = 14943278, upload-time = "2026-04-21T17:09:15.599Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/6b0eeecfe96d7cce1d71c66b8e03cb304aa70ec11f1955dc1d6b46aca3c3/mypy-1.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:f376e37f9bf2a946872fc5fd1199c99310748e3c26c7a26683f13f8bdb756cbd", size = 10851915, upload-time = "2026-04-21T17:06:03.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/36/6593dc88545d75fb96416184be5392da5e2a8e8c2802a8597913e16ae25c/mypy-1.20.2-cp310-cp310-win_arm64.whl", hash = "sha256:6e2b469efd811707bc530fd1effef0f5d6eebcb7fe376affae69025da4b979a2", size = 9786676, upload-time = "2026-04-21T17:07:02.035Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4d/9ebeae211caccbdaddde7ed5e31dfcf57faac66be9b11deb1dc6526c8078/mypy-1.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4077797a273e56e8843d001e9dfe4ba10e33323d6ade647ff260e5cd97d9758c", size = 14371307, upload-time = "2026-04-21T17:08:56.442Z" }, + { url = "https://files.pythonhosted.org/packages/95/d7/93473d34b61f04fac1aecc01368485c89c5c4af7a4b9a0cab5d77d04b63f/mypy-1.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cdecf62abcc4292500d7858aeae87a1f8f1150f4c4dd08fb0b336ee79b2a6df3", size = 13258917, upload-time = "2026-04-21T17:05:50.978Z" }, + { url = "https://files.pythonhosted.org/packages/e2/30/3dd903e8bafb7b5f7bf87fcd58f8382086dea2aa19f0a7b357f21f63071b/mypy-1.20.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c566c3a88b6ece59b3d70f65bedef17304f48eb52ff040a6a18214e1917b3254", size = 13700516, upload-time = "2026-04-21T17:11:33.161Z" }, + { url = "https://files.pythonhosted.org/packages/07/05/c61a140aba4c729ac7bc99ae26fc627c78a6e08f5b9dd319244ea71a3d7e/mypy-1.20.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0deb80d062b2479f2c87ae568f89845afc71d11bc41b04179e58165fd9f31e98", size = 14562889, upload-time = "2026-04-21T17:05:27.674Z" }, + { url = "https://files.pythonhosted.org/packages/fd/87/da78243742ffa8a36d98c3010f0d829f93d5da4e6786f1a1a6f2ad616502/mypy-1.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bba9ad231e92a3e424b3e56b65aa17704993425bba97e302c832f9466bb85bac", size = 14803844, upload-time = "2026-04-21T17:10:06.2Z" }, + { url = "https://files.pythonhosted.org/packages/37/52/10a1ddf91b40f843943a3c6db51e2df59c9e237f29d355e95eaab427461f/mypy-1.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:baf593f2765fa3a6b1ef95807dbaa3d25b594f6a52adcc506a6b9cb115e1be67", size = 10846300, upload-time = "2026-04-21T17:12:23.886Z" }, + { url = "https://files.pythonhosted.org/packages/20/02/f9a4415b664c53bd34d6709be59da303abcae986dc4ac847b402edb6fa1e/mypy-1.20.2-cp311-cp311-win_arm64.whl", hash = "sha256:20175a1c0f49863946ec20b7f63255768058ac4f07d2b9ded6a6b46cfb5a9100", size = 9779498, upload-time = "2026-04-21T17:09:23.695Z" }, + { url = "https://files.pythonhosted.org/packages/71/4e/7560e4528db9e9b147e4c0f22660466bf30a0a1fe3d63d1b9d3b0fd354ee/mypy-1.20.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4dbfcf869f6b0517f70cf0030ba6ea1d6645e132337a7d5204a18d8d5636c02b", size = 14539393, upload-time = "2026-04-21T17:07:12.52Z" }, + { url = "https://files.pythonhosted.org/packages/32/d9/34a5efed8124f5a9234f55ac6a4ced4201e2c5b81e1109c49ad23190ec8c/mypy-1.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b6481b228d072315b053210b01ac320e1be243dc17f9e5887ef167f23f5fae4", size = 13361642, upload-time = "2026-04-21T17:06:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/d1/14/eb377acf78c03c92d566a1510cda8137348215b5335085ef662ab82ecd3a/mypy-1.20.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34397cdced6b90b836e38182076049fdb41424322e0b0728c946b0939ebdf9f6", size = 13740347, upload-time = "2026-04-21T17:12:04.73Z" }, + { url = "https://files.pythonhosted.org/packages/b9/94/7e4634a32b641aa1c112422eed1bbece61ee16205f674190e8b536f884de/mypy-1.20.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5da6976f20cae27059ea8d0c86e7cef3de720e04c4bb9ee18e3690fdb792066", size = 14734042, upload-time = "2026-04-21T17:07:43.16Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f3/f7e62395cb7f434541b4491a01149a4439e28ace4c0c632bbf5431e92d1f/mypy-1.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56908d7e08318d39f85b1f0c6cfd47b0cac1a130da677630dac0de3e0623e102", size = 14964958, upload-time = "2026-04-21T17:11:00.665Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0d/47e3c3a0ec2a876e35aeac365df3cac7776c36bbd4ed18cc521e1b9d255b/mypy-1.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:d52ad8d78522da1d308789df651ee5379088e77c76cb1994858d40a426b343b9", size = 10911340, upload-time = "2026-04-21T17:10:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b2/6c852d72e0ea8b01f49da817fb52539993cde327e7d010e0103dc12d0dac/mypy-1.20.2-cp312-cp312-win_arm64.whl", hash = "sha256:785b08db19c9f214dc37d65f7c165d19a30fcecb48abfa30f31b01b5acaabb58", size = 9833947, upload-time = "2026-04-21T17:09:05.267Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c4/b93812d3a192c9bcf5df405bd2f30277cd0e48106a14d1023c7f6ed6e39b/mypy-1.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:edfbfca868cdd6bd8d974a60f8a3682f5565d3f5c99b327640cedd24c4264026", size = 14524670, upload-time = "2026-04-21T17:10:30.737Z" }, + { url = "https://files.pythonhosted.org/packages/f3/47/42c122501bff18eaf1e8f457f5c017933452d8acdc52918a9f59f6812955/mypy-1.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2877a02380adfcdbc69071a0f74d6e9dbbf593c0dc9d174e1f223ffd5281943", size = 13336218, upload-time = "2026-04-21T17:08:44.069Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/75bbc92f41725fbd585fb17b440b1119b576105df1013622983e18640a93/mypy-1.20.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7488448de6007cd5177c6cea0517ac33b4c0f5ee9b5e9f2be51ce75511a85517", size = 13724906, upload-time = "2026-04-21T17:08:01.02Z" }, + { url = "https://files.pythonhosted.org/packages/a1/32/4c49da27a606167391ff0c39aa955707a00edc500572e562f7c36c08a71f/mypy-1.20.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb9c2fa06887e21d6a3a868762acb82aec34e2c6fd0174064f27c93ede68ad15", size = 14726046, upload-time = "2026-04-21T17:11:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/7f/fc/4e354a1bd70216359deb0c9c54847ee6b32ef78dfb09f5131ff99b494078/mypy-1.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d56a78b646f2e3daa865bc70cd5ec5a46c50045801ca8ff17a0c43abc97e3ee", size = 14955587, upload-time = "2026-04-21T17:12:16.033Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/c0f2056e9eb8f08c62cafd9715e4584b89132bdc832fcf85d27d07b5f3e5/mypy-1.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:2a4102b03bb7481d9a91a6da8d174740c9c8c4401024684b9ca3b7cc5e49852f", size = 10922681, upload-time = "2026-04-21T17:06:35.842Z" }, + { url = "https://files.pythonhosted.org/packages/e5/14/065e333721f05de8ef683d0aa804c23026bcc287446b61cac657b902ccac/mypy-1.20.2-cp313-cp313-win_arm64.whl", hash = "sha256:a95a9248b0c6fd933a442c03c3b113c3b61320086b88e2c444676d3fd1ca3330", size = 9830560, upload-time = "2026-04-21T17:07:51.023Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d1/b4ec96b0ecc620a4443570c6e95c867903428cfcde4206518eafdd5880c3/mypy-1.20.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:419413398fe250aae057fd2fe50166b61077083c9b82754c341cf4fd73038f30", size = 14524561, upload-time = "2026-04-21T17:06:27.325Z" }, + { url = "https://files.pythonhosted.org/packages/3a/63/d2c2ff4fa66bc49477d32dfa26e8a167ba803ea6a69c5efb416036909d30/mypy-1.20.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e73c07f23009962885c197ccb9b41356a30cc0e5a1d0c2ea8fd8fb1362d7f924", size = 13363883, upload-time = "2026-04-21T17:11:11.239Z" }, + { url = "https://files.pythonhosted.org/packages/2a/56/983916806bf4eddeaaa2c9230903c3669c6718552a921154e1c5182c701f/mypy-1.20.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c64e5973df366b747646fc98da921f9d6eba9716d57d1db94a83c026a08e0fb", size = 13742945, upload-time = "2026-04-21T17:08:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/19/65/0cd9285ab010ee8214c83d67c6b49417c40d86ce46f1aa109457b5a9b8d7/mypy-1.20.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a65aa591af023864fd08a97da9974e919452cfe19cb146c8a5dc692626445dc", size = 14706163, upload-time = "2026-04-21T17:05:15.51Z" }, + { url = "https://files.pythonhosted.org/packages/94/97/48ff3b297cafcc94d185243a9190836fb1b01c1b0918fff64e941e973cc9/mypy-1.20.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4fef51b01e638974a6e69885687e9bd40c8d1e09a6cd291cca0619625cf1f558", size = 14938677, upload-time = "2026-04-21T17:05:39.562Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a1/1b4233d255bdd0b38a1f284feeb1c143ca508c19184964e22f8d837ec851/mypy-1.20.2-cp314-cp314-win_amd64.whl", hash = "sha256:913485a03f1bcf5d279409a9d2b9ed565c151f61c09f29991e5faa14033da4c8", size = 11089322, upload-time = "2026-04-21T17:06:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/ce7ee2ba36aeb954ba50f18fa25d9c1188578654b97d02a66a15b6f09531/mypy-1.20.2-cp314-cp314-win_arm64.whl", hash = "sha256:c3bae4f855d965b5453784300c12ffc63a548304ac7f99e55d4dc7c898673aa3", size = 10017775, upload-time = "2026-04-21T17:07:20.732Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a1/9d93a7d0b5859af0ead82b4888b46df6c8797e1bc5e1e262a08518c6d48e/mypy-1.20.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2de3dcea53babc1c3237a19002bc3d228ce1833278f093b8d619e06e7cc79609", size = 15549002, upload-time = "2026-04-21T17:08:23.107Z" }, + { url = "https://files.pythonhosted.org/packages/00/d2/09a6a10ee1bf0008f6c144d9676f2ca6a12512151b4e0ad0ff6c4fac5337/mypy-1.20.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:52b176444e2e5054dfcbcb8c75b0b719865c96247b37407184bbfca5c353f2c2", size = 14401942, upload-time = "2026-04-21T17:07:31.837Z" }, + { url = "https://files.pythonhosted.org/packages/57/da/9594b75c3c019e805250bed3583bdf4443ff9e6ef08f97e39ae308cb06f2/mypy-1.20.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:688c3312e5dadb573a2c69c82af3a298d43ecf9e6d264e0f95df960b5f6ac19c", size = 15041649, upload-time = "2026-04-21T17:09:34.653Z" }, + { url = "https://files.pythonhosted.org/packages/97/77/f75a65c278e6e8eba2071f7f5a90481891053ecc39878cc444634d892abe/mypy-1.20.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29752dbbf8cc53f89f6ac096d363314333045c257c9c75cbd189ca2de0455744", size = 15864588, upload-time = "2026-04-21T17:11:44.936Z" }, + { url = "https://files.pythonhosted.org/packages/d7/46/1a4e1c66e96c1a3246ddf5403d122ac9b0a8d2b7e65730b9d6533ba7a6d3/mypy-1.20.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:803203d2b6ea644982c644895c2f78b28d0e208bba7b27d9b921e0ec5eb207c6", size = 16093956, upload-time = "2026-04-21T17:10:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/5a/2c/78a8851264dec38cd736ca5b8bc9380674df0dd0be7792f538916157716c/mypy-1.20.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9bcb8aa397ff0093c824182fd76a935a9ba7ad097fcbef80ae89bf6c1731d8ec", size = 12568661, upload-time = "2026-04-21T17:11:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/83/01/cd7318aa03493322ce275a0e14f4f52b8896335e4e79d4fb8153a7ad2b77/mypy-1.20.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e061b58443f1736f8a37c48978d7ab581636d6ab03e3d4f99e3fa90463bb9382", size = 10389240, upload-time = "2026-04-21T17:09:42.719Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/f23c163e25b11074188251b0b5a0342625fc1cdb6af604757174fa9acc9b/mypy-1.20.2-py3-none-any.whl", hash = "sha256:a94c5a76ab46c5e6257c7972b6c8cff0574201ca7dc05647e33e795d78680563", size = 2637314, upload-time = "2026-04-21T17:05:54.5Z" }, ] [[package]] @@ -822,7 +824,8 @@ name = "myst-parser" version = "5.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ { name = "docutils", marker = "python_full_version >= '3.11'" }, @@ -848,11 +851,11 @@ wheels = [ [[package]] name = "pathspec" -version = "1.0.4" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/17/9c3094b822982b9f1ea666d8580ce59000f61f87c1663556fb72031ad9ec/pathspec-1.1.0.tar.gz", hash = "sha256:f5d7c555da02fd8dde3e4a2354b6aba817a89112fa8f333f7917a2a4834dd080", size = 133918, upload-time = "2026-04-23T01:46:22.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/8eed0486f074e9f1ca7f8ce5ad663e65f12fdab344028d658fa1b03d35e0/pathspec-1.1.0-py3-none-any.whl", hash = "sha256:574b128f7456bd899045ccd142dd446af7e6cfd0072d63ad73fbc55fbb4aaa42", size = 56264, upload-time = "2026-04-23T01:46:20.606Z" }, ] [[package]] @@ -1220,7 +1223,8 @@ name = "sphinx" version = "8.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ { name = "alabaster", marker = "python_full_version >= '3.11'" }, @@ -1271,7 +1275,8 @@ name = "sphinx-autobuild" version = "2025.8.25" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.11'" }, @@ -1375,7 +1380,8 @@ name = "sphinx-design" version = "0.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11'", + "python_full_version >= '3.15'", + "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -1789,16 +1795,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.44.0" +version = "0.46.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/da/6eee1ff8b6cbeed47eeb5229749168e81eb4b7b999a1a15a7176e51410c9/uvicorn-0.44.0.tar.gz", hash = "sha256:6c942071b68f07e178264b9152f1f16dfac5da85880c4ce06366a96d70d4f31e", size = 86947, upload-time = "2026-04-06T09:23:22.826Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/23/a5bbd9600dd607411fa644c06ff4951bec3a4d82c4b852374024359c19c0/uvicorn-0.44.0-py3-none-any.whl", hash = "sha256:ce937c99a2cc70279556967274414c087888e8cec9f9c94644dfca11bd3ced89", size = 69425, upload-time = "2026-04-06T09:23:21.524Z" }, + { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, ] [[package]] From bb152946b6d202d4879661bd31a09dd9312aa6f4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 26 Apr 2026 20:45:50 -0500 Subject: [PATCH 2827/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a11 why: gp-sphinx cut 0.0.1a11 covering a theme-flicker fix that addresses three independent failure modes on Furo + Cloudflare deploys. (1) Flash of the wrong colour scheme on initial load when localStorage.theme and OS prefers-color-scheme disagree. (2) Toggle-icon "pop-in" mid-load caused by furo.js being deferred by Cloudflare Rocket Loader, leaving on the page and the .theme-toggle-container hidden until furo.js eventually ran. (3) Animated mid-blend on .sig and dl.py headers during runtime theme toggle, from CSS transitions on background-on-hover that also ran on every CSS-variable swap. Tracking the new alpha picks all three fixes up on the next docs build at https://tmuxp.git-pull.com/. See https://github.com/git-pull/gp-sphinx/pull/23 for the source-side detail. what: - pyproject.toml: gp-sphinx, sphinx-autodoc-argparse, and sphinx-autodoc-api-style all move 0.0.1a10 -> 0.0.1a11 in every dependency group that pins them (one row in [project.optional-dependencies], one row in [dependency-groups] per package). - uv.lock regenerated against the new pins; gp-sphinx workspace siblings co-resolved to 0.0.1a11. --- pyproject.toml | 12 ++++---- uv.lock | 76 +++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0721a5adb3..f2622f573e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a10", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a10", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a10", + "gp-sphinx==0.0.1a11", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a11", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a11", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a10", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a10", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a10", + "gp-sphinx==0.0.1a11", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a11", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a11", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 19f60dd3ba..f1dcf1ea71 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-04-23T09:16:08.178787764Z" +exclude-newer = "2026-04-24T01:45:40.802078501Z" exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -374,7 +374,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/5f/16afe16307c716f1ea7501f76cf278218e2bcb92d3001e5eaa18dd525a4e/gp_sphinx-0.0.1a10.tar.gz", hash = "sha256:13eeafcc860ed6b05ea1052b216c559e978928a9bc3abacff3f6b5481970ed4f", size = 14965, upload-time = "2026-04-25T23:13:41.395Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/6f/bf184c500e57b8ae47797de47ebf0f20076396df6c8cae7fcec6baea5072/gp_sphinx-0.0.1a11.tar.gz", hash = "sha256:d5a4cb1b58f68d3bfd00a361752fabc0b41e6a6b03b499e54c55c4b88fa5c109", size = 16338, upload-time = "2026-04-27T01:35:57.175Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/19/c51cdc0c007c9fb6fad4d1502d98eb4c2ae4c037467d7358e65f87fe9ff2/gp_sphinx-0.0.1a10-py3-none-any.whl", hash = "sha256:37f4d3048ece611b3b21133e24da965c0952598987e4297a75616fd71b7a4608", size = 15351, upload-time = "2026-04-25T23:09:08.839Z" }, + { url = "https://files.pythonhosted.org/packages/60/0c/6a5f09cae060d462475e0d69e9b0b9a31084466a4a4c151efa7881919c22/gp_sphinx-0.0.1a11-py3-none-any.whl", hash = "sha256:b546b9f7e7097039420353c67c6204a0a043aafe70549280b04fe4e92575e486", size = 16747, upload-time = "2026-04-27T01:35:37.806Z" }, ] [[package]] @@ -1293,7 +1293,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1301,14 +1301,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/19/c0dc6cb16fa4c2160dbf3e35049c52fe9c1195b72ff27a8ad570e365a517/sphinx_autodoc_api_style-0.0.1a10.tar.gz", hash = "sha256:3eb80bda832018fdd805133c19a32b09f6a6015d0b61369df7e885d9aaecab60", size = 8295, upload-time = "2026-04-25T23:13:42.658Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/15/1cf1973b291533c3a71d0844c8735f9dd27540d1254071dacc91ae7c2f7f/sphinx_autodoc_api_style-0.0.1a11.tar.gz", hash = "sha256:cedb7e589964209233839305f6aecd50a20f9e5a484ac1ee6a8ab40737f65278", size = 8271, upload-time = "2026-04-27T01:35:58.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d7/cd4879bb8a3f879ed156810955baa0e8d95ca8119413fb9df7f2e26fe5d4/sphinx_autodoc_api_style-0.0.1a10-py3-none-any.whl", hash = "sha256:bd0486bce8ef390a803793821e6612991449ab4b8832d56ddaaea6fc97e5a1c4", size = 8332, upload-time = "2026-04-25T23:09:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/02/d0/ded2117cb6cfa47b7ea8cf7c5afe81ae15184020c3f4c8e465cd88aeaab9/sphinx_autodoc_api_style-0.0.1a11-py3-none-any.whl", hash = "sha256:2ac79c6e6336a128c1cd4488138ed0d1658c6665b48a18859c581da25f8d8311", size = 8309, upload-time = "2026-04-27T01:35:39.335Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1316,22 +1316,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/67/c1ea6958e4e800e9ee26ed703cb0e4b823b2dbea1cf133c9b25cfcf06ff3/sphinx_autodoc_argparse-0.0.1a10.tar.gz", hash = "sha256:91052e40aaef5355cef1ebc3529482286d4a662becf6049b60787c9365b89529", size = 42323, upload-time = "2026-04-25T23:13:44.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/98/ddd8be6ef5b080b8967a18009d3d221642f85f438dcce52419d859c89a4b/sphinx_autodoc_argparse-0.0.1a11.tar.gz", hash = "sha256:67ea35eb0a7ce9eba5add2c6ebd1dedaaad5690db30383cfa5a42faa15bc8c2f", size = 42322, upload-time = "2026-04-27T01:35:58.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/73/10f9f4b2a8e677fc6fe2de3bd84c5f3f55bf24fa8fd2812efd73cca6877e/sphinx_autodoc_argparse-0.0.1a10-py3-none-any.whl", hash = "sha256:4c58ba98f245314535cbbe8eff91810590db2c48b4c8dc41226ef28708000f2b", size = 47274, upload-time = "2026-04-25T23:09:11.862Z" }, + { url = "https://files.pythonhosted.org/packages/f1/1a/4692b9cb341d56f026bcd4d1afd5ab08fc857cdb872f56dfd1833b504a86/sphinx_autodoc_argparse-0.0.1a11-py3-none-any.whl", hash = "sha256:2a407a64ffa86bbfd3e6cdd7554d439ab9962fad652eb71e630cfda590169e92", size = 47275, upload-time = "2026-04-27T01:35:40.714Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/5a/c312d8ae8bfccc323858e16583044bf91c5236ea6248672d90edd6133c3b/sphinx_autodoc_typehints_gp-0.0.1a10.tar.gz", hash = "sha256:4cc2f78a4fcd3cd09c7ed80ef331386cd4b724b9f91310bfaef6334aa32eca09", size = 18463, upload-time = "2026-04-25T23:13:50.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/99/4629060676c3a3e8135270e59bcb327aefe1fe37b37e177012e2211a47ca/sphinx_autodoc_typehints_gp-0.0.1a11.tar.gz", hash = "sha256:63a7196197f14183641a15566d707bd2ae44626eee11ec8c9188b4ee2ea7f622", size = 18462, upload-time = "2026-04-27T01:36:04.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/00/678d5cb51365b66a9cf4ef8c180f6192dd1d5c65e69e8c0469e6ede1932b/sphinx_autodoc_typehints_gp-0.0.1a10-py3-none-any.whl", hash = "sha256:ffa5707bfda9f2bf751df8137b1e93d46173db20760345e9519963df894327d8", size = 19007, upload-time = "2026-04-25T23:09:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/49/41/c13b9ed7a5ea15dfb8af04271cf0594dced26a5b8519ba22ff208a2d7a81/sphinx_autodoc_typehints_gp-0.0.1a11-py3-none-any.whl", hash = "sha256:7657b0f14f07d1f2ea6140d4c65ab63578243184fbd60268e891bfa1ef0561f6", size = 19010, upload-time = "2026-04-27T01:35:47.916Z" }, ] [[package]] @@ -1393,55 +1393,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/04/17e9f6f573068b7097877003e7fe91fdb7f64dc2afe4d327bb379718268c/sphinx_fonts-0.0.1a10.tar.gz", hash = "sha256:69a35fa977c60dafd419eb37a5ee108c5bf5d8a05aad9d2d81908541d85a80ec", size = 5679, upload-time = "2026-04-25T23:13:51.156Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/ab/30a635c2c23cf8f45a589800e00e8e63ce2bf95711ebaaf44464866e02df/sphinx_fonts-0.0.1a11.tar.gz", hash = "sha256:8287f701393d0ea1e0bc543a63e8f5ea80f7852e097992058e1961cb771e0c69", size = 5680, upload-time = "2026-04-27T01:36:05.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/02/01530c82ba4fecc6fa5ba72f2f3aa3000809b55f32f0be1db7d64a296acc/sphinx_fonts-0.0.1a10-py3-none-any.whl", hash = "sha256:b7759794a81b5327b2033fae84acfd7af9c9dfcd0f2367570c3af3dc2eb2cc6d", size = 4361, upload-time = "2026-04-25T23:09:20.647Z" }, + { url = "https://files.pythonhosted.org/packages/ee/59/78833e18579c9b45dbc62069e947214f12da8e856a4a5cee4080243234d2/sphinx_fonts-0.0.1a11-py3-none-any.whl", hash = "sha256:edcd17b17eab5148174fffe401eb7809f2ecc65d8a255d81f7e0372cdaa0d86e", size = 4361, upload-time = "2026-04-27T01:35:49.209Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/18/4c70742fbec11985fe1503dce2eb6ddbf29eb5c76b6190d774d481cb0e2e/sphinx_gp_opengraph-0.0.1a10.tar.gz", hash = "sha256:3a22b6c05851185f94775f468ef8d32b04d4682fc1547a867e13c25e86b4459a", size = 11815, upload-time = "2026-04-25T23:13:52.084Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/49/6b658ee64f71f14b2c9b08bf4d206d9bfe0e2a3685d879181a0423720b40/sphinx_gp_opengraph-0.0.1a11.tar.gz", hash = "sha256:39ee8ae7a02c52f9fb87ea4c40c034d6b0c47576c06e7cab2e78b9c438ecc85c", size = 11815, upload-time = "2026-04-27T01:36:06.047Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/cc/f588228404e8ba6e38e0cd47dc09778b920a53ec0f4cc9b3737f98bf3897/sphinx_gp_opengraph-0.0.1a10-py3-none-any.whl", hash = "sha256:79aefc52f8a0d87ff571b335fba683234b722e78aad6b19a977c561f14d23da3", size = 12182, upload-time = "2026-04-25T23:11:16.437Z" }, + { url = "https://files.pythonhosted.org/packages/60/f4/9a3d1919030c83a84c273941ba79eab6b18417ac8f48eac6ea4ac5478f53/sphinx_gp_opengraph-0.0.1a11-py3-none-any.whl", hash = "sha256:d86a12dac6a400ac8ef8a5a8e6a6187a696ae08db047fcd03ae1bdbc2a59416a", size = 12182, upload-time = "2026-04-27T01:35:50.538Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/f5/2e7733a1da9fd162a9f29696f01f7ba20f9662e8bd73e262d446e5072003/sphinx_gp_sitemap-0.0.1a10.tar.gz", hash = "sha256:9c3588e39611059b984baeb9738dd2ec52571c075fe6a7c6b35d20645a020fcd", size = 9860, upload-time = "2026-04-25T23:13:52.986Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/ba/44e8457c3a8bde4cce0b714b68ffbb18104c177a919374bd924421d76e90/sphinx_gp_sitemap-0.0.1a11.tar.gz", hash = "sha256:cb4eab0714fea35afaa714fdddbc19ebbed403aeb582ee795eea583babdd3d25", size = 9863, upload-time = "2026-04-27T01:36:07.209Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/29/fd8c73036cfed8ef1e1a77703dea146bbffc0c2d7d19dde09d92353240cb/sphinx_gp_sitemap-0.0.1a10-py3-none-any.whl", hash = "sha256:4b630d4306065dfe97db1cb08d7debeb5070afd46af693090bb62ac9ea3c4cb8", size = 8982, upload-time = "2026-04-25T23:13:35.054Z" }, + { url = "https://files.pythonhosted.org/packages/ac/40/12adf6d2870765976f232b4eb17121fbca02c8b4a860a8f37e562f02c5cc/sphinx_gp_sitemap-0.0.1a11-py3-none-any.whl", hash = "sha256:e4c66fd1f21316b7f7ef2c9cece9214a1eb08741876ae0d88a2ba1c22b5bccb4", size = 8982, upload-time = "2026-04-27T01:35:51.78Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/6f/d5eebf76c492ac30e009749bf1c063c75101e68735dcfb760d4f799bc80e/sphinx_gp_theme-0.0.1a10.tar.gz", hash = "sha256:99cd3caf5ef36814e89494c7941b2b10770dc5b187ee55e02143889062b27eda", size = 15947, upload-time = "2026-04-25T23:13:53.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/89/efcb4c91cd6d71f00946e903cd622428d8331c9faaad972c18b4a55dc259/sphinx_gp_theme-0.0.1a11.tar.gz", hash = "sha256:9c1523e2417a7e409af7afd342e8588ee9616bbd4b9557290534900854dac92e", size = 16078, upload-time = "2026-04-27T01:36:08.438Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/e9/3f257430838e0a085e2876e91b588a47ff994bc610eeb9869a6cef03e736/sphinx_gp_theme-0.0.1a10-py3-none-any.whl", hash = "sha256:94912582cf4bfa8441073f65b8aadca7e1dacb350bbdcb14e70fb29b73b9fc38", size = 17159, upload-time = "2026-04-25T23:13:36.778Z" }, + { url = "https://files.pythonhosted.org/packages/18/3f/10a5cd41010f2c30a48662d7b2109e3b2f076d1550320f5fbb7724d10539/sphinx_gp_theme-0.0.1a11-py3-none-any.whl", hash = "sha256:9820e871871f7485bd0aec345b1942feb1bf30ef847068ae74e7bf25428b83a7", size = 17305, upload-time = "2026-04-27T01:35:53.288Z" }, ] [[package]] @@ -1459,28 +1459,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/5c/2761c0d22679098251467fbfe54a6d669ee4809eb50b4de6624ff0deb663/sphinx_ux_autodoc_layout-0.0.1a10.tar.gz", hash = "sha256:5ddcfc61d23e839d30cef97a29752bff974d21cb902e8bb27b62bab5b0802cd6", size = 21346, upload-time = "2026-04-25T23:13:55.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/0c/0048d93b2e9e969a1486ec05d988f86ae8d15e5f8ce3631f329a8c6dfcd5/sphinx_ux_autodoc_layout-0.0.1a11.tar.gz", hash = "sha256:7fedd5c184649ec1879e03c16e241482f02ff175893ec4c9153110274a1357a0", size = 21325, upload-time = "2026-04-27T01:36:09.394Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/1a/a7b4ef43201329bf35eef15c457a8bf27293a0f15e7fb14099b8a4603930/sphinx_ux_autodoc_layout-0.0.1a10-py3-none-any.whl", hash = "sha256:72484674a9cd7145b95077e4e7a847490c6d09a5461b04d1d70f4650800ce672", size = 25163, upload-time = "2026-04-25T23:13:38.3Z" }, + { url = "https://files.pythonhosted.org/packages/e9/88/7a88646e502fbc0bb78947d87a1a386304b1dc4770ead020d3921ea1bf14/sphinx_ux_autodoc_layout-0.0.1a11-py3-none-any.whl", hash = "sha256:dcc6cbd4b800fdd5c8b3c3c4bb70c6bd46ceb09cded6bb74d863b3b5a837ade4", size = 25144, upload-time = "2026-04-27T01:35:54.59Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a10" +version = "0.0.1a11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/53/cdaf697efe97a6e080497619bc653ae74f040aed85ea9f2d1c5d8ae459f0/sphinx_ux_badges-0.0.1a10.tar.gz", hash = "sha256:5d522fb52af59c35010fbfae7cdd5f871c5eb92839227232643667c5b71cba10", size = 15280, upload-time = "2026-04-25T23:13:56.067Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/1a/89135927d3533fac3f7ed7b34811ae47a198e741983897675d8bd37610d9/sphinx_ux_badges-0.0.1a11.tar.gz", hash = "sha256:a33a55e33e1726950c2d983d5c256a4e44c3782d69b7bf58f4e46ac5a288419a", size = 15283, upload-time = "2026-04-27T01:36:10.65Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/a4/3758c9d9b3e2a8367d3ed98576908be41aaae703bf1943a2cf2b9e8f7c6b/sphinx_ux_badges-0.0.1a10-py3-none-any.whl", hash = "sha256:391f83750070bac13ed49d36f16ea5324940ca8f45ab7f8f3963b3f25b8ccc4b", size = 16278, upload-time = "2026-04-25T23:13:39.84Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/e660fdb0ba71e7161a764e9108a5d1db4b88bf5573b847a3c97700314a9c/sphinx_ux_badges-0.0.1a11-py3-none-any.whl", hash = "sha256:ff254bf3b5bb5ea1f607b6f9a9db0153821720a5d735ccd309ced015ab1236a2", size = 16278, upload-time = "2026-04-27T01:35:55.962Z" }, ] [[package]] @@ -1642,7 +1642,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a10" }, + { name = "gp-sphinx", specifier = "==0.0.1a11" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1652,8 +1652,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a10" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a10" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a11" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a11" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1661,11 +1661,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a10" }, + { name = "gp-sphinx", specifier = "==0.0.1a11" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a10" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a10" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a11" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a11" }, ] lint = [ { name = "mypy" }, From 1de45f764ecccb809d8727752ce187539bb76a0b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 27 Apr 2026 18:13:32 -0500 Subject: [PATCH 2828/2998] .tool-versions(uv, just) uv 0.11.7 -> 0.11.8, just 1.49 -> 1.50 - just - https://github.com/casey/just/blob/1.50.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.50.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.8 - https://github.com/astral-sh/uv/blob/0.11.8/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index 35d1382f54..09479bd719 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.49 -uv 0.11.7 +just 1.50 +uv 0.11.8 python 3.14 3.13 3.12 3.11 3.10 From 15925dc2c601106adf76cb632e924e46cb4389fc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 27 Apr 2026 20:32:44 -0500 Subject: [PATCH 2829/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a12 why: gp-sphinx cut 0.0.1a12 with a single iOS Safari fix -- the sidebar logo no longer disappears during SPA navigation. The previous order ran the DOM swap before history.pushState, so the new in the sidebar resolved its relative URL against the OLD page's directory and 404'd on every cross-depth navigation. Chromium and Gecko queue URL resolution as an element task and read document.baseURI AFTER pushState fires on the same call stack, so they tolerated the bug. WebKit (iOS Safari) resolves eagerly, and inside document.startViewTransition the failed-load state was then committed into the new snapshot during the cross-fade. Most visible on iPad with Request Desktop Site. Tracking the new alpha picks the fix up on the next docs build at https://tmuxp.git-pull.com/. what: - pyproject.toml: gp-sphinx, sphinx-autodoc-argparse, and sphinx-autodoc-api-style all move 0.0.1a11 -> 0.0.1a12 in [dependency-groups] dev and docs. - uv.lock regenerated; gp-sphinx workspace siblings co- resolved to 0.0.1a12. --- pyproject.toml | 12 ++++---- uv.lock | 74 +++++++++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f2622f573e..852e778a23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a11", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a11", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a11", + "gp-sphinx==0.0.1a12", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a12", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a12", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a11", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a11", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a11", + "gp-sphinx==0.0.1a12", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a12", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a12", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index f1dcf1ea71..4d9f5f08ef 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-04-24T01:45:40.802078501Z" +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/6f/bf184c500e57b8ae47797de47ebf0f20076396df6c8cae7fcec6baea5072/gp_sphinx-0.0.1a11.tar.gz", hash = "sha256:d5a4cb1b58f68d3bfd00a361752fabc0b41e6a6b03b499e54c55c4b88fa5c109", size = 16338, upload-time = "2026-04-27T01:35:57.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/72/edebe2ab31642abf59c93767c39bb2a7865ec0a13a8490f888c079cdaae9/gp_sphinx-0.0.1a12.tar.gz", hash = "sha256:c31029d19bc79b5fa92620456ed1b78a7073b1480acb54d31cbf8fa80f16a9ac", size = 16337, upload-time = "2026-04-28T01:09:14.821Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/0c/6a5f09cae060d462475e0d69e9b0b9a31084466a4a4c151efa7881919c22/gp_sphinx-0.0.1a11-py3-none-any.whl", hash = "sha256:b546b9f7e7097039420353c67c6204a0a043aafe70549280b04fe4e92575e486", size = 16747, upload-time = "2026-04-27T01:35:37.806Z" }, + { url = "https://files.pythonhosted.org/packages/06/25/106f9cb8caf09d9efb4df51c5d8f2c8e5075bd107a7c147e90487217b169/gp_sphinx-0.0.1a12-py3-none-any.whl", hash = "sha256:1ca147f561470fb44d5ceb71da164c445292e20001b0daf7485ed892ab551d29", size = 16749, upload-time = "2026-04-28T01:08:56.805Z" }, ] [[package]] @@ -1293,7 +1293,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1301,14 +1301,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/15/1cf1973b291533c3a71d0844c8735f9dd27540d1254071dacc91ae7c2f7f/sphinx_autodoc_api_style-0.0.1a11.tar.gz", hash = "sha256:cedb7e589964209233839305f6aecd50a20f9e5a484ac1ee6a8ab40737f65278", size = 8271, upload-time = "2026-04-27T01:35:58.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ac/a7e9726bf89c457a4f5e0c86ebd9789c65e75c5c0b51eed267e99ce659a9/sphinx_autodoc_api_style-0.0.1a12.tar.gz", hash = "sha256:67a3dd17c82c69e5f47fd0b9ffbf3a90a7a9bd588a45e2f5e0d47e90b979bfb6", size = 8270, upload-time = "2026-04-28T01:09:16.021Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/d0/ded2117cb6cfa47b7ea8cf7c5afe81ae15184020c3f4c8e465cd88aeaab9/sphinx_autodoc_api_style-0.0.1a11-py3-none-any.whl", hash = "sha256:2ac79c6e6336a128c1cd4488138ed0d1658c6665b48a18859c581da25f8d8311", size = 8309, upload-time = "2026-04-27T01:35:39.335Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ea/3d3b7bab0ab5bc6001ca7657ec6abe7a1685d2aa58a4e4db04ec12ab516f/sphinx_autodoc_api_style-0.0.1a12-py3-none-any.whl", hash = "sha256:20377a629438d04fd36834043066246acd33112b06cbd2ed254a7ca6c1a7a90d", size = 8309, upload-time = "2026-04-28T01:08:58.045Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1316,22 +1316,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/98/ddd8be6ef5b080b8967a18009d3d221642f85f438dcce52419d859c89a4b/sphinx_autodoc_argparse-0.0.1a11.tar.gz", hash = "sha256:67ea35eb0a7ce9eba5add2c6ebd1dedaaad5690db30383cfa5a42faa15bc8c2f", size = 42322, upload-time = "2026-04-27T01:35:58.917Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/da/ea69c01a3f9dd317903aa450dff5e1702d942fd95a6c1efb4879280f2a1f/sphinx_autodoc_argparse-0.0.1a12.tar.gz", hash = "sha256:955123e4ada9057fe0118d072dd285e7997659e4e35628e208400c600137695b", size = 42326, upload-time = "2026-04-28T01:09:16.913Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/1a/4692b9cb341d56f026bcd4d1afd5ab08fc857cdb872f56dfd1833b504a86/sphinx_autodoc_argparse-0.0.1a11-py3-none-any.whl", hash = "sha256:2a407a64ffa86bbfd3e6cdd7554d439ab9962fad652eb71e630cfda590169e92", size = 47275, upload-time = "2026-04-27T01:35:40.714Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/aadf5135808b348be11a10e3b2c6515c1417be1fa8d2634b324a98e43f78/sphinx_autodoc_argparse-0.0.1a12-py3-none-any.whl", hash = "sha256:d13f00ff7d527939c97618cfb2ffc32817b825700c68a848e673da5ad1d0a3e5", size = 47275, upload-time = "2026-04-28T01:08:59.511Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/99/4629060676c3a3e8135270e59bcb327aefe1fe37b37e177012e2211a47ca/sphinx_autodoc_typehints_gp-0.0.1a11.tar.gz", hash = "sha256:63a7196197f14183641a15566d707bd2ae44626eee11ec8c9188b4ee2ea7f622", size = 18462, upload-time = "2026-04-27T01:36:04.196Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/73/8f4df9365b2481efd29e7ebdbb9bc9e7f53834b248763d197c739c0a4788/sphinx_autodoc_typehints_gp-0.0.1a12.tar.gz", hash = "sha256:40adeae781e6c453a7386fc240ac172ae7115da6e575bf8f3c1acb9e640beeda", size = 18463, upload-time = "2026-04-28T01:09:22.581Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/41/c13b9ed7a5ea15dfb8af04271cf0594dced26a5b8519ba22ff208a2d7a81/sphinx_autodoc_typehints_gp-0.0.1a11-py3-none-any.whl", hash = "sha256:7657b0f14f07d1f2ea6140d4c65ab63578243184fbd60268e891bfa1ef0561f6", size = 19010, upload-time = "2026-04-27T01:35:47.916Z" }, + { url = "https://files.pythonhosted.org/packages/f5/27/2767f1d960ad3a13ad925685563a8ddd18c858a5bec38338a6c3e48f6771/sphinx_autodoc_typehints_gp-0.0.1a12-py3-none-any.whl", hash = "sha256:a3451d1603895a35103325d431bcb50dd8381a3d1ca0a12ac437e7b658d624d2", size = 19007, upload-time = "2026-04-28T01:09:05.932Z" }, ] [[package]] @@ -1393,55 +1393,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/ab/30a635c2c23cf8f45a589800e00e8e63ce2bf95711ebaaf44464866e02df/sphinx_fonts-0.0.1a11.tar.gz", hash = "sha256:8287f701393d0ea1e0bc543a63e8f5ea80f7852e097992058e1961cb771e0c69", size = 5680, upload-time = "2026-04-27T01:36:05.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/ac/8ecae334cdb65eca43303b676c7fb14fa147ad8e96b8f391253b2726b38d/sphinx_fonts-0.0.1a12.tar.gz", hash = "sha256:bcc36cff0d4b23b34fc5c83c2e60b3cdd2652e04c9c078c1efebc4c95ab0742d", size = 5679, upload-time = "2026-04-28T01:09:23.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/59/78833e18579c9b45dbc62069e947214f12da8e856a4a5cee4080243234d2/sphinx_fonts-0.0.1a11-py3-none-any.whl", hash = "sha256:edcd17b17eab5148174fffe401eb7809f2ecc65d8a255d81f7e0372cdaa0d86e", size = 4361, upload-time = "2026-04-27T01:35:49.209Z" }, + { url = "https://files.pythonhosted.org/packages/ae/80/8fb19be46f551dadcd6202a1952cf3c491046dcdb08df387ff5b94256da1/sphinx_fonts-0.0.1a12-py3-none-any.whl", hash = "sha256:865e62a7350c3e1db39cd186bb41dfb63a6695f78cba5af92f8f267a3c11f0c4", size = 4362, upload-time = "2026-04-28T01:09:07.053Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/49/6b658ee64f71f14b2c9b08bf4d206d9bfe0e2a3685d879181a0423720b40/sphinx_gp_opengraph-0.0.1a11.tar.gz", hash = "sha256:39ee8ae7a02c52f9fb87ea4c40c034d6b0c47576c06e7cab2e78b9c438ecc85c", size = 11815, upload-time = "2026-04-27T01:36:06.047Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/f1/fa3ab9307c261ad31b303b97f0545fb525824db14cb81a7dddc5ce154b99/sphinx_gp_opengraph-0.0.1a12.tar.gz", hash = "sha256:193b637ad7695a449fd998078288cef50bbcaeb53fa98bc3f756337f38fad3c9", size = 11816, upload-time = "2026-04-28T01:09:24.581Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/f4/9a3d1919030c83a84c273941ba79eab6b18417ac8f48eac6ea4ac5478f53/sphinx_gp_opengraph-0.0.1a11-py3-none-any.whl", hash = "sha256:d86a12dac6a400ac8ef8a5a8e6a6187a696ae08db047fcd03ae1bdbc2a59416a", size = 12182, upload-time = "2026-04-27T01:35:50.538Z" }, + { url = "https://files.pythonhosted.org/packages/df/e1/33aa6c889b1ef04d9251765ea3255657ccf3bc7893751c3166be8a874612/sphinx_gp_opengraph-0.0.1a12-py3-none-any.whl", hash = "sha256:7a0b9b3cde70370a0f74132b1a0e09a7784a02d50f01916034502cb4f0c13ed4", size = 12183, upload-time = "2026-04-28T01:09:08.455Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/ba/44e8457c3a8bde4cce0b714b68ffbb18104c177a919374bd924421d76e90/sphinx_gp_sitemap-0.0.1a11.tar.gz", hash = "sha256:cb4eab0714fea35afaa714fdddbc19ebbed403aeb582ee795eea583babdd3d25", size = 9863, upload-time = "2026-04-27T01:36:07.209Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/6b/d826539858272a04e697573751ae5a176733db0bdf38571eae359299a255/sphinx_gp_sitemap-0.0.1a12.tar.gz", hash = "sha256:c6edb345347d89ab65074fe014e71edc3c5bb4a55d2c45a918956a63a2d4a855", size = 9862, upload-time = "2026-04-28T01:09:25.69Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/40/12adf6d2870765976f232b4eb17121fbca02c8b4a860a8f37e562f02c5cc/sphinx_gp_sitemap-0.0.1a11-py3-none-any.whl", hash = "sha256:e4c66fd1f21316b7f7ef2c9cece9214a1eb08741876ae0d88a2ba1c22b5bccb4", size = 8982, upload-time = "2026-04-27T01:35:51.78Z" }, + { url = "https://files.pythonhosted.org/packages/0c/48/a67b406394cbeb906aa1b450bb192f005408e646ea8ec5900970e6c5ad15/sphinx_gp_sitemap-0.0.1a12-py3-none-any.whl", hash = "sha256:27ccdd7bfe6e7478cff96cf0e97cfcc825049c36d71125b5f70cffa5e6927c67", size = 8982, upload-time = "2026-04-28T01:09:09.618Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/89/efcb4c91cd6d71f00946e903cd622428d8331c9faaad972c18b4a55dc259/sphinx_gp_theme-0.0.1a11.tar.gz", hash = "sha256:9c1523e2417a7e409af7afd342e8588ee9616bbd4b9557290534900854dac92e", size = 16078, upload-time = "2026-04-27T01:36:08.438Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/18/18b891bf4219078c95ff2f3f48fa2dd28e446de80b40c8143736e8d40ea5/sphinx_gp_theme-0.0.1a12.tar.gz", hash = "sha256:d4ca88af980b6daebf5caaa3ead24b4e213ba542ab304db6ecc20adc41fa12d9", size = 16209, upload-time = "2026-04-28T01:09:26.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/3f/10a5cd41010f2c30a48662d7b2109e3b2f076d1550320f5fbb7724d10539/sphinx_gp_theme-0.0.1a11-py3-none-any.whl", hash = "sha256:9820e871871f7485bd0aec345b1942feb1bf30ef847068ae74e7bf25428b83a7", size = 17305, upload-time = "2026-04-27T01:35:53.288Z" }, + { url = "https://files.pythonhosted.org/packages/84/e4/951f3b5dcddd0addcd8ccf25f2634bb6f039864024b9b851ed3671cdd076/sphinx_gp_theme-0.0.1a12-py3-none-any.whl", hash = "sha256:affd42c3299e4f57ca33e42804b19b45cf4148e9f16b6062f900d6f0563516a3", size = 17442, upload-time = "2026-04-28T01:09:11.007Z" }, ] [[package]] @@ -1459,28 +1459,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/0c/0048d93b2e9e969a1486ec05d988f86ae8d15e5f8ce3631f329a8c6dfcd5/sphinx_ux_autodoc_layout-0.0.1a11.tar.gz", hash = "sha256:7fedd5c184649ec1879e03c16e241482f02ff175893ec4c9153110274a1357a0", size = 21325, upload-time = "2026-04-27T01:36:09.394Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/96/401f23594735af84b94126652fde9e19e5a0642081bc9ef7b623e01d6bcc/sphinx_ux_autodoc_layout-0.0.1a12.tar.gz", hash = "sha256:d480e1e712df45799ab0d810bb481528d11ea39b0f559def516d21f7d8cb8dd3", size = 21324, upload-time = "2026-04-28T01:09:28.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/88/7a88646e502fbc0bb78947d87a1a386304b1dc4770ead020d3921ea1bf14/sphinx_ux_autodoc_layout-0.0.1a11-py3-none-any.whl", hash = "sha256:dcc6cbd4b800fdd5c8b3c3c4bb70c6bd46ceb09cded6bb74d863b3b5a837ade4", size = 25144, upload-time = "2026-04-27T01:35:54.59Z" }, + { url = "https://files.pythonhosted.org/packages/87/6d/c65d2258e178e5e0280d3c6b382da156ef72d13cc6fb088927321e086e4b/sphinx_ux_autodoc_layout-0.0.1a12-py3-none-any.whl", hash = "sha256:c6674788a0f1ff69645375722b13ed61d58040732d7b1ec4065b8d398283606d", size = 25145, upload-time = "2026-04-28T01:09:12.238Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a11" +version = "0.0.1a12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/1a/89135927d3533fac3f7ed7b34811ae47a198e741983897675d8bd37610d9/sphinx_ux_badges-0.0.1a11.tar.gz", hash = "sha256:a33a55e33e1726950c2d983d5c256a4e44c3782d69b7bf58f4e46ac5a288419a", size = 15283, upload-time = "2026-04-27T01:36:10.65Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/38/b609d7370cd808d5af97a9d4a4de099bf1f379357c61f34a3857198eacee/sphinx_ux_badges-0.0.1a12.tar.gz", hash = "sha256:aa0dfe982d7ce6c326fc194e3caa63f63158bb815698ab5e1dfb7e7478d8e010", size = 15284, upload-time = "2026-04-28T01:09:28.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/a8/e660fdb0ba71e7161a764e9108a5d1db4b88bf5573b847a3c97700314a9c/sphinx_ux_badges-0.0.1a11-py3-none-any.whl", hash = "sha256:ff254bf3b5bb5ea1f607b6f9a9db0153821720a5d735ccd309ced015ab1236a2", size = 16278, upload-time = "2026-04-27T01:35:55.962Z" }, + { url = "https://files.pythonhosted.org/packages/81/30/c139a0e158abe3b16bc6bb25eaf32d2ace6aa6c2d8f87c0413da4058dd7d/sphinx_ux_badges-0.0.1a12-py3-none-any.whl", hash = "sha256:650db9bb38c97d32d9a766425f4f446185dc726970da18c3491a0196c16b1244", size = 16280, upload-time = "2026-04-28T01:09:13.412Z" }, ] [[package]] @@ -1642,7 +1642,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a11" }, + { name = "gp-sphinx", specifier = "==0.0.1a12" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1652,8 +1652,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a11" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a11" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a12" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a12" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1661,11 +1661,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a11" }, + { name = "gp-sphinx", specifier = "==0.0.1a12" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a11" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a11" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a12" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a12" }, ] lint = [ { name = "mypy" }, From 64f7fe32b4de0bbeb091a31d80f4e7d53d2fcf5a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Thu, 30 Apr 2026 18:29:37 -0500 Subject: [PATCH 2830/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a13 why: Pull in the gp-sphinx 0.0.1a13 release (#24 in the workspace), which lands the light-mode Pygments default (gp-sphinx-light palette replacing the monokai-on-light fallback) and the theme-scoped argparse highlighter. Without this bump the rendered docs keep serving dark-on-light code blocks under the light theme and an ignored-theme argparse palette. what: - pyproject.toml: gp-sphinx, sphinx-autodoc-argparse, sphinx-autodoc-api-style move 0.0.1a12 -> 0.0.1a13 in [dependency-groups] dev and docs. - uv.lock regenerated; gp-sphinx workspace siblings co-resolved to 0.0.1a13. --- pyproject.toml | 12 ++++---- uv.lock | 74 +++++++++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 852e778a23..a344682bcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a12", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a12", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a12", + "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a13", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a12", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a12", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a12", + "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a13", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 4d9f5f08ef..d986212939 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,7 @@ resolution-markers = [ ] [options] -exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer = "2026-04-27T23:29:37.242465642Z" exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/72/edebe2ab31642abf59c93767c39bb2a7865ec0a13a8490f888c079cdaae9/gp_sphinx-0.0.1a12.tar.gz", hash = "sha256:c31029d19bc79b5fa92620456ed1b78a7073b1480acb54d31cbf8fa80f16a9ac", size = 16337, upload-time = "2026-04-28T01:09:14.821Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/d8/abf17835495f654ac2715b6f079780c1e3b2d20c8c2492072fa263c20c46/gp_sphinx-0.0.1a13.tar.gz", hash = "sha256:59237c484f8e5e5e0818ba3279602653348551a9946a6eb4a60fb514933777f9", size = 16548, upload-time = "2026-04-30T23:22:22.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/25/106f9cb8caf09d9efb4df51c5d8f2c8e5075bd107a7c147e90487217b169/gp_sphinx-0.0.1a12-py3-none-any.whl", hash = "sha256:1ca147f561470fb44d5ceb71da164c445292e20001b0daf7485ed892ab551d29", size = 16749, upload-time = "2026-04-28T01:08:56.805Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/f9707771b6849a3ec8a52a0604329ab91f946b97781e2380b993d7bea705/gp_sphinx-0.0.1a13-py3-none-any.whl", hash = "sha256:dfede670b239cc93bd6b60535b5caf0e0f3ae6919687861ee3c11606289f04ec", size = 16977, upload-time = "2026-04-30T23:22:02.103Z" }, ] [[package]] @@ -1293,7 +1293,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1301,14 +1301,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/ac/a7e9726bf89c457a4f5e0c86ebd9789c65e75c5c0b51eed267e99ce659a9/sphinx_autodoc_api_style-0.0.1a12.tar.gz", hash = "sha256:67a3dd17c82c69e5f47fd0b9ffbf3a90a7a9bd588a45e2f5e0d47e90b979bfb6", size = 8270, upload-time = "2026-04-28T01:09:16.021Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/e3/645f3e755b9a10b1c318eb25ad0af5aa5239881e2ff7f81a0fd96cf5b765/sphinx_autodoc_api_style-0.0.1a13.tar.gz", hash = "sha256:9c2809e6ba704032302f768b89314a742049dc6ac310fd20574c83ce8c116fb6", size = 8269, upload-time = "2026-04-30T23:22:23.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/ea/3d3b7bab0ab5bc6001ca7657ec6abe7a1685d2aa58a4e4db04ec12ab516f/sphinx_autodoc_api_style-0.0.1a12-py3-none-any.whl", hash = "sha256:20377a629438d04fd36834043066246acd33112b06cbd2ed254a7ca6c1a7a90d", size = 8309, upload-time = "2026-04-28T01:08:58.045Z" }, + { url = "https://files.pythonhosted.org/packages/d5/cc/f70f6acb041167eaef39b72080f9edd42e6ed3c6bebacc888988ce7b212f/sphinx_autodoc_api_style-0.0.1a13-py3-none-any.whl", hash = "sha256:81b07fffd9f0390cbd8b87e4ba3344820beaf354b73ebbed3b99154beb6700fb", size = 8308, upload-time = "2026-04-30T23:22:03.751Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1316,22 +1316,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/da/ea69c01a3f9dd317903aa450dff5e1702d942fd95a6c1efb4879280f2a1f/sphinx_autodoc_argparse-0.0.1a12.tar.gz", hash = "sha256:955123e4ada9057fe0118d072dd285e7997659e4e35628e208400c600137695b", size = 42326, upload-time = "2026-04-28T01:09:16.913Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/19/df90a67d3715d2125e81150e54ee72fb671dbb4a830d4d00e192aba49bac/sphinx_autodoc_argparse-0.0.1a13.tar.gz", hash = "sha256:d3961db2dfffc6a9bd64cfab8ab4b80e7c0711eed313e18008be896410faeeac", size = 42324, upload-time = "2026-04-30T23:22:24.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/62/aadf5135808b348be11a10e3b2c6515c1417be1fa8d2634b324a98e43f78/sphinx_autodoc_argparse-0.0.1a12-py3-none-any.whl", hash = "sha256:d13f00ff7d527939c97618cfb2ffc32817b825700c68a848e673da5ad1d0a3e5", size = 47275, upload-time = "2026-04-28T01:08:59.511Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a0/404a05db304762beefc2fe3e81653978b9f5e20b5cc118aeeee2c48e9e58/sphinx_autodoc_argparse-0.0.1a13-py3-none-any.whl", hash = "sha256:ebd9f05e61af78cea7f293dda69791a3adc1478dc5ef150b106d6b659567a573", size = 47274, upload-time = "2026-04-30T23:22:05.204Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/73/8f4df9365b2481efd29e7ebdbb9bc9e7f53834b248763d197c739c0a4788/sphinx_autodoc_typehints_gp-0.0.1a12.tar.gz", hash = "sha256:40adeae781e6c453a7386fc240ac172ae7115da6e575bf8f3c1acb9e640beeda", size = 18463, upload-time = "2026-04-28T01:09:22.581Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/f3/612d82c8d7ab65500cc239b6e664b4e0ca4ed07de20779e9b3c51d98cdbb/sphinx_autodoc_typehints_gp-0.0.1a13.tar.gz", hash = "sha256:92dbdd6e70191d1745569ff9b2e6c17761e749575fb704906e02ae12d8c78bc6", size = 18463, upload-time = "2026-04-30T23:22:31.031Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/27/2767f1d960ad3a13ad925685563a8ddd18c858a5bec38338a6c3e48f6771/sphinx_autodoc_typehints_gp-0.0.1a12-py3-none-any.whl", hash = "sha256:a3451d1603895a35103325d431bcb50dd8381a3d1ca0a12ac437e7b658d624d2", size = 19007, upload-time = "2026-04-28T01:09:05.932Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a9/205cca3cd42a8a8461228d22f6043f9c6cfee8e3174d55c1d4b41425692a/sphinx_autodoc_typehints_gp-0.0.1a13-py3-none-any.whl", hash = "sha256:23064df749b2ceec160dc4886adfe251571a9d256be008d8c5412c1321480e02", size = 19008, upload-time = "2026-04-30T23:22:12.712Z" }, ] [[package]] @@ -1393,55 +1393,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/ac/8ecae334cdb65eca43303b676c7fb14fa147ad8e96b8f391253b2726b38d/sphinx_fonts-0.0.1a12.tar.gz", hash = "sha256:bcc36cff0d4b23b34fc5c83c2e60b3cdd2652e04c9c078c1efebc4c95ab0742d", size = 5679, upload-time = "2026-04-28T01:09:23.741Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/fc/1e5a7a664e62745cb1d9a9251afffe1a6e081c96d3655bc1d9d89d9703fa/sphinx_fonts-0.0.1a13.tar.gz", hash = "sha256:556ccaddaa81e7618ca72163d4f6c6e3179ae252d3c92637ccfd25837dfac38c", size = 5680, upload-time = "2026-04-30T23:22:31.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/80/8fb19be46f551dadcd6202a1952cf3c491046dcdb08df387ff5b94256da1/sphinx_fonts-0.0.1a12-py3-none-any.whl", hash = "sha256:865e62a7350c3e1db39cd186bb41dfb63a6695f78cba5af92f8f267a3c11f0c4", size = 4362, upload-time = "2026-04-28T01:09:07.053Z" }, + { url = "https://files.pythonhosted.org/packages/21/ce/9eea57147bcbc6474efbd7e43128a5222620891b78664a3c950160e05f0e/sphinx_fonts-0.0.1a13-py3-none-any.whl", hash = "sha256:3cc6f716547c9e46a9a8701b6b819f8d81d10e3ee91d94d6e006bb02e6534f38", size = 4361, upload-time = "2026-04-30T23:22:14.218Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/f1/fa3ab9307c261ad31b303b97f0545fb525824db14cb81a7dddc5ce154b99/sphinx_gp_opengraph-0.0.1a12.tar.gz", hash = "sha256:193b637ad7695a449fd998078288cef50bbcaeb53fa98bc3f756337f38fad3c9", size = 11816, upload-time = "2026-04-28T01:09:24.581Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/03/7fc6a8599b801ad6dd00b8ae97fb2bb7789962141a060d40a80aa626aaae/sphinx_gp_opengraph-0.0.1a13.tar.gz", hash = "sha256:6de8209f0e9cbad59e35cd4c87d023a86903cd9a4e4c80b0fa6ddd00f8c782c1", size = 11813, upload-time = "2026-04-30T23:22:33.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/e1/33aa6c889b1ef04d9251765ea3255657ccf3bc7893751c3166be8a874612/sphinx_gp_opengraph-0.0.1a12-py3-none-any.whl", hash = "sha256:7a0b9b3cde70370a0f74132b1a0e09a7784a02d50f01916034502cb4f0c13ed4", size = 12183, upload-time = "2026-04-28T01:09:08.455Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/83e8c1d9bda000b0a02fcd0b77cf343510c1040182681a7ee852a555e14e/sphinx_gp_opengraph-0.0.1a13-py3-none-any.whl", hash = "sha256:032559b855f3bb18623d916130980162c3467ef864d9cf75cdd4efbba4344d76", size = 12183, upload-time = "2026-04-30T23:22:15.461Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/6b/d826539858272a04e697573751ae5a176733db0bdf38571eae359299a255/sphinx_gp_sitemap-0.0.1a12.tar.gz", hash = "sha256:c6edb345347d89ab65074fe014e71edc3c5bb4a55d2c45a918956a63a2d4a855", size = 9862, upload-time = "2026-04-28T01:09:25.69Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/a9/f5447291d2665078c6d4686ab7dd178c6a9549b5a8a50e4c92bbad77179a/sphinx_gp_sitemap-0.0.1a13.tar.gz", hash = "sha256:d2c0deac702a64539077de965a6c626e1669d9e3064a45e97dcbdb4d6891ed21", size = 9864, upload-time = "2026-04-30T23:22:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/48/a67b406394cbeb906aa1b450bb192f005408e646ea8ec5900970e6c5ad15/sphinx_gp_sitemap-0.0.1a12-py3-none-any.whl", hash = "sha256:27ccdd7bfe6e7478cff96cf0e97cfcc825049c36d71125b5f70cffa5e6927c67", size = 8982, upload-time = "2026-04-28T01:09:09.618Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c4/c144343c6ebaa39366eb71f68cb7033a323e9b9b078f2c2f2120c7a3ba78/sphinx_gp_sitemap-0.0.1a13-py3-none-any.whl", hash = "sha256:7d1ee3a4a3e8e6181bc264d77c497a624d20e7a6cb367c687dee38d6acb79c6d", size = 8982, upload-time = "2026-04-30T23:22:16.898Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/18/18b891bf4219078c95ff2f3f48fa2dd28e446de80b40c8143736e8d40ea5/sphinx_gp_theme-0.0.1a12.tar.gz", hash = "sha256:d4ca88af980b6daebf5caaa3ead24b4e213ba542ab304db6ecc20adc41fa12d9", size = 16209, upload-time = "2026-04-28T01:09:26.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/f7/202da5cdbbad3037e0399a57c377b126070bbea4c2c90e941e0c78a5cfb0/sphinx_gp_theme-0.0.1a13.tar.gz", hash = "sha256:169a71f9f2dc0f6109feda8a46c7055bc9b1fbf7a2b290e1d86ab771a4409db8", size = 17640, upload-time = "2026-04-30T23:22:34.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/e4/951f3b5dcddd0addcd8ccf25f2634bb6f039864024b9b851ed3671cdd076/sphinx_gp_theme-0.0.1a12-py3-none-any.whl", hash = "sha256:affd42c3299e4f57ca33e42804b19b45cf4148e9f16b6062f900d6f0563516a3", size = 17442, upload-time = "2026-04-28T01:09:11.007Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8b/739a4d38b6941da61b53624fc157c59f21e8b1cea0d68762f7f72f795f2d/sphinx_gp_theme-0.0.1a13-py3-none-any.whl", hash = "sha256:ab4238c07e6433bce80e727409e8654f7510510d216426e36c9109197d27240e", size = 19279, upload-time = "2026-04-30T23:22:18.239Z" }, ] [[package]] @@ -1459,28 +1459,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/96/401f23594735af84b94126652fde9e19e5a0642081bc9ef7b623e01d6bcc/sphinx_ux_autodoc_layout-0.0.1a12.tar.gz", hash = "sha256:d480e1e712df45799ab0d810bb481528d11ea39b0f559def516d21f7d8cb8dd3", size = 21324, upload-time = "2026-04-28T01:09:28.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/33/be38ac26da13447fdbd719268cbff8cd29d75ba36ae7f0c4e21ec244eba6/sphinx_ux_autodoc_layout-0.0.1a13.tar.gz", hash = "sha256:b49ea9725724c407aae5a6c8c24414780d1c13520c2f0753940211ae5dd93629", size = 21324, upload-time = "2026-04-30T23:22:35.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/6d/c65d2258e178e5e0280d3c6b382da156ef72d13cc6fb088927321e086e4b/sphinx_ux_autodoc_layout-0.0.1a12-py3-none-any.whl", hash = "sha256:c6674788a0f1ff69645375722b13ed61d58040732d7b1ec4065b8d398283606d", size = 25145, upload-time = "2026-04-28T01:09:12.238Z" }, + { url = "https://files.pythonhosted.org/packages/74/36/4ff92c28d5af14e6b3c395016fb94fd9d75ae16ac7540a2e2ddd7cfb3df1/sphinx_ux_autodoc_layout-0.0.1a13-py3-none-any.whl", hash = "sha256:4a203d2fa42dc91304bdc5d540b35e1fded14819f20e1ba4c563fb177e8b0c10", size = 25143, upload-time = "2026-04-30T23:22:19.726Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a12" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/38/b609d7370cd808d5af97a9d4a4de099bf1f379357c61f34a3857198eacee/sphinx_ux_badges-0.0.1a12.tar.gz", hash = "sha256:aa0dfe982d7ce6c326fc194e3caa63f63158bb815698ab5e1dfb7e7478d8e010", size = 15284, upload-time = "2026-04-28T01:09:28.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/76/0d2275bf0de9ef74131c828f077a9c21377d9a5698906389cdf43b5759f9/sphinx_ux_badges-0.0.1a13.tar.gz", hash = "sha256:88c429a4b63cbb35c8f113985981092f62c559e9d3d5204f63ab0d010e9ecf65", size = 15284, upload-time = "2026-04-30T23:22:36.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/30/c139a0e158abe3b16bc6bb25eaf32d2ace6aa6c2d8f87c0413da4058dd7d/sphinx_ux_badges-0.0.1a12-py3-none-any.whl", hash = "sha256:650db9bb38c97d32d9a766425f4f446185dc726970da18c3491a0196c16b1244", size = 16280, upload-time = "2026-04-28T01:09:13.412Z" }, + { url = "https://files.pythonhosted.org/packages/48/26/2245dc4b805dab87b73ce2a0fec1d9ff8f8ba2127cb63892b6367093ad2a/sphinx_ux_badges-0.0.1a13-py3-none-any.whl", hash = "sha256:64ade9a187f593dd9254354b348fcd858eef99f1b0d8a57bc5baf54fe1dce779", size = 16281, upload-time = "2026-04-30T23:22:21.202Z" }, ] [[package]] @@ -1642,7 +1642,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a12" }, + { name = "gp-sphinx", specifier = "==0.0.1a13" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1652,8 +1652,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a12" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a12" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1661,11 +1661,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a12" }, + { name = "gp-sphinx", specifier = "==0.0.1a13" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a12" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a12" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, ] lint = [ { name = "mypy" }, From 37f425b0547368427be2eb9586a29e3216239408 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 May 2026 08:46:31 -0500 Subject: [PATCH 2831/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a14 why: Pick up the gp-sphinx 0.0.1a14 release, which fixes a light-mode distinguishability gap in the gp-sphinx-light Pygments style: Generic.Prompt is now coloured purple and Generic.Output cyan, so shell prompts ($, >>>, etc.) and command output stand out from surrounding text. Previously both fell through to a generic slate that matched section sub-headings, leaving prompts and command output visually indistinguishable. Mirrors the dark-mode (monokai) pink + cyan pairing already in place. what: - pyproject.toml: gp-sphinx, sphinx-autodoc-argparse, sphinx-autodoc-api-style move ==0.0.1a13 -> ==0.0.1a14 in [dependency-groups] dev and docs. - uv.lock: regenerated; gp-sphinx workspace siblings (sphinx-gp-theme, sphinx-ux-autodoc-layout, sphinx-ux-badges, sphinx-fonts, etc.) co-resolved to 0.0.1a14. ref: https://pypi.org/project/gp-sphinx/0.0.1a14/ --- pyproject.toml | 12 ++++---- uv.lock | 74 +++++++++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a344682bcd..3880e45cb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a13", + "gp-sphinx==0.0.1a14", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a14", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a14", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a13", + "gp-sphinx==0.0.1a14", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a14", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a14", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index d986212939..c609a9b2a0 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-04-27T23:29:37.242465642Z" +exclude-newer = "2026-04-29T13:45:32.54289551Z" exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/d8/abf17835495f654ac2715b6f079780c1e3b2d20c8c2492072fa263c20c46/gp_sphinx-0.0.1a13.tar.gz", hash = "sha256:59237c484f8e5e5e0818ba3279602653348551a9946a6eb4a60fb514933777f9", size = 16548, upload-time = "2026-04-30T23:22:22.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/63/b8520404d1fea1fbcff19fad96c3d093147be0366b8915238282fdf5d9b3/gp_sphinx-0.0.1a14.tar.gz", hash = "sha256:7b6f10f173d89b4b60ad28c36261b37785a1dadace94b89b38d65166bf45d3d5", size = 16548, upload-time = "2026-05-02T13:42:03.095Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/db/f9707771b6849a3ec8a52a0604329ab91f946b97781e2380b993d7bea705/gp_sphinx-0.0.1a13-py3-none-any.whl", hash = "sha256:dfede670b239cc93bd6b60535b5caf0e0f3ae6919687861ee3c11606289f04ec", size = 16977, upload-time = "2026-04-30T23:22:02.103Z" }, + { url = "https://files.pythonhosted.org/packages/a6/81/9724f20cf5725290fa6475fefdd839d0ac004cb86e19761840e187fe06c0/gp_sphinx-0.0.1a14-py3-none-any.whl", hash = "sha256:90afcb0c2c1938d209e3c7d5ba1d476495bd03804fe3d358c97e1924b2ebce97", size = 16978, upload-time = "2026-05-02T13:41:44.582Z" }, ] [[package]] @@ -1293,7 +1293,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1301,14 +1301,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/e3/645f3e755b9a10b1c318eb25ad0af5aa5239881e2ff7f81a0fd96cf5b765/sphinx_autodoc_api_style-0.0.1a13.tar.gz", hash = "sha256:9c2809e6ba704032302f768b89314a742049dc6ac310fd20574c83ce8c116fb6", size = 8269, upload-time = "2026-04-30T23:22:23.792Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/95/5c7ddca7d2a0f43e8ffca024f942eb983e6a50f51847cf1b5b22eda42b74/sphinx_autodoc_api_style-0.0.1a14.tar.gz", hash = "sha256:f70889e1cc52fdcb27279744411f64e79e72c83b5b187a8848906825cce5a012", size = 8270, upload-time = "2026-05-02T13:42:03.944Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/cc/f70f6acb041167eaef39b72080f9edd42e6ed3c6bebacc888988ce7b212f/sphinx_autodoc_api_style-0.0.1a13-py3-none-any.whl", hash = "sha256:81b07fffd9f0390cbd8b87e4ba3344820beaf354b73ebbed3b99154beb6700fb", size = 8308, upload-time = "2026-04-30T23:22:03.751Z" }, + { url = "https://files.pythonhosted.org/packages/44/65/b0ea9715b407135ec45b146218d63e663eeca53cb3585f2a9697ecd87397/sphinx_autodoc_api_style-0.0.1a14-py3-none-any.whl", hash = "sha256:24a34440d2b4d862de6550379dc61119373d948c55cb7197c455669c58a3fa5d", size = 8308, upload-time = "2026-05-02T13:41:46.024Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1316,22 +1316,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/19/df90a67d3715d2125e81150e54ee72fb671dbb4a830d4d00e192aba49bac/sphinx_autodoc_argparse-0.0.1a13.tar.gz", hash = "sha256:d3961db2dfffc6a9bd64cfab8ab4b80e7c0711eed313e18008be896410faeeac", size = 42324, upload-time = "2026-04-30T23:22:24.948Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/d0/896145d8c07df88bc311e0e1358bfae9f6ce0ce1a9bd947559bf484655d3/sphinx_autodoc_argparse-0.0.1a14.tar.gz", hash = "sha256:1fea0bcf4c4c05bc1d7e578eb2ff4126e37e19198e62021d6418223e3bb1aac5", size = 42323, upload-time = "2026-05-02T13:42:05.055Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/a0/404a05db304762beefc2fe3e81653978b9f5e20b5cc118aeeee2c48e9e58/sphinx_autodoc_argparse-0.0.1a13-py3-none-any.whl", hash = "sha256:ebd9f05e61af78cea7f293dda69791a3adc1478dc5ef150b106d6b659567a573", size = 47274, upload-time = "2026-04-30T23:22:05.204Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/ae500f5bed6a9cf5d594cf61815adfde07062fc1ee0097c0405a22565a52/sphinx_autodoc_argparse-0.0.1a14-py3-none-any.whl", hash = "sha256:4dd8ca59b007f8ca56e864e48ed0c60b92d124968ec3bab23ed7e5925a4784f7", size = 47276, upload-time = "2026-05-02T13:41:47.103Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/f3/612d82c8d7ab65500cc239b6e664b4e0ca4ed07de20779e9b3c51d98cdbb/sphinx_autodoc_typehints_gp-0.0.1a13.tar.gz", hash = "sha256:92dbdd6e70191d1745569ff9b2e6c17761e749575fb704906e02ae12d8c78bc6", size = 18463, upload-time = "2026-04-30T23:22:31.031Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/26/0c35b8c3ef3a4f8a16fd17d1e25ba0b90c4c0cc319126e5003bbe9bd2da5/sphinx_autodoc_typehints_gp-0.0.1a14.tar.gz", hash = "sha256:ab2efb43c3793b6832f3c6139fec501952b3c2b55cfdaf10bbcb9b341d9f5c5f", size = 18463, upload-time = "2026-05-02T13:42:10.547Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/a9/205cca3cd42a8a8461228d22f6043f9c6cfee8e3174d55c1d4b41425692a/sphinx_autodoc_typehints_gp-0.0.1a13-py3-none-any.whl", hash = "sha256:23064df749b2ceec160dc4886adfe251571a9d256be008d8c5412c1321480e02", size = 19008, upload-time = "2026-04-30T23:22:12.712Z" }, + { url = "https://files.pythonhosted.org/packages/49/e2/1ba9c6cd1f6ca5240b4afc503ecce74733eda5620f944ed58d903e12b98b/sphinx_autodoc_typehints_gp-0.0.1a14-py3-none-any.whl", hash = "sha256:4581d3a0282be124a4c9648de33592e13b675077ffeafceea8ccf2f10af21717", size = 19007, upload-time = "2026-05-02T13:41:54.065Z" }, ] [[package]] @@ -1393,55 +1393,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/fc/1e5a7a664e62745cb1d9a9251afffe1a6e081c96d3655bc1d9d89d9703fa/sphinx_fonts-0.0.1a13.tar.gz", hash = "sha256:556ccaddaa81e7618ca72163d4f6c6e3179ae252d3c92637ccfd25837dfac38c", size = 5680, upload-time = "2026-04-30T23:22:31.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/9f/de2bb1ddbd963e5cc82f4763f7f9cefbc96a057feba2e929ed4d57a15d64/sphinx_fonts-0.0.1a14.tar.gz", hash = "sha256:e78cd51f8e93b2eebdd1e87b8edd91aea940027fce064ed60327ef6eb7fa744a", size = 5680, upload-time = "2026-05-02T13:42:11.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/ce/9eea57147bcbc6474efbd7e43128a5222620891b78664a3c950160e05f0e/sphinx_fonts-0.0.1a13-py3-none-any.whl", hash = "sha256:3cc6f716547c9e46a9a8701b6b819f8d81d10e3ee91d94d6e006bb02e6534f38", size = 4361, upload-time = "2026-04-30T23:22:14.218Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c0/5fcb15dd6325e78904ed4f421225431434a2a5510e5583e8da0276f7872d/sphinx_fonts-0.0.1a14-py3-none-any.whl", hash = "sha256:7f23c48c82b560ac284595d9d7cd63799b4cf7831195ca94b7fab75cf91fa57c", size = 4361, upload-time = "2026-05-02T13:41:55.48Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/03/7fc6a8599b801ad6dd00b8ae97fb2bb7789962141a060d40a80aa626aaae/sphinx_gp_opengraph-0.0.1a13.tar.gz", hash = "sha256:6de8209f0e9cbad59e35cd4c87d023a86903cd9a4e4c80b0fa6ddd00f8c782c1", size = 11813, upload-time = "2026-04-30T23:22:33.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/f2/73fb96d4f61437292ac6c4327b044aaa6bbd73deef34b840af93198cb5c9/sphinx_gp_opengraph-0.0.1a14.tar.gz", hash = "sha256:b29e1739940e9a2e691ceabe62985135740e59fe609dc3b59630db72cfb8dd70", size = 11813, upload-time = "2026-05-02T13:42:12.429Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/58/83e8c1d9bda000b0a02fcd0b77cf343510c1040182681a7ee852a555e14e/sphinx_gp_opengraph-0.0.1a13-py3-none-any.whl", hash = "sha256:032559b855f3bb18623d916130980162c3467ef864d9cf75cdd4efbba4344d76", size = 12183, upload-time = "2026-04-30T23:22:15.461Z" }, + { url = "https://files.pythonhosted.org/packages/b8/8f/204b64cce65baffa46533141895d476059aea7d58a445833ac42247cd44b/sphinx_gp_opengraph-0.0.1a14-py3-none-any.whl", hash = "sha256:e2d2abde8512c1ee3747cef8c579862a9fa51dc53a4ea963f982cc5a89a7b4c5", size = 12183, upload-time = "2026-05-02T13:41:56.546Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/a9/f5447291d2665078c6d4686ab7dd178c6a9549b5a8a50e4c92bbad77179a/sphinx_gp_sitemap-0.0.1a13.tar.gz", hash = "sha256:d2c0deac702a64539077de965a6c626e1669d9e3064a45e97dcbdb4d6891ed21", size = 9864, upload-time = "2026-04-30T23:22:33.898Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/72/1597ea7873c515f6eb109afbe896bf322c12d2cd8599b7f017dfaee5c8c5/sphinx_gp_sitemap-0.0.1a14.tar.gz", hash = "sha256:ee437cfbae8c8d5aaa8e581d3d7a08631d7cdeb7ec244a9525db92e5f0632c2b", size = 9863, upload-time = "2026-05-02T13:42:13.214Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/c4/c144343c6ebaa39366eb71f68cb7033a323e9b9b078f2c2f2120c7a3ba78/sphinx_gp_sitemap-0.0.1a13-py3-none-any.whl", hash = "sha256:7d1ee3a4a3e8e6181bc264d77c497a624d20e7a6cb367c687dee38d6acb79c6d", size = 8982, upload-time = "2026-04-30T23:22:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e0/cd73655e5ddefaf5d5196368bb8f7413338ef44f8ee83f9bb0ab337c0195/sphinx_gp_sitemap-0.0.1a14-py3-none-any.whl", hash = "sha256:17ef6b79540de2883a94ac33531962b264337ab79ca2a9938c96622c52cfb84a", size = 8981, upload-time = "2026-05-02T13:41:57.917Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/f7/202da5cdbbad3037e0399a57c377b126070bbea4c2c90e941e0c78a5cfb0/sphinx_gp_theme-0.0.1a13.tar.gz", hash = "sha256:169a71f9f2dc0f6109feda8a46c7055bc9b1fbf7a2b290e1d86ab771a4409db8", size = 17640, upload-time = "2026-04-30T23:22:34.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/ef/e0db0d10a8ef09d5d7ed60f20fe8cc5f3865f74794a19d23a90f7d913b1f/sphinx_gp_theme-0.0.1a14.tar.gz", hash = "sha256:ed85eb3a7b116c470caeb928bd9c16f6b68147bf7993868e74418b7889adcc72", size = 17927, upload-time = "2026-05-02T13:42:14.311Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/8b/739a4d38b6941da61b53624fc157c59f21e8b1cea0d68762f7f72f795f2d/sphinx_gp_theme-0.0.1a13-py3-none-any.whl", hash = "sha256:ab4238c07e6433bce80e727409e8654f7510510d216426e36c9109197d27240e", size = 19279, upload-time = "2026-04-30T23:22:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/60/2b/0450a61c66c30725a66632e55d9b191b1343a1ccc756ebb156bf1cb17221/sphinx_gp_theme-0.0.1a14-py3-none-any.whl", hash = "sha256:a9211e1f54b20749b1e9af833ec1a90db7e0c79dd01dee0ba3a0f7a13d1e2677", size = 19593, upload-time = "2026-05-02T13:41:59.241Z" }, ] [[package]] @@ -1459,28 +1459,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/33/be38ac26da13447fdbd719268cbff8cd29d75ba36ae7f0c4e21ec244eba6/sphinx_ux_autodoc_layout-0.0.1a13.tar.gz", hash = "sha256:b49ea9725724c407aae5a6c8c24414780d1c13520c2f0753940211ae5dd93629", size = 21324, upload-time = "2026-04-30T23:22:35.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/ca/56baa19aaad01385b562b46144c337daa6773fdaafb180e2a24f04e7b347/sphinx_ux_autodoc_layout-0.0.1a14.tar.gz", hash = "sha256:257e1d73e6625134c5d4504b0281173d4156a81ebca2ac89fa99e18fdb43eb13", size = 21326, upload-time = "2026-05-02T13:42:15.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/36/4ff92c28d5af14e6b3c395016fb94fd9d75ae16ac7540a2e2ddd7cfb3df1/sphinx_ux_autodoc_layout-0.0.1a13-py3-none-any.whl", hash = "sha256:4a203d2fa42dc91304bdc5d540b35e1fded14819f20e1ba4c563fb177e8b0c10", size = 25143, upload-time = "2026-04-30T23:22:19.726Z" }, + { url = "https://files.pythonhosted.org/packages/ab/bd/9dfd303eaac604dd389113cbd3f62b4d9ad2b14ba423282b6102b35c22de/sphinx_ux_autodoc_layout-0.0.1a14-py3-none-any.whl", hash = "sha256:dc7cb215ea7dd47be13603f854156ae8f44b7383e91b884fce14388b60084c1a", size = 25145, upload-time = "2026-05-02T13:42:00.619Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a13" +version = "0.0.1a14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/76/0d2275bf0de9ef74131c828f077a9c21377d9a5698906389cdf43b5759f9/sphinx_ux_badges-0.0.1a13.tar.gz", hash = "sha256:88c429a4b63cbb35c8f113985981092f62c559e9d3d5204f63ab0d010e9ecf65", size = 15284, upload-time = "2026-04-30T23:22:36.85Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/5b/ad5f85ff8bfe77422a87f5bdb922408d6bc995883718b96d275cd6e5afb8/sphinx_ux_badges-0.0.1a14.tar.gz", hash = "sha256:8e22c12a92b241df17e739b15e1b707dd503d059cc7cd80d9af7f95e3f3a81e5", size = 15284, upload-time = "2026-05-02T13:42:16.292Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/26/2245dc4b805dab87b73ce2a0fec1d9ff8f8ba2127cb63892b6367093ad2a/sphinx_ux_badges-0.0.1a13-py3-none-any.whl", hash = "sha256:64ade9a187f593dd9254354b348fcd858eef99f1b0d8a57bc5baf54fe1dce779", size = 16281, upload-time = "2026-04-30T23:22:21.202Z" }, + { url = "https://files.pythonhosted.org/packages/16/e6/952b781dd95337fba3051567bcc55e1c2c99abe9e6448ad8b3a743705c3a/sphinx_ux_badges-0.0.1a14-py3-none-any.whl", hash = "sha256:b6466ad4ae2c220618dd8831c5e8545e08cda33372ea0708f02a33121038ce8c", size = 16280, upload-time = "2026-05-02T13:42:02.05Z" }, ] [[package]] @@ -1642,7 +1642,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a13" }, + { name = "gp-sphinx", specifier = "==0.0.1a14" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1652,8 +1652,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a14" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a14" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1661,11 +1661,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a13" }, + { name = "gp-sphinx", specifier = "==0.0.1a14" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a14" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a14" }, ] lint = [ { name = "mypy" }, From 325057b2071834805691be4d85c49e9b1cb4eb07 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 May 2026 11:46:35 -0500 Subject: [PATCH 2832/2998] py(deps[dev]) Bump dev packages --- uv.lock | 58 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/uv.lock b/uv.lock index c609a9b2a0..89e3818509 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-04-29T13:45:32.54289551Z" +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" [options.exclude-newer-package] @@ -374,7 +374,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -842,20 +842,20 @@ wheels = [ [[package]] name = "packaging" -version = "26.1" +version = "26.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] [[package]] name = "pathspec" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/17/9c3094b822982b9f1ea666d8580ce59000f61f87c1663556fb72031ad9ec/pathspec-1.1.0.tar.gz", hash = "sha256:f5d7c555da02fd8dde3e4a2354b6aba817a89112fa8f333f7917a2a4834dd080", size = 133918, upload-time = "2026-04-23T01:46:22.298Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/c9/8eed0486f074e9f1ca7f8ce5ad663e65f12fdab344028d658fa1b03d35e0/pathspec-1.1.0-py3-none-any.whl", hash = "sha256:574b128f7456bd899045ccd142dd446af7e6cfd0072d63ad73fbc55fbb4aaa42", size = 56264, upload-time = "2026-04-23T01:46:20.606Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] @@ -1146,27 +1146,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/8d/192f3d7103816158dfd5ea50d098ef2aec19194e6cbccd4b3485bdb2eb2d/ruff-0.15.11.tar.gz", hash = "sha256:f092b21708bf0e7437ce9ada249dfe688ff9a0954fc94abab05dcea7dcd29c33", size = 4637264, upload-time = "2026-04-16T18:46:26.58Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/1e/6aca3427f751295ab011828e15e9bf452200ac74484f1db4be0197b8170b/ruff-0.15.11-py3-none-linux_armv6l.whl", hash = "sha256:e927cfff503135c558eb581a0c9792264aae9507904eb27809cdcff2f2c847b7", size = 10607943, upload-time = "2026-04-16T18:46:05.967Z" }, - { url = "https://files.pythonhosted.org/packages/e7/26/1341c262e74f36d4e84f3d6f4df0ac68cd53331a66bfc5080daa17c84c0b/ruff-0.15.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7a1b5b2938d8f890b76084d4fa843604d787a912541eae85fd7e233398bbb73e", size = 10988592, upload-time = "2026-04-16T18:46:00.742Z" }, - { url = "https://files.pythonhosted.org/packages/03/71/850b1d6ffa9564fbb6740429bad53df1094082fe515c8c1e74b6d8d05f18/ruff-0.15.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d4176f3d194afbdaee6e41b9ccb1a2c287dba8700047df474abfbe773825d1cb", size = 10338501, upload-time = "2026-04-16T18:46:03.723Z" }, - { url = "https://files.pythonhosted.org/packages/f2/11/cc1284d3e298c45a817a6aadb6c3e1d70b45c9b36d8d9cce3387b495a03a/ruff-0.15.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b17c886fb88203ced3afe7f14e8d5ae96e9d2f4ccc0ee66aa19f2c2675a27e4", size = 10670693, upload-time = "2026-04-16T18:46:41.941Z" }, - { url = "https://files.pythonhosted.org/packages/ce/9e/f8288b034ab72b371513c13f9a41d9ba3effac54e24bfb467b007daee2ca/ruff-0.15.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:49fafa220220afe7758a487b048de4c8f9f767f37dfefad46b9dd06759d003eb", size = 10416177, upload-time = "2026-04-16T18:46:21.717Z" }, - { url = "https://files.pythonhosted.org/packages/85/71/504d79abfd3d92532ba6bbe3d1c19fada03e494332a59e37c7c2dabae427/ruff-0.15.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2ab8427e74a00d93b8bda1307b1e60970d40f304af38bccb218e056c220120d", size = 11221886, upload-time = "2026-04-16T18:46:15.086Z" }, - { url = "https://files.pythonhosted.org/packages/43/5a/947e6ab7a5ad603d65b474be15a4cbc6d29832db5d762cd142e4e3a74164/ruff-0.15.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:195072c0c8e1fc8f940652073df082e37a5d9cb43b4ab1e4d0566ab8977a13b7", size = 12075183, upload-time = "2026-04-16T18:46:07.944Z" }, - { url = "https://files.pythonhosted.org/packages/9f/a1/0b7bb6268775fdd3a0818aee8efd8f5b4e231d24dd4d528ced2534023182/ruff-0.15.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3a0996d486af3920dec930a2e7daed4847dfc12649b537a9335585ada163e9e", size = 11516575, upload-time = "2026-04-16T18:46:31.687Z" }, - { url = "https://files.pythonhosted.org/packages/30/c3/bb5168fc4d233cc06e95f482770d0f3c87945a0cd9f614b90ea8dc2f2833/ruff-0.15.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bef2cb556d509259f1fe440bb9cd33c756222cf0a7afe90d15edf0866702431", size = 11306537, upload-time = "2026-04-16T18:46:36.988Z" }, - { url = "https://files.pythonhosted.org/packages/e4/92/4cfae6441f3967317946f3b788136eecf093729b94d6561f963ed810c82e/ruff-0.15.11-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:030d921a836d7d4a12cf6e8d984a88b66094ccb0e0f17ddd55067c331191bf19", size = 11296813, upload-time = "2026-04-16T18:46:24.182Z" }, - { url = "https://files.pythonhosted.org/packages/43/26/972784c5dde8313acde8ac71ba8ac65475b85db4a2352a76c9934361f9bc/ruff-0.15.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0e783b599b4577788dbbb66b9addcef87e9a8832f4ce0c19e34bf55543a2f890", size = 10633136, upload-time = "2026-04-16T18:46:39.802Z" }, - { url = "https://files.pythonhosted.org/packages/5b/53/3985a4f185020c2f367f2e08a103032e12564829742a1b417980ce1514a0/ruff-0.15.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ae90592246625ba4a34349d68ec28d4400d75182b71baa196ddb9f82db025ef5", size = 10424701, upload-time = "2026-04-16T18:46:10.381Z" }, - { url = "https://files.pythonhosted.org/packages/d3/57/bf0dfb32241b56c83bb663a826133da4bf17f682ba8c096973065f6e6a68/ruff-0.15.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1f111d62e3c983ed20e0ca2e800f8d77433a5b1161947df99a5c2a3fb60514f0", size = 10873887, upload-time = "2026-04-16T18:46:29.157Z" }, - { url = "https://files.pythonhosted.org/packages/02/05/e48076b2a57dc33ee8c7a957296f97c744ca891a8ffb4ffb1aaa3b3f517d/ruff-0.15.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:06f483d6646f59eaffba9ae30956370d3a886625f511a3108994000480621d1c", size = 11404316, upload-time = "2026-04-16T18:46:19.462Z" }, - { url = "https://files.pythonhosted.org/packages/88/27/0195d15fe7a897cbcba0904792c4b7c9fdd958456c3a17d2ea6093716a9a/ruff-0.15.11-py3-none-win32.whl", hash = "sha256:476a2aa56b7da0b73a3ee80b6b2f0e19cce544245479adde7baa65466664d5f3", size = 10655535, upload-time = "2026-04-16T18:46:12.47Z" }, - { url = "https://files.pythonhosted.org/packages/3a/5e/c927b325bd4c1d3620211a4b96f47864633199feed60fa936025ab27e090/ruff-0.15.11-py3-none-win_amd64.whl", hash = "sha256:8b6756d88d7e234fb0c98c91511aae3cd519d5e3ed271cae31b20f39cb2a12a3", size = 11779692, upload-time = "2026-04-16T18:46:17.268Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/aeadee5443e49baa2facd51131159fd6301cc4ccfc1541e4df7b021c37dd/ruff-0.15.11-py3-none-win_arm64.whl", hash = "sha256:063fed18cc1bbe0ee7393957284a6fe8b588c6a406a285af3ee3f46da2391ee4", size = 11032614, upload-time = "2026-04-16T18:46:34.487Z" }, +version = "0.15.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, + { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, + { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, + { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, + { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, + { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, + { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, + { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, + { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, ] [[package]] From 1c0e9943696859959bd333e9b961065459f927e2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 May 2026 18:56:03 -0500 Subject: [PATCH 2833/2998] py(deps[uv]) Bump gp-sphinx workspace pins to 0.0.1a15 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Pick up the gp-sphinx 0.0.1a15 release. Bigger than the previous a14 cumulative bump — a15 ships the workspace-owned Furo replacement. For downstream consumers of gp-sphinx, the headline effects on next `uv sync`: - `furo` (and its transitive deps `accessible-pygments` + `sphinx-basic-ng`) drop out of the install tree. `sphinx-gp-theme` now inherits from `gp-furo` (a workspace-owned, Tailwind-v4 port of @pradyunsg's Furo) instead of upstream `furo`. - The CSS custom-property contract is preserved, so existing `light_css_variables` / `dark_css_variables` overrides keep working unchanged. Rendered output is visually equivalent to vanilla Furo modulo the gp-sphinx project layer already on top. - Two new workspace packages ship: `gp-furo-theme` (standalone Furo-equivalent theme, available without the gp-sphinx project layer) and `gp-sphinx-vite` (transparent Vite + pnpm orchestration that no-ops in production wheels). - Carries forward the a14 light-mode shell-output fix: `Generic.Prompt` is now purple and `Generic.Output` cyan in the `gp-sphinx-light` Pygments style. what: - pyproject.toml: gp-sphinx, sphinx-autodoc-argparse, sphinx-autodoc-api-style move ==0.0.1a14 -> ==0.0.1a15 in [dependency-groups] dev and docs. - pyproject.toml: [tool.uv.exclude-newer-package] gains `gp-furo-theme = false` and `gp-sphinx-vite = false` entries. Both are new gp-sphinx workspace packages introduced in a15; without these exemptions, uv's global `exclude-newer` filter rejects them as too-new and fails resolution (`hint: ... was filtered by 'exclude-newer'`). Mirrors the per-package exemption pattern already in place for the rest of the gp-sphinx workspace. - uv.lock: regenerated; gp-sphinx workspace siblings (sphinx-gp-theme, sphinx-ux-autodoc-layout, sphinx-ux-badges, sphinx-fonts, gp-furo-theme, gp-sphinx-vite, …) co-resolved to 0.0.1a15. ref: https://pypi.org/project/gp-sphinx/0.0.1a15/ --- pyproject.toml | 14 ++++---- uv.lock | 86 ++++++++++++++++++++++++++------------------------ 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3880e45cb4..f330dc44ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a14", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a14", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a14", + "gp-sphinx==0.0.1a15", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a15", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a15", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a14", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a14", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a14", + "gp-sphinx==0.0.1a15", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a15", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a15", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -121,7 +121,9 @@ build-backend = "hatchling.build" # committing a date that would age into the lockfile. Mirrors the # pattern at vcspull/pyproject.toml for libvcs. gp-libs = false +gp-furo-theme = false gp-sphinx = false +gp-sphinx-vite = false sphinx-autodoc-api-style = false sphinx-autodoc-argparse = false sphinx-autodoc-docutils = false diff --git a/uv.lock b/uv.lock index 89e3818509..9d45acd88c 100644 --- a/uv.lock +++ b/uv.lock @@ -21,7 +21,9 @@ sphinx-ux-autodoc-layout = false sphinx-autodoc-argparse = false sphinx-ux-badges = false gp-libs = false +gp-sphinx-vite = false sphinx-autodoc-docutils = false +gp-furo-theme = false sphinx-gp-sitemap = false sphinx-fonts = false sphinx-autodoc-typehints-gp = false @@ -374,7 +376,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -382,8 +384,8 @@ wheels = [ ] [[package]] -name = "furo" -version = "2025.12.19" +name = "gp-furo-theme" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -393,9 +395,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/29/f880bcfffae9375d21c5dd757cbdee0f9ead001fc1a1320a2bb4b0b28181/gp_furo_theme-0.0.1a15.tar.gz", hash = "sha256:6fbbc854ae9042af0a3f9fa71e50ef85a24f5f835dc6345b3d780fce248e0def", size = 43137, upload-time = "2026-05-02T23:51:43.385Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload-time = "2025-12-19T17:34:38.905Z" }, + { url = "https://files.pythonhosted.org/packages/26/b8/acf5af0b0032feb9a2f98a1970205f651710ccf4b16d330c44bb796d99a1/gp_furo_theme-0.0.1a15-py3-none-any.whl", hash = "sha256:d5327e34ecbb422512723e2da498bfa60af2a3f1768b16a5d2f5381497557afe", size = 28838, upload-time = "2026-05-02T23:45:36.593Z" }, ] [[package]] @@ -414,7 +416,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -435,9 +437,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/b8520404d1fea1fbcff19fad96c3d093147be0366b8915238282fdf5d9b3/gp_sphinx-0.0.1a14.tar.gz", hash = "sha256:7b6f10f173d89b4b60ad28c36261b37785a1dadace94b89b38d65166bf45d3d5", size = 16548, upload-time = "2026-05-02T13:42:03.095Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/92/0756e0d097d43bf236ae6eced0dee7eb284525393790e4a8e3fd59e6badf/gp_sphinx-0.0.1a15.tar.gz", hash = "sha256:cd33170d3e1afa3e9d997081c682329a813aea19b5bbd6cb23c47d81baa11501", size = 17031, upload-time = "2026-05-02T23:51:45.217Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/81/9724f20cf5725290fa6475fefdd839d0ac004cb86e19761840e187fe06c0/gp_sphinx-0.0.1a14-py3-none-any.whl", hash = "sha256:90afcb0c2c1938d209e3c7d5ba1d476495bd03804fe3d358c97e1924b2ebce97", size = 16978, upload-time = "2026-05-02T13:41:44.582Z" }, + { url = "https://files.pythonhosted.org/packages/69/fb/b9ff170ab93989b8bd5adecbde52b2c814ccadbef111cf88e225a526f536/gp_sphinx-0.0.1a15-py3-none-any.whl", hash = "sha256:b6694a78c98802147c5f6f50f7afbd1dba5efaed8121cb87124d1eb8350c6f75", size = 17384, upload-time = "2026-05-02T23:45:38.275Z" }, ] [[package]] @@ -1293,7 +1295,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1301,14 +1303,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/95/5c7ddca7d2a0f43e8ffca024f942eb983e6a50f51847cf1b5b22eda42b74/sphinx_autodoc_api_style-0.0.1a14.tar.gz", hash = "sha256:f70889e1cc52fdcb27279744411f64e79e72c83b5b187a8848906825cce5a012", size = 8270, upload-time = "2026-05-02T13:42:03.944Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/31/e9357f12951bfa1b1866a53f8b67568a06057e46bcb00fd704c4dd9bc6b9/sphinx_autodoc_api_style-0.0.1a15.tar.gz", hash = "sha256:4a8a5d263c5d3d89dd3ed078732d97db4a9adb960faf17333afe0080931eef9a", size = 8297, upload-time = "2026-05-02T23:51:47.811Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/65/b0ea9715b407135ec45b146218d63e663eeca53cb3585f2a9697ecd87397/sphinx_autodoc_api_style-0.0.1a14-py3-none-any.whl", hash = "sha256:24a34440d2b4d862de6550379dc61119373d948c55cb7197c455669c58a3fa5d", size = 8308, upload-time = "2026-05-02T13:41:46.024Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/0ae29dbecc78808c9eca7cf024df9e839e2e29370bc7cf4a7b75d9799b31/sphinx_autodoc_api_style-0.0.1a15-py3-none-any.whl", hash = "sha256:2b60fd09578857d590c4bf3e4d525e486c5973741b1b958854ce3f6b5d49524b", size = 8309, upload-time = "2026-05-02T23:51:24.629Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1316,22 +1318,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/d0/896145d8c07df88bc311e0e1358bfae9f6ce0ce1a9bd947559bf484655d3/sphinx_autodoc_argparse-0.0.1a14.tar.gz", hash = "sha256:1fea0bcf4c4c05bc1d7e578eb2ff4126e37e19198e62021d6418223e3bb1aac5", size = 42323, upload-time = "2026-05-02T13:42:05.055Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/11/a144aff9bf883b2884aad922e9df19c038207cf22711891894ef5a5c3891/sphinx_autodoc_argparse-0.0.1a15.tar.gz", hash = "sha256:3ba9636df4603b70277f5a05b12e5fea2dc59371225d4fcfd6774a5dd74b551e", size = 42348, upload-time = "2026-05-02T23:51:48.708Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/8a/ae500f5bed6a9cf5d594cf61815adfde07062fc1ee0097c0405a22565a52/sphinx_autodoc_argparse-0.0.1a14-py3-none-any.whl", hash = "sha256:4dd8ca59b007f8ca56e864e48ed0c60b92d124968ec3bab23ed7e5925a4784f7", size = 47276, upload-time = "2026-05-02T13:41:47.103Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b5/0dd3b674dd9da46ca290c6c1133b96fc40e3cd96be4c8aec91949f49285d/sphinx_autodoc_argparse-0.0.1a15-py3-none-any.whl", hash = "sha256:e60feaea13830786175d8b0d05828267c5f08af7e7f1bdb7ca500d2ff00fb46a", size = 47276, upload-time = "2026-05-02T23:51:26.175Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/26/0c35b8c3ef3a4f8a16fd17d1e25ba0b90c4c0cc319126e5003bbe9bd2da5/sphinx_autodoc_typehints_gp-0.0.1a14.tar.gz", hash = "sha256:ab2efb43c3793b6832f3c6139fec501952b3c2b55cfdaf10bbcb9b341d9f5c5f", size = 18463, upload-time = "2026-05-02T13:42:10.547Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/68/8bd8df4d1922fa57a9fefb1d056c5bce1b2c1e26758e869ac05ec35de272/sphinx_autodoc_typehints_gp-0.0.1a15.tar.gz", hash = "sha256:48034725f20080c9b2e7702273ee3814d69174982c08f350afc4a07306551280", size = 18489, upload-time = "2026-05-02T23:51:55.316Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/e2/1ba9c6cd1f6ca5240b4afc503ecce74733eda5620f944ed58d903e12b98b/sphinx_autodoc_typehints_gp-0.0.1a14-py3-none-any.whl", hash = "sha256:4581d3a0282be124a4c9648de33592e13b675077ffeafceea8ccf2f10af21717", size = 19007, upload-time = "2026-05-02T13:41:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/76/93/15535405bfa1f42082648513e40db38efe6c75dbac4099c0aa5256787bbd/sphinx_autodoc_typehints_gp-0.0.1a15-py3-none-any.whl", hash = "sha256:e0f867e12451b40661c5973be54a365a76181f0bf7671fa8be45e82a2e755b92", size = 19007, upload-time = "2026-05-02T23:51:33.203Z" }, ] [[package]] @@ -1393,55 +1395,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/9f/de2bb1ddbd963e5cc82f4763f7f9cefbc96a057feba2e929ed4d57a15d64/sphinx_fonts-0.0.1a14.tar.gz", hash = "sha256:e78cd51f8e93b2eebdd1e87b8edd91aea940027fce064ed60327ef6eb7fa744a", size = 5680, upload-time = "2026-05-02T13:42:11.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/58/f0b21385334bcd747d0cee633e0c5579ba5eb846ae471171fac121498dbd/sphinx_fonts-0.0.1a15.tar.gz", hash = "sha256:f42cb65e7a5d474c57339c4bdd98d041e7622ac71f402e1b135592fee5a84887", size = 5705, upload-time = "2026-05-02T23:51:56.507Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/c0/5fcb15dd6325e78904ed4f421225431434a2a5510e5583e8da0276f7872d/sphinx_fonts-0.0.1a14-py3-none-any.whl", hash = "sha256:7f23c48c82b560ac284595d9d7cd63799b4cf7831195ca94b7fab75cf91fa57c", size = 4361, upload-time = "2026-05-02T13:41:55.48Z" }, + { url = "https://files.pythonhosted.org/packages/53/11/a6162c2c1d590c97abf198af4d9ca07236c7606d3f1d050c457c76a58af3/sphinx_fonts-0.0.1a15-py3-none-any.whl", hash = "sha256:d54e61a442f1d1342e3598e7d71ecc24ad14ce3affb2610098dbb7eff03e0c03", size = 4361, upload-time = "2026-05-02T23:51:34.687Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/f2/73fb96d4f61437292ac6c4327b044aaa6bbd73deef34b840af93198cb5c9/sphinx_gp_opengraph-0.0.1a14.tar.gz", hash = "sha256:b29e1739940e9a2e691ceabe62985135740e59fe609dc3b59630db72cfb8dd70", size = 11813, upload-time = "2026-05-02T13:42:12.429Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/fe/5783be6bf5549cf069cf4c7fcb7c6c3178c9d1207c1dc279f949db55f23e/sphinx_gp_opengraph-0.0.1a15.tar.gz", hash = "sha256:31abdf0052bde4ac5c6ee0ea7c51f1edeeb67b02d09a4202eb288c74918b7b43", size = 11839, upload-time = "2026-05-02T23:51:57.385Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/8f/204b64cce65baffa46533141895d476059aea7d58a445833ac42247cd44b/sphinx_gp_opengraph-0.0.1a14-py3-none-any.whl", hash = "sha256:e2d2abde8512c1ee3747cef8c579862a9fa51dc53a4ea963f982cc5a89a7b4c5", size = 12183, upload-time = "2026-05-02T13:41:56.546Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0a/f2a91df6ff3a0cc423fd40e876066b60928345224fbf6cdad1578f6e7688/sphinx_gp_opengraph-0.0.1a15-py3-none-any.whl", hash = "sha256:f8756624ea7fb67706f56b945538ae4fa6f7706149bb55bb29281de3da72c1be", size = 12183, upload-time = "2026-05-02T23:51:36.194Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/72/1597ea7873c515f6eb109afbe896bf322c12d2cd8599b7f017dfaee5c8c5/sphinx_gp_sitemap-0.0.1a14.tar.gz", hash = "sha256:ee437cfbae8c8d5aaa8e581d3d7a08631d7cdeb7ec244a9525db92e5f0632c2b", size = 9863, upload-time = "2026-05-02T13:42:13.214Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/c5/290a7d16f8bba5751efcdad6b3c8813ee2853810d06be841106229d58dce/sphinx_gp_sitemap-0.0.1a15.tar.gz", hash = "sha256:d901a59d183655437075c98c7063aede30215e367b6290c91d05624efa4f12a2", size = 9884, upload-time = "2026-05-02T23:51:58.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e0/cd73655e5ddefaf5d5196368bb8f7413338ef44f8ee83f9bb0ab337c0195/sphinx_gp_sitemap-0.0.1a14-py3-none-any.whl", hash = "sha256:17ef6b79540de2883a94ac33531962b264337ab79ca2a9938c96622c52cfb84a", size = 8981, upload-time = "2026-05-02T13:41:57.917Z" }, + { url = "https://files.pythonhosted.org/packages/4c/30/abb55b486f830ede8583f31b0a84c358f446042a03d11be81073418dc0f1/sphinx_gp_sitemap-0.0.1a15-py3-none-any.whl", hash = "sha256:53ebfe443000c94f22fc0e73d06bc482975b70054e5fd2e3dd66ef32d54de99b", size = 8983, upload-time = "2026-05-02T23:51:37.638Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "furo" }, + { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/ef/e0db0d10a8ef09d5d7ed60f20fe8cc5f3865f74794a19d23a90f7d913b1f/sphinx_gp_theme-0.0.1a14.tar.gz", hash = "sha256:ed85eb3a7b116c470caeb928bd9c16f6b68147bf7993868e74418b7889adcc72", size = 17927, upload-time = "2026-05-02T13:42:14.311Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/58/c26c38c6aaac9df2094262bd9fc0cc7bee4023dc7ab18aef5051c94b94dd/sphinx_gp_theme-0.0.1a15.tar.gz", hash = "sha256:b95ffe93c8632bc47f835a71d97d20b3bae7c340caacabc4e3ff46dbb647afbe", size = 17970, upload-time = "2026-05-02T23:51:59.813Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/2b/0450a61c66c30725a66632e55d9b191b1343a1ccc756ebb156bf1cb17221/sphinx_gp_theme-0.0.1a14-py3-none-any.whl", hash = "sha256:a9211e1f54b20749b1e9af833ec1a90db7e0c79dd01dee0ba3a0f7a13d1e2677", size = 19593, upload-time = "2026-05-02T13:41:59.241Z" }, + { url = "https://files.pythonhosted.org/packages/da/a9/a3e95ec7bf6357957a02d0d2da154549a34d4091c1b36916ffc4c90fadc3/sphinx_gp_theme-0.0.1a15-py3-none-any.whl", hash = "sha256:f46cdfdf91d6b9588af905e6256bdc896758c9c726b5fb291114da8c34441952", size = 19611, upload-time = "2026-05-02T23:51:39.04Z" }, ] [[package]] @@ -1459,28 +1461,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/ca/56baa19aaad01385b562b46144c337daa6773fdaafb180e2a24f04e7b347/sphinx_ux_autodoc_layout-0.0.1a14.tar.gz", hash = "sha256:257e1d73e6625134c5d4504b0281173d4156a81ebca2ac89fa99e18fdb43eb13", size = 21326, upload-time = "2026-05-02T13:42:15.473Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/de/7e3e7e6904f333fb0f91f15bb1f154f93dcf3b2b171f686c9da6c3f96463/sphinx_ux_autodoc_layout-0.0.1a15.tar.gz", hash = "sha256:d98b85eff727b56dceef6ad810776df0eb6dddb595f4f20356679eeea4536751", size = 21352, upload-time = "2026-05-02T23:52:00.72Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/bd/9dfd303eaac604dd389113cbd3f62b4d9ad2b14ba423282b6102b35c22de/sphinx_ux_autodoc_layout-0.0.1a14-py3-none-any.whl", hash = "sha256:dc7cb215ea7dd47be13603f854156ae8f44b7383e91b884fce14388b60084c1a", size = 25145, upload-time = "2026-05-02T13:42:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/02/ee/cd541815d475aa608c2a554affcd8f8b1b2aca26d070f61e4cbff6699cb8/sphinx_ux_autodoc_layout-0.0.1a15-py3-none-any.whl", hash = "sha256:a84de8ae79793c8860077b8fee2fd7cc048e93a0b1934f0dc2cb52c2f75bb1cc", size = 25145, upload-time = "2026-05-02T23:51:40.661Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a14" +version = "0.0.1a15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/5b/ad5f85ff8bfe77422a87f5bdb922408d6bc995883718b96d275cd6e5afb8/sphinx_ux_badges-0.0.1a14.tar.gz", hash = "sha256:8e22c12a92b241df17e739b15e1b707dd503d059cc7cd80d9af7f95e3f3a81e5", size = 15284, upload-time = "2026-05-02T13:42:16.292Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/89/1c2b920a0bf973faac9f409279820b6e30f6c1df1bd78e157defe8842e2c/sphinx_ux_badges-0.0.1a15.tar.gz", hash = "sha256:2a8539d910a63abda427bbb60f3da585c068f8bdee233ac15f9727ac4f1bfcc2", size = 15310, upload-time = "2026-05-02T23:52:01.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e6/952b781dd95337fba3051567bcc55e1c2c99abe9e6448ad8b3a743705c3a/sphinx_ux_badges-0.0.1a14-py3-none-any.whl", hash = "sha256:b6466ad4ae2c220618dd8831c5e8545e08cda33372ea0708f02a33121038ce8c", size = 16280, upload-time = "2026-05-02T13:42:02.05Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ec/e7366c3e5b4984ec30520581a7731865e7b83d49d3d5a27a3d558062a9fa/sphinx_ux_badges-0.0.1a15-py3-none-any.whl", hash = "sha256:166d20b22b12c229ae08de90bd0451d9d3b6042095ede53f273773e75c92e3d8", size = 16283, upload-time = "2026-05-02T23:51:42.137Z" }, ] [[package]] @@ -1642,7 +1644,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a14" }, + { name = "gp-sphinx", specifier = "==0.0.1a15" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1652,8 +1654,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a14" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a14" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a15" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a15" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1661,11 +1663,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a14" }, + { name = "gp-sphinx", specifier = "==0.0.1a15" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a14" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a14" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a15" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a15" }, ] lint = [ { name = "mypy" }, From 953ac4609824db8939d36844e3af317a4c462900 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 2 May 2026 20:50:24 -0500 Subject: [PATCH 2834/2998] py(deps[uv]) Revert gp-sphinx workspace pins from 0.0.1a15 back to 0.0.1a13 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: The published `gp_furo_theme-0.0.1a15-py3-none-any.whl` is broken — 28 KB, no `theme/gp-furo/static/` directory, no built CSS or JS. Every consumer of `gp-sphinx==0.0.1a15` therefore renders an unstyled docs site (e.g. https://libtmux.git-pull.com/, https://gp-sphinx.git-pull.com/). Two failures chained in the v0.0.1a15 release: 1. `release.yml` ran `uv build` without first running `pnpm exec vite build`, so the gitignored `static/` tree was empty when hatchling packed the wheel. 2. Even if vite had run, `static/` is gitignored — without `[tool.hatch.build.targets.{sdist,wheel}.force-include]`, hatchling's default gitignore-aware file selection would still have dropped it. A force-include + CI ordering fix is in flight on `git-pull/gp-sphinx` (#27, branch `loud-fail-missing-assets`), but it introduced a fresh regression: editable installs via `uv sync` now fail with `FileNotFoundError: Forced include not found` when the static dir doesn't exist on disk. The packaging design needs more work before a16 can ship. In the meantime, pinning every consumer back to a13 (the last version that produced a working wheel — see https://pypi.org/project/gp-sphinx/0.0.1a13/) unblocks docs builds across all 14 downstream sites. We chose a13 rather than a14 because a14 was also part of the broken release wave (same packaging architecture, same risk surface). what: - pyproject.toml: revert all gp-sphinx workspace pins from `==0.0.1a15` back to `==0.0.1a13` in `[dependency-groups] dev` and `docs`. - uv.lock: regenerated against the a13 pins; gp-sphinx workspace siblings (sphinx-gp-theme, sphinx-ux-autodoc-layout, sphinx-ux-badges, sphinx-fonts, sphinx-autodoc-typehints-gp, …) co-resolved back to 0.0.1a13. The upstream `furo==2025.12.19` dependency reappears as a transitive (gp-sphinx 0.0.1a13 still consumed it; a15 replaced it with the in-tree `gp-furo-theme`). ref: https://pypi.org/project/gp-sphinx/0.0.1a13/ ref: https://github.com/git-pull/gp-sphinx/pull/27 --- pyproject.toml | 12 ++++---- uv.lock | 82 +++++++++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f330dc44ef..8c12a710ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a15", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a15", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a15", + "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a13", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a15", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a15", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a15", + "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a13", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 9d45acd88c..e01ee309b4 100644 --- a/uv.lock +++ b/uv.lock @@ -384,8 +384,8 @@ wheels = [ ] [[package]] -name = "gp-furo-theme" -version = "0.0.1a15" +name = "furo" +version = "2025.12.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -395,9 +395,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/29/f880bcfffae9375d21c5dd757cbdee0f9ead001fc1a1320a2bb4b0b28181/gp_furo_theme-0.0.1a15.tar.gz", hash = "sha256:6fbbc854ae9042af0a3f9fa71e50ef85a24f5f835dc6345b3d780fce248e0def", size = 43137, upload-time = "2026-05-02T23:51:43.385Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/b8/acf5af0b0032feb9a2f98a1970205f651710ccf4b16d330c44bb796d99a1/gp_furo_theme-0.0.1a15-py3-none-any.whl", hash = "sha256:d5327e34ecbb422512723e2da498bfa60af2a3f1768b16a5d2f5381497557afe", size = 28838, upload-time = "2026-05-02T23:45:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload-time = "2025-12-19T17:34:38.905Z" }, ] [[package]] @@ -416,7 +416,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -437,9 +437,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/92/0756e0d097d43bf236ae6eced0dee7eb284525393790e4a8e3fd59e6badf/gp_sphinx-0.0.1a15.tar.gz", hash = "sha256:cd33170d3e1afa3e9d997081c682329a813aea19b5bbd6cb23c47d81baa11501", size = 17031, upload-time = "2026-05-02T23:51:45.217Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/d8/abf17835495f654ac2715b6f079780c1e3b2d20c8c2492072fa263c20c46/gp_sphinx-0.0.1a13.tar.gz", hash = "sha256:59237c484f8e5e5e0818ba3279602653348551a9946a6eb4a60fb514933777f9", size = 16548, upload-time = "2026-04-30T23:22:22.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/fb/b9ff170ab93989b8bd5adecbde52b2c814ccadbef111cf88e225a526f536/gp_sphinx-0.0.1a15-py3-none-any.whl", hash = "sha256:b6694a78c98802147c5f6f50f7afbd1dba5efaed8121cb87124d1eb8350c6f75", size = 17384, upload-time = "2026-05-02T23:45:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/f9707771b6849a3ec8a52a0604329ab91f946b97781e2380b993d7bea705/gp_sphinx-0.0.1a13-py3-none-any.whl", hash = "sha256:dfede670b239cc93bd6b60535b5caf0e0f3ae6919687861ee3c11606289f04ec", size = 16977, upload-time = "2026-04-30T23:22:02.103Z" }, ] [[package]] @@ -1295,7 +1295,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1303,14 +1303,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/31/e9357f12951bfa1b1866a53f8b67568a06057e46bcb00fd704c4dd9bc6b9/sphinx_autodoc_api_style-0.0.1a15.tar.gz", hash = "sha256:4a8a5d263c5d3d89dd3ed078732d97db4a9adb960faf17333afe0080931eef9a", size = 8297, upload-time = "2026-05-02T23:51:47.811Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/e3/645f3e755b9a10b1c318eb25ad0af5aa5239881e2ff7f81a0fd96cf5b765/sphinx_autodoc_api_style-0.0.1a13.tar.gz", hash = "sha256:9c2809e6ba704032302f768b89314a742049dc6ac310fd20574c83ce8c116fb6", size = 8269, upload-time = "2026-04-30T23:22:23.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/a9/0ae29dbecc78808c9eca7cf024df9e839e2e29370bc7cf4a7b75d9799b31/sphinx_autodoc_api_style-0.0.1a15-py3-none-any.whl", hash = "sha256:2b60fd09578857d590c4bf3e4d525e486c5973741b1b958854ce3f6b5d49524b", size = 8309, upload-time = "2026-05-02T23:51:24.629Z" }, + { url = "https://files.pythonhosted.org/packages/d5/cc/f70f6acb041167eaef39b72080f9edd42e6ed3c6bebacc888988ce7b212f/sphinx_autodoc_api_style-0.0.1a13-py3-none-any.whl", hash = "sha256:81b07fffd9f0390cbd8b87e4ba3344820beaf354b73ebbed3b99154beb6700fb", size = 8308, upload-time = "2026-04-30T23:22:03.751Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1318,22 +1318,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/11/a144aff9bf883b2884aad922e9df19c038207cf22711891894ef5a5c3891/sphinx_autodoc_argparse-0.0.1a15.tar.gz", hash = "sha256:3ba9636df4603b70277f5a05b12e5fea2dc59371225d4fcfd6774a5dd74b551e", size = 42348, upload-time = "2026-05-02T23:51:48.708Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/19/df90a67d3715d2125e81150e54ee72fb671dbb4a830d4d00e192aba49bac/sphinx_autodoc_argparse-0.0.1a13.tar.gz", hash = "sha256:d3961db2dfffc6a9bd64cfab8ab4b80e7c0711eed313e18008be896410faeeac", size = 42324, upload-time = "2026-04-30T23:22:24.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/b5/0dd3b674dd9da46ca290c6c1133b96fc40e3cd96be4c8aec91949f49285d/sphinx_autodoc_argparse-0.0.1a15-py3-none-any.whl", hash = "sha256:e60feaea13830786175d8b0d05828267c5f08af7e7f1bdb7ca500d2ff00fb46a", size = 47276, upload-time = "2026-05-02T23:51:26.175Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a0/404a05db304762beefc2fe3e81653978b9f5e20b5cc118aeeee2c48e9e58/sphinx_autodoc_argparse-0.0.1a13-py3-none-any.whl", hash = "sha256:ebd9f05e61af78cea7f293dda69791a3adc1478dc5ef150b106d6b659567a573", size = 47274, upload-time = "2026-04-30T23:22:05.204Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/68/8bd8df4d1922fa57a9fefb1d056c5bce1b2c1e26758e869ac05ec35de272/sphinx_autodoc_typehints_gp-0.0.1a15.tar.gz", hash = "sha256:48034725f20080c9b2e7702273ee3814d69174982c08f350afc4a07306551280", size = 18489, upload-time = "2026-05-02T23:51:55.316Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/f3/612d82c8d7ab65500cc239b6e664b4e0ca4ed07de20779e9b3c51d98cdbb/sphinx_autodoc_typehints_gp-0.0.1a13.tar.gz", hash = "sha256:92dbdd6e70191d1745569ff9b2e6c17761e749575fb704906e02ae12d8c78bc6", size = 18463, upload-time = "2026-04-30T23:22:31.031Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/93/15535405bfa1f42082648513e40db38efe6c75dbac4099c0aa5256787bbd/sphinx_autodoc_typehints_gp-0.0.1a15-py3-none-any.whl", hash = "sha256:e0f867e12451b40661c5973be54a365a76181f0bf7671fa8be45e82a2e755b92", size = 19007, upload-time = "2026-05-02T23:51:33.203Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a9/205cca3cd42a8a8461228d22f6043f9c6cfee8e3174d55c1d4b41425692a/sphinx_autodoc_typehints_gp-0.0.1a13-py3-none-any.whl", hash = "sha256:23064df749b2ceec160dc4886adfe251571a9d256be008d8c5412c1321480e02", size = 19008, upload-time = "2026-04-30T23:22:12.712Z" }, ] [[package]] @@ -1395,55 +1395,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/58/f0b21385334bcd747d0cee633e0c5579ba5eb846ae471171fac121498dbd/sphinx_fonts-0.0.1a15.tar.gz", hash = "sha256:f42cb65e7a5d474c57339c4bdd98d041e7622ac71f402e1b135592fee5a84887", size = 5705, upload-time = "2026-05-02T23:51:56.507Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/fc/1e5a7a664e62745cb1d9a9251afffe1a6e081c96d3655bc1d9d89d9703fa/sphinx_fonts-0.0.1a13.tar.gz", hash = "sha256:556ccaddaa81e7618ca72163d4f6c6e3179ae252d3c92637ccfd25837dfac38c", size = 5680, upload-time = "2026-04-30T23:22:31.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/11/a6162c2c1d590c97abf198af4d9ca07236c7606d3f1d050c457c76a58af3/sphinx_fonts-0.0.1a15-py3-none-any.whl", hash = "sha256:d54e61a442f1d1342e3598e7d71ecc24ad14ce3affb2610098dbb7eff03e0c03", size = 4361, upload-time = "2026-05-02T23:51:34.687Z" }, + { url = "https://files.pythonhosted.org/packages/21/ce/9eea57147bcbc6474efbd7e43128a5222620891b78664a3c950160e05f0e/sphinx_fonts-0.0.1a13-py3-none-any.whl", hash = "sha256:3cc6f716547c9e46a9a8701b6b819f8d81d10e3ee91d94d6e006bb02e6534f38", size = 4361, upload-time = "2026-04-30T23:22:14.218Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/fe/5783be6bf5549cf069cf4c7fcb7c6c3178c9d1207c1dc279f949db55f23e/sphinx_gp_opengraph-0.0.1a15.tar.gz", hash = "sha256:31abdf0052bde4ac5c6ee0ea7c51f1edeeb67b02d09a4202eb288c74918b7b43", size = 11839, upload-time = "2026-05-02T23:51:57.385Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/03/7fc6a8599b801ad6dd00b8ae97fb2bb7789962141a060d40a80aa626aaae/sphinx_gp_opengraph-0.0.1a13.tar.gz", hash = "sha256:6de8209f0e9cbad59e35cd4c87d023a86903cd9a4e4c80b0fa6ddd00f8c782c1", size = 11813, upload-time = "2026-04-30T23:22:33.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/0a/f2a91df6ff3a0cc423fd40e876066b60928345224fbf6cdad1578f6e7688/sphinx_gp_opengraph-0.0.1a15-py3-none-any.whl", hash = "sha256:f8756624ea7fb67706f56b945538ae4fa6f7706149bb55bb29281de3da72c1be", size = 12183, upload-time = "2026-05-02T23:51:36.194Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/83e8c1d9bda000b0a02fcd0b77cf343510c1040182681a7ee852a555e14e/sphinx_gp_opengraph-0.0.1a13-py3-none-any.whl", hash = "sha256:032559b855f3bb18623d916130980162c3467ef864d9cf75cdd4efbba4344d76", size = 12183, upload-time = "2026-04-30T23:22:15.461Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/c5/290a7d16f8bba5751efcdad6b3c8813ee2853810d06be841106229d58dce/sphinx_gp_sitemap-0.0.1a15.tar.gz", hash = "sha256:d901a59d183655437075c98c7063aede30215e367b6290c91d05624efa4f12a2", size = 9884, upload-time = "2026-05-02T23:51:58.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/a9/f5447291d2665078c6d4686ab7dd178c6a9549b5a8a50e4c92bbad77179a/sphinx_gp_sitemap-0.0.1a13.tar.gz", hash = "sha256:d2c0deac702a64539077de965a6c626e1669d9e3064a45e97dcbdb4d6891ed21", size = 9864, upload-time = "2026-04-30T23:22:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/30/abb55b486f830ede8583f31b0a84c358f446042a03d11be81073418dc0f1/sphinx_gp_sitemap-0.0.1a15-py3-none-any.whl", hash = "sha256:53ebfe443000c94f22fc0e73d06bc482975b70054e5fd2e3dd66ef32d54de99b", size = 8983, upload-time = "2026-05-02T23:51:37.638Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c4/c144343c6ebaa39366eb71f68cb7033a323e9b9b078f2c2f2120c7a3ba78/sphinx_gp_sitemap-0.0.1a13-py3-none-any.whl", hash = "sha256:7d1ee3a4a3e8e6181bc264d77c497a624d20e7a6cb367c687dee38d6acb79c6d", size = 8982, upload-time = "2026-04-30T23:22:16.898Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "gp-furo-theme" }, + { name = "furo" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/58/c26c38c6aaac9df2094262bd9fc0cc7bee4023dc7ab18aef5051c94b94dd/sphinx_gp_theme-0.0.1a15.tar.gz", hash = "sha256:b95ffe93c8632bc47f835a71d97d20b3bae7c340caacabc4e3ff46dbb647afbe", size = 17970, upload-time = "2026-05-02T23:51:59.813Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/f7/202da5cdbbad3037e0399a57c377b126070bbea4c2c90e941e0c78a5cfb0/sphinx_gp_theme-0.0.1a13.tar.gz", hash = "sha256:169a71f9f2dc0f6109feda8a46c7055bc9b1fbf7a2b290e1d86ab771a4409db8", size = 17640, upload-time = "2026-04-30T23:22:34.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/a9/a3e95ec7bf6357957a02d0d2da154549a34d4091c1b36916ffc4c90fadc3/sphinx_gp_theme-0.0.1a15-py3-none-any.whl", hash = "sha256:f46cdfdf91d6b9588af905e6256bdc896758c9c726b5fb291114da8c34441952", size = 19611, upload-time = "2026-05-02T23:51:39.04Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8b/739a4d38b6941da61b53624fc157c59f21e8b1cea0d68762f7f72f795f2d/sphinx_gp_theme-0.0.1a13-py3-none-any.whl", hash = "sha256:ab4238c07e6433bce80e727409e8654f7510510d216426e36c9109197d27240e", size = 19279, upload-time = "2026-04-30T23:22:18.239Z" }, ] [[package]] @@ -1461,28 +1461,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/de/7e3e7e6904f333fb0f91f15bb1f154f93dcf3b2b171f686c9da6c3f96463/sphinx_ux_autodoc_layout-0.0.1a15.tar.gz", hash = "sha256:d98b85eff727b56dceef6ad810776df0eb6dddb595f4f20356679eeea4536751", size = 21352, upload-time = "2026-05-02T23:52:00.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/33/be38ac26da13447fdbd719268cbff8cd29d75ba36ae7f0c4e21ec244eba6/sphinx_ux_autodoc_layout-0.0.1a13.tar.gz", hash = "sha256:b49ea9725724c407aae5a6c8c24414780d1c13520c2f0753940211ae5dd93629", size = 21324, upload-time = "2026-04-30T23:22:35.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/ee/cd541815d475aa608c2a554affcd8f8b1b2aca26d070f61e4cbff6699cb8/sphinx_ux_autodoc_layout-0.0.1a15-py3-none-any.whl", hash = "sha256:a84de8ae79793c8860077b8fee2fd7cc048e93a0b1934f0dc2cb52c2f75bb1cc", size = 25145, upload-time = "2026-05-02T23:51:40.661Z" }, + { url = "https://files.pythonhosted.org/packages/74/36/4ff92c28d5af14e6b3c395016fb94fd9d75ae16ac7540a2e2ddd7cfb3df1/sphinx_ux_autodoc_layout-0.0.1a13-py3-none-any.whl", hash = "sha256:4a203d2fa42dc91304bdc5d540b35e1fded14819f20e1ba4c563fb177e8b0c10", size = 25143, upload-time = "2026-04-30T23:22:19.726Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a15" +version = "0.0.1a13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/89/1c2b920a0bf973faac9f409279820b6e30f6c1df1bd78e157defe8842e2c/sphinx_ux_badges-0.0.1a15.tar.gz", hash = "sha256:2a8539d910a63abda427bbb60f3da585c068f8bdee233ac15f9727ac4f1bfcc2", size = 15310, upload-time = "2026-05-02T23:52:01.674Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/76/0d2275bf0de9ef74131c828f077a9c21377d9a5698906389cdf43b5759f9/sphinx_ux_badges-0.0.1a13.tar.gz", hash = "sha256:88c429a4b63cbb35c8f113985981092f62c559e9d3d5204f63ab0d010e9ecf65", size = 15284, upload-time = "2026-04-30T23:22:36.85Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ec/e7366c3e5b4984ec30520581a7731865e7b83d49d3d5a27a3d558062a9fa/sphinx_ux_badges-0.0.1a15-py3-none-any.whl", hash = "sha256:166d20b22b12c229ae08de90bd0451d9d3b6042095ede53f273773e75c92e3d8", size = 16283, upload-time = "2026-05-02T23:51:42.137Z" }, + { url = "https://files.pythonhosted.org/packages/48/26/2245dc4b805dab87b73ce2a0fec1d9ff8f8ba2127cb63892b6367093ad2a/sphinx_ux_badges-0.0.1a13-py3-none-any.whl", hash = "sha256:64ade9a187f593dd9254354b348fcd858eef99f1b0d8a57bc5baf54fe1dce779", size = 16281, upload-time = "2026-04-30T23:22:21.202Z" }, ] [[package]] @@ -1644,7 +1644,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a15" }, + { name = "gp-sphinx", specifier = "==0.0.1a13" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1654,8 +1654,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a15" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a15" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1663,11 +1663,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a15" }, + { name = "gp-sphinx", specifier = "==0.0.1a13" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a15" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a15" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, ] lint = [ { name = "mypy" }, From 8e82d34fa1b3875bc9ba2602f5b3caab8c72e0da Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 May 2026 15:32:43 -0500 Subject: [PATCH 2835/2998] =?UTF-8?q?docs(deps[gp-sphinx])=20bump=200.0.1a?= =?UTF-8?q?13=20=E2=86=92=200.0.1a16.dev4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a16.dev4 ships the sphinx-vite-builder consolidation (PR git-pull/gp-sphinx#29). The new package replaces gp-sphinx-vite, fixes the unstyled-wheel bug from a15, and adds a hatchling build-hook variant alongside the existing PEP 517 backend. what: - bump every gp-sphinx workspace pin in pyproject.toml + uv.lock - add [tool.uv].prerelease = "allow" so uv resolves the *.dev4 pins - drop legacy gp-sphinx-vite references (the package no longer exists) --- pyproject.toml | 20 +++++++----- uv.lock | 84 +++++++++++++++++++++++++------------------------- 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8c12a710ac..c942307319 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a13", + "gp-sphinx==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a16.dev4", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a13", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a13", + "gp-sphinx==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a16.dev4", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -113,6 +113,13 @@ lint = [ requires = ["hatchling"] build-backend = "hatchling.build" +[tool.uv] +# `[DO NOT MERGE]`: gp-sphinx workspace ships on the 0.0.1a16.devN +# pre-release track until the sphinx-vite-builder integration is +# proven end-to-end. uv otherwise refuses to resolve `*.dev4` +# markers without this allow. +prerelease = "allow" + [tool.uv.exclude-newer-package] # git-pull packages release in lockstep with their workspaces, so a # fresh release blocking on the 3-day cooldown blocks every @@ -123,7 +130,6 @@ build-backend = "hatchling.build" gp-libs = false gp-furo-theme = false gp-sphinx = false -gp-sphinx-vite = false sphinx-autodoc-api-style = false sphinx-autodoc-argparse = false sphinx-autodoc-docutils = false diff --git a/uv.lock b/uv.lock index e01ee309b4..3ee843b0dc 100644 --- a/uv.lock +++ b/uv.lock @@ -8,6 +8,7 @@ resolution-markers = [ ] [options] +prerelease-mode = "allow" exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" @@ -21,7 +22,6 @@ sphinx-ux-autodoc-layout = false sphinx-autodoc-argparse = false sphinx-ux-badges = false gp-libs = false -gp-sphinx-vite = false sphinx-autodoc-docutils = false gp-furo-theme = false sphinx-gp-sitemap = false @@ -384,8 +384,8 @@ wheels = [ ] [[package]] -name = "furo" -version = "2025.12.19" +name = "gp-furo-theme" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -395,9 +395,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/0b/a3f0d9eec981254a944740665a097319abfb3f859e3a86df3f6efbebbd5a/gp_furo_theme-0.0.1a16.dev4.tar.gz", hash = "sha256:c80b7999ea06a3aa864e39959db64e85811e36d134107d281fd7c166d3100877", size = 33168, upload-time = "2026-05-03T20:08:28.572Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/b2/50e9b292b5cac13e9e81272c7171301abc753a60460d21505b606e15cf21/furo-2025.12.19-py3-none-any.whl", hash = "sha256:bb0ead5309f9500130665a26bee87693c41ce4dbdff864dbfb6b0dae4673d24f", size = 339262, upload-time = "2025-12-19T17:34:38.905Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/4b2e7875b1e6302bcc3a833bfc8bad9d4fdb6dc74ca2b6224f7730db163c/gp_furo_theme-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:6282b6473a0594fd1945957db425cd65bac563c73837aab612c7797e841653e5", size = 42797, upload-time = "2026-05-03T20:08:02.849Z" }, ] [[package]] @@ -416,7 +416,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -437,9 +437,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/d8/abf17835495f654ac2715b6f079780c1e3b2d20c8c2492072fa263c20c46/gp_sphinx-0.0.1a13.tar.gz", hash = "sha256:59237c484f8e5e5e0818ba3279602653348551a9946a6eb4a60fb514933777f9", size = 16548, upload-time = "2026-04-30T23:22:22.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/84/34d930c6f53456da5d6aa674c49b8a42aa51ccd48913da9a5c2b96de22ce/gp_sphinx-0.0.1a16.dev4.tar.gz", hash = "sha256:a010cf78ad176135295f424641779e37479e74f3e1e4029fa29aa1cbb931b547", size = 17039, upload-time = "2026-05-03T20:08:29.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/db/f9707771b6849a3ec8a52a0604329ab91f946b97781e2380b993d7bea705/gp_sphinx-0.0.1a13-py3-none-any.whl", hash = "sha256:dfede670b239cc93bd6b60535b5caf0e0f3ae6919687861ee3c11606289f04ec", size = 16977, upload-time = "2026-04-30T23:22:02.103Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1c/35fb981bf0d44b28b72491dd86cf1ba30ea5b8fbb90b1e10d6720268e406/gp_sphinx-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:47e0d2afa85e9e2c763c7469245d8fa87805bec121ac50410a9b5b9f477150cf", size = 17427, upload-time = "2026-05-03T20:08:04.127Z" }, ] [[package]] @@ -1295,7 +1295,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1303,14 +1303,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/e3/645f3e755b9a10b1c318eb25ad0af5aa5239881e2ff7f81a0fd96cf5b765/sphinx_autodoc_api_style-0.0.1a13.tar.gz", hash = "sha256:9c2809e6ba704032302f768b89314a742049dc6ac310fd20574c83ce8c116fb6", size = 8269, upload-time = "2026-04-30T23:22:23.792Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/20/585919161263ee304cfd3d841a1dcfea01b87b91835646220e690d595000/sphinx_autodoc_api_style-0.0.1a16.dev4.tar.gz", hash = "sha256:10072a6882a0be27ecad42d15f2e7cc3b778ad73300af8cde43e5aedbcb119d3", size = 8305, upload-time = "2026-05-03T20:08:30.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/cc/f70f6acb041167eaef39b72080f9edd42e6ed3c6bebacc888988ce7b212f/sphinx_autodoc_api_style-0.0.1a13-py3-none-any.whl", hash = "sha256:81b07fffd9f0390cbd8b87e4ba3344820beaf354b73ebbed3b99154beb6700fb", size = 8308, upload-time = "2026-04-30T23:22:03.751Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/d8c9977385843052ddf78709ba1e8f6ef5dec007ba16be3fad395553ec9a/sphinx_autodoc_api_style-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:2945fd40f25dbc657505217a2e44ca7f998d834cea3bbd9672d6308befeb22d6", size = 8347, upload-time = "2026-05-03T20:08:05.891Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1318,22 +1318,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/19/df90a67d3715d2125e81150e54ee72fb671dbb4a830d4d00e192aba49bac/sphinx_autodoc_argparse-0.0.1a13.tar.gz", hash = "sha256:d3961db2dfffc6a9bd64cfab8ab4b80e7c0711eed313e18008be896410faeeac", size = 42324, upload-time = "2026-04-30T23:22:24.948Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/29/c61056b326c223e53ca1307be420fb5e3afbffde811a653cff893fa1b048/sphinx_autodoc_argparse-0.0.1a16.dev4.tar.gz", hash = "sha256:107f41c7b98ffd0fe3fbea0aa03e535bf4d8c4cc8f4b65375bb1f66cdd88698b", size = 42362, upload-time = "2026-05-03T20:08:31.703Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/a0/404a05db304762beefc2fe3e81653978b9f5e20b5cc118aeeee2c48e9e58/sphinx_autodoc_argparse-0.0.1a13-py3-none-any.whl", hash = "sha256:ebd9f05e61af78cea7f293dda69791a3adc1478dc5ef150b106d6b659567a573", size = 47274, upload-time = "2026-04-30T23:22:05.204Z" }, + { url = "https://files.pythonhosted.org/packages/be/56/557bbdeb2c7a54b85aa2ddefd8b6ee6568cd8cf7de58987e8dd6346d3e94/sphinx_autodoc_argparse-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:c2ab90a72c05a54bed2a3f314b35cfa395f2977897d68d6c87cba0780b5ebc06", size = 47318, upload-time = "2026-05-03T20:08:07.137Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/f3/612d82c8d7ab65500cc239b6e664b4e0ca4ed07de20779e9b3c51d98cdbb/sphinx_autodoc_typehints_gp-0.0.1a13.tar.gz", hash = "sha256:92dbdd6e70191d1745569ff9b2e6c17761e749575fb704906e02ae12d8c78bc6", size = 18463, upload-time = "2026-04-30T23:22:31.031Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/7c/9f4bc077a5faab0e4dda25d24bf8c43473d499b3738542ab408655f29667/sphinx_autodoc_typehints_gp-0.0.1a16.dev4.tar.gz", hash = "sha256:319a11a0fd37fc12b5643fc35d6eb2b71b375d5f979e405bebbee2aee01a7e3f", size = 18494, upload-time = "2026-05-03T20:08:37.063Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/a9/205cca3cd42a8a8461228d22f6043f9c6cfee8e3174d55c1d4b41425692a/sphinx_autodoc_typehints_gp-0.0.1a13-py3-none-any.whl", hash = "sha256:23064df749b2ceec160dc4886adfe251571a9d256be008d8c5412c1321480e02", size = 19008, upload-time = "2026-04-30T23:22:12.712Z" }, + { url = "https://files.pythonhosted.org/packages/39/29/0c9ae9533ea759978d1de55b4051ff3c4b9629ed24b978ea5c8e86cdee63/sphinx_autodoc_typehints_gp-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:e115ff9a4678768e610d18aea800ab3490ac5c7f4399a2675df09bb74d2acaba", size = 19051, upload-time = "2026-05-03T20:08:15.491Z" }, ] [[package]] @@ -1395,55 +1395,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/fc/1e5a7a664e62745cb1d9a9251afffe1a6e081c96d3655bc1d9d89d9703fa/sphinx_fonts-0.0.1a13.tar.gz", hash = "sha256:556ccaddaa81e7618ca72163d4f6c6e3179ae252d3c92637ccfd25837dfac38c", size = 5680, upload-time = "2026-04-30T23:22:31.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/36/afda58f99cbc5cffa01a3a38a0ea32b350d70ef8511e25a71a6fac2955a4/sphinx_fonts-0.0.1a16.dev4.tar.gz", hash = "sha256:16f919b3d078b59e67b7f5715e59e52edd867658687bf75c4c1eacaa8b75ac51", size = 5707, upload-time = "2026-05-03T20:08:37.965Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/ce/9eea57147bcbc6474efbd7e43128a5222620891b78664a3c950160e05f0e/sphinx_fonts-0.0.1a13-py3-none-any.whl", hash = "sha256:3cc6f716547c9e46a9a8701b6b819f8d81d10e3ee91d94d6e006bb02e6534f38", size = 4361, upload-time = "2026-04-30T23:22:14.218Z" }, + { url = "https://files.pythonhosted.org/packages/e8/d8/4299f0ad82ddd3b3cbf71a96770b1848f53c5183180eaabf1f2a26d2d0df/sphinx_fonts-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:9ff38315bf6842e56f2af179e098175575d3b713123afcc36a924c58d61f6523", size = 4407, upload-time = "2026-05-03T20:08:17.66Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/03/7fc6a8599b801ad6dd00b8ae97fb2bb7789962141a060d40a80aa626aaae/sphinx_gp_opengraph-0.0.1a13.tar.gz", hash = "sha256:6de8209f0e9cbad59e35cd4c87d023a86903cd9a4e4c80b0fa6ddd00f8c782c1", size = 11813, upload-time = "2026-04-30T23:22:33.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/92/ef8e15e271686c7a4f7f462b66509cfd039309cda88d5015486410040785/sphinx_gp_opengraph-0.0.1a16.dev4.tar.gz", hash = "sha256:722f41a9f3c946afc8e4dc50791b393caa901e913c2bbd38a8232b5ab7a788c9", size = 11844, upload-time = "2026-05-03T20:08:38.82Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/58/83e8c1d9bda000b0a02fcd0b77cf343510c1040182681a7ee852a555e14e/sphinx_gp_opengraph-0.0.1a13-py3-none-any.whl", hash = "sha256:032559b855f3bb18623d916130980162c3467ef864d9cf75cdd4efbba4344d76", size = 12183, upload-time = "2026-04-30T23:22:15.461Z" }, + { url = "https://files.pythonhosted.org/packages/86/a3/056b061f69b9bbb4c84887ae3d78bd09f7d9852818ec95ef5e949a9cc60e/sphinx_gp_opengraph-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:787fcd44dfb7bdded235a83f4eefb8c0ddf72e2661558c213bbe9db4104a0495", size = 12229, upload-time = "2026-05-03T20:08:18.797Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/a9/f5447291d2665078c6d4686ab7dd178c6a9549b5a8a50e4c92bbad77179a/sphinx_gp_sitemap-0.0.1a13.tar.gz", hash = "sha256:d2c0deac702a64539077de965a6c626e1669d9e3064a45e97dcbdb4d6891ed21", size = 9864, upload-time = "2026-04-30T23:22:33.898Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/f1/d4996857aef6814ac0b6a50bc8d43d419e1d31d591bd10e10c2b04350e55/sphinx_gp_sitemap-0.0.1a16.dev4.tar.gz", hash = "sha256:ca9649b415b99b12e2f8cd4dfc148fb13575fc146f92442d9111394d4468a47e", size = 9893, upload-time = "2026-05-03T20:08:39.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/c4/c144343c6ebaa39366eb71f68cb7033a323e9b9b078f2c2f2120c7a3ba78/sphinx_gp_sitemap-0.0.1a13-py3-none-any.whl", hash = "sha256:7d1ee3a4a3e8e6181bc264d77c497a624d20e7a6cb367c687dee38d6acb79c6d", size = 8982, upload-time = "2026-04-30T23:22:16.898Z" }, + { url = "https://files.pythonhosted.org/packages/a1/87/0fe81b02b7b9743d4cf4e2d7723f0d0a371546d24e914e09267d8298b769/sphinx_gp_sitemap-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:3f76d46afa835b0d458ec0f537afb423decb311efad983be46d57a37908aebd9", size = 9024, upload-time = "2026-05-03T20:08:20.323Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "furo" }, + { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/f7/202da5cdbbad3037e0399a57c377b126070bbea4c2c90e941e0c78a5cfb0/sphinx_gp_theme-0.0.1a13.tar.gz", hash = "sha256:169a71f9f2dc0f6109feda8a46c7055bc9b1fbf7a2b290e1d86ab771a4409db8", size = 17640, upload-time = "2026-04-30T23:22:34.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/00/f7903ea03057f4b30534d71c54d2f1ca8d45df1aa0421976e38ae82ae33f/sphinx_gp_theme-0.0.1a16.dev4.tar.gz", hash = "sha256:a10eec412a0470325e64ef608d9acf69f37e3be9c76843309f229e6c26311133", size = 17973, upload-time = "2026-05-03T20:08:40.839Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/8b/739a4d38b6941da61b53624fc157c59f21e8b1cea0d68762f7f72f795f2d/sphinx_gp_theme-0.0.1a13-py3-none-any.whl", hash = "sha256:ab4238c07e6433bce80e727409e8654f7510510d216426e36c9109197d27240e", size = 19279, upload-time = "2026-04-30T23:22:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/1c6765b102188767be7d0d83a80b7e4dfe90405cd0372fa8f8c9dbfb182c/sphinx_gp_theme-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:651e30aab7f9111fec3b66c9f1f066dd693ec3fedc2125f482b70d0e353c9ee8", size = 19662, upload-time = "2026-05-03T20:08:22.042Z" }, ] [[package]] @@ -1461,28 +1461,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/33/be38ac26da13447fdbd719268cbff8cd29d75ba36ae7f0c4e21ec244eba6/sphinx_ux_autodoc_layout-0.0.1a13.tar.gz", hash = "sha256:b49ea9725724c407aae5a6c8c24414780d1c13520c2f0753940211ae5dd93629", size = 21324, upload-time = "2026-04-30T23:22:35.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/3b/d4faf0d4fe9d141e00fa975773e28d6aa37a706d8a83b6435057856f1cad/sphinx_ux_autodoc_layout-0.0.1a16.dev4.tar.gz", hash = "sha256:d196e24f8eddd5b65daf9ee4a140580c18b752ec5f8aeb5c80310a05574c53bf", size = 21355, upload-time = "2026-05-03T20:08:42.063Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/36/4ff92c28d5af14e6b3c395016fb94fd9d75ae16ac7540a2e2ddd7cfb3df1/sphinx_ux_autodoc_layout-0.0.1a13-py3-none-any.whl", hash = "sha256:4a203d2fa42dc91304bdc5d540b35e1fded14819f20e1ba4c563fb177e8b0c10", size = 25143, upload-time = "2026-04-30T23:22:19.726Z" }, + { url = "https://files.pythonhosted.org/packages/0d/06/cb7f606d822f73593605f8e25cf2c8e141fb0eb9ba1944ed1b398702b2ff/sphinx_ux_autodoc_layout-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:9048ff9c14fecb81b4a3981722a0bd3d9288fa3bf1b3d3662231a3fd0b22c292", size = 25182, upload-time = "2026-05-03T20:08:23.652Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a13" +version = "0.0.1a16.dev4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/76/0d2275bf0de9ef74131c828f077a9c21377d9a5698906389cdf43b5759f9/sphinx_ux_badges-0.0.1a13.tar.gz", hash = "sha256:88c429a4b63cbb35c8f113985981092f62c559e9d3d5204f63ab0d010e9ecf65", size = 15284, upload-time = "2026-04-30T23:22:36.85Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/64/aaccc4848f88433cac2c2a80d4c20c090a7f89d5e80f06ee8cc4555b5c06/sphinx_ux_badges-0.0.1a16.dev4.tar.gz", hash = "sha256:7f9b4c7bd0c5a2d8a1b48402a04cac7d5571b9110253e46a4b4468d98e5f6eff", size = 15314, upload-time = "2026-05-03T20:08:43.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/26/2245dc4b805dab87b73ce2a0fec1d9ff8f8ba2127cb63892b6367093ad2a/sphinx_ux_badges-0.0.1a13-py3-none-any.whl", hash = "sha256:64ade9a187f593dd9254354b348fcd858eef99f1b0d8a57bc5baf54fe1dce779", size = 16281, upload-time = "2026-04-30T23:22:21.202Z" }, + { url = "https://files.pythonhosted.org/packages/15/fc/8a2ff5fb56c52f0dd275f485e35667a0581103498200207388ee6f44a25c/sphinx_ux_badges-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:476f96d995bdb7573aed9afca99aa8ad5c0f05279b5680057da3385c793ae6fe", size = 16326, upload-time = "2026-05-03T20:08:24.806Z" }, ] [[package]] @@ -1644,7 +1644,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a13" }, + { name = "gp-sphinx", specifier = "==0.0.1a16.dev4" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1654,8 +1654,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16.dev4" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16.dev4" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1663,11 +1663,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a13" }, + { name = "gp-sphinx", specifier = "==0.0.1a16.dev4" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a13" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a13" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16.dev4" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16.dev4" }, ] lint = [ { name = "mypy" }, From 6546aa3bbe9e501299a29a27e53cc173af9e5215 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 May 2026 16:07:18 -0500 Subject: [PATCH 2836/2998] =?UTF-8?q?release(deps[gp-sphinx])=20bump=200.0?= =?UTF-8?q?.1a16.dev4=20=E2=86=92=200.0.1a16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a16 (final) is on PyPI. Promote off the pre-release pin and drop the [tool.uv].prerelease workaround that was only needed to resolve *.devN versions. what: - bump every gp-sphinx workspace pin in pyproject.toml + uv.lock - drop the [tool.uv] block carrying prerelease = "allow"; the [tool.uv.exclude-newer-package] section it sat above is unchanged --- pyproject.toml | 19 ++++-------- uv.lock | 79 +++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 53 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c942307319..7198b98493 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a16.dev4", + "gp-sphinx==0.0.1a16", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a16", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a16", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a16.dev4", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a16.dev4", + "gp-sphinx==0.0.1a16", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a16", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a16", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -113,13 +113,6 @@ lint = [ requires = ["hatchling"] build-backend = "hatchling.build" -[tool.uv] -# `[DO NOT MERGE]`: gp-sphinx workspace ships on the 0.0.1a16.devN -# pre-release track until the sphinx-vite-builder integration is -# proven end-to-end. uv otherwise refuses to resolve `*.dev4` -# markers without this allow. -prerelease = "allow" - [tool.uv.exclude-newer-package] # git-pull packages release in lockstep with their workspaces, so a # fresh release blocking on the 3-day cooldown blocks every diff --git a/uv.lock b/uv.lock index 3ee843b0dc..8b6b5b0bdb 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,6 @@ resolution-markers = [ ] [options] -prerelease-mode = "allow" exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" @@ -385,7 +384,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -395,9 +394,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/0b/a3f0d9eec981254a944740665a097319abfb3f859e3a86df3f6efbebbd5a/gp_furo_theme-0.0.1a16.dev4.tar.gz", hash = "sha256:c80b7999ea06a3aa864e39959db64e85811e36d134107d281fd7c166d3100877", size = 33168, upload-time = "2026-05-03T20:08:28.572Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/ac/a4d25fb7bb50495969ea928cfb505db99689338dadc881e15b1c9202221a/gp_furo_theme-0.0.1a16.tar.gz", hash = "sha256:5fec0e5f71dea4c4ffcf25d72c1ec5c9622cf1d5b66f6bd3978782f1ebb2d7cd", size = 33162, upload-time = "2026-05-03T20:55:30.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/4a/4b2e7875b1e6302bcc3a833bfc8bad9d4fdb6dc74ca2b6224f7730db163c/gp_furo_theme-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:6282b6473a0594fd1945957db425cd65bac563c73837aab612c7797e841653e5", size = 42797, upload-time = "2026-05-03T20:08:02.849Z" }, + { url = "https://files.pythonhosted.org/packages/23/03/575f5fe6cbf5a21687e88332af6df5bd8b3b0ffa797b5631e977cedc5ce3/gp_furo_theme-0.0.1a16-py3-none-any.whl", hash = "sha256:8764e27c277413b9abd3cf9b7bcdbbf2ae3a5f76f8340d818135e3e7b519974e", size = 42735, upload-time = "2026-05-03T20:55:09.576Z" }, ] [[package]] @@ -416,7 +415,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -437,9 +436,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/84/34d930c6f53456da5d6aa674c49b8a42aa51ccd48913da9a5c2b96de22ce/gp_sphinx-0.0.1a16.dev4.tar.gz", hash = "sha256:a010cf78ad176135295f424641779e37479e74f3e1e4029fa29aa1cbb931b547", size = 17039, upload-time = "2026-05-03T20:08:29.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/ff/151b1baf067a34f7811755f7b2ab40f8713af02cd53ca9cb9ef94d64e467/gp_sphinx-0.0.1a16.tar.gz", hash = "sha256:d3b063e3b4056571d8b75f54661c193f9b4d9b76a35249d63a8d55fe5d26168b", size = 17031, upload-time = "2026-05-03T20:55:31.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/1c/35fb981bf0d44b28b72491dd86cf1ba30ea5b8fbb90b1e10d6720268e406/gp_sphinx-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:47e0d2afa85e9e2c763c7469245d8fa87805bec121ac50410a9b5b9f477150cf", size = 17427, upload-time = "2026-05-03T20:08:04.127Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/2030cebc3e6caf579cb05ddc93afeecf711edfc1a5711d3c6691b82adebf/gp_sphinx-0.0.1a16-py3-none-any.whl", hash = "sha256:f61a18bf3d94503508cc217b6a2db23d1631ed0f7df824eee14566f1b41ecf78", size = 17384, upload-time = "2026-05-03T20:55:11.232Z" }, ] [[package]] @@ -1295,7 +1294,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1303,14 +1302,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/20/585919161263ee304cfd3d841a1dcfea01b87b91835646220e690d595000/sphinx_autodoc_api_style-0.0.1a16.dev4.tar.gz", hash = "sha256:10072a6882a0be27ecad42d15f2e7cc3b778ad73300af8cde43e5aedbcb119d3", size = 8305, upload-time = "2026-05-03T20:08:30.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/bb/1bfc21d7a20bac5b6300af5e2dbb3a0025cb0c1ba08c2df251bc3d9519f8/sphinx_autodoc_api_style-0.0.1a16.tar.gz", hash = "sha256:e0e14c44f200c30b6d746016d49b3edad80ca537178a936b511da7b9e60e906b", size = 8296, upload-time = "2026-05-03T20:55:32.782Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/15/d8c9977385843052ddf78709ba1e8f6ef5dec007ba16be3fad395553ec9a/sphinx_autodoc_api_style-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:2945fd40f25dbc657505217a2e44ca7f998d834cea3bbd9672d6308befeb22d6", size = 8347, upload-time = "2026-05-03T20:08:05.891Z" }, + { url = "https://files.pythonhosted.org/packages/77/6e/92b1ae54dbaf0cc29ed1bca615239f5a10297566dc6f3e57a9b4ee67dcd6/sphinx_autodoc_api_style-0.0.1a16-py3-none-any.whl", hash = "sha256:6f8939e22e4f6b1b1bcca4a711e93262b49dc7672ae9f4babee59375d473d874", size = 8308, upload-time = "2026-05-03T20:55:12.353Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1318,22 +1317,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/29/c61056b326c223e53ca1307be420fb5e3afbffde811a653cff893fa1b048/sphinx_autodoc_argparse-0.0.1a16.dev4.tar.gz", hash = "sha256:107f41c7b98ffd0fe3fbea0aa03e535bf4d8c4cc8f4b65375bb1f66cdd88698b", size = 42362, upload-time = "2026-05-03T20:08:31.703Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/15/3d21ad557ccbc95d359f367a028a67bf4fe929389eb89b288df9b3f037d5/sphinx_autodoc_argparse-0.0.1a16.tar.gz", hash = "sha256:e44cb5eaa0ac20319de36965745b02f5e29637e6f276673d8762ee5e36f770ec", size = 42347, upload-time = "2026-05-03T20:55:34.042Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/56/557bbdeb2c7a54b85aa2ddefd8b6ee6568cd8cf7de58987e8dd6346d3e94/sphinx_autodoc_argparse-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:c2ab90a72c05a54bed2a3f314b35cfa395f2977897d68d6c87cba0780b5ebc06", size = 47318, upload-time = "2026-05-03T20:08:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/507cb8f846c1f6c43a715f29567ff9d9663174b8872cae840e1f6eeb2b36/sphinx_autodoc_argparse-0.0.1a16-py3-none-any.whl", hash = "sha256:a812865b43374eddbf0e4545dde95ea42c35a5bc51adf46aab7d6bddd4ee1ff9", size = 47276, upload-time = "2026-05-03T20:55:13.428Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/7c/9f4bc077a5faab0e4dda25d24bf8c43473d499b3738542ab408655f29667/sphinx_autodoc_typehints_gp-0.0.1a16.dev4.tar.gz", hash = "sha256:319a11a0fd37fc12b5643fc35d6eb2b71b375d5f979e405bebbee2aee01a7e3f", size = 18494, upload-time = "2026-05-03T20:08:37.063Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/9a/473eb793304c0bbfe4368c685ac69a759951ace95b932da3caf4064795fc/sphinx_autodoc_typehints_gp-0.0.1a16.tar.gz", hash = "sha256:5ae62da7aa44098094b97c4d3984179e9356b09bfe0bfc45b3c12ac443346352", size = 18492, upload-time = "2026-05-03T20:55:38.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/29/0c9ae9533ea759978d1de55b4051ff3c4b9629ed24b978ea5c8e86cdee63/sphinx_autodoc_typehints_gp-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:e115ff9a4678768e610d18aea800ab3490ac5c7f4399a2675df09bb74d2acaba", size = 19051, upload-time = "2026-05-03T20:08:15.491Z" }, + { url = "https://files.pythonhosted.org/packages/24/1c/5f4ce27439eead8eda30f231585a65c02810d61c84b3b23c3c52c5cf8052/sphinx_autodoc_typehints_gp-0.0.1a16-py3-none-any.whl", hash = "sha256:b9333c634e6e427f8f105851bc7c1bc4807d7a00e26897b395bf3b4f96e19150", size = 19010, upload-time = "2026-05-03T20:55:20.035Z" }, ] [[package]] @@ -1395,55 +1394,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/36/afda58f99cbc5cffa01a3a38a0ea32b350d70ef8511e25a71a6fac2955a4/sphinx_fonts-0.0.1a16.dev4.tar.gz", hash = "sha256:16f919b3d078b59e67b7f5715e59e52edd867658687bf75c4c1eacaa8b75ac51", size = 5707, upload-time = "2026-05-03T20:08:37.965Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/66/a1467c2cff1ea931589691eecfa4cac8c36c5533b76de1a2bc146dad9a4c/sphinx_fonts-0.0.1a16.tar.gz", hash = "sha256:4d31ac84e036bae1b898255e58feb2b01bbaae9703dae5e9235ab6bba4aa1e71", size = 5706, upload-time = "2026-05-03T20:55:39.633Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/d8/4299f0ad82ddd3b3cbf71a96770b1848f53c5183180eaabf1f2a26d2d0df/sphinx_fonts-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:9ff38315bf6842e56f2af179e098175575d3b713123afcc36a924c58d61f6523", size = 4407, upload-time = "2026-05-03T20:08:17.66Z" }, + { url = "https://files.pythonhosted.org/packages/b2/95/9acbeed82672d57d004ef638a6f0a9ec615aad1c8edf033d4de9980527bc/sphinx_fonts-0.0.1a16-py3-none-any.whl", hash = "sha256:f6f16fd627457e1246bbadce03749e17d6577f26c7e64731ae25dabf35ad8e6a", size = 4362, upload-time = "2026-05-03T20:55:21.434Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/92/ef8e15e271686c7a4f7f462b66509cfd039309cda88d5015486410040785/sphinx_gp_opengraph-0.0.1a16.dev4.tar.gz", hash = "sha256:722f41a9f3c946afc8e4dc50791b393caa901e913c2bbd38a8232b5ab7a788c9", size = 11844, upload-time = "2026-05-03T20:08:38.82Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/48/d50cb6a029ac6b21552e2a5cbf47164f82609d9facb0aa27cf9ed5d20b77/sphinx_gp_opengraph-0.0.1a16.tar.gz", hash = "sha256:96f2fb5c81902371082e82e76dda418f324459e31bd0eed77b598339c8760ff2", size = 11841, upload-time = "2026-05-03T20:55:40.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/a3/056b061f69b9bbb4c84887ae3d78bd09f7d9852818ec95ef5e949a9cc60e/sphinx_gp_opengraph-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:787fcd44dfb7bdded235a83f4eefb8c0ddf72e2661558c213bbe9db4104a0495", size = 12229, upload-time = "2026-05-03T20:08:18.797Z" }, + { url = "https://files.pythonhosted.org/packages/96/a5/353cf6983db2658dc3adb766c4275714d27b282dcde71dbe5a1f81e9927a/sphinx_gp_opengraph-0.0.1a16-py3-none-any.whl", hash = "sha256:5f3c5e54f8cbb20d81c744f1ad79c5cb130ce77f0f8e2945e4a369f644060695", size = 12185, upload-time = "2026-05-03T20:55:22.725Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/f1/d4996857aef6814ac0b6a50bc8d43d419e1d31d591bd10e10c2b04350e55/sphinx_gp_sitemap-0.0.1a16.dev4.tar.gz", hash = "sha256:ca9649b415b99b12e2f8cd4dfc148fb13575fc146f92442d9111394d4468a47e", size = 9893, upload-time = "2026-05-03T20:08:39.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/25/b418867670df9c9fb97ea5a1cbae7dc1942efebee91c1eb057acfde5d839/sphinx_gp_sitemap-0.0.1a16.tar.gz", hash = "sha256:ebcca77ab091df06a1499b336d5d43263d6282f6076b908c957842931ea37489", size = 9887, upload-time = "2026-05-03T20:55:41.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/87/0fe81b02b7b9743d4cf4e2d7723f0d0a371546d24e914e09267d8298b769/sphinx_gp_sitemap-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:3f76d46afa835b0d458ec0f537afb423decb311efad983be46d57a37908aebd9", size = 9024, upload-time = "2026-05-03T20:08:20.323Z" }, + { url = "https://files.pythonhosted.org/packages/56/27/a8e7496cabc5fe1997a8a3dc2bd9a828583579e5a78f67c4df2ae3f402a1/sphinx_gp_sitemap-0.0.1a16-py3-none-any.whl", hash = "sha256:c36d1850562a06184899e907aa3aa0df9e6c5724f7c0d24433cbc4f5607bd9b1", size = 8983, upload-time = "2026-05-03T20:55:23.784Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/00/f7903ea03057f4b30534d71c54d2f1ca8d45df1aa0421976e38ae82ae33f/sphinx_gp_theme-0.0.1a16.dev4.tar.gz", hash = "sha256:a10eec412a0470325e64ef608d9acf69f37e3be9c76843309f229e6c26311133", size = 17973, upload-time = "2026-05-03T20:08:40.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/07/e6959fe2a3b225a03a82e2a7b79dd3be2bc0cadf66bdf070c6c7040caede/sphinx_gp_theme-0.0.1a16.tar.gz", hash = "sha256:e61063fc22b88c0bf14016004ec8ec1d7eb3e5bf9838a4b60bad0e6a08b87968", size = 17968, upload-time = "2026-05-03T20:55:42.864Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/a1/1c6765b102188767be7d0d83a80b7e4dfe90405cd0372fa8f8c9dbfb182c/sphinx_gp_theme-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:651e30aab7f9111fec3b66c9f1f066dd693ec3fedc2125f482b70d0e353c9ee8", size = 19662, upload-time = "2026-05-03T20:08:22.042Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a4/ef8e54214ff73e9cfc10963524bfb48c9412dabbd561ac9c37a90cc2867e/sphinx_gp_theme-0.0.1a16-py3-none-any.whl", hash = "sha256:f4043a6f2a656137c4fe00e492812d3ce6fc6cf4933c2ba1cb67371ba6e267e2", size = 19608, upload-time = "2026-05-03T20:55:24.83Z" }, ] [[package]] @@ -1461,28 +1460,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/3b/d4faf0d4fe9d141e00fa975773e28d6aa37a706d8a83b6435057856f1cad/sphinx_ux_autodoc_layout-0.0.1a16.dev4.tar.gz", hash = "sha256:d196e24f8eddd5b65daf9ee4a140580c18b752ec5f8aeb5c80310a05574c53bf", size = 21355, upload-time = "2026-05-03T20:08:42.063Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/a8/2908c7ac8289df68af1bbaa54d311ad6b0a109f3c3893189a022aa93534f/sphinx_ux_autodoc_layout-0.0.1a16.tar.gz", hash = "sha256:859ac6e4f690701d7da3b0fb3cc75c069eaa8db1f48b61df6e21557f39ea6c92", size = 21352, upload-time = "2026-05-03T20:55:43.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/06/cb7f606d822f73593605f8e25cf2c8e141fb0eb9ba1944ed1b398702b2ff/sphinx_ux_autodoc_layout-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:9048ff9c14fecb81b4a3981722a0bd3d9288fa3bf1b3d3662231a3fd0b22c292", size = 25182, upload-time = "2026-05-03T20:08:23.652Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/5c5fe2cae27be3c8aa527b49dadc6399ab92fdc7713d67f9ab2d43ca9b91/sphinx_ux_autodoc_layout-0.0.1a16-py3-none-any.whl", hash = "sha256:93ff9c98d56105d6c6ec9ff1dd2b607028c111776758050bd30c50924de507bb", size = 25145, upload-time = "2026-05-03T20:55:26.251Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a16.dev4" +version = "0.0.1a16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/64/aaccc4848f88433cac2c2a80d4c20c090a7f89d5e80f06ee8cc4555b5c06/sphinx_ux_badges-0.0.1a16.dev4.tar.gz", hash = "sha256:7f9b4c7bd0c5a2d8a1b48402a04cac7d5571b9110253e46a4b4468d98e5f6eff", size = 15314, upload-time = "2026-05-03T20:08:43.326Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/27/c51a407f5e83f69c664a860de4d94f19e523d17231999d0ac0dfcf017e35/sphinx_ux_badges-0.0.1a16.tar.gz", hash = "sha256:2d8f3390207ff70a8de99b49a217393f748855f62fbe8045c09519bcaeec1011", size = 15310, upload-time = "2026-05-03T20:55:44.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/fc/8a2ff5fb56c52f0dd275f485e35667a0581103498200207388ee6f44a25c/sphinx_ux_badges-0.0.1a16.dev4-py3-none-any.whl", hash = "sha256:476f96d995bdb7573aed9afca99aa8ad5c0f05279b5680057da3385c793ae6fe", size = 16326, upload-time = "2026-05-03T20:08:24.806Z" }, + { url = "https://files.pythonhosted.org/packages/f5/70/98d5564562d20983110a23ee072ba2db7c9db68192739521f4ac2cabe9ef/sphinx_ux_badges-0.0.1a16-py3-none-any.whl", hash = "sha256:d2cf637566d18dd767282841f4c800264bfe9e32896f7e74cea18d1753bca4d5", size = 16284, upload-time = "2026-05-03T20:55:27.724Z" }, ] [[package]] @@ -1644,7 +1643,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a16.dev4" }, + { name = "gp-sphinx", specifier = "==0.0.1a16" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1654,8 +1653,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16.dev4" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16.dev4" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1663,11 +1662,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a16.dev4" }, + { name = "gp-sphinx", specifier = "==0.0.1a16" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16.dev4" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16.dev4" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16" }, ] lint = [ { name = "mypy" }, From 2f971854ddbbecd03d55860b1550496093f25593 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 3 May 2026 16:07:19 -0500 Subject: [PATCH 2837/2998] docs(CHANGES) note gp-sphinx 0.0.1a16 bump --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index acdfe87145..edece8c7ba 100644 --- a/CHANGES +++ b/CHANGES @@ -43,6 +43,9 @@ _Notes on the upcoming release will go here._ - Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#1035) - Bump gp-sphinx docs stack to v0.0.1a8 (#1036) +- Bump gp-sphinx docs stack to v0.0.1a16 — docs site now renders + via `gp-furo-theme`, a Tailwind v4 respin of Furo, with + `sphinx-vite-builder` handling theme-asset builds (#1037) ## tmuxp 1.67.0 (2026-03-08) From bffc79cba47d55543cc3e681f714ef1b1b68900f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 May 2026 04:52:17 -0500 Subject: [PATCH 2838/2998] .tool-versions(uv) uv 0.11.8 -> 0.11.12 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.12 - https://github.com/astral-sh/uv/blob/0.11.12/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 09479bd719..298af84d17 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.50 -uv 0.11.8 +uv 0.11.12 python 3.14 3.13 3.12 3.11 3.10 From 65c71b362211f3d56a793b7ad28c28a3ca820f76 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 May 2026 04:53:03 -0500 Subject: [PATCH 2839/2998] py(deps[dev]) Bump dev packages --- uv.lock | 164 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/uv.lock b/uv.lock index 8b6b5b0bdb..48c93f929d 100644 --- a/uv.lock +++ b/uv.lock @@ -375,7 +375,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -491,87 +491,87 @@ wheels = [ [[package]] name = "librt" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/6b/3d5c13fb3e3c4f43206c8f9dfed13778c2ed4f000bacaa0b7ce3c402a265/librt-0.9.0.tar.gz", hash = "sha256:a0951822531e7aee6e0dfb556b30d5ee36bbe234faf60c20a16c01be3530869d", size = 184368, upload-time = "2026-04-09T16:06:26.173Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/4a/c64265d71b84030174ff3ac2cd16d8b664072afab8c41fccd8e2ee5a6f8d/librt-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443", size = 67529, upload-time = "2026-04-09T16:04:27.373Z" }, - { url = "https://files.pythonhosted.org/packages/23/b1/30ca0b3a8bdac209a00145c66cf42e5e7da2cc056ffc6ebc5c7b430ddd34/librt-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c", size = 70248, upload-time = "2026-04-09T16:04:28.758Z" }, - { url = "https://files.pythonhosted.org/packages/fa/fc/c6018dc181478d6ac5aa24a5846b8185101eb90894346db239eb3ea53209/librt-0.9.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:de7dac64e3eb832ffc7b840eb8f52f76420cde1b845be51b2a0f6b870890645e", size = 202184, upload-time = "2026-04-09T16:04:29.893Z" }, - { url = "https://files.pythonhosted.org/packages/bf/58/d69629f002203370ef41ea69ff71c49a2c618aec39b226ff49986ecd8623/librt-0.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22a904cbdb678f7cb348c90d543d3c52f581663d687992fee47fd566dcbf5285", size = 212926, upload-time = "2026-04-09T16:04:31.126Z" }, - { url = "https://files.pythonhosted.org/packages/cc/55/01d859f57824e42bd02465c77bec31fa5ef9d8c2bcee702ccf8ef1b9f508/librt-0.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:224b9727eb8bc188bc3bcf29d969dba0cd61b01d9bac80c41575520cc4baabb2", size = 225664, upload-time = "2026-04-09T16:04:32.352Z" }, - { url = "https://files.pythonhosted.org/packages/9b/02/32f63ad0ef085a94a70315291efe1151a48b9947af12261882f8445b2a30/librt-0.9.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e94cbc6ad9a6aeea46d775cbb11f361022f778a9cc8cc90af653d3a594b057ce", size = 219534, upload-time = "2026-04-09T16:04:33.667Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5a/9d77111a183c885acf3b3b6e4c00f5b5b07b5817028226499a55f1fedc59/librt-0.9.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7bc30ad339f4e1a01d4917d645e522a0bc0030644d8973f6346397c93ba1503f", size = 227322, upload-time = "2026-04-09T16:04:34.945Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e7/05d700c93063753e12ab230b972002a3f8f3b9c95d8a980c2f646c8b6963/librt-0.9.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:56d65b583cf43b8cf4c8fbe1e1da20fa3076cc32a1149a141507af1062718236", size = 223407, upload-time = "2026-04-09T16:04:36.22Z" }, - { url = "https://files.pythonhosted.org/packages/c0/26/26c3124823c67c987456977c683da9a27cc874befc194ddcead5f9988425/librt-0.9.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0a1be03168b2691ba61927e299b352a6315189199ca18a57b733f86cb3cc8d38", size = 221302, upload-time = "2026-04-09T16:04:37.62Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/c7cc2be5cf4ff7b017d948a789256288cb33a517687ff1995e72a7eea79f/librt-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63c12efcd160e1d14da11af0c46c0217473e1e0d2ae1acbccc83f561ea4c2a7b", size = 243893, upload-time = "2026-04-09T16:04:38.909Z" }, - { url = "https://files.pythonhosted.org/packages/62/d3/da553d37417a337d12660450535d5fd51373caffbedf6962173c87867246/librt-0.9.0-cp310-cp310-win32.whl", hash = "sha256:e9002e98dcb1c0a66723592520decd86238ddcef168b37ff6cfb559200b4b774", size = 55375, upload-time = "2026-04-09T16:04:40.148Z" }, - { url = "https://files.pythonhosted.org/packages/9b/5a/46fa357bab8311b6442a83471591f2f9e5b15ecc1d2121a43725e0c529b8/librt-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9fcb461fbf70654a52a7cc670e606f04449e2374c199b1825f754e16dacfedd8", size = 62581, upload-time = "2026-04-09T16:04:41.452Z" }, - { url = "https://files.pythonhosted.org/packages/e2/1e/2ec7afcebcf3efea593d13aee18bbcfdd3a243043d848ebf385055e9f636/librt-0.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90904fac73c478f4b83f4ed96c99c8208b75e6f9a8a1910548f69a00f1eaa671", size = 67155, upload-time = "2026-04-09T16:04:42.933Z" }, - { url = "https://files.pythonhosted.org/packages/18/77/72b85afd4435268338ad4ec6231b3da8c77363f212a0227c1ff3b45e4d35/librt-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789fff71757facc0738e8d89e3b84e4f0251c1c975e85e81b152cdaca927cc2d", size = 69916, upload-time = "2026-04-09T16:04:44.042Z" }, - { url = "https://files.pythonhosted.org/packages/27/fb/948ea0204fbe2e78add6d46b48330e58d39897e425560674aee302dca81c/librt-0.9.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1bf465d1e5b0a27713862441f6467b5ab76385f4ecf8f1f3a44f8aa3c695b4b6", size = 199635, upload-time = "2026-04-09T16:04:45.5Z" }, - { url = "https://files.pythonhosted.org/packages/ac/cd/894a29e251b296a27957856804cfd21e93c194aa131de8bb8032021be07e/librt-0.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f819e0c6413e259a17a7c0d49f97f405abadd3c2a316a3b46c6440b7dbbedbb1", size = 211051, upload-time = "2026-04-09T16:04:47.016Z" }, - { url = "https://files.pythonhosted.org/packages/18/8f/dcaed0bc084a35f3721ff2d081158db569d2c57ea07d35623ddaca5cfc8e/librt-0.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0785c2fb4a81e1aece366aa3e2e039f4a4d7d21aaaded5227d7f3c703427882", size = 224031, upload-time = "2026-04-09T16:04:48.207Z" }, - { url = "https://files.pythonhosted.org/packages/03/44/88f6c1ed1132cd418601cc041fbd92fed28b3a09f39de81978e0822d13ff/librt-0.9.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80b25c7b570a86c03b5da69e665809deb39265476e8e21d96a9328f9762f9990", size = 218069, upload-time = "2026-04-09T16:04:50.025Z" }, - { url = "https://files.pythonhosted.org/packages/a3/90/7d02e981c2db12188d82b4410ff3e35bfdb844b26aecd02233626f46af2b/librt-0.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d4d16b608a1c43d7e33142099a75cd93af482dadce0bf82421e91cad077157f4", size = 224857, upload-time = "2026-04-09T16:04:51.684Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c3/c77e706b7215ca32e928d47535cf13dbc3d25f096f84ddf8fbc06693e229/librt-0.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:194fc1a32e1e21fe809d38b5faea66cc65eaa00217c8901fbdb99866938adbdb", size = 219865, upload-time = "2026-04-09T16:04:52.949Z" }, - { url = "https://files.pythonhosted.org/packages/52/d1/32b0c1a0eb8461c70c11656c46a29f760b7c7edf3c36d6f102470c17170f/librt-0.9.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8c6bc1384d9738781cfd41d09ad7f6e8af13cfea2c75ece6bd6d2566cdea2076", size = 218451, upload-time = "2026-04-09T16:04:54.174Z" }, - { url = "https://files.pythonhosted.org/packages/74/d1/adfd0f9c44761b1d49b1bec66173389834c33ee2bd3c7fd2e2367f1942d4/librt-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cb151e52a044f06e54ac7f7b47adbfc89b5c8e2b63e1175a9d587c43e8942a", size = 241300, upload-time = "2026-04-09T16:04:55.452Z" }, - { url = "https://files.pythonhosted.org/packages/09/b0/9074b64407712f0003c27f5b1d7655d1438979155f049720e8a1abd9b1a1/librt-0.9.0-cp311-cp311-win32.whl", hash = "sha256:f100bfe2acf8a3689af9d0cc660d89f17286c9c795f9f18f7b62dd1a6b247ae6", size = 55668, upload-time = "2026-04-09T16:04:56.689Z" }, - { url = "https://files.pythonhosted.org/packages/24/19/40b77b77ce80b9389fb03971431b09b6b913911c38d412059e0b3e2a9ef2/librt-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:0b73e4266307e51c95e09c0750b7ec383c561d2e97d58e473f6f6a209952fbb8", size = 62976, upload-time = "2026-04-09T16:04:57.733Z" }, - { url = "https://files.pythonhosted.org/packages/70/9d/9fa7a64041e29035cb8c575af5f0e3840be1b97b4c4d9061e0713f171849/librt-0.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc5518873822d2faa8ebdd2c1a4d7c8ef47b01a058495ab7924cb65bdbf5fc9a", size = 53502, upload-time = "2026-04-09T16:04:58.806Z" }, - { url = "https://files.pythonhosted.org/packages/bf/90/89ddba8e1c20b0922783cd93ed8e64f34dc05ab59c38a9c7e313632e20ff/librt-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b3e3bc363f71bda1639a4ee593cb78f7fbfeacc73411ec0d4c92f00730010a4", size = 68332, upload-time = "2026-04-09T16:05:00.09Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/7aa4da1fb08bdeeb540cb07bfc8207cb32c5c41642f2594dbd0098a0662d/librt-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a09c2f5869649101738653a9b7ab70cf045a1105ac66cbb8f4055e61df78f2d", size = 70581, upload-time = "2026-04-09T16:05:01.213Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/73a2187e1031041e93b7e3a25aae37aa6f13b838c550f7e0f06f66766212/librt-0.9.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ca8e133d799c948db2ab1afc081c333a825b5540475164726dcbf73537e5c2f", size = 203984, upload-time = "2026-04-09T16:05:02.542Z" }, - { url = "https://files.pythonhosted.org/packages/5e/3d/23460d571e9cbddb405b017681df04c142fb1b04cbfce77c54b08e28b108/librt-0.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:603138ee838ee1583f1b960b62d5d0007845c5c423feb68e44648b1359014e27", size = 215762, upload-time = "2026-04-09T16:05:04.127Z" }, - { url = "https://files.pythonhosted.org/packages/de/1e/42dc7f8ab63e65b20640d058e63e97fd3e482c1edbda3570d813b4d0b927/librt-0.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4003f70c56a5addd6aa0897f200dd59afd3bf7bcd5b3cce46dd21f925743bc2", size = 230288, upload-time = "2026-04-09T16:05:05.883Z" }, - { url = "https://files.pythonhosted.org/packages/dc/08/ca812b6d8259ad9ece703397f8ad5c03af5b5fedfce64279693d3ce4087c/librt-0.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78042f6facfd98ecb25e9829c7e37cce23363d9d7c83bc5f72702c5059eb082b", size = 224103, upload-time = "2026-04-09T16:05:07.148Z" }, - { url = "https://files.pythonhosted.org/packages/b6/3f/620490fb2fa66ffd44e7f900254bc110ebec8dac6c1b7514d64662570e6f/librt-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a361c9434a64d70a7dbb771d1de302c0cc9f13c0bffe1cf7e642152814b35265", size = 232122, upload-time = "2026-04-09T16:05:08.386Z" }, - { url = "https://files.pythonhosted.org/packages/e9/83/12864700a1b6a8be458cf5d05db209b0d8e94ae281e7ec261dbe616597b4/librt-0.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd2c7e082b0b92e1baa4da28163a808672485617bc855cc22a2fd06978fa9084", size = 225045, upload-time = "2026-04-09T16:05:09.707Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1b/845d339c29dc7dbc87a2e992a1ba8d28d25d0e0372f9a0a2ecebde298186/librt-0.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7e6274fd33fc5b2a14d41c9119629d3ff395849d8bcbc80cf637d9e8d2034da8", size = 227372, upload-time = "2026-04-09T16:05:10.942Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fe/277985610269d926a64c606f761d58d3db67b956dbbf40024921e95e7fcb/librt-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5093043afb226ecfa1400120d1ebd4442b4f99977783e4f4f7248879009b227f", size = 248224, upload-time = "2026-04-09T16:05:12.254Z" }, - { url = "https://files.pythonhosted.org/packages/92/1b/ee486d244b8de6b8b5dbaefabe6bfdd4a72e08f6353edf7d16d27114da8d/librt-0.9.0-cp312-cp312-win32.whl", hash = "sha256:9edcc35d1cae9fd5320171b1a838c7da8a5c968af31e82ecc3dff30b4be0957f", size = 55986, upload-time = "2026-04-09T16:05:13.529Z" }, - { url = "https://files.pythonhosted.org/packages/89/7a/ba1737012308c17dc6d5516143b5dce9a2c7ba3474afd54e11f44a4d1ef3/librt-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc2917258e131ae5f958a4d872e07555b51cb7466a43433218061c74ef33745", size = 63260, upload-time = "2026-04-09T16:05:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/36/e4/01752c113da15127f18f7bf11142f5640038f062407a611c059d0036c6aa/librt-0.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:90e6d5420fc8a300518d4d2288154ff45005e920425c22cbbfe8330f3f754bd9", size = 53694, upload-time = "2026-04-09T16:05:16.095Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d7/1b3e26fffde1452d82f5666164858a81c26ebe808e7ae8c9c88628981540/librt-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29b68cd9714531672db62cc54f6e8ff981900f824d13fa0e00749189e13778e", size = 68367, upload-time = "2026-04-09T16:05:17.243Z" }, - { url = "https://files.pythonhosted.org/packages/a5/5b/c61b043ad2e091fbe1f2d35d14795e545d0b56b03edaa390fa1dcee3d160/librt-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d5c8a5929ac325729f6119802070b561f4db793dffc45e9ac750992a4ed4d22", size = 70595, upload-time = "2026-04-09T16:05:18.471Z" }, - { url = "https://files.pythonhosted.org/packages/a3/22/2448471196d8a73370aa2f23445455dc42712c21404081fcd7a03b9e0749/librt-0.9.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:756775d25ec8345b837ab52effee3ad2f3b2dfd6bbee3e3f029c517bd5d8f05a", size = 204354, upload-time = "2026-04-09T16:05:19.593Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5e/39fc4b153c78cfd2c8a2dcb32700f2d41d2312aa1050513183be4540930d/librt-0.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8f5d00b49818f4e2b1667db994488b045835e0ac16fe2f924f3871bd2b8ac5", size = 216238, upload-time = "2026-04-09T16:05:20.868Z" }, - { url = "https://files.pythonhosted.org/packages/d7/42/bc2d02d0fa7badfa63aa8d6dcd8793a9f7ef5a94396801684a51ed8d8287/librt-0.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c81aef782380f0f13ead670aae01825eb653b44b046aa0e5ebbb79f76ed4aa11", size = 230589, upload-time = "2026-04-09T16:05:22.305Z" }, - { url = "https://files.pythonhosted.org/packages/c8/7b/e2d95cc513866373692aa5edf98080d5602dd07cabfb9e5d2f70df2f25f7/librt-0.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66b58fed90a545328e80d575467244de3741e088c1af928f0b489ebec3ef3858", size = 224610, upload-time = "2026-04-09T16:05:23.647Z" }, - { url = "https://files.pythonhosted.org/packages/31/d5/6cec4607e998eaba57564d06a1295c21b0a0c8de76e4e74d699e627bd98c/librt-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e78fb7419e07d98c2af4b8567b72b3eaf8cb05caad642e9963465569c8b2d87e", size = 232558, upload-time = "2026-04-09T16:05:25.025Z" }, - { url = "https://files.pythonhosted.org/packages/95/8c/27f1d8d3aaf079d3eb26439bf0b32f1482340c3552e324f7db9dca858671/librt-0.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c3786f0f4490a5cd87f1ed6cefae833ad6b1060d52044ce0434a2e85893afd0", size = 225521, upload-time = "2026-04-09T16:05:26.311Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d8/1e0d43b1c329b416017619469b3c3801a25a6a4ef4a1c68332aeaa6f72ca/librt-0.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8494cfc61e03542f2d381e71804990b3931175a29b9278fdb4a5459948778dc2", size = 227789, upload-time = "2026-04-09T16:05:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/d3d842e88610fcd4c8eec7067b0c23ef2d7d3bff31496eded6a83b0f99be/librt-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07cf11f769831186eeac424376e6189f20ace4f7263e2134bdb9757340d84d4d", size = 248616, upload-time = "2026-04-09T16:05:29.181Z" }, - { url = "https://files.pythonhosted.org/packages/ec/28/527df8ad0d1eb6c8bdfa82fc190f1f7c4cca5a1b6d7b36aeabf95b52d74d/librt-0.9.0-cp313-cp313-win32.whl", hash = "sha256:850d6d03177e52700af605fd60db7f37dcb89782049a149674d1a9649c2138fd", size = 56039, upload-time = "2026-04-09T16:05:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a7/413652ad0d92273ee5e30c000fc494b361171177c83e57c060ecd3c21538/librt-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:a5af136bfba820d592f86c67affcef9b3ff4d4360ac3255e341e964489b48519", size = 63264, upload-time = "2026-04-09T16:05:31.881Z" }, - { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c1/184e539543f06ea2912f4b92a5ffaede4f9b392689e3f00acbf8134bee92/librt-0.9.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:3f05d145df35dca5056a8bc3838e940efebd893a54b3e19b2dda39ceaa299bcb", size = 67830, upload-time = "2026-04-09T16:05:34.517Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ad/23399bdcb7afca819acacdef31b37ee59de261bd66b503a7995c03c4b0dc/librt-0.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1c587494461ebd42229d0f1739f3aa34237dd9980623ecf1be8d3bcba79f4499", size = 70280, upload-time = "2026-04-09T16:05:35.649Z" }, - { url = "https://files.pythonhosted.org/packages/9f/0b/4542dc5a2b8772dbf92cafb9194701230157e73c14b017b6961a23598b03/librt-0.9.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0a2040f801406b93657a70b72fa12311063a319fee72ce98e1524da7200171f", size = 201925, upload-time = "2026-04-09T16:05:36.739Z" }, - { url = "https://files.pythonhosted.org/packages/31/d4/8ee7358b08fd0cfce051ef96695380f09b3c2c11b77c9bfbc367c921cce5/librt-0.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f38bc489037eca88d6ebefc9c4d41a4e07c8e8b4de5188a9e6d290273ad7ebb1", size = 212381, upload-time = "2026-04-09T16:05:38.043Z" }, - { url = "https://files.pythonhosted.org/packages/f2/94/a2025fe442abedf8b038038dab3dba942009ad42b38ea064a1a9e6094241/librt-0.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3fd278f5e6bf7c75ccd6d12344eb686cc020712683363b66f46ac79d37c799f", size = 227065, upload-time = "2026-04-09T16:05:39.394Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e9/b9fcf6afa909f957cfbbf918802f9dada1bd5d3c1da43d722fd6a310dc3f/librt-0.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fcbdf2a9ca24e87bbebb47f1fe34e531ef06f104f98c9ccfc953a3f3344c567a", size = 221333, upload-time = "2026-04-09T16:05:40.999Z" }, - { url = "https://files.pythonhosted.org/packages/ac/7c/ba54cd6aa6a3c8cd12757a6870e0c79a64b1e6327f5248dcff98423f4d43/librt-0.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e306d956cfa027fe041585f02a1602c32bfa6bb8ebea4899d373383295a6c62f", size = 229051, upload-time = "2026-04-09T16:05:42.605Z" }, - { url = "https://files.pythonhosted.org/packages/4b/4b/8cfdbad314c8677a0148bf0b70591d6d18587f9884d930276098a235461b/librt-0.9.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:465814ab157986acb9dfa5ccd7df944be5eefc0d08d31ec6e8d88bc71251d845", size = 222492, upload-time = "2026-04-09T16:05:43.842Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d1/2eda69563a1a88706808decdce035e4b32755dbfbb0d05e1a65db9547ed1/librt-0.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:703f4ae36d6240bfe24f542bac784c7e4194ec49c3ba5a994d02891649e2d85b", size = 223849, upload-time = "2026-04-09T16:05:45.054Z" }, - { url = "https://files.pythonhosted.org/packages/04/44/b2ed37df6be5b3d42cfe36318e0598e80843d5c6308dd63d0bf4e0ce5028/librt-0.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3be322a15ee5e70b93b7a59cfd074614f22cc8c9ff18bd27f474e79137ea8d3b", size = 245001, upload-time = "2026-04-09T16:05:46.34Z" }, - { url = "https://files.pythonhosted.org/packages/47/e7/617e412426df89169dd2a9ed0cc8752d5763336252c65dbf945199915119/librt-0.9.0-cp314-cp314-win32.whl", hash = "sha256:b8da9f8035bb417770b1e1610526d87ad4fc58a2804dc4d79c53f6d2cf5a6eb9", size = 51799, upload-time = "2026-04-09T16:05:47.738Z" }, - { url = "https://files.pythonhosted.org/packages/24/ed/c22ca4db0ca3cbc285e4d9206108746beda561a9792289c3c31281d7e9df/librt-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:b8bd70d5d816566a580d193326912f4a76ec2d28a97dc4cd4cc831c0af8e330e", size = 59165, upload-time = "2026-04-09T16:05:49.198Z" }, - { url = "https://files.pythonhosted.org/packages/24/56/875398fafa4cbc8f15b89366fc3287304ddd3314d861f182a4b87595ace0/librt-0.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:fc5758e2b7a56532dc33e3c544d78cbaa9ecf0a0f2a2da2df882c1d6b99a317f", size = 49292, upload-time = "2026-04-09T16:05:50.362Z" }, - { url = "https://files.pythonhosted.org/packages/4c/61/bc448ecbf9b2d69c5cff88fe41496b19ab2a1cbda0065e47d4d0d51c0867/librt-0.9.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f24b90b0e0c8cc9491fb1693ae91fe17cb7963153a1946395acdbdd5818429a4", size = 70175, upload-time = "2026-04-09T16:05:51.564Z" }, - { url = "https://files.pythonhosted.org/packages/60/f2/c47bb71069a73e2f04e70acbd196c1e5cc411578ac99039a224b98920fd4/librt-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fe56e80badb66fdcde06bef81bbaa5bfcf6fbd7aefb86222d9e369c38c6b228", size = 72951, upload-time = "2026-04-09T16:05:52.699Z" }, - { url = "https://files.pythonhosted.org/packages/29/19/0549df59060631732df758e8886d92088da5fdbedb35b80e4643664e8412/librt-0.9.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:527b5b820b47a09e09829051452bb0d1dd2122261254e2a6f674d12f1d793d54", size = 225864, upload-time = "2026-04-09T16:05:53.895Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f8/3b144396d302ac08e50f89e64452c38db84bc7b23f6c60479c5d3abd303c/librt-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d429bdd4ac0ab17c8e4a8af0ed2a7440b16eba474909ab357131018fe8c7e71", size = 241155, upload-time = "2026-04-09T16:05:55.191Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ce/ee67ec14581de4043e61d05786d2aed6c9b5338816b7859bcf07455c6a9f/librt-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7202bdcac47d3a708271c4304a474a8605a4a9a4a709e954bf2d3241140aa938", size = 252235, upload-time = "2026-04-09T16:05:56.549Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fa/0ead15daa2b293a54101550b08d4bafe387b7d4a9fc6d2b985602bae69b6/librt-0.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0d620e74897f8c2613b3c4e2e9c1e422eb46d2ddd07df540784d44117836af3", size = 244963, upload-time = "2026-04-09T16:05:57.858Z" }, - { url = "https://files.pythonhosted.org/packages/29/68/9fbf9a9aa704ba87689e40017e720aced8d9a4d2b46b82451d8142f91ec9/librt-0.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d69fc39e627908f4c03297d5a88d9284b73f4d90b424461e32e8c2485e21c283", size = 257364, upload-time = "2026-04-09T16:05:59.686Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8d/9d60869f1b6716c762e45f66ed945b1e5dd649f7377684c3b176ae424648/librt-0.9.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c2640e23d2b7c98796f123ffd95cf2022c7777aa8a4a3b98b36c570d37e85eee", size = 247661, upload-time = "2026-04-09T16:06:00.938Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/a5c365093962310bfdb4f6af256f191085078ffb529b3f0cbebb5b33ebe2/librt-0.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:451daa98463b7695b0a30aa56bf637831ea559e7b8101ac2ef6382e8eb15e29c", size = 248238, upload-time = "2026-04-09T16:06:02.537Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3c/2d34365177f412c9e19c0a29f969d70f5343f27634b76b765a54d8b27705/librt-0.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:928bd06eca2c2bbf4349e5b817f837509b0604342e65a502de1d50a7570afd15", size = 269457, upload-time = "2026-04-09T16:06:03.833Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cd/de45b239ea3bdf626f982a00c14bfcf2e12d261c510ba7db62c5969a27cd/librt-0.9.0-cp314-cp314t-win32.whl", hash = "sha256:a9c63e04d003bc0fb6a03b348018b9a3002f98268200e22cc80f146beac5dc40", size = 52453, upload-time = "2026-04-09T16:06:05.229Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f9/bfb32ae428aa75c0c533915622176f0a17d6da7b72b5a3c6363685914f70/librt-0.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f162af66a2ed3f7d1d161a82ca584efd15acd9c1cff190a373458c32f7d42118", size = 60044, upload-time = "2026-04-09T16:06:06.398Z" }, - { url = "https://files.pythonhosted.org/packages/aa/47/7d70414bcdbb3bc1f458a8d10558f00bbfdb24e5a11740fc8197e12c3255/librt-0.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a4b25c6c25cac5d0d9d6d6da855195b254e0021e513e0249f0e3b444dc6e0e61", size = 50009, upload-time = "2026-04-09T16:06:07.995Z" }, +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/cb/c1945e506893b5b8577fb45a60c80e3ffe4a82092a04a6f29b0b951d9a24/librt-0.10.0.tar.gz", hash = "sha256:1aba1e8aa4e3307a7be68a74149545fde7451964dc0235a8bec5704a17bdda42", size = 191799, upload-time = "2026-05-05T16:31:23.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/18/827e5c1262a88c2602e86f99aee0f288ffea3280dbd2ff448858ef9dc6e9/librt-0.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dc99f9642100b86e5f6bb14cdc9970009e31a9ef7d64df6704b7018451524a3", size = 76461, upload-time = "2026-05-05T16:29:00.422Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/54254e30287f5a5abec6fef22d976987476e966be5fdff51fe8c2d5d73d1/librt-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8298cedfcfaff3790000bd057aaaa3df1b0ab54cf7b48eeab16184cbb1bc66b9", size = 79740, upload-time = "2026-05-05T16:29:01.926Z" }, + { url = "https://files.pythonhosted.org/packages/4c/20/e93264b52113669d98d3b63ff94d4ce0c4dd49ae0503f1788440a884e5f0/librt-0.10.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7dbe312dbf76468255b79a7ba311236fde620f2f7055fc09d421e31340314e", size = 243472, upload-time = "2026-05-05T16:29:03.373Z" }, + { url = "https://files.pythonhosted.org/packages/35/ad/34a5141178e8b18a4cfa45d1a0d523c84397e2abd5d06fea2d846da687e8/librt-0.10.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:56ed90c48c19249012dadfd79a1bc13bd5168ea60a70722d330a3a600c0b1852", size = 232073, upload-time = "2026-05-05T16:29:04.815Z" }, + { url = "https://files.pythonhosted.org/packages/97/1f/67240e910cd9f9ab1498c1470738345fc29dce5dc9719db1e0e09d1e861f/librt-0.10.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d74ca0f4b2b09c117f913d4df01f6b934dff8a271096b35167d5264a31649f0", size = 256956, upload-time = "2026-05-05T16:29:06.516Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/3a2b3482c27d607f6e8216d913c6bc592b9a2141d96990309452340a78e3/librt-0.10.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8eb2daa9375f93c0e55ff5e44a4bbe98f39e5fe52e1abf9c97acb67743b61bf8", size = 250593, upload-time = "2026-05-05T16:29:08.324Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1c/07dba133d79f93322fa17514062f1a2a50d6bdfb7baec4acf78193d7fad1/librt-0.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7b09b90e634e6dff57978cd358070046071e2b120501f10787aeb35425f504f6", size = 263582, upload-time = "2026-05-05T16:29:09.866Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ac/033f2c6d6ab0b48f15f02e5bf065521b11a51922806017f8b6274df30d69/librt-0.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2cf22fd379d60c739b800d4295ed34045f8b04aa8df9c12bd2f8f43f7fe672b7", size = 259307, upload-time = "2026-05-05T16:29:11.675Z" }, + { url = "https://files.pythonhosted.org/packages/6e/10/679046cd75d5a52c0104c890d8f69574ef4e619c683e59c15584d03a2457/librt-0.10.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:74c798793fcf29a84d442278ebe0bb1fff79fe58ac4106eeff7019cbba861423", size = 257342, upload-time = "2026-05-05T16:29:13.14Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d5/dbaac9c0884f78a53dda22b9ec92bb788e1400e762ed7623fa96928c8da5/librt-0.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dc4f1573401e8dbe6c26511fe027620b0fb30ae9a7ab814e02e510626b8b5f9c", size = 280141, upload-time = "2026-05-05T16:29:14.922Z" }, + { url = "https://files.pythonhosted.org/packages/cc/81/71f18cf8eb340d9fda011498870910f6a8697aeb50833005d3d8107653fd/librt-0.10.0-cp310-cp310-win32.whl", hash = "sha256:e1428275f5fe3d4db6822e58d8b005a5b28ffca55e8433ebc051247fbe46429f", size = 62257, upload-time = "2026-05-05T16:29:16.226Z" }, + { url = "https://files.pythonhosted.org/packages/df/52/6bcebc2f870c4836bcb372be885fae7f17a1d25037d3a8250ef79fbe0124/librt-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:0708e9408f585b0f065081680583a577652099680ccf820c7538904322b679c3", size = 70321, upload-time = "2026-05-05T16:29:17.41Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/1472717d2325adacc8d335ba2e4078015c09d75b599f3cf48e967b3d306e/librt-0.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01b4500ca3a625450c032a9142a8e843923ce263fa8a92ad1b38927cabe2fe72", size = 76045, upload-time = "2026-05-05T16:29:18.731Z" }, + { url = "https://files.pythonhosted.org/packages/a6/31/bfe32355d4b369aef3d7aa442df663bb5558c2ffa2de286cb2956346bc24/librt-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b7e42d1b3e300d20bfc87e72ffd62f0a92a2cb3c35f7bf90df90c9d2a49f74c", size = 79466, upload-time = "2026-05-05T16:29:20.052Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f1/83f8a2c715ba2cac9b7387a5a5cea25f717f7184320cfe48b36bed9c58e9/librt-0.10.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8ef7b8c61ce3a1b597cd3e15348ff1574325165c2e7ce09a718154cde2a7950", size = 242283, upload-time = "2026-05-05T16:29:21.596Z" }, + { url = "https://files.pythonhosted.org/packages/cc/94/c3a4ce94857f0004a542f86662806383611858f522722db58efaec0a1472/librt-0.10.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e73c84f72d1fa0d6eaa7a1930b436ba8d2c90c58d77bfabb09995a69ad35f6c0", size = 230735, upload-time = "2026-05-05T16:29:23.335Z" }, + { url = "https://files.pythonhosted.org/packages/d1/41/e962bb26c7728eb7b3a69e490d0c800fd9968a6970e390c1f18ddb56093d/librt-0.10.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9728cb98713bd862fb8f4fd6a642d1896c86058a41d77c70f3d5cee75e725275", size = 256606, upload-time = "2026-05-05T16:29:24.91Z" }, + { url = "https://files.pythonhosted.org/packages/66/3a/4e46a707b1ecc993fd691071623b9beab89703a63bd21cc7807e06c28209/librt-0.10.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:648b7e941d20acd72f9652115e0e53facd98156d61f9ebf7a812bdef8bdccea9", size = 249739, upload-time = "2026-05-05T16:29:26.648Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f5/dc5b7eb294656ad23d4ff4cf8514208d54fe1026b909d726a0dc026689c9/librt-0.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c3e33747c068e86a9007c20fdb777eb5ba8d3d19136d7812f88e69a713041b6f", size = 261414, upload-time = "2026-05-05T16:29:28.702Z" }, + { url = "https://files.pythonhosted.org/packages/58/e4/990ed8d12c7f114ac8f8ccd47f7d9bd9704ef61acfcb1df4a05047da7710/librt-0.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d509c745bf7e77d1107cf05e6abb249dc03fad13eb39f2286a49deedaeb2bcd7", size = 256614, upload-time = "2026-05-05T16:29:30.357Z" }, + { url = "https://files.pythonhosted.org/packages/60/eb/52d2726c7fb22818507dc3cc166c8f36dd4a4b68a7be67f12006ac8777c1/librt-0.10.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:786ad5a15e99d0e0e74f3adbeecc198a5ac58f340be07e984723d1e0074838de", size = 255144, upload-time = "2026-05-05T16:29:32.106Z" }, + { url = "https://files.pythonhosted.org/packages/bc/df/bd5591a78f7531fce4b6eb9962aadc6adc9560a01570442a884b6e554abe/librt-0.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:075582d877a97ee3d8e77bda3689dbe617b14f6469224a2d80b4b6c38e3951aa", size = 279121, upload-time = "2026-05-05T16:29:33.688Z" }, + { url = "https://files.pythonhosted.org/packages/fd/df/7c2b838dfc89a1762dd156d8b0c39848a7a2845d725a50be5a6e021fb8ba/librt-0.10.0-cp311-cp311-win32.whl", hash = "sha256:75ecdc3f5a90065aa2af2e574706c5495adc392520762dcf10b1aa716f0b8090", size = 62593, upload-time = "2026-05-05T16:29:35.152Z" }, + { url = "https://files.pythonhosted.org/packages/91/19/22ff572981049a9d436a083dbea1572d0f5dc068b7353637d2dd9977c8f1/librt-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:b6f6084884131d8a52cb9d7095ff2aa52c1e786d9fdaefab1fb4515415e9e083", size = 70914, upload-time = "2026-05-05T16:29:36.407Z" }, + { url = "https://files.pythonhosted.org/packages/12/22/1697cc64f4a5c7e9bce55e99c6d234a346beaedaefcd1e2ca90dd285f98c/librt-0.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:0140bd62151160047e89b2730cb6f8506cdac5127baa1afb9231e4dd3fe7f681", size = 61176, upload-time = "2026-05-05T16:29:37.62Z" }, + { url = "https://files.pythonhosted.org/packages/12/8e/cbb5b6f6e45e65c10a42449a69eaccc44d73e6a081ea752fbc5221c6dc1c/librt-0.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b4b58a44b407e91f633dafee008de9ddea6aa2a555ed94929c099260910bd0ba", size = 77327, upload-time = "2026-05-05T16:29:38.919Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3d/8233cbee8e99e6a8992f02bfc2dec8d787509566a511d1fde2574ee7473f/librt-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:950b79b11762531bdf45a9df909d2f9a2a8445c70c88665c01d14c8511a27dc5", size = 79971, upload-time = "2026-05-05T16:29:40.96Z" }, + { url = "https://files.pythonhosted.org/packages/87/6f/5264b298cef2b72fc97d2dde56c66181eda35204bf5dcd1ed0c3d0a0a782/librt-0.10.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4538453f51be197633b425912c150e25b0667252d3741c53e8368176d98d9d37", size = 246559, upload-time = "2026-05-05T16:29:42.701Z" }, + { url = "https://files.pythonhosted.org/packages/07/7b/19b1b859cc60d5f99276cc2b3144d91556c6d1b1e4ebb50359696bebf7a8/librt-0.10.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:70b955f091beac93e994a0b7ec616934f63b3ea5c3d6d7af847562f935aceca7", size = 235216, upload-time = "2026-05-05T16:29:44.193Z" }, + { url = "https://files.pythonhosted.org/packages/6e/56/a2f40717142a8af46289f57874ef914353d8faccd5e4f8e594ab1e16e8c7/librt-0.10.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:483e685e06b6163728ba6c85d74315176be7190f432ec2a41226e5e14355d5f0", size = 263108, upload-time = "2026-05-05T16:29:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/ca/15c625c3bdc0167c01e04ef8878317e9713f3bfa788438342f7a94c7b22c/librt-0.10.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ac53d946a009d1a38c44a60812708c9458fb2a239a5f630d8e625571386650f", size = 255280, upload-time = "2026-05-05T16:29:48.087Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/ba301d571d9e05844e2435b73aba30bee77bb75ce155c9affcfd2173dd03/librt-0.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc8771c9fcf0ea894ca41fdc2abd83572c2fbda221f232d86e718614e57ff513", size = 268829, upload-time = "2026-05-05T16:29:49.628Z" }, + { url = "https://files.pythonhosted.org/packages/8b/60/af70e135bc1f1fe15dd3894b1e4bbefc7ecdf911749a925a39eb86ceb2a1/librt-0.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:70805dbc5257892ac572f86290a61e3c8d90224ecce1a8b2d1f7ed51965417f4", size = 262051, upload-time = "2026-05-05T16:29:51.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/c2/c8236eb8b421bac5a172ba208f965abaa89805da2a3fa112bdf1764caf8f/librt-0.10.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d3b4f300f7bcba6e2ff73fb8bef1898479e9772bfa2682998c636391633ec826", size = 264347, upload-time = "2026-05-05T16:29:53.013Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/15b6d32bc25dacd4a60886a683d8128d6219910c122202b995a40dd4f8d2/librt-0.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:943bc943f92f4fb3408fae62485c6a3ad68ce4f2ee205643a39641525c19a276", size = 286482, upload-time = "2026-05-05T16:29:54.675Z" }, + { url = "https://files.pythonhosted.org/packages/fb/8e/b1b959bacd323eb4360579db992513e1406d1c6ef7edb57b5511fd0666fd/librt-0.10.0-cp312-cp312-win32.whl", hash = "sha256:6065c1a758fba1010b41401013903d3d5d2750eab425ddedd584abac31d0630e", size = 62955, upload-time = "2026-05-05T16:29:56.39Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4c/d4cd6e4b9fc24098e63cc85537d1b6689682aee96809c38f08072067cc2b/librt-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:d788ecbe208ab352dab0e105cc06057bf9a2fc7e58cabb0d751ad9e30062b9e2", size = 71191, upload-time = "2026-05-05T16:29:57.682Z" }, + { url = "https://files.pythonhosted.org/packages/2b/19/8641da1f63d24b92354a492f893c022d6b3a0df44e70c8eff49364613983/librt-0.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:6003d1f295bdba02656dc81308208fc060d0a51d8c0d0a6db70f7f3c57b9ba0a", size = 61432, upload-time = "2026-05-05T16:29:58.971Z" }, + { url = "https://files.pythonhosted.org/packages/e5/29/681a75c82f4cc90d29e4b257a3299b79fe13fe927a04c57b8109d70b6957/librt-0.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0ede79d682e73f91c1b599a76d78b7464b9b5d213754cedb13372d9df36e596", size = 77299, upload-time = "2026-05-05T16:30:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/62/24/0c7ca445a55d04be79cac19819437fd094782347fa116f6681844fa6143e/librt-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0ba0b131fdb336c8b9c948e397f4a7e649d0f783b529f07b647bf4961df392e", size = 79930, upload-time = "2026-05-05T16:30:01.555Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1f/1e2b8f6443ef9e9a81e89486ca70e22f3684f93db003ce6eaefc3d0839b9/librt-0.10.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2728117da2afb96fb957768725ee43dc9a2d73b031e02da424b818a3cdd3a275", size = 246195, upload-time = "2026-05-05T16:30:03.261Z" }, + { url = "https://files.pythonhosted.org/packages/74/61/9dc9e03de0439ad84c1c240aac8b747f12c90cb797ea6042f7bdb8d3410f/librt-0.10.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:723ba80594c49cdf0584196fc430752262605dc9449902fc9bd3d9b79976cb77", size = 234951, upload-time = "2026-05-05T16:30:04.881Z" }, + { url = "https://files.pythonhosted.org/packages/55/f4/635223117d7590875bca441275065a3bf491203ad4208bd1cc3ffd90c5a1/librt-0.10.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7292edaaca294a61a978c53a3c7d6130d099b0dfbc8f0a65916cdc6b891b9852", size = 262768, upload-time = "2026-05-05T16:30:06.638Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/b04152d0cd8b6ca2b428a8bd3230343230c35ed304a932f35b5375f2f828/librt-0.10.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89fe9d539f2c10a1666633eeeac507ce95dd06d9ecc58de3c6390dba156a3d3a", size = 255075, upload-time = "2026-05-05T16:30:08.216Z" }, + { url = "https://files.pythonhosted.org/packages/35/1e/25bac4c7f2ca36f0e612cade186970683cf79153d96beccc3a11a9e19b97/librt-0.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4efa7b9587503fa5b67f40593302b9c8836d211d222ff9f7cafe67be5f8f0b10", size = 268559, upload-time = "2026-05-05T16:30:10.1Z" }, + { url = "https://files.pythonhosted.org/packages/18/54/4601faab35b6632a13200faa146ca62bfd111ffbe2568be430d65c89493a/librt-0.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:22dc982ef59df0136df36092ccbdbb570ced8aafb33e49585739b2f1de1c13b6", size = 261753, upload-time = "2026-05-05T16:30:11.912Z" }, + { url = "https://files.pythonhosted.org/packages/1b/cf/39f4023509e94fade8b074666fa3292db9cb6b34ea5dcbe7af53df9fca1d/librt-0.10.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6f2e5f3606253a84cea719c94a3bb1c54487b5d617d0254d46e0920d8a06be3f", size = 264055, upload-time = "2026-05-05T16:30:13.465Z" }, + { url = "https://files.pythonhosted.org/packages/8e/00/40247209fc46a8e308a91412d5206aedf8efb667ee89eb625820106a5c2f/librt-0.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40884bfaa1e29f6b6a9be255007d8f359bfc9e61d68bdef8ed3158bfcbc95df9", size = 286190, upload-time = "2026-05-05T16:30:15.073Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6e/5566beb94431a985abe1787af5ef86e087750172ff9d0bbf20f93e88132d/librt-0.10.0-cp313-cp313-win32.whl", hash = "sha256:3cd34cd8254eba756660bff6c2da91278248184301054fe3e4feb073bdd49b14", size = 62949, upload-time = "2026-05-05T16:30:16.503Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c2/3ea3301d6c8dff51d39dbe8ed75db3dc92896947d4afb5eeadf821c1e67f/librt-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:7baac5313e2d8dce1386f97777a8d03ab28f5fe1e780b3b9ac2ee7544551fedc", size = 71152, upload-time = "2026-05-05T16:30:17.766Z" }, + { url = "https://files.pythonhosted.org/packages/3c/de/5d49cb92cadcbc77d3abc27b93fd6030ed8437487dde2eae38cab5e6704d/librt-0.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:afc5b4406c8e2515698d922a5c7823a009312835ea58196671fff40e35cb8166", size = 61336, upload-time = "2026-05-05T16:30:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/7165e08108cc185a13a9c069f0685e6ef92e70e07fddf7edf5e7348c6316/librt-0.10.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f09588a30e6a22ec624090d72a3ab1a6d4d5485c3ed739603e76aa3c16efa688", size = 76794, upload-time = "2026-05-05T16:30:20.392Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ef/bf8613febf651b90c5222ee79dea5ae58d4cc2b544df69d3033424448934/librt-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:131ade118d12bd7a0adc4e655474a553f1b76cf78385868885944d21d51e45e0", size = 79662, upload-time = "2026-05-05T16:30:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/b6/67/9eddd165c1d8397bdf99b38bf12b5a55b3def5035b49eedb49f2775d1430/librt-0.10.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8b9ab28e40d011c373a189eae900c916e66d6fbecf7983e9e4883089ee085ef", size = 242390, upload-time = "2026-05-05T16:30:23.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/d1/d95da80334501866cd37004ab5d7483220d05862fab4b5405394f0264f0d/librt-0.10.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:67c39bb30da73bae1f293d1ed8bc2f8f6642649dd0928d3600aeff3041ac23d6", size = 232603, upload-time = "2026-05-05T16:30:25.198Z" }, + { url = "https://files.pythonhosted.org/packages/0c/fa/e6d64d28718bc1be4e1736fcb037ca1c4dfca927e7167df75a7d5215665e/librt-0.10.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c3273c6b774614f093c8927c2bf1b077d0fefde988fe98f46a333734e5597ab", size = 259187, upload-time = "2026-05-05T16:30:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/72/3f/3fdb77e7f937dad59cfd76b720be7e7643400ec76b2da35befab8d66ba30/librt-0.10.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9dd7c1b86a4baa583ab5db977484b93a2c474e69e96ef3e9538387ea54229cb9", size = 251846, upload-time = "2026-05-05T16:30:28.56Z" }, + { url = "https://files.pythonhosted.org/packages/18/ca/f4d49133dd86a6f55d79eca30bf412fa722f511a9abe67f62f57aa64e66a/librt-0.10.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a77385c5a202e831149f7ad03be9e67cf80e957e52c614e83dcb822c95222eb8", size = 264936, upload-time = "2026-05-05T16:30:30.491Z" }, + { url = "https://files.pythonhosted.org/packages/de/66/a8df2fbadc1f6c1827a096d11c40175bd526133480bd3bc88ec64a03d257/librt-0.10.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c6a5eafa74b5655bad59886138ed68426f098a6beb8cb95a71f2cc3cd8bb33fe", size = 258699, upload-time = "2026-05-05T16:30:32.002Z" }, + { url = "https://files.pythonhosted.org/packages/bb/73/1e3c83613fe05451bb969e27b68a573d177f08d5f63533cc29fec0989658/librt-0.10.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1fc93d0439204c50ab4d1512611ce2c206f1b369b419f69c7c27c761561e3291", size = 259825, upload-time = "2026-05-05T16:30:35.077Z" }, + { url = "https://files.pythonhosted.org/packages/09/24/5e2f926ee9d3ef348d9339526d7062abb5c44d8419e3179528c01d78c102/librt-0.10.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:79e713c178bc7a744adfbee6b4619a288eecc0c914da2a9313a20255abe2f0cf", size = 282548, upload-time = "2026-05-05T16:30:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7d/3e89ed6ad0162561fa8bef9df3195e24263104c955713cd0237d3711fad2/librt-0.10.0-cp314-cp314-win32.whl", hash = "sha256:2eba9d955a68c41d9f326be3da42f163ec3518b7ab20f1c826224e7bed71e0bf", size = 58970, upload-time = "2026-05-05T16:30:38.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/579e731c94a7086a268bfa3e7a4945cd47836bebd3cbf3faeafd2e7eaef9/librt-0.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbfaf7f5145e9917f5d18bffa298eff6a19d74e7b8b11dabdca95785befe8dbf", size = 67260, upload-time = "2026-05-05T16:30:39.804Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f8/235822b7ae0b2334f12ee18bcf2476d07924077a5efeea57dbe927704be2/librt-0.10.0-cp314-cp314-win_arm64.whl", hash = "sha256:8d6d385d1969849a6b1397114df22714b6ded917bada98668e3e974dc663477e", size = 57156, upload-time = "2026-05-05T16:30:41.412Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e3/9b919cbf1e8eb770bf91bb7df28125e0f1daf4587169afefd95402636e9a/librt-0.10.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:6c3a82d3bd32631ef5c79922dfc028520c9ad840255979ab4d908271818039ee", size = 79150, upload-time = "2026-05-05T16:30:42.761Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f5/72a944aa3bc3498169a168087eff58ca48b58bf1b704e59d091fd30739f3/librt-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d64cc66005dc324c9bb1fa3fc2841f529002f6eb15966d55e46d430f56955a6a", size = 82304, upload-time = "2026-05-05T16:30:44.082Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e3/fcc290a33e295019759472dfa794d204e43504b276ac65eab7fd9da20ea3/librt-0.10.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb562cd28c88cd2c6a9a6c78f99dc39348d6b16c94adc25de0e574acf1176e9", size = 272556, upload-time = "2026-05-05T16:30:45.497Z" }, + { url = "https://files.pythonhosted.org/packages/fd/54/546975e4c997573885e7f040a05012f8838e06fb12b0c3c1fbb76254e9d7/librt-0.10.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b809aa2854d019c28773b03605df22adc675ee4f3f4402d673581313e8906119", size = 256941, upload-time = "2026-05-05T16:30:47.059Z" }, + { url = "https://files.pythonhosted.org/packages/70/8c/f1d03401571b331653acddbd4e8cd955c06d945241dd08b25192fac0d04b/librt-0.10.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc15acabdd519bd4176fdadc2119e5e3093485d86f89138daf47e5b4cedb983a", size = 285855, upload-time = "2026-05-05T16:30:48.86Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/62cf80ff046c339faf56718b3a940244d4beb70f1c6407289b5830ec11e9/librt-0.10.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b1b2d835307d08ddadd94568e2369648ec9173bd3eea6d7f52a1abe717c81f98", size = 275321, upload-time = "2026-05-05T16:30:50.63Z" }, + { url = "https://files.pythonhosted.org/packages/d9/ea/da5918d4070362e9a4d2ee9cd34f9dc84902daad8fd4275f8504a727ff4e/librt-0.10.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d261c6a2f93335a5167887fb0223e8b98ffce20ee3fde242e8e58a37ece6d0e5", size = 293993, upload-time = "2026-05-05T16:30:52.577Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8d/68b6086bed1fcdc314c640ea04e31e52d18052e08059fa595409d66a51a9/librt-0.10.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e2ffd44963f8e7f68995504d90f9881d64e94dc1d8e310039b9526108fc0c0f7", size = 284254, upload-time = "2026-05-05T16:30:55.086Z" }, + { url = "https://files.pythonhosted.org/packages/06/c8/b810f1d84ec34a5a7ed93d7b510ab04164d75fbdf23088d5c3fbe6b08357/librt-0.10.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f285f6455ed495791c4d8630e5af732960adea93cac4c893d15619f2eae53e8", size = 284925, upload-time = "2026-05-05T16:30:56.728Z" }, + { url = "https://files.pythonhosted.org/packages/5a/00/3c82d4158c5a2c62528b8fccce65a8c9ad700e480e86f9389387435089a5/librt-0.10.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f6034ff52e663d34c7b82ef2aa2f94ad7c1d939e2368e63b06844bc4d127d2e1", size = 307830, upload-time = "2026-05-05T16:30:58.377Z" }, + { url = "https://files.pythonhosted.org/packages/99/3a/9c635ac3e8a00383ff689161d3eac8a30b3b2ddc711b40471e6b8983ea29/librt-0.10.0-cp314-cp314t-win32.whl", hash = "sha256:657860fd877fba6a241ea088ef99f63ca819945d3c715265da670bad56c37ebe", size = 60147, upload-time = "2026-05-05T16:31:00.293Z" }, + { url = "https://files.pythonhosted.org/packages/dc/e8/6f65f3e565d4ac212cddddd552eacc8035ffdf941ca0ad6fe945a211d41f/librt-0.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:56ded2d66010203a0cb5af063b609e3f079531a0e5e576d618dece859fd2e1af", size = 68649, upload-time = "2026-05-05T16:31:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/51/78/a0705a67cacd81e5fa01a5035b3adbdfbb43a7b8d4bd27e2b282ae61baf2/librt-0.10.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1ee63f30abf18ed4830fdbaf87b2b6f4bba1e198d46085c314edde4045e56715", size = 58247, upload-time = "2026-05-05T16:31:03.191Z" }, ] [[package]] From a859f1aa0ff8c21e8f2cc2d816d46c22d50d405f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 May 2026 05:27:04 -0500 Subject: [PATCH 2840/2998] =?UTF-8?q?release(deps[gp-sphinx])=20bump=200.0?= =?UTF-8?q?.1a16=20=E2=86=92=200.0.1a17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 12 ++++---- uv.lock | 80 +++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7198b98493..43c491a1d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a16", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a16", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a16", + "gp-sphinx==0.0.1a17", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a17", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a17", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a16", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a16", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a16", + "gp-sphinx==0.0.1a17", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a17", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a17", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 48c93f929d..1ba3396a4f 100644 --- a/uv.lock +++ b/uv.lock @@ -375,7 +375,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -384,7 +384,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -394,9 +394,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/ac/a4d25fb7bb50495969ea928cfb505db99689338dadc881e15b1c9202221a/gp_furo_theme-0.0.1a16.tar.gz", hash = "sha256:5fec0e5f71dea4c4ffcf25d72c1ec5c9622cf1d5b66f6bd3978782f1ebb2d7cd", size = 33162, upload-time = "2026-05-03T20:55:30.75Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/f1/1a75cc2d02a2c9da9063304270fd81012cccf0529657c897861d01f0f853/gp_furo_theme-0.0.1a17.tar.gz", hash = "sha256:3d3d634d9df214990a5d2aa33ab31ce64886ad2e631c76287ce9b1ea25d0a341", size = 33431, upload-time = "2026-05-09T10:05:57.41Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/03/575f5fe6cbf5a21687e88332af6df5bd8b3b0ffa797b5631e977cedc5ce3/gp_furo_theme-0.0.1a16-py3-none-any.whl", hash = "sha256:8764e27c277413b9abd3cf9b7bcdbbf2ae3a5f76f8340d818135e3e7b519974e", size = 42735, upload-time = "2026-05-03T20:55:09.576Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ad/b75738a1a8ce51b2371bdb4c556dbc9f83c2192511c52bffff4dc76d6b31/gp_furo_theme-0.0.1a17-py3-none-any.whl", hash = "sha256:2868c310f62b03e27a4daa191fc95f57d4a7baacac0a614b103a810119be1af0", size = 42735, upload-time = "2026-05-09T10:05:33.412Z" }, ] [[package]] @@ -415,7 +415,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/ff/151b1baf067a34f7811755f7b2ab40f8713af02cd53ca9cb9ef94d64e467/gp_sphinx-0.0.1a16.tar.gz", hash = "sha256:d3b063e3b4056571d8b75f54661c193f9b4d9b76a35249d63a8d55fe5d26168b", size = 17031, upload-time = "2026-05-03T20:55:31.924Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/b9/5d99d315c8fb36a9af2cb3901f7d1a4cdaa4fcbcd1c271b927aff0b056d3/gp_sphinx-0.0.1a17.tar.gz", hash = "sha256:976b3ddc529cc2792b2d31acd8f24083e7db18ffab60ee7151d40371c45d3570", size = 18516, upload-time = "2026-05-09T10:05:58.692Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/fa/2030cebc3e6caf579cb05ddc93afeecf711edfc1a5711d3c6691b82adebf/gp_sphinx-0.0.1a16-py3-none-any.whl", hash = "sha256:f61a18bf3d94503508cc217b6a2db23d1631ed0f7df824eee14566f1b41ecf78", size = 17384, upload-time = "2026-05-03T20:55:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/a9/57/96ddfeab4af002be9cc7a40cd39a8730c4d99b0448e5dcef18a01b324275/gp_sphinx-0.0.1a17-py3-none-any.whl", hash = "sha256:a4bb3311e2748f91da9a1299d5b6e9c71475024824e563611b20ce6e37174eba", size = 18980, upload-time = "2026-05-09T10:05:35.153Z" }, ] [[package]] @@ -1294,7 +1294,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1302,14 +1302,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/bb/1bfc21d7a20bac5b6300af5e2dbb3a0025cb0c1ba08c2df251bc3d9519f8/sphinx_autodoc_api_style-0.0.1a16.tar.gz", hash = "sha256:e0e14c44f200c30b6d746016d49b3edad80ca537178a936b511da7b9e60e906b", size = 8296, upload-time = "2026-05-03T20:55:32.782Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6e/0818edd3024997e53be5db981bba6e40cc9b176b326e3a67ddc8d3b40ba9/sphinx_autodoc_api_style-0.0.1a17.tar.gz", hash = "sha256:10b58f1071498b34b68fea77df2787efe39a6335beb42acf621fc88028154517", size = 8296, upload-time = "2026-05-09T10:06:00.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/6e/92b1ae54dbaf0cc29ed1bca615239f5a10297566dc6f3e57a9b4ee67dcd6/sphinx_autodoc_api_style-0.0.1a16-py3-none-any.whl", hash = "sha256:6f8939e22e4f6b1b1bcca4a711e93262b49dc7672ae9f4babee59375d473d874", size = 8308, upload-time = "2026-05-03T20:55:12.353Z" }, + { url = "https://files.pythonhosted.org/packages/46/f6/aca230523ab055b4e8e652034802237a80cb250648f83a2e3b97fb3d4bfa/sphinx_autodoc_api_style-0.0.1a17-py3-none-any.whl", hash = "sha256:85848088c93adb18f757752856ecbf7f8f0db26939701099ed917dadc9694de8", size = 8308, upload-time = "2026-05-09T10:05:36.797Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1317,22 +1317,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/15/3d21ad557ccbc95d359f367a028a67bf4fe929389eb89b288df9b3f037d5/sphinx_autodoc_argparse-0.0.1a16.tar.gz", hash = "sha256:e44cb5eaa0ac20319de36965745b02f5e29637e6f276673d8762ee5e36f770ec", size = 42347, upload-time = "2026-05-03T20:55:34.042Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/45/4c2710e16893305675589c9a439fc938fe9d01ad4a2444b44617ff689d1e/sphinx_autodoc_argparse-0.0.1a17.tar.gz", hash = "sha256:c6ab49e9a15e20bf20c5d3bca11e4478b3af72546a890df162f904a4882d4a50", size = 42459, upload-time = "2026-05-09T10:06:01.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/cd/507cb8f846c1f6c43a715f29567ff9d9663174b8872cae840e1f6eeb2b36/sphinx_autodoc_argparse-0.0.1a16-py3-none-any.whl", hash = "sha256:a812865b43374eddbf0e4545dde95ea42c35a5bc51adf46aab7d6bddd4ee1ff9", size = 47276, upload-time = "2026-05-03T20:55:13.428Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d3/2b00ae5f73a1deb838da9fd5f30a5328c85559b8281612df3f0683dba215/sphinx_autodoc_argparse-0.0.1a17-py3-none-any.whl", hash = "sha256:f6355aef4493173eab4ddcedbdab0b5376a48e7a557d07b8a062ee025fc9552b", size = 47275, upload-time = "2026-05-09T10:05:38.422Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/9a/473eb793304c0bbfe4368c685ac69a759951ace95b932da3caf4064795fc/sphinx_autodoc_typehints_gp-0.0.1a16.tar.gz", hash = "sha256:5ae62da7aa44098094b97c4d3984179e9356b09bfe0bfc45b3c12ac443346352", size = 18492, upload-time = "2026-05-03T20:55:38.816Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/2b/e1341a8be6c457a9fbab67e6cc91dfdcfa20f6aad7f8311b0e94246a4b07/sphinx_autodoc_typehints_gp-0.0.1a17.tar.gz", hash = "sha256:eb74bb993a8437b97bf3ad6b84b990646a032ad0123f76dfc2d046ac17ad4265", size = 18587, upload-time = "2026-05-09T10:06:06.99Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/1c/5f4ce27439eead8eda30f231585a65c02810d61c84b3b23c3c52c5cf8052/sphinx_autodoc_typehints_gp-0.0.1a16-py3-none-any.whl", hash = "sha256:b9333c634e6e427f8f105851bc7c1bc4807d7a00e26897b395bf3b4f96e19150", size = 19010, upload-time = "2026-05-03T20:55:20.035Z" }, + { url = "https://files.pythonhosted.org/packages/3b/1c/ab3a668ada94871728582d161ef376095665958ec51d663e6337fb7dc1d1/sphinx_autodoc_typehints_gp-0.0.1a17-py3-none-any.whl", hash = "sha256:7452c6e6740e2d9defbe7a22e3273586927a8b132ba2a0fd52bca1f68e1d8231", size = 19009, upload-time = "2026-05-09T10:05:45.776Z" }, ] [[package]] @@ -1394,55 +1394,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/66/a1467c2cff1ea931589691eecfa4cac8c36c5533b76de1a2bc146dad9a4c/sphinx_fonts-0.0.1a16.tar.gz", hash = "sha256:4d31ac84e036bae1b898255e58feb2b01bbaae9703dae5e9235ab6bba4aa1e71", size = 5706, upload-time = "2026-05-03T20:55:39.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/72/e1b365ebeffd7b3c494628e6730b91ed2dfbe4fb2cac6d496263de383344/sphinx_fonts-0.0.1a17.tar.gz", hash = "sha256:c5138145cd2b3af3024e155add69d9eb9201dfb0e887af77fe8d0e2990f4ba3b", size = 5788, upload-time = "2026-05-09T10:06:07.934Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/95/9acbeed82672d57d004ef638a6f0a9ec615aad1c8edf033d4de9980527bc/sphinx_fonts-0.0.1a16-py3-none-any.whl", hash = "sha256:f6f16fd627457e1246bbadce03749e17d6577f26c7e64731ae25dabf35ad8e6a", size = 4362, upload-time = "2026-05-03T20:55:21.434Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ae/0ee78cab53f2d864e3d765c141f577a0c9928cb764fd77eca340cce51262/sphinx_fonts-0.0.1a17-py3-none-any.whl", hash = "sha256:835d74e89aae56a96f034ea002fa322ba6dc9b87304c15cfc514d1ff5f7733d1", size = 4363, upload-time = "2026-05-09T10:05:47.376Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/48/d50cb6a029ac6b21552e2a5cbf47164f82609d9facb0aa27cf9ed5d20b77/sphinx_gp_opengraph-0.0.1a16.tar.gz", hash = "sha256:96f2fb5c81902371082e82e76dda418f324459e31bd0eed77b598339c8760ff2", size = 11841, upload-time = "2026-05-03T20:55:40.724Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/fa/c0f3d81529d7f1bd25e58ffbbf9a033f3a812edf9b47c20e494f03916769/sphinx_gp_opengraph-0.0.1a17.tar.gz", hash = "sha256:7977856c45d7b60cbb14d7a892e17d2ea306dcd713062108aede8a790a592a4b", size = 11947, upload-time = "2026-05-09T10:06:08.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/a5/353cf6983db2658dc3adb766c4275714d27b282dcde71dbe5a1f81e9927a/sphinx_gp_opengraph-0.0.1a16-py3-none-any.whl", hash = "sha256:5f3c5e54f8cbb20d81c744f1ad79c5cb130ce77f0f8e2945e4a369f644060695", size = 12185, upload-time = "2026-05-03T20:55:22.725Z" }, + { url = "https://files.pythonhosted.org/packages/82/7d/719d93a65c363a687eb1dca92a6bb093acbdf64cb0671adbf83c0ab3df98/sphinx_gp_opengraph-0.0.1a17-py3-none-any.whl", hash = "sha256:769b00d1eea11c44ccd5bd67fc02554905751d96ba2a2f342e96ab1a009f0a33", size = 12184, upload-time = "2026-05-09T10:05:48.761Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/25/b418867670df9c9fb97ea5a1cbae7dc1942efebee91c1eb057acfde5d839/sphinx_gp_sitemap-0.0.1a16.tar.gz", hash = "sha256:ebcca77ab091df06a1499b336d5d43263d6282f6076b908c957842931ea37489", size = 9887, upload-time = "2026-05-03T20:55:41.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/7d/2119503abf54b6dc8baadced9a854ffc78a085b25bf8a24740437b1d4859/sphinx_gp_sitemap-0.0.1a17.tar.gz", hash = "sha256:588709e5e84497803528a09d90f2dd3b9536026f4a80f9dd45dad076f107198b", size = 9956, upload-time = "2026-05-09T10:06:09.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/27/a8e7496cabc5fe1997a8a3dc2bd9a828583579e5a78f67c4df2ae3f402a1/sphinx_gp_sitemap-0.0.1a16-py3-none-any.whl", hash = "sha256:c36d1850562a06184899e907aa3aa0df9e6c5724f7c0d24433cbc4f5607bd9b1", size = 8983, upload-time = "2026-05-03T20:55:23.784Z" }, + { url = "https://files.pythonhosted.org/packages/21/d0/1d82d17811b189d30f953ba1630f17d959efa53849fe12b2efc350328892/sphinx_gp_sitemap-0.0.1a17-py3-none-any.whl", hash = "sha256:214b903689f8027c3e10906a5dbf873f1f5151b859c9cf47a75cf521322528c6", size = 8985, upload-time = "2026-05-09T10:05:50.033Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/07/e6959fe2a3b225a03a82e2a7b79dd3be2bc0cadf66bdf070c6c7040caede/sphinx_gp_theme-0.0.1a16.tar.gz", hash = "sha256:e61063fc22b88c0bf14016004ec8ec1d7eb3e5bf9838a4b60bad0e6a08b87968", size = 17968, upload-time = "2026-05-03T20:55:42.864Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/07/13c5ef75c0034732e79dc9fec7295d80419b5f325d210abb6f4ac60c54bb/sphinx_gp_theme-0.0.1a17.tar.gz", hash = "sha256:b27dd1071bb070d946b2d54f2ebae1f6ac3e96a752bd16d5449e6da72e50d54d", size = 18040, upload-time = "2026-05-09T10:06:10.888Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/a4/ef8e54214ff73e9cfc10963524bfb48c9412dabbd561ac9c37a90cc2867e/sphinx_gp_theme-0.0.1a16-py3-none-any.whl", hash = "sha256:f4043a6f2a656137c4fe00e492812d3ce6fc6cf4933c2ba1cb67371ba6e267e2", size = 19608, upload-time = "2026-05-03T20:55:24.83Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/95bc9410ba5df636c756ea2500a04061ed6e9ad960dfe01e04909e6085fc/sphinx_gp_theme-0.0.1a17-py3-none-any.whl", hash = "sha256:f49aa5f34ca534140a2f17149d912de2836237f59441678d0f4965edb6a9304b", size = 19610, upload-time = "2026-05-09T10:05:51.215Z" }, ] [[package]] @@ -1460,28 +1460,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/a8/2908c7ac8289df68af1bbaa54d311ad6b0a109f3c3893189a022aa93534f/sphinx_ux_autodoc_layout-0.0.1a16.tar.gz", hash = "sha256:859ac6e4f690701d7da3b0fb3cc75c069eaa8db1f48b61df6e21557f39ea6c92", size = 21352, upload-time = "2026-05-03T20:55:43.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/20/ad0b557f63a4d708f24d20347de53f1e592b1142ec01a19ffae673c0d470/sphinx_ux_autodoc_layout-0.0.1a17.tar.gz", hash = "sha256:001333f0ce166630ccb41b4500d4d2e1f837d5e060cbe2e7b2aa669b394e34e6", size = 21467, upload-time = "2026-05-09T10:06:11.86Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/3a/5c5fe2cae27be3c8aa527b49dadc6399ab92fdc7713d67f9ab2d43ca9b91/sphinx_ux_autodoc_layout-0.0.1a16-py3-none-any.whl", hash = "sha256:93ff9c98d56105d6c6ec9ff1dd2b607028c111776758050bd30c50924de507bb", size = 25145, upload-time = "2026-05-03T20:55:26.251Z" }, + { url = "https://files.pythonhosted.org/packages/6b/59/7d0930f5c23dc03d5bd0c9e33d94d3a06dbd803138d167161f36b1a7d342/sphinx_ux_autodoc_layout-0.0.1a17-py3-none-any.whl", hash = "sha256:8fec752202d683608ac91e2d58bace793c870be83a90cb391f132922e076110d", size = 25144, upload-time = "2026-05-09T10:05:52.592Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a16" +version = "0.0.1a17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/27/c51a407f5e83f69c664a860de4d94f19e523d17231999d0ac0dfcf017e35/sphinx_ux_badges-0.0.1a16.tar.gz", hash = "sha256:2d8f3390207ff70a8de99b49a217393f748855f62fbe8045c09519bcaeec1011", size = 15310, upload-time = "2026-05-03T20:55:44.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/6b/753df32ceb23f0457ae2119b4668aaf6f7c568b25718ab9dd4d931a0e6ac/sphinx_ux_badges-0.0.1a17.tar.gz", hash = "sha256:0833fdae7e5b443eb298712170929bb8b19d4cd027033c7348573693a2940a06", size = 15417, upload-time = "2026-05-09T10:06:12.823Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/70/98d5564562d20983110a23ee072ba2db7c9db68192739521f4ac2cabe9ef/sphinx_ux_badges-0.0.1a16-py3-none-any.whl", hash = "sha256:d2cf637566d18dd767282841f4c800264bfe9e32896f7e74cea18d1753bca4d5", size = 16284, upload-time = "2026-05-03T20:55:27.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/46/a07c367fab1420e342d6e04d49268b1c33d410097c313cd725947e0008b6/sphinx_ux_badges-0.0.1a17-py3-none-any.whl", hash = "sha256:3e5d01b493c9b73078d17036840706b394c4f542ac8f4647dcf8b2a69efbee9c", size = 16280, upload-time = "2026-05-09T10:05:54.239Z" }, ] [[package]] @@ -1643,7 +1643,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a16" }, + { name = "gp-sphinx", specifier = "==0.0.1a17" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1653,8 +1653,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a17" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a17" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1662,11 +1662,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a16" }, + { name = "gp-sphinx", specifier = "==0.0.1a17" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a16" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a16" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a17" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a17" }, ] lint = [ { name = "mypy" }, From 281eb9a045b42d2440b764e5dbe6f3e1a7a7e93c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 May 2026 05:56:01 -0500 Subject: [PATCH 2841/2998] py(deps[dev]) Bump dev packages --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 1ba3396a4f..7a1ab6498d 100644 --- a/uv.lock +++ b/uv.lock @@ -375,7 +375,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From 0dba63d12be63034836031155e07ad83bdbff7a3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 9 May 2026 18:30:12 -0500 Subject: [PATCH 2842/2998] py(deps[dev]) Bump dev packages --- uv.lock | 141 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 90 insertions(+), 51 deletions(-) diff --git a/uv.lock b/uv.lock index 7a1ab6498d..aba4007b56 100644 --- a/uv.lock +++ b/uv.lock @@ -73,6 +73,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] +[[package]] +name = "ast-serialize" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/9d/912fefab0e30aee6a3af8a62bbea4a81b29afa4ba2c973d31170620a26de/ast_serialize-0.3.0.tar.gz", hash = "sha256:1bc3ca09a63a021376527c4e938deedd11d11d675ce850e6f9c7487f5889992b", size = 60689, upload-time = "2026-04-30T23:24:48.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/57/a54d4de491d6cdd7a4e4b0952cc3ca9f60dcefa7b5fb48d6d492debe1649/ast_serialize-0.3.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3a867927df59f76a18dc1d874a0b2c079b42c58972dca637905576deb0912e14", size = 1182966, upload-time = "2026-04-30T23:23:57.376Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9e/a5db014bb0f91b209236b57c429389e31290c0093532b8436d577699b2fa/ast_serialize-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a6fb063bf040abf8321e7b8113a0554eda445ffc508aa51287f8808886a5ae22", size = 1171316, upload-time = "2026-04-30T23:23:59.63Z" }, + { url = "https://files.pythonhosted.org/packages/15/59/fd55133e478c4326f60a11df02573bf7ccb2ac685810b50f1803d0f68053/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5075cd8482573d743586779e5f9b652a015e37d4e95132d7e5a9bc5c8f483d8f", size = 1232234, upload-time = "2026-04-30T23:24:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/cc/79/0ca1d26357ecb4a697d74d00b73ef3137f24c140424125393a0de820eb09/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41560b27794f4553b0f77811e9fb325b77db4a2b39018d437e09932275306e66", size = 1233437, upload-time = "2026-04-30T23:24:03.151Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/7078ec94dd6e124b8e028ac77016a4f13c83fa1c145790f2e68f3816998b/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b967c01ca74909c5d90e0fe4393401e2cc5da5ebd9a6262a19e45ffd3757dec8", size = 1440188, upload-time = "2026-04-30T23:24:04.717Z" }, + { url = "https://files.pythonhosted.org/packages/21/16/cca7195ef55a012f8013c3442afa91d287a0a36dcf88b480b262475135b3/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:424ebb8f46cd993f7cec4009d119312d8433dd90e6b0df0499cd2c91bdcc5af9", size = 1254211, upload-time = "2026-04-30T23:24:06.18Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0f/f3d4dfae67dee6580534361a6343367d34217e7d25cff858bd1d8f03b8ed/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d14b1d566b56e2ee70b11fec1de7e0b94ec7cd83717ec7d189967841a361190e", size = 1255973, upload-time = "2026-04-30T23:24:07.772Z" }, + { url = "https://files.pythonhosted.org/packages/14/41/55fbfe02c42f40fbe3e74eda167d977d555ff720ce1abfa08515236efd88/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba30b18735f047ec11103d1ab92f4789cf1fea1e0dc89b04a2f5a0632fd79de", size = 1298629, upload-time = "2026-04-30T23:24:09.4Z" }, + { url = "https://files.pythonhosted.org/packages/28/36/7d2501cacc7989fb8504aa9da2a2022a174200a59d4e6639de4367a57fdd/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e6ea0754cb7b0f682ebb005ffb0d18f8d17993490d9c289863cd69cacc4ab8df", size = 1408435, upload-time = "2026-04-30T23:24:11.013Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/54e3b469c3fa0bf9cd532fa643d1d33b73303f8d70beac3e366b68dd64b7/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a0c5aa1073a5ba7b2abaa4b54abe8b8d75c4d1e2d54a2ff70b0ca6222fea5728", size = 1508174, upload-time = "2026-04-30T23:24:12.635Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/9b9621865b02c60539e26d9b114a312b4fa46aa703e33e79317174bfea21/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4e52650d834c1ea7791969a361de2c54c13b2fb4c519ec79445fa8b9021a147d", size = 1502354, upload-time = "2026-04-30T23:24:14.186Z" }, + { url = "https://files.pythonhosted.org/packages/34/dd/f138bc5c43b0c414fdd12eefe15677839323078b6e75301ad7f96cd26d45/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15bd6af3f136c61dae27805eb6b8f3269e85a545c4c27ffe9e530ead78d2b36d", size = 1450504, upload-time = "2026-04-30T23:24:16.076Z" }, + { url = "https://files.pythonhosted.org/packages/68/cf/97ef9e1c315601db74365955c8edd3292e3055500d6317602815dbdf08ae/ast_serialize-0.3.0-cp314-cp314t-win32.whl", hash = "sha256:d188bfe37b674b49708497683051d4b571366a668799c9b8e8a94513694969d9", size = 1058662, upload-time = "2026-04-30T23:24:17.535Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d6/e2c3483c31580fdb623f92ad38d2f856cde4b9205a3e6bd84760f3de7d82/ast_serialize-0.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5832c2fdf8f8a6cf682b4cfcf677f5eaf39b4ddbc490f5480cfccdd1e7ce8fa1", size = 1100349, upload-time = "2026-04-30T23:24:18.992Z" }, + { url = "https://files.pythonhosted.org/packages/ab/89/29abcb1fe18a429cda60c6e0bbd1d6e90499339842a2f548d7567542357e/ast_serialize-0.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:670f177188d128fb7f9f15b5ad0e1b553d22c34e3f584dcb83eb8077600437f0", size = 1072895, upload-time = "2026-04-30T23:24:20.706Z" }, + { url = "https://files.pythonhosted.org/packages/bc/93/72abad83966ed6235647c9f956417dc1e17e997696388521910e3d1fa3f4/ast_serialize-0.3.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ec2fafa5e4313cc8feed96e436ebe19ac7bc6fa41fbc2827e826c48b9e4c3a9", size = 1190024, upload-time = "2026-04-30T23:24:22.486Z" }, + { url = "https://files.pythonhosted.org/packages/85/4f/eb88584b2f0234e581762011208ca203252bf6c98e59b4769daa571f3576/ast_serialize-0.3.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ef6d3c08b7b4cd29b48410338e134764a00e76d25841eb02c1084e868c888ecc", size = 1178633, upload-time = "2026-04-30T23:24:24.35Z" }, + { url = "https://files.pythonhosted.org/packages/56/51/cf1ec1ff3e616373d0dcbd5fad502e0029dc541f13ab642259762a7d127f/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d841424f41b886e98044abc80769c14a956e6e5ccd5fb5b0d9f5ead72be18a4", size = 1241351, upload-time = "2026-04-30T23:24:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/68fcf50478cf1093f2d423f034ae06453122c8b415d8e21a44668eca485d/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d21453734ad39367ede5d37efe4f59f830ce1c09f432fc72a90e368f77a4a3e7", size = 1239582, upload-time = "2026-04-30T23:24:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/9d/c1/a6c9fa284eceb5fc6f21347e968445a051d7ca2c4d34e6a04314646dbcee/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5e110cdce2a347e1dd987529c88ef54d26f67848dce3eba1b3b2cc2cf085c94", size = 1448853, upload-time = "2026-04-30T23:24:29.534Z" }, + { url = "https://files.pythonhosted.org/packages/23/5f/8ad3829a09e4e8c5328a53ce7d4711d660944e3e164c5f6abcc2c8f27167/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6e23a98e57560a055f5c4b68700a0fd5ce483d2814c23140b3638c7f5d1e61", size = 1262204, upload-time = "2026-04-30T23:24:31.482Z" }, + { url = "https://files.pythonhosted.org/packages/25/13/44aa28d97f10e25247e8576b5f6b2795d4fa1a80acc88acc942c508d06f7/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1c9e763d70293d65ce1e1ea8c943140c68d0953f0268c7ee0998f2e07f77dd0", size = 1266458, upload-time = "2026-04-30T23:24:33.088Z" }, + { url = "https://files.pythonhosted.org/packages/d8/58/b3a8be3777cd3744324fd5cec0d80d37cd96fc7cbb0fb010e03dff1e870f/ast_serialize-0.3.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4388a1796c228f1ce5c391426f7d21a0003ad3b47f677dbeded9bd1a85c7209f", size = 1308700, upload-time = "2026-04-30T23:24:34.657Z" }, + { url = "https://files.pythonhosted.org/packages/13/03/f8312d6b57f5471a9dc7946f22b8798a1fc296d38c25766223aacadec42c/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5283cdcc0c64c3d8b9b688dc6aaa012d9c0cf1380a7f774a6bae6a1c01b3205a", size = 1416724, upload-time = "2026-04-30T23:24:36.562Z" }, + { url = "https://files.pythonhosted.org/packages/50/5d/13fc3789a7abac00559da2e2e9f386db4612aa1f84fc53d09bf714c37545/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ef88cc5842a5d7a6ac09dc0d5fc2c98f5d276c1f076f866d55047ce886785b", size = 1515441, upload-time = "2026-04-30T23:24:38.018Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b9/7ab43fc7a23b1f970281093228f5f79bed6edeed7a3e672bde6d7a832a58/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cc14bf402bdc0978594ecce783793de2c7470cd4f5cd7eb286ca97ed8ff7cba9", size = 1510522, upload-time = "2026-04-30T23:24:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/56/ec/d75fc2b788d319f1fad77c14156896f31afdfc68af85b505e5bdebcb9592/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11eae0cf1b7b3e0678133cc2daa974ea972caf02eb4b3aa062af6fa9acd52c57", size = 1460917, upload-time = "2026-04-30T23:24:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/95/74/f99c81193a2725911e1911ae567ed27c2f2419332c7f3537366f9d238cac/ast_serialize-0.3.0-cp39-abi3-win32.whl", hash = "sha256:2db3dd99de5e6a5a11d7dda73de8750eb6e5baaf25245adf7bdcfe64b6108ae2", size = 1067804, upload-time = "2026-04-30T23:24:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/16/81/76af00c47daa151e89f98ae21fbbcb2840aaa9f5766579c4da76a3c57188/ast_serialize-0.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:a2cd125adccf7969470621905d302750cd25951f22ea430d9a25b7be031e5549", size = 1105561, upload-time = "2026-04-30T23:24:44.578Z" }, + { url = "https://files.pythonhosted.org/packages/bd/46/d3ec57ad500f598d1554bd14ce4df615960549ab2844961bc4e1f5fbd174/ast_serialize-0.3.0-cp39-abi3-win_arm64.whl", hash = "sha256:0dd00da29985f15f50dc35728b7e1e7c84507bccfea1d9914738530f1c72238a", size = 1077165, upload-time = "2026-04-30T23:24:46.377Z" }, +] + [[package]] name = "babel" version = "2.18.0" @@ -612,7 +650,7 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.0.0" +version = "4.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15'", @@ -621,9 +659,9 @@ resolution-markers = [ dependencies = [ { name = "mdurl", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5c/f3aedc83549aae71cd52b9e9687fe896e3dc6e966ba20eba04718605d198/markdown_it_py-4.1.0.tar.gz", hash = "sha256:760e3f87b2787c044c5138a5ba107b7c2be26c03b13cc7f8fe42756b65b1df6c", size = 81613, upload-time = "2026-05-06T16:32:13.649Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/a8/88/802c82060c54bc7dde21eb0033e337838b8181a1323254aa9ec41cbfc3d1/markdown_it_py-4.1.0-py3-none-any.whl", hash = "sha256:d4939a62a2dd0cd9cb80a191a711ba1d39bac8ed5ef9e9966895b0171c01c46d", size = 90955, upload-time = "2026-05-06T16:32:12.184Z" }, ] [[package]] @@ -717,7 +755,7 @@ version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ @@ -735,60 +773,61 @@ wheels = [ [[package]] name = "mypy" -version = "1.20.2" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "ast-serialize" }, { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/af/e3d4b3e9ec91a0ff9aabfdb38692952acf49bbb899c2e4c29acb3a6da3ae/mypy-1.20.2.tar.gz", hash = "sha256:e8222c26daaafd9e8626dec58ae36029f82585890589576f769a650dd20fd665", size = 3817349, upload-time = "2026-04-21T17:12:28.473Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/97/ce2502df2cecf2ef997b6c6527c4a223b92feb9e7b790cdc8dcd683f3a8a/mypy-1.20.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cf5a4db6dca263010e2c7bff081c89383c72d187ba2cf4c44759aac970e2f0c4", size = 14457059, upload-time = "2026-04-21T17:06:14.935Z" }, - { url = "https://files.pythonhosted.org/packages/c9/34/417ee60b822cc80c0f3dc9f495ad7fd8dbb8d8b2cf4baf22d4046d25d01d/mypy-1.20.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b0e817b518bff7facd7f85ea05b643ad8bdcce684cf29784987b0a7c8e1f997", size = 13346816, upload-time = "2026-04-21T17:10:41.433Z" }, - { url = "https://files.pythonhosted.org/packages/4a/85/e20951978702df58379d0bcc2e8f7ccdca4e78cd7dc66dd3ddbf9b29d517/mypy-1.20.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97d7b9a485b40f8ca425460e89bf1da2814625b2da627c0dcc6aa46c92631d14", size = 13772593, upload-time = "2026-04-21T17:08:11.24Z" }, - { url = "https://files.pythonhosted.org/packages/63/a5/5441a13259ec516c56fd5de0fd96a69a9590ae6c5e5d3e5174aa84b97973/mypy-1.20.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e1c12f6d2db3d78b909b5f77513c11eb7f2dd2782b96a3ab6dffc7d44575c99", size = 14656635, upload-time = "2026-04-21T17:09:54.042Z" }, - { url = "https://files.pythonhosted.org/packages/3b/51/b89c69157c5e1f19fd125a65d991166a26906e7902f026f00feebbcfa2b9/mypy-1.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:89dce27e142d25ffbc154c1819383b69f2e9234dc4ed4766f42e0e8cb264ab5c", size = 14943278, upload-time = "2026-04-21T17:09:15.599Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/6b0eeecfe96d7cce1d71c66b8e03cb304aa70ec11f1955dc1d6b46aca3c3/mypy-1.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:f376e37f9bf2a946872fc5fd1199c99310748e3c26c7a26683f13f8bdb756cbd", size = 10851915, upload-time = "2026-04-21T17:06:03.5Z" }, - { url = "https://files.pythonhosted.org/packages/3c/36/6593dc88545d75fb96416184be5392da5e2a8e8c2802a8597913e16ae25c/mypy-1.20.2-cp310-cp310-win_arm64.whl", hash = "sha256:6e2b469efd811707bc530fd1effef0f5d6eebcb7fe376affae69025da4b979a2", size = 9786676, upload-time = "2026-04-21T17:07:02.035Z" }, - { url = "https://files.pythonhosted.org/packages/1f/4d/9ebeae211caccbdaddde7ed5e31dfcf57faac66be9b11deb1dc6526c8078/mypy-1.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4077797a273e56e8843d001e9dfe4ba10e33323d6ade647ff260e5cd97d9758c", size = 14371307, upload-time = "2026-04-21T17:08:56.442Z" }, - { url = "https://files.pythonhosted.org/packages/95/d7/93473d34b61f04fac1aecc01368485c89c5c4af7a4b9a0cab5d77d04b63f/mypy-1.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cdecf62abcc4292500d7858aeae87a1f8f1150f4c4dd08fb0b336ee79b2a6df3", size = 13258917, upload-time = "2026-04-21T17:05:50.978Z" }, - { url = "https://files.pythonhosted.org/packages/e2/30/3dd903e8bafb7b5f7bf87fcd58f8382086dea2aa19f0a7b357f21f63071b/mypy-1.20.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c566c3a88b6ece59b3d70f65bedef17304f48eb52ff040a6a18214e1917b3254", size = 13700516, upload-time = "2026-04-21T17:11:33.161Z" }, - { url = "https://files.pythonhosted.org/packages/07/05/c61a140aba4c729ac7bc99ae26fc627c78a6e08f5b9dd319244ea71a3d7e/mypy-1.20.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0deb80d062b2479f2c87ae568f89845afc71d11bc41b04179e58165fd9f31e98", size = 14562889, upload-time = "2026-04-21T17:05:27.674Z" }, - { url = "https://files.pythonhosted.org/packages/fd/87/da78243742ffa8a36d98c3010f0d829f93d5da4e6786f1a1a6f2ad616502/mypy-1.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bba9ad231e92a3e424b3e56b65aa17704993425bba97e302c832f9466bb85bac", size = 14803844, upload-time = "2026-04-21T17:10:06.2Z" }, - { url = "https://files.pythonhosted.org/packages/37/52/10a1ddf91b40f843943a3c6db51e2df59c9e237f29d355e95eaab427461f/mypy-1.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:baf593f2765fa3a6b1ef95807dbaa3d25b594f6a52adcc506a6b9cb115e1be67", size = 10846300, upload-time = "2026-04-21T17:12:23.886Z" }, - { url = "https://files.pythonhosted.org/packages/20/02/f9a4415b664c53bd34d6709be59da303abcae986dc4ac847b402edb6fa1e/mypy-1.20.2-cp311-cp311-win_arm64.whl", hash = "sha256:20175a1c0f49863946ec20b7f63255768058ac4f07d2b9ded6a6b46cfb5a9100", size = 9779498, upload-time = "2026-04-21T17:09:23.695Z" }, - { url = "https://files.pythonhosted.org/packages/71/4e/7560e4528db9e9b147e4c0f22660466bf30a0a1fe3d63d1b9d3b0fd354ee/mypy-1.20.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4dbfcf869f6b0517f70cf0030ba6ea1d6645e132337a7d5204a18d8d5636c02b", size = 14539393, upload-time = "2026-04-21T17:07:12.52Z" }, - { url = "https://files.pythonhosted.org/packages/32/d9/34a5efed8124f5a9234f55ac6a4ced4201e2c5b81e1109c49ad23190ec8c/mypy-1.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b6481b228d072315b053210b01ac320e1be243dc17f9e5887ef167f23f5fae4", size = 13361642, upload-time = "2026-04-21T17:06:53.742Z" }, - { url = "https://files.pythonhosted.org/packages/d1/14/eb377acf78c03c92d566a1510cda8137348215b5335085ef662ab82ecd3a/mypy-1.20.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34397cdced6b90b836e38182076049fdb41424322e0b0728c946b0939ebdf9f6", size = 13740347, upload-time = "2026-04-21T17:12:04.73Z" }, - { url = "https://files.pythonhosted.org/packages/b9/94/7e4634a32b641aa1c112422eed1bbece61ee16205f674190e8b536f884de/mypy-1.20.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5da6976f20cae27059ea8d0c86e7cef3de720e04c4bb9ee18e3690fdb792066", size = 14734042, upload-time = "2026-04-21T17:07:43.16Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f3/f7e62395cb7f434541b4491a01149a4439e28ace4c0c632bbf5431e92d1f/mypy-1.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56908d7e08318d39f85b1f0c6cfd47b0cac1a130da677630dac0de3e0623e102", size = 14964958, upload-time = "2026-04-21T17:11:00.665Z" }, - { url = "https://files.pythonhosted.org/packages/3e/0d/47e3c3a0ec2a876e35aeac365df3cac7776c36bbd4ed18cc521e1b9d255b/mypy-1.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:d52ad8d78522da1d308789df651ee5379088e77c76cb1994858d40a426b343b9", size = 10911340, upload-time = "2026-04-21T17:10:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b2/6c852d72e0ea8b01f49da817fb52539993cde327e7d010e0103dc12d0dac/mypy-1.20.2-cp312-cp312-win_arm64.whl", hash = "sha256:785b08db19c9f214dc37d65f7c165d19a30fcecb48abfa30f31b01b5acaabb58", size = 9833947, upload-time = "2026-04-21T17:09:05.267Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c4/b93812d3a192c9bcf5df405bd2f30277cd0e48106a14d1023c7f6ed6e39b/mypy-1.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:edfbfca868cdd6bd8d974a60f8a3682f5565d3f5c99b327640cedd24c4264026", size = 14524670, upload-time = "2026-04-21T17:10:30.737Z" }, - { url = "https://files.pythonhosted.org/packages/f3/47/42c122501bff18eaf1e8f457f5c017933452d8acdc52918a9f59f6812955/mypy-1.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2877a02380adfcdbc69071a0f74d6e9dbbf593c0dc9d174e1f223ffd5281943", size = 13336218, upload-time = "2026-04-21T17:08:44.069Z" }, - { url = "https://files.pythonhosted.org/packages/92/8f/75bbc92f41725fbd585fb17b440b1119b576105df1013622983e18640a93/mypy-1.20.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7488448de6007cd5177c6cea0517ac33b4c0f5ee9b5e9f2be51ce75511a85517", size = 13724906, upload-time = "2026-04-21T17:08:01.02Z" }, - { url = "https://files.pythonhosted.org/packages/a1/32/4c49da27a606167391ff0c39aa955707a00edc500572e562f7c36c08a71f/mypy-1.20.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb9c2fa06887e21d6a3a868762acb82aec34e2c6fd0174064f27c93ede68ad15", size = 14726046, upload-time = "2026-04-21T17:11:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/7f/fc/4e354a1bd70216359deb0c9c54847ee6b32ef78dfb09f5131ff99b494078/mypy-1.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d56a78b646f2e3daa865bc70cd5ec5a46c50045801ca8ff17a0c43abc97e3ee", size = 14955587, upload-time = "2026-04-21T17:12:16.033Z" }, - { url = "https://files.pythonhosted.org/packages/62/b2/c0f2056e9eb8f08c62cafd9715e4584b89132bdc832fcf85d27d07b5f3e5/mypy-1.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:2a4102b03bb7481d9a91a6da8d174740c9c8c4401024684b9ca3b7cc5e49852f", size = 10922681, upload-time = "2026-04-21T17:06:35.842Z" }, - { url = "https://files.pythonhosted.org/packages/e5/14/065e333721f05de8ef683d0aa804c23026bcc287446b61cac657b902ccac/mypy-1.20.2-cp313-cp313-win_arm64.whl", hash = "sha256:a95a9248b0c6fd933a442c03c3b113c3b61320086b88e2c444676d3fd1ca3330", size = 9830560, upload-time = "2026-04-21T17:07:51.023Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d1/b4ec96b0ecc620a4443570c6e95c867903428cfcde4206518eafdd5880c3/mypy-1.20.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:419413398fe250aae057fd2fe50166b61077083c9b82754c341cf4fd73038f30", size = 14524561, upload-time = "2026-04-21T17:06:27.325Z" }, - { url = "https://files.pythonhosted.org/packages/3a/63/d2c2ff4fa66bc49477d32dfa26e8a167ba803ea6a69c5efb416036909d30/mypy-1.20.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e73c07f23009962885c197ccb9b41356a30cc0e5a1d0c2ea8fd8fb1362d7f924", size = 13363883, upload-time = "2026-04-21T17:11:11.239Z" }, - { url = "https://files.pythonhosted.org/packages/2a/56/983916806bf4eddeaaa2c9230903c3669c6718552a921154e1c5182c701f/mypy-1.20.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c64e5973df366b747646fc98da921f9d6eba9716d57d1db94a83c026a08e0fb", size = 13742945, upload-time = "2026-04-21T17:08:34.181Z" }, - { url = "https://files.pythonhosted.org/packages/19/65/0cd9285ab010ee8214c83d67c6b49417c40d86ce46f1aa109457b5a9b8d7/mypy-1.20.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a65aa591af023864fd08a97da9974e919452cfe19cb146c8a5dc692626445dc", size = 14706163, upload-time = "2026-04-21T17:05:15.51Z" }, - { url = "https://files.pythonhosted.org/packages/94/97/48ff3b297cafcc94d185243a9190836fb1b01c1b0918fff64e941e973cc9/mypy-1.20.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4fef51b01e638974a6e69885687e9bd40c8d1e09a6cd291cca0619625cf1f558", size = 14938677, upload-time = "2026-04-21T17:05:39.562Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a1/1b4233d255bdd0b38a1f284feeb1c143ca508c19184964e22f8d837ec851/mypy-1.20.2-cp314-cp314-win_amd64.whl", hash = "sha256:913485a03f1bcf5d279409a9d2b9ed565c151f61c09f29991e5faa14033da4c8", size = 11089322, upload-time = "2026-04-21T17:06:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/78/c2/ce7ee2ba36aeb954ba50f18fa25d9c1188578654b97d02a66a15b6f09531/mypy-1.20.2-cp314-cp314-win_arm64.whl", hash = "sha256:c3bae4f855d965b5453784300c12ffc63a548304ac7f99e55d4dc7c898673aa3", size = 10017775, upload-time = "2026-04-21T17:07:20.732Z" }, - { url = "https://files.pythonhosted.org/packages/4e/a1/9d93a7d0b5859af0ead82b4888b46df6c8797e1bc5e1e262a08518c6d48e/mypy-1.20.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2de3dcea53babc1c3237a19002bc3d228ce1833278f093b8d619e06e7cc79609", size = 15549002, upload-time = "2026-04-21T17:08:23.107Z" }, - { url = "https://files.pythonhosted.org/packages/00/d2/09a6a10ee1bf0008f6c144d9676f2ca6a12512151b4e0ad0ff6c4fac5337/mypy-1.20.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:52b176444e2e5054dfcbcb8c75b0b719865c96247b37407184bbfca5c353f2c2", size = 14401942, upload-time = "2026-04-21T17:07:31.837Z" }, - { url = "https://files.pythonhosted.org/packages/57/da/9594b75c3c019e805250bed3583bdf4443ff9e6ef08f97e39ae308cb06f2/mypy-1.20.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:688c3312e5dadb573a2c69c82af3a298d43ecf9e6d264e0f95df960b5f6ac19c", size = 15041649, upload-time = "2026-04-21T17:09:34.653Z" }, - { url = "https://files.pythonhosted.org/packages/97/77/f75a65c278e6e8eba2071f7f5a90481891053ecc39878cc444634d892abe/mypy-1.20.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29752dbbf8cc53f89f6ac096d363314333045c257c9c75cbd189ca2de0455744", size = 15864588, upload-time = "2026-04-21T17:11:44.936Z" }, - { url = "https://files.pythonhosted.org/packages/d7/46/1a4e1c66e96c1a3246ddf5403d122ac9b0a8d2b7e65730b9d6533ba7a6d3/mypy-1.20.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:803203d2b6ea644982c644895c2f78b28d0e208bba7b27d9b921e0ec5eb207c6", size = 16093956, upload-time = "2026-04-21T17:10:17.683Z" }, - { url = "https://files.pythonhosted.org/packages/5a/2c/78a8851264dec38cd736ca5b8bc9380674df0dd0be7792f538916157716c/mypy-1.20.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9bcb8aa397ff0093c824182fd76a935a9ba7ad097fcbef80ae89bf6c1731d8ec", size = 12568661, upload-time = "2026-04-21T17:11:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/83/01/cd7318aa03493322ce275a0e14f4f52b8896335e4e79d4fb8153a7ad2b77/mypy-1.20.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e061b58443f1736f8a37c48978d7ab581636d6ab03e3d4f99e3fa90463bb9382", size = 10389240, upload-time = "2026-04-21T17:09:42.719Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/f23c163e25b11074188251b0b5a0342625fc1cdb6af604757174fa9acc9b/mypy-1.20.2-py3-none-any.whl", hash = "sha256:a94c5a76ab46c5e6257c7972b6c8cff0574201ca7dc05647e33e795d78680563", size = 2637314, upload-time = "2026-04-21T17:05:54.5Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cf/dc/7e6d49f04fca40b9dd5c752a51a432ffe67fb45200702bc9eee0cb4bbb26/mypy-2.0.0.tar.gz", hash = "sha256:1a9e3900ac5c40f1fe813506c7739da6e6f0eab2729067ebd94bfb0bbba53532", size = 3869036, upload-time = "2026-05-06T19:26:43.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/1e/9983d2d5b5d2dc3677177bcf0fa6b25185ecf750cc0559e02199625a31c5/mypy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65d6f22d643bccaeb182d41d2a9f0990a05a871673c4ae3f97d4931eca0d2294", size = 14663140, upload-time = "2026-05-06T19:25:59.474Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/b4009c91d3ced13c8f406acf47bbe56365025cd21bf6585cd1e87375a708/mypy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:106650bce72114f43019bf72197296f51c2cd47adfa9d073ea2976c247a404c5", size = 13526733, upload-time = "2026-05-06T19:22:56.425Z" }, + { url = "https://files.pythonhosted.org/packages/f0/99/2403cb0ceeb1552f70e70e779e3d0713b24f84c7ca0e9e14b2b7bc684cf0/mypy-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c734b7eb89a4cc4ec347f8187ffa730e2b59693407bc93dcb878183037f80a17", size = 13951940, upload-time = "2026-05-06T19:24:43.45Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f7/4848a14c2667b6eb62841c9aeb7e1f6479613b1ef9a65564fe1f5518a35b/mypy-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd9e60388944d0f1432a2419ab938a78d5658df1d143a7172cfe1a197276cf49", size = 14833983, upload-time = "2026-05-06T19:23:16.827Z" }, + { url = "https://files.pythonhosted.org/packages/ec/28/c51831f9f1c6e46cbce765bd0a18981b84696e40bd1eea14e0a08494af44/mypy-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95e3890666c3be41af7a7179f4872341c08e90c161ba8e7a08a21f9be92c131", size = 15135591, upload-time = "2026-05-06T19:24:32.96Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/3c25e503a94f9ec18352464551bc6c506dee2bca93c6d0e0b5568eefc269/mypy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8e8709ce1b1046b8aad77a506dd01491157102dd727128c0b374b5025c7d769", size = 10983019, upload-time = "2026-05-06T19:20:30.942Z" }, + { url = "https://files.pythonhosted.org/packages/75/da/5cf833fd3b53fd4b5797e55dc16fb7efab16fddbc7205d49ff65b15d554e/mypy-2.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:0165968759c99ab79dc1a9f8aaec18e93a1bedcf7c13edd70e68dd3d5faf17cb", size = 9914165, upload-time = "2026-05-06T19:21:49.165Z" }, + { url = "https://files.pythonhosted.org/packages/8b/1e/268b81393b81d64683f670680215553e70ae92c55805915b3440080e05e4/mypy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17b7222e9fdfd352e61fb3131da117e55cc465f701ff232f1bd97a02bbad91f", size = 14580849, upload-time = "2026-05-06T19:23:06.567Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/d159a8002d9e5c44e59ece9d641a26956c89be5b6827f819d9a9dc678c65/mypy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc0a61adea1a5ffc2d47a4dc4bb180d8103f477fc2a90a1cdcbb168c2cc6caff", size = 13444955, upload-time = "2026-05-06T19:25:11.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5d/3b28d5a2799591da0ee5490418e94497eaf5d701e42d8b001b5e17a9b3d6/mypy-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8578f857b519993d065e5805290b71467ebfae772407a5f57e823755e4fdb850", size = 13873124, upload-time = "2026-05-06T19:20:39.684Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/f40f723955617b814d5ddc1154d8938b77aaf6926c2dbf72846e8943a0b7/mypy-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:33f668a37a650df60f7b825c1ac61e6baadd4ac3c89519e929badde58d28edf5", size = 14748822, upload-time = "2026-05-06T19:25:30.972Z" }, + { url = "https://files.pythonhosted.org/packages/d6/16/eded971224a483e422a141ffd580c00e1b919df8e529f06d03a4a987878c/mypy-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29ea6da86c8c5e9addd48fa6e624f467341b3814f54ded871b28980468686dea", size = 14992675, upload-time = "2026-05-06T19:23:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6a/1cbd7290f00b4dbaa4c4502e53ac05645ea635e4d1e3dcd42687c2fc39cd/mypy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:904baa0124ebbccf0c7ba94f722cf9186ee30478f5e5b11432ffc8929248ee55", size = 10983628, upload-time = "2026-05-06T19:26:39.48Z" }, + { url = "https://files.pythonhosted.org/packages/83/3f/8caa9bcc2636cd512642050747466b695fa2540d7040544fd7ddb721d671/mypy-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:440165501295e523bf1e5d3e411b62b367b901c65610938e75f0e56ba0462461", size = 9906041, upload-time = "2026-05-06T19:24:03.199Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4b/f6cd12ef1eb63be1c342da3e8ca811d2280276177f6de4ef20cb2366d79b/mypy-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:660790551c988e69d8bf7a35c8b4149edeb22f4a339165702be843532e9dcdb5", size = 14756610, upload-time = "2026-05-06T19:26:19.221Z" }, + { url = "https://files.pythonhosted.org/packages/32/73/67d09ca28bee21feaca264b2a680cf2d300bcc2071136ad064928324c843/mypy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7a15bf92cd8781f8e72f69ffa7e30d1f434402d065ee1ecd5223ef2ef100f914", size = 13554270, upload-time = "2026-05-06T19:26:08.977Z" }, + { url = "https://files.pythonhosted.org/packages/61/b3/44718b5c6b1b5a27440ff2effe6a1be0fa2a190c0f4e2e21a83728416f95/mypy-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ff370b43d7def05bbcd2f5267f0bcda72dd6a552ef2ea9375b02d6fe06da270", size = 13924663, upload-time = "2026-05-06T19:21:24.932Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2b/bbb9cc5773f946846a7c340097e59bcf84095437dda0d56bb4f6cf1f6541/mypy-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37bd246590a018e5a11703b7b09c39d47ede3df5ba3fa863c5b8590b465beb01", size = 14946862, upload-time = "2026-05-06T19:24:23.023Z" }, + { url = "https://files.pythonhosted.org/packages/43/25/e9318566f443a5130b4ff0ad3367ee6c4c4c49ff083fe5214a7318c18282/mypy-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cce87e92214fac8bf8feb8a680d0c1b6fb748d50e9b57fbb13e4b1d83a3ed19b", size = 15175090, upload-time = "2026-05-06T19:26:28.794Z" }, + { url = "https://files.pythonhosted.org/packages/67/65/2ec28c834f21e164c33bc296a7db538ad50c74f83e517c7a0be95ff6de86/mypy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:e19e9cb69b66a4141009d24898259914fa2b71d026de0b46edf9fafdbf4fd46e", size = 11052899, upload-time = "2026-05-06T19:25:39.084Z" }, + { url = "https://files.pythonhosted.org/packages/9e/72/d1ec625cfc9bd101c07a6834ef1f94e820296f8fdbad2eb03f50e0983f8c/mypy-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:b021614cb08d44785b025982163ec3c39c94bff766ead071fa9e82b4ef6f62cd", size = 9972935, upload-time = "2026-05-06T19:23:24.204Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c6/996a1e535e5d0d597c3b1460fc962733091f885f312e749350eb2ac10965/mypy-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ef5f581b61240d1cc629b12f8df6565ed6ffac0d82ed745eef7833222ab50b9", size = 14737259, upload-time = "2026-05-06T19:20:23.081Z" }, + { url = "https://files.pythonhosted.org/packages/94/c5/0f9460e26b77f434bd53f47d1ce32a3cd4580c92a5331fa5dfc059f9421a/mypy-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20e3470a165dbc249bdfbe8d1c5172727ef22688cffc279f8c3aa264ab9d4d9a", size = 13538377, upload-time = "2026-05-06T19:21:08.804Z" }, + { url = "https://files.pythonhosted.org/packages/b2/3e/8ea2f8dd1e5c9c279fb3c28193bdb850adf4d3d8172880abad829eced609/mypy-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:224ba142eee8b4d65d4db657cb1fc22abec30b135ded6ab297302ba1f62e505d", size = 13914264, upload-time = "2026-05-06T19:24:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/78bd3b8520f676acee9dab48ea71473e68f6d5cf14b59fbd800bea50a92b/mypy-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e879ad8a03908ff74d15e8a9b42bf049918e6798d52c011011f1873d0b5877e", size = 14926761, upload-time = "2026-05-06T19:20:12.846Z" }, + { url = "https://files.pythonhosted.org/packages/61/ef/b52fa340522da3d22e669117c3b83155c2660f7cdc035856958fbfffb224/mypy-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:65c5c15bcbd18d6fe927cc55c459597a3517d69cc3123f067be3b020010e115e", size = 15157014, upload-time = "2026-05-06T19:25:49.78Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0c/dde7614250c6d017936c7aa3bb63b9b52c7cfd298d3f1be9be45f307870b/mypy-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:d1a068acd7c9fb77e9f8923f1556f2f49d6d7895821121b8d97fa5642b9c52f5", size = 11067049, upload-time = "2026-05-06T19:21:16.116Z" }, + { url = "https://files.pythonhosted.org/packages/27/ec/1d6af4830a94a285442db19caa02f160cc1a255e4f324eec5458e6c2bafb/mypy-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:ef9d96da1ddffbc21f27d3939319b6846d12393baa17c4d2f3e81e040e73ce2c", size = 9967903, upload-time = "2026-05-06T19:22:15.52Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2c/6fefe954207860aed6eeb91776795e64a257d3ce0360862288984ce121f5/mypy-2.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c918c64e8ce36557851b0347f84eb12f1965d3a06813c36df253eb0c0afd1d82", size = 14729633, upload-time = "2026-05-06T19:24:53.383Z" }, + { url = "https://files.pythonhosted.org/packages/23/d6/d336f5b820af189eb0390cce21de62d264c0a4e64713dfbe81bfc4fc7739/mypy-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:301f1a8ccc7d79b542ee218b28bb49443a83e194eb3d10da63ff1649e5aa5d34", size = 13559524, upload-time = "2026-05-06T19:22:24.906Z" }, + { url = "https://files.pythonhosted.org/packages/af/a6/d7bb54fde1770f0484e5fbdbdce37a41e95ed0a1cd493ec60ead111e356c/mypy-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fdf4ef489d44ce350bac3fd699907834e551d4c934e9cc862ef201215ab1558d", size = 13936018, upload-time = "2026-05-06T19:25:02.992Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ba/5be51316b91e6a6bf6e3a8adb3de500e7e1fb5bf9491743b8cbc81a34a2c/mypy-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cde2d0989f912fc850890f727d0d76495e7a6c5bdd9912a1efdb64952b4398d", size = 14910712, upload-time = "2026-05-06T19:25:21.83Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/e2c8c3b373e20ebfb66e6c83a99027fd67df4ec43b08879f74e822d2dc4c/mypy-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdf05693c231a14fe37dbfce192a3a1372c26a833af4a80f550547742952e719", size = 15141499, upload-time = "2026-05-06T19:20:50.924Z" }, + { url = "https://files.pythonhosted.org/packages/12/36/07756f933e00416d912e35878cfcf89a593a3350a885691c0bb85ae0226a/mypy-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:73aee2da33a2237e66cbe84a94780e53599847e86bb3aa7b93e405e8cd9905f2", size = 11240511, upload-time = "2026-05-06T19:21:32.39Z" }, + { url = "https://files.pythonhosted.org/packages/70/05/79ac1f20f2397353f3845f7b8bb5d8006cda7c8ef9092f04f9de3c6135f2/mypy-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:1f6dcd8f39971f41edab2728c877c4ac8b50ad3c387ff2770423b79a05d23910", size = 10149336, upload-time = "2026-05-06T19:22:08.383Z" }, + { url = "https://files.pythonhosted.org/packages/53/e0/0db84e0ebbad6e99e566c68e4b465784f2a2294f7719e8db9d509ef23087/mypy-2.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a04e980b9275c76159da66c6e1723c7798306f9802b31bdaf9358d0c84030ce8", size = 15797362, upload-time = "2026-05-06T19:22:00.835Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a4/14cc0768164dd53bec48aa41a20270b18df9bf72aa5054278bf133608315/mypy-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33f9cf4825469b2bc73c53ba55f6d9a9b4cdb60f9e6e228745581520f29b8771", size = 14635914, upload-time = "2026-05-06T19:23:43.675Z" }, + { url = "https://files.pythonhosted.org/packages/08/48/d866a3e23b4dc5974c77d9cf65a435bf22de01a84dd4620917950e233960/mypy-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191675c3c7dc2a5c7722a035a6909c277f14046c5e4e02aa5fbf65f8524f08ad", size = 15270866, upload-time = "2026-05-06T19:22:34.756Z" }, + { url = "https://files.pythonhosted.org/packages/71/eb/de9ef94958eb2078a6b908ceb247757dc384d3a238d3bd6ed7d81de5eaf8/mypy-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3d26c4321a3b06fc9f04c741e0733af693f82d823f8e64e47b2e63b7f19fa84", size = 16093131, upload-time = "2026-05-06T19:23:56.541Z" }, + { url = "https://files.pythonhosted.org/packages/ad/07/0ab2c1a9d26e90942612724cbd5788f16b7810c5dd39bfcf79286c6c4524/mypy-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bbcbc4d5917ca6ce12de70e051de7f533e3bf92d548b41a38a2232a6fe356525", size = 16330685, upload-time = "2026-05-06T19:21:42.037Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8f/46f85d1371a5be642dad263828118ae1efd536d91d8bd2000c68acff3920/mypy-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:dbc6ba6d40572ae49268531565793a8f07eac7fc65ad76d482c9b4c8765b6043", size = 12752017, upload-time = "2026-05-06T19:22:44.002Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e6/94ca48800cac19eb28a58188a768aaec0d16cac0f373915f073058ab0855/mypy-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:77926029dfcb7e1a3ecb0acb2ddbb24ca36be03f7d623e1759ad5376be8f6c01", size = 10527097, upload-time = "2026-05-06T19:20:58.973Z" }, + { url = "https://files.pythonhosted.org/packages/5c/14/fd0694aa594d6e9f9fd16ce821be2eff295197a273262ef56ddcc1388d68/mypy-2.0.0-py3-none-any.whl", hash = "sha256:8a92b2be3146b4fa1f062af7eb05574cbf3e6eb8e1f14704af1075423144e4e5", size = 2673434, upload-time = "2026-05-06T19:26:32.856Z" }, ] [[package]] @@ -831,7 +870,7 @@ resolution-markers = [ dependencies = [ { name = "docutils", marker = "python_full_version >= '3.11'" }, { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "mdit-py-plugins", marker = "python_full_version >= '3.11'" }, { name = "pyyaml", marker = "python_full_version >= '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, From 3f4d107b521ca42140994608d7d8b59f6415ec3e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 08:42:54 -0500 Subject: [PATCH 2843/2998] py(deps[dev]) Bump dev packages --- uv.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/uv.lock b/uv.lock index aba4007b56..e4b33a9f96 100644 --- a/uv.lock +++ b/uv.lock @@ -650,7 +650,7 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.1.0" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15'", @@ -659,9 +659,9 @@ resolution-markers = [ dependencies = [ { name = "mdurl", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/5c/f3aedc83549aae71cd52b9e9687fe896e3dc6e966ba20eba04718605d198/markdown_it_py-4.1.0.tar.gz", hash = "sha256:760e3f87b2787c044c5138a5ba107b7c2be26c03b13cc7f8fe42756b65b1df6c", size = 81613, upload-time = "2026-05-06T16:32:13.649Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/88/802c82060c54bc7dde21eb0033e337838b8181a1323254aa9ec41cbfc3d1/markdown_it_py-4.1.0-py3-none-any.whl", hash = "sha256:d4939a62a2dd0cd9cb80a191a711ba1d39bac8ed5ef9e9966895b0171c01c46d", size = 90955, upload-time = "2026-05-06T16:32:12.184Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] [[package]] @@ -751,15 +751,15 @@ wheels = [ [[package]] name = "mdit-py-plugins" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/3d/e0e8d9d1cee04f758120915e2b2a3a07eb41f8cf4654b4734788a522bcd1/mdit_py_plugins-0.6.0.tar.gz", hash = "sha256:2436f14a7295837ac9228a36feeabda867c4abc488c8d019ad5c0bda88eee040", size = 56025, upload-time = "2026-05-07T12:20:42.295Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl", hash = "sha256:f7e7a25d8b616fee99cb1e330da73451d11a8061baf39bb9663ab9ce0e005b90", size = 66655, upload-time = "2026-05-07T12:20:41.226Z" }, ] [[package]] @@ -870,7 +870,7 @@ resolution-markers = [ dependencies = [ { name = "docutils", marker = "python_full_version >= '3.11'" }, { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "markdown-it-py", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "mdit-py-plugins", marker = "python_full_version >= '3.11'" }, { name = "pyyaml", marker = "python_full_version >= '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, From 1d6bb889080035a95e0555a74877f07e8829f8a9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 08:52:38 -0500 Subject: [PATCH 2844/2998] py(deps[uv]) Whitelist libtmux from exclude-newer cooldown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: libtmux releases in lockstep with the tmuxp release cycle — when libtmux 0.56.0 lands and tmuxp needs to bump, the rolling exclude-newer = now − P3D window in the lockfile filters every release younger than 3 days, so contributor `uv sync` against the new pin would fail until the window naturally clears: × No solution found when resolving dependencies: ╰─▶ Because libtmux==0.56.0 was published after the exclude newer time and only libtmux<=0.55.1 is available... hint: Consider using `exclude-newer-package` to override the cutoff for this package. libtmux is a git-pull package (same maintainer surface as gp-libs and the gp-sphinx workspace already whitelisted in 6c0a0b2d), so the supply-chain cooldown adds friction without adding safety — gp == git-pull, and so are we. Whitelisting now also unblocks the imminent ~=0.55.0 -> ~=0.56.0 bump without staging it on a 3-day-delayed branch. what: - Add `libtmux = false` to [tool.uv.exclude-newer-package], slotted between the gp-* group and the sphinx-* group in line with the existing visual grouping. No comment churn — the existing block-level comment from 6c0a0b2d already covers the rationale (git-pull lockstep releases, vcspull/libvcs precedent). --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 43c491a1d1..3ae415440f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -123,6 +123,7 @@ build-backend = "hatchling.build" gp-libs = false gp-furo-theme = false gp-sphinx = false +libtmux = false sphinx-autodoc-api-style = false sphinx-autodoc-argparse = false sphinx-autodoc-docutils = false From 3754a060aa2ff103b062df8367464f8ebffdbb01 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 08:53:52 -0500 Subject: [PATCH 2845/2998] py(deps) Bump libtmux 0.55.0 -> 0.56.0 --- pyproject.toml | 2 +- uv.lock | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3ae415440f..fb5eb937b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.55.0", + "libtmux~=0.56.0", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index e4b33a9f96..b6280f3133 100644 --- a/uv.lock +++ b/uv.lock @@ -12,6 +12,7 @@ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for exclude-newer-span = "P3D" [options.exclude-newer-package] +libtmux = false gp-sphinx = false sphinx-autodoc-sphinx = false sphinx-autodoc-api-style = false @@ -413,7 +414,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -614,11 +615,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.55.1" +version = "0.56.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/01/fa4f839045d32576d4c193d85ba37e47908fea8227f18800847f589e2476/libtmux-0.55.1.tar.gz", hash = "sha256:dcee950537b8bda4337267bc2cb62b434c4c8da3a75c1546151674238ef14e20", size = 439372, upload-time = "2026-04-19T18:25:39.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/62/896e1e0412dd76c88926604d5a231feb9b116d6f32abe19054e244504dbc/libtmux-0.56.0.tar.gz", hash = "sha256:bddf52214405e4f64850826d44cbc958d4a01c53432983cee0e2856bdbbaaedb", size = 476168, upload-time = "2026-05-10T13:40:23.774Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/2e/819d7414b96f19ec4cafda95555246bdb9766dd7c0519b5b1bf4495789f7/libtmux-0.55.1-py3-none-any.whl", hash = "sha256:4382667d508610bdf71a7cc07d7a561d402fa2d5621cce299e7ae97b0cdcb93b", size = 80679, upload-time = "2026-04-19T18:25:37.61Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ce/4319c912164fa142956c73ba50ed6f2aac2ca7cced2e96c8320114f1c937/libtmux-0.56.0-py3-none-any.whl", hash = "sha256:ddf70de0f287666fb0f02082732f28eed46450de1828c995da3de2b12042ab60", size = 97768, upload-time = "2026-05-10T13:40:22.189Z" }, ] [[package]] @@ -1667,7 +1668,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.55.0" }, + { name = "libtmux", specifier = "~=0.56.0" }, { name = "pyyaml", specifier = ">=6.0" }, ] From 9f48a47f1456aaf23c7983d20b0b3dca2bd758d0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 09:31:54 -0500 Subject: [PATCH 2846/2998] docs(CHANGES) libtmux ~=0.55.0 -> ~=0.56.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Document the libtmux dependency bump for the upcoming release so an end user skimming next-version notes can confirm their `tmuxp load`/`freeze`/YAML workflow won't change. The first draft of this entry leaned on libtmux internals (`control_mode` fixture, `TMUX_MAX_VERSION` ceiling, the `move_window()` auto-refresh) — accurate but useless to a session- manager user, who never meets those names. what: - Add a Breaking Changes entry under the unreleased tmuxp 1.68.0 block. Frames the bump through the one tmuxp surface where users actually meet libtmux APIs (`tmuxp shell`): notes that 0.56.0 broadens the tmux command coverage available there (interactive commands, buffer I/O, key bindings, window/pane manipulation), and that 0.55.1 is a test-fixture cleanup. Skips the upstream's contributor-only additions (pytest fixture, version-ceiling bump, etc.) — those belong in libtmux release notes, not the session-manager changelog. - Heading style mirrors the prior 1.65.0 entry verbatim (`#### **libtmux** minimum bumped from ...`) so the changelog reads consistently across libtmux jumps. --- CHANGES | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGES b/CHANGES index edece8c7ba..8a54b45431 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,15 @@ $ pipx install \ _Notes on the upcoming release will go here._ +### Breaking changes + +#### **libtmux** minimum bumped from `~=0.55.0` to `~=0.56.0` (#1038) + + Picks up two releases: 0.55.1 (test-fixture socket cleanup) and + 0.56.0 (broader tmux command coverage — interactive commands, + buffer I/O, key bindings, and window/pane manipulation, all + available to scripts run via `tmuxp shell`). + ### Documentation - Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#1035) From 8f0d123e692a1a2a4e94d1d3690f9e3920fe2ac4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 10:12:01 -0500 Subject: [PATCH 2847/2998] tests(perf[conftest]) Pin \$SHELL=/bin/sh in autouse fixture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Profiling tmuxp's test suite showed the dominant per-pane cost was tmux spawning the contributor's interactive \$SHELL — typically ``/bin/zsh`` with a full rcfile chain (oh-my-zsh, plugins, prompt themes, etc.) — for every pane created across the suite. Each init costs ~60ms warm and up to ~400ms cold; multiplied across hundreds of pane spawns in workspace/builder tests, that's the single largest line item in suite wall time. tmux falls back to ``\$SHELL`` for new panes when ``default-shell`` is unset (the default in libtmux's bundled test ``.tmux.conf``), so monkey-patching \$SHELL=/bin/sh in an autouse function-scoped fixture forces every test pane to spawn ``/bin/sh`` instead. Empty rcfiles, deterministic prompt, no plugin chains. A/B measured locally with the project's standard ``uv run py.test`` (defaults: ``--reruns=0 --doctest-modules``): master ~76-78s pytest, ~71s wall this branch (1st run) 37.01s pytest, 35.08s wall this branch (2nd run) 36.24s pytest, 34.29s wall That's a ~51% wall-time reduction, consistent with the upstream libtmux PR (tmux-python/libtmux#662) that pins the same env var in libtmux's pytest plugin and reports a similar "~70s -> ~32s" delta. Applying the pin at the tmuxp conftest level lands the gain immediately without waiting for the libtmux PR to merge and release; once libtmux ships the upstream pin, this commit becomes redundant and can be reverted cleanly. what: - conftest.py: add ``_pin_test_shell_env`` function-scoped autouse fixture that calls ``monkeypatch.setenv("SHELL", "/bin/sh")``. ``monkeypatch`` restores the prior value at teardown so no global state leaks across tests or out of pytest's process. - Leading-underscore name signals "internal autouse plumbing" — no test should depend on it explicitly. - USING_ZSH constant and ``zshrc`` autouse-on-USING_ZSH fixture retained for now; they become dead at runtime once \$SHELL is always ``/bin/sh`` (no zsh first-run greeting to suppress) but the cleanup is left as a follow-up to keep this commit's diff minimal and the perf claim independently revertible. --- conftest.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/conftest.py b/conftest.py index 5ae04a57a3..1f0583439e 100644 --- a/conftest.py +++ b/conftest.py @@ -30,6 +30,20 @@ USING_ZSH = "zsh" in os.getenv("SHELL", "") +@pytest.fixture(autouse=True) +def _pin_test_shell_env(monkeypatch: pytest.MonkeyPatch) -> None: + """Pin ``$SHELL`` to ``/bin/sh`` for every test. + + tmux falls back to ``$SHELL`` for new panes when ``default-shell`` is + unset, so pinning the env var here forces every test pane to spawn + ``/bin/sh`` instead of the contributor's interactive shell. Eliminates + rcfile init cost (zsh / oh-my-zsh / bash profile chains) and yields + deterministic prompt output that doesn't flake capture-pane assertions. + ``monkeypatch`` restores the prior value at teardown. + """ + monkeypatch.setenv("SHELL", "/bin/sh") + + @pytest.fixture(autouse=USING_ZSH, scope="session") def zshrc(user_path: pathlib.Path) -> pathlib.Path | None: """Quiets ZSH default message. From a4b416b4fa148c1c7c78ded93fd0a8889bf4fedb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 13:22:06 -0500 Subject: [PATCH 2848/2998] docs(CHANGES) Pin \$SHELL=/bin/sh for tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Document the contributor-side test-suite speedup landing on the unreleased tmuxp 1.68.0 block so anyone skimming next-version notes can confirm the change is dev-only — `tmuxp load`, `tmuxp freeze`, and workspace YAML behaviour are unchanged. what: - Add a Development entry under the unreleased 1.68.0 block, placed after the existing Documentation section per the mandatory section order. Heading style mirrors tmuxp 1.66.0's `#### Structured logging with extra context` entry — name the product surface that changed (test panes), describe what's different (spawn /bin/sh instead of \$SHELL), and cap with a one-line non-user-impact disclaimer. - Frame the speedup as "roughly halve... on systems with slow shell startup" rather than the precise 51% measured locally — the gain depends entirely on the contributor's shell init weight; quoting a single number would be brittle. --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 8a54b45431..6fc7f773ab 100644 --- a/CHANGES +++ b/CHANGES @@ -56,6 +56,16 @@ _Notes on the upcoming release will go here._ via `gp-furo-theme`, a Tailwind v4 respin of Furo, with `sphinx-vite-builder` handling theme-asset builds (#1037) +### Development + +#### Test panes spawn `/bin/sh` instead of the developer's `$SHELL` (#1041) + +An autouse pytest fixture pins `$SHELL=/bin/sh` so test panes skip +the contributor's interactive shell init. On systems with slow shell +startup (zsh + oh-my-zsh, heavy bash profiles) this can roughly halve +`uv run py.test` wall time; smaller gain on stripped-down shells. No +effect on tmuxp's runtime behavior. + ## tmuxp 1.67.0 (2026-03-08) From 57b2270dc0ca5a582828aedc09db6f2341f70aa5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 16:33:17 -0500 Subject: [PATCH 2849/2998] ai(rules[AGENTS{docs}]): Add Changelog Conventions section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: tmuxp's CHANGES has long practiced a Django-shaped release- notes pattern — `## tmuxp X.Y.Z (date)` headers, `#### Deliverable title (#NN)` subsections with prose bodies, HTML-comment-fenced unreleased placeholders — but the conventions lived as tribal knowledge rather than rules. Codify them so future entries stay consistent and agents authoring entries have an actionable rule set. what: - New "Changelog Conventions" sub-section under "Documentation Standards" (after "Shell Command Formatting"). - Rules covered: release entry boilerplate, multi-sentence lead paragraph with version-as-subject, deliverable-as-section (`#### Title (#NN)` shape), the deliverable test, fixed subheading order, PR refs in headings, when bullets are appropriate, anti-patterns (fragile metrics / internal jargon / walls of text / buried breaking changes), always-link autodoc'd APIs, MyST role table, summarization style for agent Q&A. --- AGENTS.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 0f87f4ce20..6252a23946 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -395,6 +395,37 @@ Bad: $ pipx install --suffix=@next --pip-args '\--pre' --force 'tmuxp' ``` +### Changelog Conventions + +These rules apply when authoring entries in `CHANGES`, which is rendered as the Sphinx changelog page. Modeled on Django's release-notes shape — deliverables get titles and prose, not bullets. + +**Release entry boilerplate.** Every release header is `## tmuxp X.Y.Z (YYYY-MM-DD)`. The file opens with a `## tmuxp X.Y.Z (Yet to be released)` placeholder block fenced by `` and `` HTML comments — new release entries land immediately below the END marker, never above it. + +**Open with a multi-sentence lead paragraph.** Plain prose, no italic. Open with the version as sentence subject (*"tmuxp X.Y.Z ships …"*) so the lead is self-contained when excerpted. Two to four sentences telling the reader what shipped and who cares — user-visible takeaways, not internal mechanism. Cross-reference detail docs with `{ref}` to keep the lead compact. + +**Each deliverable is a section, not a bullet.** Inside `### What's new`, every distinct deliverable gets a `#### Deliverable title (#NN)` heading naming it in user vocabulary, followed by 1-3 prose paragraphs explaining what shipped. Don't wrap a paragraph in `- ` — bullets are for enumerable lists, not paragraph containers. Cross-link detail docs (`See {ref}\`foo\` for details.`) so prose stays focused. + +**The deliverable test.** Before writing an entry, ask: "What's the deliverable, in user vocabulary?" If you can't answer in one sentence, the entry isn't ready. Mechanism (helper internals, byte counters, schema-validation locations) belongs in PR descriptions and code comments, not the changelog. + +**Fixed subheadings**, in this order when present: `### Breaking changes`, `### Dependencies`, `### What's new`, `### Fixes`, `### Documentation`, `### Development`. Dev tooling (helper scripts, internal automation) lives under `### Development`. For breaking changes, show the migration path with concrete inline code (e.g. a `# Before` / `# After` fenced code block). Dependency floor bumps use the form ``Minimum `pkg>=X.Y.Z` (was `>=X.Y.W`)``. + +**PR refs `(#NN)`** sit in each deliverable's `####` heading. + +**When bullets are appropriate.** Catch-all sections (`### Fixes`, occasionally `### Documentation`) with 3+ genuinely small items use bullets — one line each, never paragraphs. If a bullet swells past two lines, promote it to a `#### Title (#NN)` heading with prose body. + +**Anti-patterns.** + +- Fragile metrics: token ceilings, third-party version pins, percent benchmarks, exact byte counts. Describe the *capability*, not the math. +- Internal jargon: private symbols (leading-underscore identifiers), algorithm names exposed for the first time, backend scaffolding. +- Walls of text dressed up as bullets. +- Buried breaking changes — they get their own subheading at the top of the entry. + +**Always link autodoc'd APIs.** Any class, method, function, exception, or attribute that has its own rendered page must be cited via the appropriate role (`{class}`, `{meth}`, `{func}`, `{exc}`, `{attr}`) — never with plain backticks. Doc pages without explicit ref labels use `{doc}`. Plain backticks are correct for code syntax, env vars, parameter names, and file paths that aren't doc pages — anything without an autodoc destination. + +**MyST roles.** Class references use `{class}` (e.g. `{class}\`~tmuxp.workspace.builder.WorkspaceBuilder\``), methods use `{meth}`, functions use `{func}`, exceptions use `{exc}`, attributes use `{attr}`, internal anchors use `{ref}`, doc-path links use `{doc}`. + +**Summarization style.** When a user asks "what changed in the latest version?" or similar, lead with the entry's lead paragraph (paraphrased if needed), followed by each `####` deliverable heading under `### What's new` with a one-sentence summary. Cite `(#NN)` only if the user asks for source links. Don't invent versions, dates, or numbers not present in `CHANGES`. Don't quote line numbers or file offsets — those shift as the file evolves. + ## Important Notes - **QA every edit**: Run formatting and tests before committing From 65f018f0e3899245c68a47c7e7037391f1de6ab1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 17:55:59 -0500 Subject: [PATCH 2850/2998] docs(CHANGES): Rewrite release history for May 2026 refresh why: The changelog had grown into mixed release-note styles with dense bullets, stale API links, and current release notes that did not match the documented CHANGES conventions. what: - Rewrite CHANGES entries into release-oriented prose with deliverable headings - Preserve all release headers, dates, placeholder comments, and historical version order - Add current MyST cross-references while keeping old/deprecated APIs as inline history --- CHANGES | 3498 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 1771 insertions(+), 1727 deletions(-) diff --git a/CHANGES b/CHANGES index 6fc7f773ab..5c77d12ee6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,6 @@ # Changelog -To install the unreleased tmuxp version, see [developmental releases](https://tmuxp.git-pull.com/quickstart.html#developmental-releases). +To install the unreleased tmuxp version, see {ref}`developmental-releases`. [pip](https://pip.pypa.io/en/stable/): @@ -28,7 +28,12 @@ $ pipx install \ --pip-args '\--pre' \ --force \ 'tmuxp' -// Usage: tmuxp@next load yoursession +``` + +Run the developmental install with: + +```console +$ tmuxp@next load yoursession ``` ## tmuxp 1.68.0 (Yet to be released) @@ -39,2793 +44,2832 @@ $ pipx install \ _Notes on the upcoming release will go here._ -### Breaking changes +tmuxp 1.68.0 refreshes the documentation stack and developer workflow for the next release train. The docs now sit on the shared [gp-sphinx](https://gp-sphinx.git-pull.com/) platform, the API pages pick up the newer gp-furo visual language, and the test suite avoids paying for each contributor's interactive shell startup. The release also raises the libtmux floor so {ref}`tmuxp-shell` users can script against the expanded tmux command wrapper surface. + +### Dependencies -#### **libtmux** minimum bumped from `~=0.55.0` to `~=0.56.0` (#1038) +#### Minimum `libtmux~=0.56.0` (was `~=0.55.0`) (#1038) - Picks up two releases: 0.55.1 (test-fixture socket cleanup) and - 0.56.0 (broader tmux command coverage — interactive commands, - buffer I/O, key bindings, and window/pane manipulation, all - available to scripts run via `tmuxp shell`). +The libtmux bump pulls in the 0.55.1 test-fixture socket cleanup and the 0.56.0 command-coverage release. tmuxp's runtime imports stay on stable APIs, while scripts launched through {ref}`tmuxp-shell` can now reach more upstream wrappers for interactive commands, buffer I/O, key bindings, and window/pane manipulation without falling back to raw `cmd()` calls. ### Documentation -- Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#1035) -- Bump gp-sphinx docs stack to v0.0.1a8 (#1036) -- Bump gp-sphinx docs stack to v0.0.1a16 — docs site now renders - via `gp-furo-theme`, a Tailwind v4 respin of Furo, with - `sphinx-vite-builder` handling theme-asset builds (#1037) +#### Shared gp-sphinx documentation platform (#1033, #1035, #1036, #1037) + +The docs move from repo-local Sphinx extension copies to the shared gp-sphinx package family. That makes the tmuxp site inherit the common Furo-based theme, IBM Plex typography, packaged argparse documentation helpers, API badge styling, and MyST-aware object references used across the surrounding Python projects. + +The later gp-sphinx bumps bring in the `gp-furo-theme` Tailwind v4 respin and `sphinx-vite-builder` asset pipeline. In practice, this keeps tmuxp's CLI and API docs visually aligned with the newer [libtmux-mcp](https://libtmux-mcp.git-pull.com/) docs without keeping private copies of the same theme and extension code. + +#### Documentation command blocks are easier to copy (#1024) + +Shell examples now use one command per `console` code block with a `$` prompt. Long commands are split with continuations so rendered docs stay readable while still copying cleanly. ### Development #### Test panes spawn `/bin/sh` instead of the developer's `$SHELL` (#1041) -An autouse pytest fixture pins `$SHELL=/bin/sh` so test panes skip -the contributor's interactive shell init. On systems with slow shell -startup (zsh + oh-my-zsh, heavy bash profiles) this can roughly halve -`uv run py.test` wall time; smaller gain on stripped-down shells. No -effect on tmuxp's runtime behavior. - +The pytest suite now pins `$SHELL=/bin/sh` while tests run, so tmux panes created by fixtures skip the developer's interactive shell startup files. That removes a large local performance cost for zsh or heavily customized shell setups and does not change tmuxp runtime behavior. ## tmuxp 1.67.0 (2026-03-08) +tmuxp 1.67.0 makes {ref}`tmuxp-load` visibly track the workspace build it is performing. Users get progress feedback while windows, panes, and `before_script` hooks are being prepared, and automation can still disable the display entirely. + ### What's new -#### Animated progress spinner for `tmuxp load` (#1020) +#### Animated progress for `tmuxp load` (#1020) -The `load` command now shows an animated spinner with real-time build progress -as windows and panes are created. Five built-in presets control the display -format (`default`, `minimal`, `window`, `pane`, `verbose`), and custom format -strings are supported via `--progress-format` or `TMUXP_PROGRESS_FORMAT`. +The {ref}`tmuxp-load` command now shows an animated progress display while it builds a session. Built-in formats cover terse, window-focused, pane-focused, and verbose views, while `--progress-format` and `TMUXP_PROGRESS_FORMAT` allow a custom display. -- `--progress-lines N` / `TMUXP_PROGRESS_LINES`: Control how many lines of - `before_script` output appear in the spinner panel (default: 3). Use `0` to - hide the panel, `-1` for unlimited (capped to terminal height). -- `--no-progress` / `TMUXP_PROGRESS=0`: Disable the spinner entirely. -- During `before_script` execution, the progress bar shows a marching animation - and ⏸ icon. +`--progress-lines` and `TMUXP_PROGRESS_LINES` control how much `before_script` output appears in the panel, and `--no-progress` or `TMUXP_PROGRESS=0` restores quiet output. ## tmuxp 1.66.0 (2026-03-08) -### Bug fixes +tmuxp 1.66.0 cleans up diagnostics and user-facing output. Normal CLI use is quieter, build failures stop dumping raw tracebacks by default, and structured logging becomes the common diagnostic path. -- Fix default CLI log level from INFO to WARNING so normal usage is not noisy (#1017) -- Suppress raw Python tracebacks on workspace build failure; error details available via `--log-level debug` while the user sees only `[Error] ` (#1017) -- Fix `get_pane()` to match sibling methods: widen catch to `Exception`, preserve exception chain via `from e`, replace bare `print()` with structured debug log (#1017) -- Route `ls --json` and `debug-info --json` through `OutputFormatter` for consistent machine-readable output (#1017) +### Fixes + +#### Quieter CLI failures and machine-readable output fixes (#1017) + +The default CLI log level moved from INFO to WARNING so routine commands no longer emit internal chatter. Workspace build failures now show a concise user-facing error unless `--log-level debug` is requested, `get_pane()` preserves exception context without printing directly, and JSON output for `ls` and `debug-info` now flows through the shared output formatter. ### Development -#### Structured logging with `extra` context across all modules (#1017) +#### Structured logging across tmuxp (#1017) -All modules now use `logging.getLogger(__name__)` with structured `extra` keys -(`tmux_session`, `tmux_window`, `tmux_pane`, `tmux_config_path`, etc.) for -filtering and aggregation. Library `__init__.py` adds `NullHandler` per Python -best practices. A new `TmuxpLoggerAdapter` provides persistent context for -objects with stable identity. +Modules now use named loggers with structured `extra` fields such as `tmux_session`, `tmux_window`, `tmux_pane`, and `tmux_config_path`. Library imports install a `NullHandler`, and stable objects can carry persistent context through a logger adapter. -- Remove `colorama` runtime and type-stub dependencies; replace with stdlib ANSI constants (#1017) -- Route all raw `print()` calls through `tmuxp_echo()` for consistent output channels (#1017) +The same cleanup removes the `colorama` dependency in favor of stdlib ANSI helpers and routes direct user-visible printing through tmuxp's output layer. ## tmuxp 1.65.0 (2026-03-08) -### Breaking Changes +tmuxp 1.65.0 is a libtmux compatibility release. It raises the floor to pick up upstream lifecycle logging, error propagation fixes, pane title support, configurable tmux binary support, and safer pre-execution command logging. -#### **libtmux** minimum bumped from `~=0.53.0` to `~=0.55.0` (#1019) +### Dependencies - Picks up three releases: 0.53.1 (race condition fix in `new_session()`), - 0.54.0 (structured lifecycle logging, error propagation fixes), and - 0.55.0 (`Pane.set_title()`, `Server(tmux_bin=)`, pre-execution DEBUG logging). +#### Minimum `libtmux~=0.55.0` (was `~=0.53.0`) (#1019) -## tmuxp 1.64.2 (2026-03-08) +This pulls in libtmux 0.53.1, 0.54.0, and 0.55.0. The most visible downstream effects are the upstream `new_session()` race fix, structured lifecycle logging, `Pane.set_title()`, `Server(tmux_bin=)`, and DEBUG logging before tmux subprocess execution. -### Packaging +## tmuxp 1.64.2 (2026-03-08) -- Fix `__about__.__version__` not updated in 1.64.1 release +tmuxp 1.64.2 is a packaging-only correction for the previous patch release. -## tmuxp 1.64.1 (2026-03-08) +### Fixes -### Bug fixes +#### Published version metadata corrected -#### Fix `%` character appearing in panes on workspace load (#1018) +The package version in `__about__.__version__` is updated to match the 1.64.1 release. -Fixed long-standing issue ([#365]) where zsh panes displayed an inverse `%` marker after -loading a workspace. WorkspaceBuilder now waits for each pane's shell to be ready before -applying layout or sending commands. +## tmuxp 1.64.1 (2026-03-08) -[#365]: https://github.com/tmux-python/tmuxp/issues/365 +tmuxp 1.64.1 fixes a long-standing zsh display artifact during workspace load and adds linkable, richer CLI option documentation. -### Documentation +### Fixes -#### Linkable CLI arguments and options (#1010) +#### Pane readiness before layout and commands (#1018) -CLI documentation now supports direct linking to specific arguments: +Workspace loading now waits for each pane's shell to become ready before applying layout or sending commands. This fixes the inverse `%` marker that zsh could leave in panes after loading a workspace ([#365](https://github.com/tmux-python/tmuxp/issues/365)). -- **Linkable options**: Each `--option` and positional argument has a permanent URL anchor (e.g., `cli/load.html#load-d`) -- **Headerlinks**: Hover over any argument to reveal a ¶ link for easy sharing -- **Visual styling**: Argument names displayed with syntax-highlighted backgrounds for better readability -- **Default value badges**: Default values shown as styled inline code (e.g., `auto`) +### Documentation -#### Improved argument metadata display (#1011) +#### Linkable and richer CLI arguments (#1010, #1011) -- **Cleaner layout**: Default, Type, Choices shown as key-value pairs instead of pipe-separated text -- **Required badge**: Subtle amber tag visible in both light and dark modes -- **Consistent sizing**: All CLI elements match code block font size +CLI docs now expose permanent anchors for command options and positional arguments. Argument metadata is rendered as readable key/value detail with required badges, default-value styling, and header links for sharing a specific option. ## tmuxp 1.64.0 (2026-01-24) -### Documentation - -#### CLI documentation overhaul with sphinx_argparse_neo (#1009) +tmuxp 1.64.0 replaces the first-generation argparse docs extension with a maintained package and fixes the warnings that surfaced during that migration. -Replaced the `pretty_argparse` extension with a new `sphinx_argparse_neo` package: - -- **New argparse documentation engine**: Complete rewrite for cleaner, more maintainable CLI docs -- **Syntax highlighting**: Custom Pygments lexers for CLI usage blocks and argparse output -- **Examples transformation**: Automatically converts epilog "examples:" definition lists into proper documentation sections with TOC entries -- **ANSI stripping**: Removes escape codes when `FORCE_COLOR` is set -- **RST emphasis escaping**: Prevents warnings from glob patterns like `django-*` -- **Restructured CLI pages**: Consistent layout matching vcspull documentation pattern +### Documentation -### Bug fixes +#### CLI docs powered by `sphinx_argparse_neo` (#1009) -#### Docutils node.children protocol (#1009) +The CLI reference moves to a packaged argparse documentation engine with syntax-highlighted usage blocks, transformed examples sections, ANSI stripping, safer RST escaping, and a page structure consistent with sibling projects. -- Fixed direct `node.children` assignment that bypassed docutils' parent-child tracking mechanism +### Fixes -#### Mypy type annotation (#1009) +#### Docutils and typing cleanup (#1009) -- Added missing type annotation to fix `no-any-return` error +The docs extension no longer assigns directly to `node.children`, preserving docutils parent/child tracking, and a missing type annotation was added to satisfy mypy. ## tmuxp 1.63.1 (2026-01-11) -### Bug fixes - -#### CLI example colorization (#1008) +tmuxp 1.63.1 is a small CLI help fix after the colorized command release. -- Fix example sections not being colorized in `tmuxp --help` output -- Change `build_description` to use `"{heading} examples:"` format (e.g., "load examples:") for proper formatter detection +### Fixes -## tmuxp 1.63.0 (2026-01-11) +#### Example sections colorize correctly (#1008) -### Features +Example headings in `tmuxp --help` now use the command-specific heading format needed by the formatter, so example sections receive the same styling as other help output. -#### CLI Colors (#1006) +## tmuxp 1.63.0 (2026-01-11) -New semantic color output for all CLI commands: +tmuxp 1.63.0 is the CLI usability release. It adds semantic color, a searchable workspace index, richer `ls` output, and JSON output for debugging and automation. -- New `--color` flag (auto/always/never) on root CLI for controlling color output -- Respects `NO_COLOR` and `FORCE_COLOR` environment variables per [no-color.org](https://no-color.org) standard -- Semantic color methods: `success()` (green), `warning()` (yellow), `error()` (red), `info()` (cyan), `highlight()` (magenta), `muted()` (blue) -- All commands updated with colored output: `load`, `ls`, `freeze`, `convert`, `import`, `edit`, `shell`, `debug-info` -- Interactive prompts enhanced with color support -- `PrivatePath` utility masks home directory as `~` for privacy protection in output -- Beautiful `--help` output with usage examples +### What's new -#### Search Command (#1006) +#### Semantic color across CLI output (#1006) -New `tmuxp search` command for finding workspace files: +The root CLI gains `--color=auto|always|never` and respects `NO_COLOR` and `FORCE_COLOR`. Commands use semantic color roles for success, warnings, errors, paths, highlights, muted labels, interactive prompts, and help examples. -- Field-scoped search with prefixes: `name:`, `session:`, `path:`, `window:`, `pane:` -- Matching options: `-i` (ignore-case), `-S` (smart-case), `-F` (fixed-strings), `-w` (word) -- Logic operators: `--any` for OR, `-v` for invert match -- Output formats: human (with match highlighting), `--json`, `--ndjson` for automation and piping to `jq` -- Searches local (cwd and parents) and global (~/.tmuxp/) workspaces +#### Workspace search command (#1006) -#### Enhanced ls Command (#1006) +The new {ref}`search-config` command searches local and global workspace files with field prefixes such as `name:`, `session:`, `path:`, `window:`, and `pane:`. It supports smart-case, fixed-string, word, OR, and inverted matching, plus human, JSON, and NDJSON output. -New output options for `tmuxp ls`: +#### Richer workspace listing (#1006) -- `--tree`: Display workspaces grouped by directory -- `--full`: Include complete parsed config content -- `--json` / `--ndjson`: Machine-readable output for automation and piping to `jq` -- Local workspace discovery from current directory and parents -- Source field distinguishes "local" vs "global" workspaces -- "Global workspace directories" section shows XDG vs legacy paths with status +The {ref}`ls-config` command can display grouped trees, complete parsed config content, local-versus-global source information, and machine-readable JSON/NDJSON output. Global workspace directories also show legacy and XDG locations with status. -#### JSON Output for debug-info (#1006) +#### JSON debug information (#1006) -- `tmuxp debug-info --json`: Structured JSON output for automation, issue reporting, and piping to `jq` +{ref}`tmuxp-debug-info` can now emit structured JSON for automation and issue-reporting workflows. -### Development +### Documentation -#### Makefile -> Justfile (#1005) +#### Better CLI documentation primitives (#1007) -- Migrate from `Makefile` to `justfile` for running development tasks -- Update documentation to reference `just` commands +The docs gained a pretty-argparse extension for stripping ANSI escape codes, turning help examples into documentation sections, highlighting usage blocks, and ordering generated sections more naturally. -### Documentation +### Development -#### pretty_argparse Sphinx extension (#1007) +#### Development tasks move to Just (#1005) -New Sphinx extension that enhances sphinx-argparse CLI documentation: +The project development entrypoint moved from `Makefile` targets to `just` recipes, and the docs were updated around the new workflow. -- Strip ANSI escape codes from help text (FORCE_COLOR support) -- Transform examples into proper documentation sections -- Custom Pygments lexer (`cli-usage`) for usage block syntax highlighting -- Reorder sections so usage appears before examples +#### Docs deployment uses OIDC (#1000) -- Migrate docs deployment to AWS OIDC authentication and AWS CLI +The documentation deployment path moved to AWS OIDC credentials and the AWS CLI, removing long-lived credentials from the normal deploy flow. ## tmuxp 1.62.0 (2025-12-14) -### Breaking changes +tmuxp 1.62.0 pairs a libtmux floor bump with a load-time error fix. + +### Dependencies -#### libtmux 0.52.1 (#1001) +#### Minimum `libtmux~=0.53.0` (was `~=0.52.1`) (#1001, #1003) -libtmux minimum version bumped from 0.52.1 -> 0.53.0. +The libtmux bump keeps tmuxp aligned with the upstream session-management fixes required by the current test and runtime surface. -### Bug fixes +### Fixes -#### Fixed traceback on session load (#1002, #1003) +#### Session-killed tracebacks are surfaced correctly (#1002, #1003) -Fixed issue where session killed tracebacks should show after `tmuxp load`'s attach. +When a session is killed during the attach path after `tmuxp load`, the failure now reports through the expected error path instead of hiding the traceback. ## tmuxp 1.61.0 (2025-12-07) -### Breaking changes +tmuxp 1.61.0 keeps the dependency stack on the newly published trusted-release line. -#### libtmux 0.52.1 (#1001) +### Dependencies -libtmux minimum version bumped from 0.51.0 -> 0.52.1. +#### Minimum `libtmux~=0.52.1` (was `~=0.51.0`) (#1001) -- libtmux 0.52.0: Improved `Pane.capture_pane()` support -- libtmux 0.52.1: PyPI Trusted Published package +The libtmux update picks up improved pane capture support and the upstream package's Trusted Publisher release. -#### gp-libs 0.0.7 (#1001) +#### `gp-libs` trusted-publishing refresh (#1001) -gp-libs now published via PyPI Trusted Published package. +The gp-libs dependency moves to a package published through PyPI Trusted Publisher. ## tmuxp 1.60.1 (2025-12-07) -### CI +tmuxp 1.60.1 is a release-infrastructure update. + +### Development + +#### PyPI Trusted Publisher (#1000) -- Migrate to PyPI Trusted Publisher (#1000) +tmuxp publishing moved to PyPI Trusted Publisher, reducing the need for long-lived upload credentials. ## tmuxp 1.60.0 (2025-12-06) -#### libtmux 0.51.0 (#999) +tmuxp 1.60.0 raises the libtmux floor to the release where old deprecation warnings became hard API errors. -libtmux minimum version bumped from 0.50.1 -> 0.51.0. +### Dependencies -Hard API deprecations in libtmux 0.51.0 will cause deprecated APIs that faced only warnings to now error. +#### Minimum `libtmux~=0.51.0` (was `~=0.50.1`) (#999) -## tmuxp 1.59.1 (2025-12-06) +Users and plugins relying on deprecated libtmux names should migrate before this line, because libtmux 0.51.0 turns some formerly warned APIs into errors. -### Breaking changes +## tmuxp 1.59.1 (2025-12-06) -#### libtmux 0.50.1 (#998) +tmuxp 1.59.1 is a docs-health and dependency patch. -libtmux minimum version bumped from 0.50.0 -> 0.50.1. +### Dependencies -### Documentation (#997) +#### Minimum `libtmux~=0.50.1` (was `~=0.50.0`) (#998) -Sphinx build warnings fixed: +The libtmux patch keeps tmuxp on the latest 0.50.x maintenance line. -- `docs/conf.py`: Add sphinx-autodoc-typehints configuration - (`always_document_param_types`, `typehints_use_rtype`) and suppress - forward reference warnings from TYPE_CHECKING blocks -- `src/tmuxp/workspace/builder.py`: Fix "via via" typo in docstring -- `src/tmuxp/workspace/freezer.py`: Fix "workspacee" typo in docstring -- `src/tmuxp/log.py`: Fix RST parameter formatting in docstrings -- `src/tmuxp/workspace/finders.py`: Add missing Returns/Raises sections - to `find_workspace_file` docstring -- `docs/about_tmux.md`: Fix orphan footnote reference +### Documentation -## tmuxp 1.59.0 (2025-11-30) +#### Sphinx warnings fixed (#997) -### Breaking changes +The docs build received typehint configuration, docstring typo fixes, missing `Returns` and `Raises` sections, RST parameter formatting fixes, and an orphan footnote cleanup. -#### libtmux 0.50.0 (#996) +## tmuxp 1.59.0 (2025-11-30) -libtmux minimum version bumped from 0.49.0 -> 0.50.0. +tmuxp 1.59.0 adapts to libtmux's unified options API and its Python-native option values. -Internal updates to use libtmux's new unified options API: +### Dependencies -- `Session.attach_session()` → `Session.attach()` -- `Window.show_window_option()` → `Window.show_option()` -- `Window.show_window_options()` → `Window.show_options()` -- `Window.set_window_option()` → `Window.set_option()` +#### Minimum `libtmux~=0.50.0` (was `~=0.49.0`) (#996) -Note: Options now return Python-native types (`True`/`False` instead of -`"on"`/`"off"`, `int` instead of numeric strings). +Internal tmuxp calls moved from the old libtmux option helpers to the newer unified option methods. Historical names such as `Session.attach_session()`, `Window.show_window_option()`, and `Window.set_window_option()` are intentionally left as inline code here because they describe the old migration surface. ## tmuxp 1.58.0 (2025-11-30) +tmuxp 1.58.0 completes the move away from old tmux versions. + ### Breaking changes -#### Minimum tmux version bumped to 3.2+ (#992, #993) +#### tmux 3.2+ is now required (#992, #993) + +tmux versions below 3.2a are disabled through the libtmux 0.49.0 update. -tmux versions below 3.2a are now disabled (via libtmux v0.49.0). +### Dependencies -#### libtmux 0.49.0 (#992) +#### Minimum `libtmux~=0.49.0` (was `~=0.48.0`) (#992) -libtmux minimum version bumped from 0.48.0 -> 0.49.0. +The libtmux update carries the tmux-version enforcement used by tmuxp. ## tmuxp 1.57.0 (2025-11-28) +tmuxp 1.57.0 starts the tmux 3.2+ migration and expands test coverage to tmux 3.6. + ### Breaking changes -#### Minimum tmux version bumped to 3.2+ (#991) +#### tmux versions below 3.2a are deprecated (#991) -tmux versions below 3.2a are now deprecated (via libtmux v0.48.0). +Older tmux versions now emit a `FutureWarning` on first use through libtmux. Set `LIBTMUX_SUPPRESS_VERSION_WARNING=1` only when you intentionally need to silence the warning during a transition. -A `FutureWarning` will be emitted on first use. Support for these versions will be removed in a future release. Set `LIBTMUX_SUPPRESS_VERSION_WARNING=1` to suppress. +### Dependencies -#### libtmux 0.48.0 (#990) +#### Minimum `libtmux~=0.48.0` (was `~=0.47.0`) (#990) -libtmux minimum version bumped from 0.47.0 -> 0.48.0. +The libtmux floor carries the warning path for older tmux versions. -### What's new +### Development -#### tmux 3.6 support (#989) +#### tmux 3.6 in the test grid (#989) -Added tmux 3.6 to test grid. +CI now covers tmux 3.6. ## tmuxp 1.56.0 (2025-11-01) +tmuxp 1.56.0 drops Python 3.9 and starts the Python 3.14 readiness line. + ### Breaking changes -- Bump minimum libtmux from 0.46.0 to 0.47.0 -- Drop Python 3.9, EOL October 5th, 2025 (#987) +#### Python 3.10+ is now required (#987) - tmuxp 1.55.0 was the last release for Python 3.9. +tmuxp 1.55.0 was the last release supporting Python 3.9. Python 3.9 reached end of life on October 5, 2025. - The minimum Python for tmuxp as of 1.56.0 is Python 3.10 +#### Minimum `libtmux~=0.47.0` (was `~=0.46.0`) + +The libtmux floor moves with the supported Python baseline. ### Development -- Add Python 3.14 to test matrix (#986) +#### Python 3.14 added to CI (#986) + +The test matrix now includes Python 3.14. ## tmuxp 1.55.0 (2025-02-26) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.55.0 is a maintenance release for libtmux test-helper compatibility. -### Breaking changes +### Dependencies -- libtmux: Bump minimum version from 0.45.0 -> 0.46.0 (#969) +#### Minimum `libtmux~=0.46.0` (was `~=0.45.0`) (#969) - 0.46.0+ needs this release of tmuxp to stay up-to-date with test helpers. +The dependency bump keeps tmuxp current with upstream libtmux test helper changes. ## tmuxp 1.54.0 (2025-02-23) -### Breaking changes +tmuxp 1.54.0 is a maintenance release around libtmux and runtime-dependency checks. -- libtmux: Bump minimum version from 0.44.2 -> 0.45.0 (#968) +### Dependencies - 0.45.0+ needs this release of tmuxp to stay up-to-date with test helpers. +#### Minimum `libtmux~=0.45.0` (was `~=0.44.2`) (#968) + +The libtmux update keeps the project aligned with upstream test helper changes. ### Development -- CI: Check CLI modules runtime dependencies (#967) +#### CLI runtime dependency checks (#967) - An extra set of checks on top of #965. +CI now verifies runtime dependencies for CLI modules, extending the earlier dependency-import checks. ## tmuxp 1.53.0 (2025-02-19) -### Bug fixes +tmuxp 1.53.0 fixes a runtime typing import issue and makes the test suite easier to read. + +### Fixes -- Fix import type unavailable at runtime (#965) +#### Runtime import fix (#965) -### Development +Imports that were only available for typing no longer leak into runtime paths. -- CI: Check for runtime dependencies (#965) -- libtmux: Bump minimum version from 0.42.0 -> 0.44.2 (#962) -- Tests: Improve parametrized test suite (#964) +### Development - Convert remaining `pytest.mark.parametrize()` tests to `NamedTuple` fixtures: +#### Dependency and test fixture cleanup (#962, #964, #965) - - Improved test maintainability and readability - - Added descriptive test IDs for better failure reporting - - Added docstrings to test fixtures - - Files updated: - - `test_cli.py`: Added `HelpTestFixture` - - `test_convert.py`: Added `ConvertTestFixture` and `ConvertJsonTestFixture` - - `test_freeze.py`: Added `FreezeTestFixture` and `FreezeOverwriteTestFixture` - - `test_import.py`: Added `ImportTestFixture`, `ImportTeamocilTestFixture`, and `ImportTmuxinatorTestFixture` - - `test_load.py`: Added `ZshAutotitleTestFixture`, `LogFileTestFixture`, `PluginVersionTestFixture`, and `PluginMissingTestFixture` +The libtmux floor moves to 0.44.2, CI verifies runtime dependencies, and parametrized tests were converted to named fixture records so failures show clearer IDs. ## tmuxp 1.52.2 (2025-02-02) -### Bug fixes +tmuxp 1.52.2 continues the `run_before_script()` output-capture fix line. + +### Fixes + +#### `run_before_script()` captures output more reliably (#960) -- `run_before_script()`: Additional output capturing improvements (#960) +Additional output-capture edge cases were fixed for pre-load scripts. ## tmuxp 1.52.1 (2025-02-02) -### Bug fixes +tmuxp 1.52.1 fixes the first output-capture issue in `run_before_script()`. + +### Fixes + +#### `run_before_script()` output fix (#959) -- `run_before_script()`: Fix output issue (#959) +The pre-load script runner now captures output through the corrected libtmux path. ## tmuxp 1.52.0 (2025-02-02) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.52.0 is a maintenance release for the libtmux 0.42.0 line. -### Development +### Dependencies -- libtmux: Bump minimum version from 0.40.1 -> 0.42.0 (#958) +#### Minimum `libtmux~=0.42.0` (was `~=0.40.1`) (#958) - - `run_before_script()`: Remove reliance on `console_to_str()` +tmuxp drops its reliance on the older `console_to_str()` helper while staying on the current libtmux command-output path. ## tmuxp 1.51.0 (2025-02-02) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.51.0 modernizes annotations and lint rules. ### Development -#### chore: Implement PEP 563 deferred annotation resolution (#957) +#### Deferred annotations and modern typing checks (#957) -- Add `from __future__ import annotations` to defer annotation resolution and reduce unnecessary runtime computations during type checking. -- Enable Ruff checks for PEP-compliant annotations: - - [non-pep585-annotation (UP006)](https://docs.astral.sh/ruff/rules/non-pep585-annotation/) - - [non-pep604-annotation (UP007)](https://docs.astral.sh/ruff/rules/non-pep604-annotation/) - -For more details on PEP 563, see: https://peps.python.org/pep-0563/ +Source files now use `from __future__ import annotations`, and Ruff checks for PEP 585 and PEP 604 style annotations are enabled. ## tmuxp 1.50.1 (2024-12-24) -### Development +tmuxp 1.50.1 is a libtmux maintenance update. -- libtmux: Bump minimum version 0.40.0 -> 0.40.1 (#956) +### Dependencies - Bug fix for server environmental variables from https://github.com/tmux-python/libtmux/pull/553. - Thank you @ppentchev! +#### Minimum `libtmux~=0.40.1` (was `~=0.40.0`) (#956) + +The libtmux bump picks up the server environment variable fix from [libtmux#553](https://github.com/tmux-python/libtmux/pull/553). ## tmuxp 1.50.0 (2024-12-20) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.50.0 modernizes syntax for the Python 3.9 baseline. -### Development +### Dependencies -- libtmux: Bump minimum version 0.39.0 -> 0.40.0 (#954) +#### Minimum `libtmux~=0.40.0` (was `~=0.39.0`) (#954) - Adopts Python 3.9 syntax features +The libtmux update adopts Python 3.9 syntax features. -- Aggressive automated lint fixes via `ruff` (#953) +### Development - via ruff v0.8.4, all automated lint fixes, including unsafe and previews were applied for Python 3.9: +#### Ruff modernization pass (#953) - ```console - $ ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . - ``` +The codebase was run through Ruff's automated fixes and formatter for the Python 3.9 baseline. ## tmuxp 1.49.0 (2024-11-26) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.49.0 drops Python 3.8 and moves the dependency stack to the Python 3.9 line. ### Breaking changes -- Drop Python 3.8. end of life was October 7th, 2024 (#951) +#### Python 3.9+ is now required (#951) + +tmuxp 1.48.0 was the last release supporting Python 3.8. Python 3.8 reached end of life on October 7, 2024. - tmuxp 1.48.0 was the last release for Python 3.8. +#### Minimum `libtmux~=0.39.0` (was `~=0.38.1`) - The minimum python for tmuxp as of 1.49.0 is Python 3.9 -- libtmux 0.38.1 -> 0.39.0 (Minimum Python version of 3.9) +The libtmux floor moves with the Python baseline. ## tmuxp 1.48.0 (2024-11-26) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.48.0 moves project management from Poetry to uv and the build backend from Poetry to Hatchling. ### Breaking changes -#### Project and package management: poetry to uv (#949) +#### Project management moved to uv (#949) -[uv] is the new package and project manager for the project, replacing Poetry. +[uv](https://github.com/astral-sh/uv) replaces Poetry for development workflows and dependency locking. -[uv]: https://github.com/astral-sh/uv +#### Build backend moved to Hatchling (#949) -#### Build system: poetry to hatchling (#949) +[Hatchling](https://hatch.pypa.io/latest/) replaces Poetry's build backend for packaging. -[Build system] moved from [poetry] to [hatchling]. +#### Minimum `libtmux~=0.38.1` (was `~=0.37.0`) (#950) -[Build system]: https://packaging.python.org/en/latest/tutorials/packaging-projects/#choosing-a-build-backend -[poetry]: https://github.com/python-poetry/poetry -[hatchling]: https://hatch.pypa.io/latest/ - -#### Minimum libtmux version 0.37.0 -> 0.38.1 (#950) - -Built with uv. +The libtmux dependency is rebuilt and locked through the new uv-based project workflow. ### Development -- Code quality: Use f-strings in more places (#931) +#### Ruff 0.4.2 cleanup (#931) - via [ruff 0.4.2](https://github.com/astral-sh/ruff/blob/v0.4.2/CHANGELOG.md). - -[uv]: https://github.com/astral-sh/uv +Code quality updates include f-string cleanups from the Ruff 0.4.2 rule set. ## tmuxp 1.47.0 (2024-04-21) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.47.0 is a libtmux maintenance release. -### Developmental +### Dependencies -- libtmux: 0.36.0 -> 0.37.0 (#929) +#### Minimum `libtmux~=0.37.0` (was `~=0.36.0`) (#929) - Internal improvements to test suite (pytest-xdist and relaxing `retry_until()` tests) +The libtmux update brings upstream test-suite improvements, including pytest-xdist work and more relaxed `retry_until()` tests. ## tmuxp 1.46.0 (2024-04-12) -### Breaking change - -#### Workspace builder now detects terminal size (#926) +tmuxp 1.46.0 changes workspace building to respect the actual terminal size. -Dimensions used by workspace builder now use {py:func}`shutil.get_terminal_size()`. - -In conjunction with `main-pane-height: 67%`, for instance, this will render a -proportional layout: +### Breaking changes -```yaml -session_name: my session -windows: -- window_name: example with percentage - focus: True - layout: main-horizontal - options: - main-pane-height: 67% - panes: - - focus: true - - pane -``` +#### Workspace builder detects terminal size (#926) -To use old behavior, set `TMUXP_DETECT_TERMINAL_SIZE=0` in your terminal -environment and file an issue on the tracker. +The workspace builder now uses `shutil.get_terminal_size()` for dimensions, which makes percentage-based layouts such as `main-pane-height: 67%` render proportionally. Set `TMUXP_DETECT_TERMINAL_SIZE=0` to use the old fixed-size behavior during migration. ### Documentation -- Automatically linkify links that were previously only text. +#### Plain links are linkified + +Documentation links that were previously plain text are now automatically linkified. ### Development -- Another `ruff` linting pass, this time with ruff 0.3.7 (#928) -- poetry: 1.8.1 -> 1.8.2 +#### Ruff and Poetry maintenance (#928) - See also: https://github.com/python-poetry/poetry/blob/1.8.2/CHANGELOG.md +The release includes another Ruff cleanup pass and a Poetry 1.8.2 update. ## tmuxp 1.45.0 (2024-03-24) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.45.0 is a code-quality maintenance release. ### Development -- Aggressive automated lint fixes via `ruff` (#922) +#### Ruff 0.3.4 cleanup (#922) - via ruff v0.3.4, all automated lint fixes, including unsafe and previews were applied: - - ```console - $ ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; ruff format . - ``` - - Branches were treated with: - - ```console - $ git rebase \ - --strategy-option=theirs \ - --exec 'poetry run ruff check --select ALL . --fix --unsafe-fixes --preview --show-fixes; poetry run ruff format .; git add src tests; git commit --amend --no-edit' \ - origin/master - ``` +The codebase was run through Ruff's automated fixes and formatter, including preview and unsafe fixes where they were accepted by maintainers. ## tmuxp 1.44.0 (2024-03-24) -### Breaking changes +tmuxp 1.44.0 tracks libtmux 0.36.0. -- libtmux: 0.35.1 -> 0.36.0 (#923) +### Dependencies - Internal refactorings and maintenance. +#### Minimum `libtmux~=0.36.0` (was `~=0.35.1`) (#923) + +The libtmux bump carries internal refactoring and maintenance. ## tmuxp 1.43.1 (2024-03-24) -### Breaking changes +tmuxp 1.43.1 picks up libtmux multi-client fixes. -- libtmux: 0.35.0 -> 0.35.1 +### Dependencies - Improved support in libtmux when multiple clients attached to a session in a server. +#### Minimum `libtmux~=0.35.1` (was `~=0.35.0`) + +The update improves behavior when multiple clients are attached to a session in one server. ## tmuxp 1.43.0 (2024-03-17) -### Breaking changes +tmuxp 1.43.0 follows libtmux's target-handling cleanup. -- libtmux: 0.34.0 -> 0.35.0 (#920) +### Dependencies - Simplify redundant `target` passing and `window-index` usages (#920) +#### Minimum `libtmux~=0.35.0` (was `~=0.34.0`) (#920) + +tmuxp adapts to libtmux changes that simplify redundant target passing and window-index usage. ## tmuxp 1.42.0 (2024-03-17) -### Breaking changes +tmuxp 1.42.0 follows libtmux's explicit-target command behavior. -- libtmux: 0.33.0 -> 0.34.0 (#919) +### Dependencies - Explicit targets in `cmd()` +#### Minimum `libtmux~=0.34.0` (was `~=0.33.0`) (#919) + +The libtmux update makes explicit command targets the expected path. ## tmuxp 1.41.1 (2024-03-17) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.41.1 is a small compatibility patch after the split-window API change. + +### Development + +#### Workspace builder uses `Pane.split` -- WorkspaceBuilder: Use `Pane.split` instead of `Window.split_window` +The builder now uses the newer `Pane.split` path instead of the historical `Window.split_window` helper. ## tmuxp 1.41.0 (2024-03-17) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.41.0 tracks libtmux's split API rename and refreshes development tooling. -### Breaking changes +### Dependencies -- libtmux: 0.32.0 -> 0.33.0 (#918) +#### Minimum `libtmux~=0.33.0` (was `~=0.32.0`) (#918) - Move `split_window()` to `split()`. +libtmux moved the split-window behavior from `split_window()` to `split()`. The old method name is kept inline here as migration history rather than linked as current API. ### Development -- poetry: 1.7.1 -> 1.8.1 +#### Poetry 1.8.1 - See also: https://github.com/python-poetry/poetry/blob/1.8.1/CHANGELOG.md +Development tooling moved to Poetry 1.8.1. ## tmuxp 1.40.0 (2024-03-32) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.40.0 is a maintenance release for libtmux export fixes and Ruff 0.3. -### Breaking changes +### Dependencies -- libtmux: 0.31.0.post0 -> 0.32.0 (#914) +#### Minimum `libtmux~=0.32.0` (was `~=0.31.0.post0`) (#914) - Export fix, ruff 0.3.0 updates. +The libtmux update includes an export fix and matching lint updates. ### Development -- ruff 0.2.2 -> 0.3.0 (#913) +#### Ruff 0.3 command shape (#913) - Related formattings. Update CI to use `ruff check .` instead of `ruff .`. +CI now uses `ruff check .`, matching the Ruff 0.3 command interface. ## tmuxp 1.39.0 (2024-02-17) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.39.0 tracks libtmux command-streamlining changes. -#### Breaking changes +### Dependencies -- libtmux: 0.30.2 -> 0.31.0 (#912) +#### Minimum `libtmux~=0.31.0` (was `~=0.30.2`) (#912) -- Renamings of libtmux 0.31.0's streamlining of `cmd()`, renaming of `attached_{window,pane}s` to - `active_{window,pane}s`. +Internal tmuxp code follows libtmux renames around command helpers and active window/pane accessors. Historical names such as `attached_windows` and `attached_panes` are left as migration notes. ## tmuxp 1.38.0 (2024-02-16) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.38.0 follows the libtmux 0.30 API-name cleanup. -#### Breaking changes +### Dependencies -- libtmux: 0.28.1 -> 0.30.1 (#911) +#### Minimum `libtmux~=0.30.1` (was `~=0.28.1`) (#911) - Updated method names - -- Rename methods to libtmux v0.30.0+-style (#911). +tmuxp internal method usage was updated to match the libtmux 0.30 naming style. ## tmuxp 1.37.1 (2024-02-15) -#### Development - -- libtmux: 0.28.0 -> 0.28.1 +tmuxp 1.37.1 is a maintenance release for libtmux docs/CI fixes and CI action updates. - Maintenance release (docs and CI bumps) +### Dependencies -#### Testing +#### Minimum `libtmux~=0.28.1` (was `~=0.28.0`) -- CI: Bump actions to node 20+ versions +The libtmux update is a maintenance release focused on docs and CI. -## tmuxp 1.37.0 (2024-02-14) +### Development -### Breaking changes +#### GitHub Actions updated to Node 20 -- libtmux: 0.27.0 -> 0.28.0 (#910) +CI actions were bumped to Node 20-compatible versions. - Refresh and resize improvements +## tmuxp 1.37.0 (2024-02-14) -### Tests +tmuxp 1.37.0 tracks libtmux refresh and resize improvements. -- CI: Add tmux 3.4 to test matrix (#909) +### Dependencies -## tmuxp 1.36.0 (2024-02-07) +#### Minimum `libtmux~=0.28.0` (was `~=0.27.0`) (#910) -_Maintenance only, no bug fixes or new features_ +The libtmux update brings refresh and resize improvements used by tmuxp. -### Breaking changes +### Development -- libtmux: 0.26.0 -> 0.27.0 (#908) +#### tmux 3.4 in CI (#909) - QueryList generic typing improvements. +The CI matrix now includes tmux 3.4. -## tmuxp 1.35.0 (2024-02-07) +## tmuxp 1.36.0 (2024-02-07) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.36.0 is a libtmux typing maintenance release. -### Breaking changes +### Dependencies -- libtmux: 0.25.0 -> 0.26.0, maintenance release (#906) +#### Minimum `libtmux~=0.27.0` (was `~=0.26.0`) (#908) - Doc string + linting stringency updates. +The libtmux update improves `QueryList` generic typing. -### Development +## tmuxp 1.35.0 (2024-02-07) -- Strengthen linting (#907) +tmuxp 1.35.0 tightens linting and follows libtmux docstring maintenance. - - Add flake8-commas (COM) +### Dependencies - - https://docs.astral.sh/ruff/rules/#flake8-commas-com - - https://pypi.org/project/flake8-commas/ +#### Minimum `libtmux~=0.26.0` (was `~=0.25.0`) (#906) - - Add flake8-builtins (A) +The libtmux update carries docstring and linting maintenance. - - https://docs.astral.sh/ruff/rules/#flake8-builtins-a - - https://pypi.org/project/flake8-builtins/ +### Development - - Add flake8-errmsg (EM) +#### Stricter Ruff rule families (#907) - - https://docs.astral.sh/ruff/rules/#flake8-errmsg-em - - https://pypi.org/project/flake8-errmsg/ +Linting now includes additional rule families for commas, builtins, and exception-message style. ## tmuxp 1.34.0 (2023-12-21) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.34.0 is an API documentation and internal package-boundary cleanup release. ### Breaking changes -- libtmux: 0.24.1 -> 0.25.0, maintenance release (#896) - - Improve styling via pydocstyle. +#### Internal modules moved under `tmuxp._internal` (#897, #900) -- `config_reader`: Move to `tmuxp._internal` (#897) -- `_types`: Move to `tmuxp._internal` (#900) +`config_reader` and `_types` moved into the internal namespace. These were implementation details, and the changelog leaves the old names unlinked because they are not stable public entrypoints. -### Documentation +### Dependencies -- Refactor API docs to split across multiple pages (#898) -- Remove unused reStructuredText section headers from some modules (#898) +#### Minimum `libtmux~=0.25.0` (was `~=0.24.1`) (#896) -## tmuxp 1.33.0 (2023-12-21) +The libtmux update improves docstring style through pydocstyle work. -_Maintenance only, no bug fixes or new features_ +### Documentation -### CI +#### API docs split across pages (#898) -- Move CodeQL from advanced configuration file to GitHub's default -- Add pydocstyle rule to ruff (#891) +API documentation was broken out into multiple pages and stale reStructuredText section headings were removed. -### Documentation +## tmuxp 1.33.0 (2023-12-21) -- Add docstrings to functions, methods, classes, and packages (#891) +tmuxp 1.33.0 makes documentation and CI stricter. -## tmuxp 1.32.1 (2023-11-23) +### Documentation -### Packaging +#### More complete docstrings (#891) -- pypoetry: Add `gp-lib` to `test` dependency group +Functions, methods, classes, and packages received docstrings, and pydocstyle enforcement was added through Ruff. ### Development -- libtmux: 0.24.0 -> 0.24.1 (maintenance release) +#### CodeQL defaults -### Tests +CodeQL moved from an advanced configuration file to GitHub's default setup. -- Shell tests: Use named, typed test fixture (#893) +## tmuxp 1.32.1 (2023-11-23) -## tmuxp 1.32.0 (2023-11-19) +tmuxp 1.32.1 is a test dependency and fixture-maintenance patch. -_Maintenance only, no bug fixes or new features_ +### Dependencies -### Packaging +#### libtmux 0.24.1 and `gp-lib` test dependency -- Move pytest configuration to `pyproject.toml` (#886) -- Poetry: 1.6.1 -> 1.7.0 +The test dependency group gained `gp-lib`, and libtmux moved to the 0.24.1 maintenance release. - See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md +### Development -- Add Python 3.12 to trove classifiers -- Packaging (poetry): Fix development dependencies +#### Named shell test fixtures (#893) - Per [Poetry's docs on managing dependencies] and `poetry check`, we had it wrong: Instead of using extras, we should create these: +Shell tests now use named, typed fixtures for clearer failures. - ```toml - [tool.poetry.group.group-name.dependencies] - dev-dependency = "1.0.0" - ``` +## tmuxp 1.32.0 (2023-11-19) - Which we now do. +tmuxp 1.32.0 consolidates test configuration and moves formatting from Black to Ruff. - [Poetry's docs on managing dependencies]: https://python-poetry.org/docs/master/managing-dependencies/ +### Packaging -### Development +#### Pytest and Poetry metadata cleanup (#886) -- libtmux: 0.23.0 -> 0.24.0 (maintenance release) -- Move formatting from `black` to [`ruff format`] (#890) +Pytest configuration moved into `pyproject.toml`, Python 3.12 classifiers were added, and development dependency groups were corrected to match Poetry's dependency-group model. - This retains the same formatting style of `black` while eliminating a - dev dependency by using our existing rust-based `ruff` linter. +### Development - [`ruff format`]: https://docs.astral.sh/ruff/formatter/ +#### Ruff formatter replaces Black (#890) -- CI: Update action packages to fix warnings +Formatting now uses [Ruff format](https://docs.astral.sh/ruff/formatter/), eliminating a separate Black dependency while keeping the same style. - - [dorny/paths-filter]: 2.7.0 -> 2.11.1 +#### libtmux 0.24.0 and CI action updates - [dorny/paths-filter]: https://github.com/dorny/paths-filter +The dependency stack moved to libtmux 0.24.0, Poetry 1.7.0, and newer GitHub Actions packages. ## tmuxp 1.31.0 (2023-09-23) -### Breaking changes +tmuxp 1.31.0 drops Python 3.7 and reaches strict mypy compliance. -- Python 3.7 Dropped (#885) +### Breaking changes -### Development +#### Python 3.8+ is now required (#885) -- **Improved typings** +Python 3.7 support ends on this line. - Now [`mypy --strict`] compliant (#859) +### Development - [`mypy --strict`]: https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-strict +#### Strict typing (#859) -- Poetry 1.5.1 -> 1.6.1 (#885) +The project is now `mypy --strict` compliant, and Poetry moved to 1.6.1. ## tmuxp 1.30.1 (2023-09-09) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.30.1 is the final Python 3.7 release line. ### Breaking changes -- Cut last python 3.7 release (EOL was June 27th, 2023) +#### Python 3.7 maintenance branch - For security updates, a 1.30.x branch can be maintained for a limited time, - if necessary. +Security updates, if needed, can target the 1.30.x branch after Python 3.7 end of life. ## tmuxp 1.30.0 (2023-09-04) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.30.0 is a code-quality release built around Ruff. ### Development -- Code quality improved via [ruff] rules (#879) +#### Faster linting and import sorting with Ruff (#879) - This includes fixes made by hand alongside ruff's automated fixes. The more - stringent rules include import sorting, and still runs almost instantly - against the whole codebase. +Ruff now handles more code-quality rules and runs quickly over the full codebase. CI also checks Black formatting. -- CI: `black . --check` now runs on pushes and pull requests +### Dependencies -### Packaging - -- libtmux: v0.23.1 -> v0.23.2 +#### libtmux 0.23.2 - Final Python 3.7 release of libtmux +The libtmux update is the final Python 3.7-compatible libtmux line. ### Documentation -- README Example for Nix (#883), thank you @ChristopherHarwell! - -## tmuxp 1.29.1 (2023-09-02) +#### Nix README example (#883) -_Maintenance only, no bug fixes or new features_ +The README gained a Nix example from @ChristopherHarwell. -### Development +## tmuxp 1.29.1 (2023-09-02) -- libtmux: v0.23.0 -> v0.23.1 +tmuxp 1.29.1 is a typo-fix release. - Typo fixes inside libtmux +### Fixes -### Docs +#### Documentation and dependency typo fixes (#884) -- Typo fixes (#884), thanks @kianmeng +tmuxp docs received typo fixes from @kianmeng, and libtmux moved to a typo-fix patch release. ## tmuxp 1.29.0 (2023-08-20) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.29.0 tracks libtmux code-quality work. -### Development +### Dependencies -- libtmux v0.22.2 -> v0.23.0 (#882) +#### libtmux 0.23.0 (#882) - Code quality improvements from https://github.com/tmux-python/libtmux/pull/488 +The libtmux update brings upstream code-quality improvements from [libtmux#488](https://github.com/tmux-python/libtmux/pull/488). -### Post-release: v1.29.0post0 (2023-09-02) +### Fixes -- libtmux post-release bumps +#### Post-release libtmux comments restored - Re-add comments that went missing from `ruff` formatter. +The `v1.29.0post0` follow-up re-added comments that were accidentally dropped during formatter work. ## tmuxp 1.28.2 (2023-08-20) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.28.2 is a packaging-maintenance patch. -### Packaging +### Dependencies -- libtmux v0.22.1 -> v0.22.2 +#### libtmux 0.22.2 - Removes `setuptools` from `build-system` requirements +The libtmux update removes `setuptools` from build-system requirements. ## tmuxp 1.28.1 (2023-05-28) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.28.1 restores Black as a development dependency while Ruff formatting matured. ### Development -- Add back `black` for formatting +#### Black restored temporarily - This is still necessary to accompany `ruff`, until it replaces black. +Black returned alongside Ruff until Ruff could fully replace it. ## tmuxp 1.28.0 (2023-05-27) -_Maintenance only, no bug fixes or new features_ - -### Internal improvements - -- Move formatting, import sorting, and linting to [ruff]. +tmuxp 1.28.0 starts the move from the older Black/isort/flake8 stack to Ruff. - This rust-based checker has dramatically improved performance. Linting and - formatting can be done almost instantly. - - This change replaces black, isort, flake8 and flake8 plugins. - -- libtmux: 0.21.1 -> 0.22.0 (Moved to ruff as well) -- poetry: 1.4.0 -> 1.5.0 +### Development - See also: https://github.com/python-poetry/poetry/releases/tag/1.5.0 +#### Ruff for linting, sorting, and formatting -[ruff]: https://ruff.rs +Ruff replaces Black, isort, flake8, and flake8 plugins for much faster whole-repo checks. The release also updates libtmux to 0.22.0 and Poetry to 1.5.0. ## tmuxp 1.27.1 (2022-04-07) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.27.1 is a typing-maintenance patch. ### Development -- Update mypy to 1.2.0 -- libtmux 0.21.0 -> 0.21.1 (mypy / typing updates only) +#### mypy 1.2 and libtmux 0.21.1 + +The release updates mypy and picks up libtmux typing-only changes. ## tmuxp 1.27.0 (2022-01-29) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.27.0 updates libtmux's tmux-format separator behavior. -### Internal improvements +### Dependencies -- libtmux 0.20.0 -> 0.21.0 (#865) +#### libtmux 0.21.0 (#865) - This updates the separator uses from libtmux to be a rarer character. See - [libtmux#475](https://github.com/tmux-python/libtmux/pull/475). +The libtmux bump uses a rarer separator for tmux format output, reducing the chance of parsing collisions. See [libtmux#475](https://github.com/tmux-python/libtmux/pull/475). ## tmuxp 1.26.0 (2023-01-15) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.26.0 improves new-session parameter support through libtmux. -### Internal improvements +### Dependencies -- libtmux 0.19.1 -> 0.20.0 (#863) +#### libtmux 0.20.0 (#863) - Improves support around `Server.new_session` and its params, e.g. `-x` and - `-y`. +The libtmux bump improves `Server.new_session` support for tmux size flags such as `-x` and `-y`. ## tmuxp 1.25.0 (2023-01-07) -### Internal improvements +tmuxp 1.25.0 is a libtmux patch-line update. -- libtmux 0.18.3 -> 0.19.1 (#862) +### Dependencies - 0.19.1 has a fix for `Window.set_window_option()` +#### libtmux 0.19.1 (#862) + +The update includes a fix for the historical `Window.set_window_option()` path. ## tmuxp 1.24.1 (2023-01-07) -### Internal improvements +tmuxp 1.24.1 improves test reliability and tracks a libtmux patch release. + +### Dependencies + +#### libtmux 0.18.3 (#861) + +The libtmux update follows [libtmux#466](https://github.com/tmux-python/libtmux/pull/466). -- libtmux: 0.18.2 -> 0.18.3 (#861) +### Development - via [libtmux#466](https://github.com/tmux-python/libtmux/pull/466) +#### More reliable pane path test -- tests(test_pane_order): Improve reliability of `pane_current_path` test. +`test_pane_order` became less timing-sensitive around `pane_current_path`. ## tmuxp 1.24.0 (2022-12-30) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.24.0 fixes session creation through libtmux and tightens test organization. -### Internal improvements +### Dependencies -- libtmux: 0.18.1 -> 0.18.2 +#### libtmux 0.18.2 - Fix for starting new sessions at default socket / temporary directory - ([libtmux#464](https://github.com/tmux-python/libtmux/pull/464)) +The libtmux update fixes starting new sessions at the default socket and temporary directory ([libtmux#464](https://github.com/tmux-python/libtmux/pull/464)). -- CLI Tests: Refactor `tests/cli` (#858) +### Development - - Fix resolution of directories +#### CLI test and builder constructor cleanup (#857, #858) -- WorkspaceBuilder: Require `Server` in constructor (#857) +CLI tests were reorganized, directory resolution was fixed, and `WorkspaceBuilder` now requires an explicit `Server` in its constructor. ## tmuxp 1.23.0 (_yanked_, 2022-12-28) -_Yanked release: `tmuxp load` issues, see #856_ +tmuxp 1.23.0 was yanked because of `tmuxp load` issues tracked in #856. -### Internal improvements +### Development -_Maintenance only, no bug fixes or new features_ +#### More type annotations (#796) -- Type annotations: More mypy typings (#796) +The yanked release carried additional mypy typing work. ## tmuxp 1.22.1 (2022-12-27) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.22.1 is a documentation-only libtmux patch. + +### Dependencies -- Update libtmux 0.18.0 -> 0.18.1 +#### libtmux 0.18.1 - Only code documentation fixes +The libtmux update contains code documentation fixes. ## tmuxp 1.22.0 (2022-12-27) -### Improvement +tmuxp 1.22.0 improves {ref}`tmuxp-shell` server detection. -- `tmuxp shell`: now detects current `server` via `TMUX` (#854) +### What's new + +#### `tmuxp shell` detects the current server from `TMUX` (#854) + +The shell command can now infer the active tmux server from the `TMUX` environment variable. ## tmuxp 1.21.0 (2022-12-27) -_Maintenance only, no bug fixes or new features_ +tmuxp 1.21.0 is a libtmux maintenance release. -- libtmux 0.17.2 -> 0.18.0 +### Dependencies - Server: Improved `__repr__` +#### libtmux 0.18.0 -## tmuxp 1.20.3 (2022-12-27) +The libtmux update improves `Server.__repr__`. -- Fix warnings for `_update_panes()` in builder +## tmuxp 1.20.3 (2022-12-27) -## tmuxp 1.20.2 (2022-12-27) +tmuxp 1.20.3 removes builder warning noise. -_Internal update only_ +### Fixes -- libtmux 0.17.1 -> 0.17.2 +#### `_update_panes()` warnings fixed - More deprecation warnings +Builder warnings around `_update_panes()` were corrected. -## tmuxp 1.20.1 (2022-12-27) +## tmuxp 1.20.2 (2022-12-27) -_Internal update only_ +tmuxp 1.20.2 is an internal libtmux deprecation-warning update. -- libtmux 0.17.0 -> ~0.17.1 +### Dependencies - Deprecation warning updates, doc fixes +#### libtmux 0.17.2 -### Development +The update carries more upstream deprecation warning coverage. -- Poetry 1.2.2 -> 1.3.1 +## tmuxp 1.20.1 (2022-12-27) -## tmuxp 1.20.0 (2022-12-26) +tmuxp 1.20.1 is a small libtmux and tooling maintenance release. -### Breaking change +### Dependencies -- libtmux 0.16 -> 0.17 (#850) +#### libtmux 0.17.1 - This includes the API overhaul from - [libtmux#426](https://github.com/tmux-python/libtmux/pull/426). +The update carries deprecation-warning and documentation fixes. ### Development -- Tests: Stabilization fix for automatic rename test (#853) +#### Poetry 1.3.1 -## tmuxp 1.19.1 (2022-12-12) +Development tooling moved to Poetry 1.3.1. -### Fixes +## tmuxp 1.20.0 (2022-12-26) -- Update libtmux 0.16.0 -> 0.16.1 +tmuxp 1.20.0 adopts the libtmux 0.17 API overhaul. - This removes the underlying dependency on `packaging` +### Breaking changes -## tmuxp 1.19.0 (2022-12-10) +#### libtmux 0.17 API update (#850) -### What's new +The dependency bump includes the upstream API overhaul from [libtmux#426](https://github.com/tmux-python/libtmux/pull/426). Historical method names are intentionally not linked here because this entry describes a migration point. -- Environment variables for windows / panes (#845) +### Development - _Requires tmux 3.0_ +#### Automatic-rename test stabilization (#853) - Allow to configure window and pane specific environment variables +The automatic rename test received a reliability fix. - Having a setup like: +## tmuxp 1.19.1 (2022-12-12) - ```yaml - session_name: env-demo - environment: - DATABASE_URL: "sqlite3:///default.db" - windows: - - window_name: dev - environment: - DATABASE_URL: "sqlite3:///dev-1.db" - panes: - - pane - - environment: - DATABASE_URL: "sqlite3:///dev-2.db" - ``` +tmuxp 1.19.1 removes an indirect packaging dependency. - will result in a window with two panes. In the first pane `$DATABASE_URL` is - `sqlite3:///dev-1.db`, while in the second pane it is `sqlite3://dev-2.db`. - Any freshly created window gets `sqlite3:///default.db` as this is what was - defined for the session. +### Fixes - Credit: @zappolowski +#### libtmux 0.16.1 removes `packaging` -### Internal +The libtmux patch removes the underlying dependency on `packaging`. -- Update libtmux 0.15.9 -> 0.16.0 +## tmuxp 1.19.0 (2022-12-10) - - Support for environmental variables - - Remove reliance on `distutils.version.LooseVersion` for - `libtmux._compat.LegacyVersion` +tmuxp 1.19.0 adds scoped environment variables for sessions, windows, and panes. -- Fix distutil warnings by using libtmux 0.16.0's `LegacyVersion` (#727) +### What's new -## tmuxp 1.18.2 (2022-11-06) +#### Environment variables for windows and panes (#845) -**Maintenance release, no features or fixes** +Workspace configuration can now define environment variables at the session, window, and pane levels for tmux 3.0+. See {ref}`environmental-variables` for the documented environment surface and {ref}`configuration` for workspace structure. -### Development +### Dependencies -- Bump libtmux from 0.15.9 -> 0.15.10 (only test tweaks) -- Poetry no longer forces `in-project: true` +#### libtmux 0.16.0 and distutils warning fixes (#727) -## tmuxp 1.18.1 (2022-10-31) +The libtmux update supports the environment-variable work and removes reliance on `distutils.version.LooseVersion`. -### Bug fix +## tmuxp 1.18.2 (2022-11-06) -- cli: `tmuxp load`: Fix pass-through of config files (#843) +tmuxp 1.18.2 is a maintenance release with no user-facing features or fixes. -## tmuxp 1.18.0 (2022-10-30) +### Development -We now refer to configs as workspaces. Other than just, just maintenance. +#### libtmux and Poetry defaults -### Internal refactoring (#840) +libtmux moved to 0.15.10 for test tweaks, and Poetry no longer forces `in-project: true`. -#### Rename config to workspace +## tmuxp 1.18.1 (2022-10-31) -Reference to "config" are now "workspace" +tmuxp 1.18.1 fixes tmux config pass-through. -#### Organize files +### Fixes -- `cli/utils.py` functions moved to `workspace/finders.py` -- `config.py` split between: +#### `tmuxp load` passes through config files (#843) - - `workspace/finders.py` - - `workspace/freezer.py` - - `workspace/importers.py` - - `workspace/validation.py` +The load command correctly forwards tmux config file arguments again. -- `workspacebuilder.py` split into: +## tmuxp 1.18.0 (2022-10-30) - - `workspace/builder.py` - - `workspace/freezer.py` +tmuxp 1.18.0 renames the project vocabulary from "config" toward "workspace" and splits the old large modules into focused workspace modules. - `config.inline` moved to freezer +### Development -#### Tests +#### Workspace package split (#840) -- `tests/fixtures/{workspacebuilder,workspacefreezer}` -> `tests/fixtures/workspace/{builder,freezer}` -- `tests/test_import_{teamocil,tmuxinator}.py` -> `tests/workspace/test_import_{teamocil,tmuxinator}.py` +Finder, freezer, importer, validation, and builder behavior moved into the `tmuxp.workspace` package. Tests moved with those boundaries, making workspace loading, freezing, importing, and validation easier to maintain separately. ## tmuxp 1.17.3 (2022-10-30) -**Maintenance release, no features or fixes** +tmuxp 1.17.3 adds Python 3.11 metadata and CI coverage. ### Development -- Add python 3.11 to test grid, pyenv / asdf files (#842) - -### Packaging +#### Python 3.11 in the test grid (#842) -- Add python 3.11 to classifiers +CI, pyenv/asdf files, and package classifiers now include Python 3.11. ## tmuxp 1.17.2 (2022-10-29) -### Bug fix +tmuxp 1.17.2 fixes multi-workspace loading. + +### Fixes + +#### Multiple workspace loads (#838) -- CLI: Fix loading of multiple workspaces in `tmuxp load` (#838 fixes #837) +`tmuxp load` can load multiple workspace arguments correctly again, fixing #837. ## tmuxp 1.17.1 (2022-10-15) -### Minor completion improvements +tmuxp 1.17.1 improves shell completions after the argparse migration. -- Improved shtab completions for files with `tmuxp load [tab]` (#834) +### Fixes -### Internal +#### Better file completions for `tmuxp load` (#834) -- Remove unused completion code leftover from click (#834) +shtab completions now handle file completion for `tmuxp load` more usefully, and leftover Click completion code was removed. ## tmuxp 1.17.0 (2022-10-09) -### Breaking changes - -- **Completions have changed** (#830) - - Completions now use a different tool: [shtab]. See the [completions page] for more information. +tmuxp 1.17.0 replaces Click with argparse and switches completions to shtab. - If you were using earlier versions of tmuxp (earlier than 1.17.0), you may need to uninstall the old completions, first. +### Breaking changes - [completions page]: https://tmuxp.git-pull.com/cli/completion.html - [shtab]: https://docs.iterative.ai/shtab/ +#### Completion setup changed (#830) -- Deprecate `click` in favor of {mod}`argparse` (#830) +Completions are now generated with [shtab](https://docs.iterative.ai/shtab/). Users with older tmuxp completions may need to remove those before installing the new completions. See {ref}`cli-completions`. -### Packages +#### Click dependency removed (#830) -- Remove `click` dependency +The CLI moved from Click to argparse, so Click is no longer a runtime dependency. ## tmuxp 1.16.2 (2022-10-08) +tmuxp 1.16.2 fixes package metadata for YAML support. + ### Packaging -- Add `yaml` to required dependencies (#833, credit: @heindsight) +#### YAML runtime dependency declared (#833) + +`yaml` is now included in required dependencies. Thanks @heindsight. ## tmuxp 1.16.1 (2022-10-02) -### Bug fix +tmuxp 1.16.1 improves blank window-name behavior through libtmux. -- Update libtmux 0.15.7 -> 0.15.8 +### Fixes - Includes an improvement for blank window names, e.g. `window_name: ''` +#### Blank `window_name` support - See also: https://github.com/tmux-python/libtmux/pull/444 +The libtmux 0.15.8 update improves handling for configurations such as `window_name: ''`. ## tmuxp 1.16.0 (2022-10-01) -**Maintenance release, no features or fixes** +tmuxp 1.16.0 replaces the kaptan configuration dependency with tmuxp's own typed reader. -### Internal +### Development -- Add `ConfigReader`: Our clean, typed parser for raw strings and files (#828) +#### `ConfigReader` replaces kaptan (#828) - This is our shiny, new, 200-line, doctested and typed parser that replaces `kaptan`. +The new reader handles raw strings and files with a smaller typed, doctested implementation. ### Packaging -- Drop kaptan dependency (#828) +#### kaptan removed (#828) + +The kaptan dependency was dropped. ## tmuxp 1.15.3 (2022-10-01) -### Bug fixes +tmuxp 1.15.3 fixes `start_directory` behavior in the workspace builder. -- WorkspaceBuilder: Fix bug in `start_directory` (#829, credit: @heindsight) +### Fixes + +#### `start_directory` builder fix (#829) + +The workspace builder now handles the reported `start_directory` case correctly. Thanks @heindsight. ## tmuxp 1.15.2 (2022-09-24) -**Maintenance release, no features or fixes** +tmuxp 1.15.2 fixes packaging around test configuration. ### Packaging -- Move conftest.py to root, to avoid packaging in wheel (#826 vs #825) +#### Root `conftest.py` kept out of wheels (#826) -## tmuxp 1.15.1 (2022-09-23) +The test `conftest.py` moved to the repository root so it is not accidentally packaged in wheels. -**Maintenance release, no features or fixes** +## tmuxp 1.15.1 (2022-09-23) -### Infrastructure +tmuxp 1.15.1 is an infrastructure release for CI, packaging, and dependency cleanup. -- CI speedups (#819) +### Development - - Split out release to separate job so the PyPI Upload docker image isn't pulled on normal runs - - Clean up CodeQL +#### Faster CI and cleaner coverage configuration (#819, #824) -- Bump poetry 1.1.x -> 1.2.x -- Bump libtmux 0.15.1 -> 0.15.7 - - 0.15.7 (move `.coveragerc` -> `pyproject.toml`) - - 0.15.6 (#823, pytest fixes, packaging improvements) - - 0.15.3 (#821, pytest plugin improvements, root-level - conftest.py) -- Move `.coveragerc` -> `pyproject.toml` (#824) +CI no longer pulls the PyPI upload image for ordinary runs, CodeQL was cleaned up, Poetry moved to 1.2, coverage configuration moved into `pyproject.toml`, and libtmux advanced through its 0.15.x pytest-plugin improvements. ### Packaging -- Remove `MANIFEST.in` +#### Poetry-managed package contents - This is handled by poetry's `include` in pyproject.toml. - -- Remove `.tmuxp-before-script.sh` from `.tmuxp.yaml` +`MANIFEST.in` was removed in favor of Poetry metadata, and the project tmuxp config no longer references `.tmuxp-before-script.sh`. ## tmuxp 1.15.0 (2022-09-11) -**Maintenance release, no features or fixes** +tmuxp 1.15.0 moves the project into `src/` layout. ### Development -- Project moved to `src/` layout (#814) +#### Source layout migration (#814) -## tmuxp 1.14.0 (2022-09-11) +Package code now lives under `src/`, aligning tmuxp with the surrounding Python packaging convention. -**Maintenance release, no features or fixes** +## tmuxp 1.14.0 (2022-09-11) -There will be several of these releases as infrastructure and APIs are upgraded -to facilitate fixes for layout issues and general contributions. +tmuxp 1.14.0 starts a maintenance series for infrastructure and API upgrades. ### Development -- libtmux bumped to v0.15.1 - - This includes a major retooling underneath, including `src/` layout and - testing of `doctest` in documentation. +#### libtmux 0.15.1 and doctested docs -[v0.15.1]: https://github.com/tmux-python/libtmux/blob/v0.15.1/CHANGES#libtmux-0151-2022-09-11 +The libtmux bump brings a major upstream retooling, including `src/` layout and doctest coverage for documentation. ### Documentation -- Render changelog in [`linkify_issues`] (#812) -- Fix Table of contents rendering with sphinx autodoc with [`sphinx_toctree_autodoc_fix`] (#812) -- Test doctests in our docs via [`pytest_doctest_docutils`] (built on [`doctest_docutils`]) (#812) +#### Changelog, autodoc, and doctest helpers (#812) -[`linkify_issues`]: https://gp-libs.git-pull.com/linkify_issues/ -[`sphinx_toctree_autodoc_fix`]: https://gp-libs.git-pull.com/sphinx_toctree_autodoc_fix/ -[`pytest_doctest_docutils`]: https://gp-libs.git-pull.com/doctest/pytest.html -[`doctest_docutils`]: https://gp-libs.git-pull.com/doctest +The docs gained issue-linking, a Sphinx autodoc TOC rendering fix, and documentation doctests through the gp-libs doctest helpers. ## tmuxp 1.13.3 (2022-09-10) -- Revert v1.13.1's #793 change for now, the behavior behind launching workspace - layouts need to be understood clearly. Future releases will decisively solve - this issue (#811). +tmuxp 1.13.3 rolls back the 1.13.1 layout change while the loading behavior is studied further. + +### Fixes + +#### Layout change reverted (#811) + +The #793 layout fix was reverted so future releases can address pane layout behavior more deliberately. ## tmuxp 1.13.2 (2022-09-10) -### Bug fixes +tmuxp 1.13.2 adjusts layout sizing for users hitting pane spacing issues. -- Layout size has been bumped for those experiencing layout spacing issues - (#809, fixes #800) +### Fixes - If you encounter issues with pane spacing, consider passing an `option` like - so: +#### Larger default layout size (#809) - ```yaml - session_name: main-pane-height - start_directory: "~" - options: - default-size: 999x999 - windows: - - window_name: my window name - layout: main-horizontal - options: - main-pane-height: 30 - panes: - - shell_command: top - - shell_command: top - - shell_command: top - - shell_command: echo "hey" - - shell_command: echo "moo" - ``` +The layout size was bumped as a mitigation for spacing issues tracked in #800. ### Development -- Add [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) (#807) -- Add [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) (#808) +#### Additional lint plugins (#807, #808) + +flake8-bugbear and flake8-comprehensions were added to the linting stack. ## tmuxp 1.13.1 (2022-08-21) -### Bug fixes +tmuxp 1.13.1 attempted to fix several layout-related issues. -- Fix layout related issues from #667, #704, #737, via - #793. Thank you @nvasilas. +### Fixes + +#### Layout issue fixes (#793) + +Layout issues from #667, #704, and #737 were addressed with help from @nvasilas. ## tmuxp 1.13.0 (2022-08-14) -### Internal +tmuxp 1.13.0 adds early typing and doctest infrastructure. + +### Development + +#### mypy, doctest, and libtmux updates (#786, #790, #791) -- libtmux updated from v0.12 to v0.14 #790 -- Add [doctest](https://docs.python.org/3/library/doctest.html) w/ - [pytest + doctest](https://docs.pytest.org/en/7.1.x/how-to/doctest.html) via #791. -- Added basic [mypy](http://mypy-lang.org/) type annotations via #786 +The release adds basic mypy annotations, doctest support through pytest, and a libtmux update from 0.12 to 0.14. ## tmuxp 1.12.1 (2022-08-04) -### Bug fix +tmuxp 1.12.1 fixes first-pane `start_directory` handling. + +### Fixes + +#### First pane `start_directory` fix (#787) -- #787 Fix #724 Fix `start_directory` issue with first pane, - credit: nvasilas. +The first pane now respects `start_directory` correctly, fixing #724. Thanks @nvasilas. ## tmuxp 1.12.0 (2022-07-31) -_Mostly internal cleanups, no features_ +tmuxp 1.12.0 is mostly test cleanup. + +### Development -### Tests +#### Test reliability work (#774, #777, #781, #783) -- #774 Fix #620 tests not finishing -- #777 Fix #778 to move the old, broken `retry()` to the new - `retry_until()`, credit: @categulario. -- #783 Fix #620 Symlink edge for for pane order tests, credit: @categulario. -- #781 Testing with ZSH will mock `~/.zshrc` startup file for cleaner - pane outputs. +The suite was adjusted so tests finish reliably, old retry helpers moved to `retry_until()`, symlink edge cases for pane order were covered, and zsh startup files were mocked for cleaner pane output. ## tmuxp 1.11.1 (2022-05-02) -### Bug fix +tmuxp 1.11.1 tightens the Click compatibility floor. + +### Fixes -- #775: Assure click 8+ +#### Click 8+ required (#775) - tmuxp 1.10 supports click 7.x. +The 1.11 line now requires Click 8 or newer. tmuxp 1.10 remains the Click 7-compatible line. ## tmuxp 1.11.0 (2022-04-24) -### Compatibility +tmuxp 1.11.0 updates Click compatibility, shell completion behavior, and project maintenance tooling. -- #773: Allow click 8.1.x -- #770: Fix shell completion for `tmuxp load` {kbd}`tab` and `tmuxp freeze` - {kbd}`tab` -- Note: Requires click 8+ (#770) +### Fixes -### Maintenance +#### Click 8.1 and shell completion fixes (#770, #773) -- #762: CLI: Break up into modules in _cli.py_ -> _cli/{command}_ -- #761: Refactor _tests/_ constants and fixtures -- Show libtmux version with `-V` / `--version` +The CLI allows Click 8.1.x and fixes completions for `tmuxp load` and `tmuxp freeze`. ### Development -- Remove tox and tox-poetry-installer +#### CLI module split and publishing cleanup (#761, #762) - This created issues with running poetry while inside the virtualenv. - -- Publish packages to PyPI via github action by setting git tag. +The large CLI module was split into per-command modules, tests/constants were refactored, tox was removed, package publishing moved to GitHub Actions tags, and `-V`/`--version` shows the libtmux version. ## tmuxp 1.10.1 (2022-04-17) -### Compatibility +tmuxp 1.10.1 backports Click 8.1 compatibility. + +### Fixes + +#### Click 8.1 allowed (#773) -- #773 (backport): Allow click 8.1.x +The compatibility fix from the 1.11 line was backported to the final Python 3.7/3.8 branch. ## tmuxp 1.10.0 (2022-03-19) -### Compatibility +tmuxp 1.10.0 is the final Python 3.7 and 3.8 release and a major command-execution ergonomics release. + +### Breaking changes -- Final python 3.7 and 3.8 release +#### Final Python 3.7 and 3.8 release - Bug fixes and security updates will go to - [`v1.10.x`](https://github.com/tmux-python/tmuxp/tree/v1.10.x) +Bug fixes and security updates for those Python versions moved to the [`v1.10.x`](https://github.com/tmux-python/tmuxp/tree/v1.10.x) branch. ### What's new -- #747: Skip execution via `enter: false` - - See {ref}`enter`. - - :::{note} +#### Command execution controls: `enter`, `sleep_before`, and `sleep_after` (#747, #750) - _Experimental setting_: behavior and api is subject to change until stable. +Pane commands can now be sent without pressing Enter via `enter: false`, and execution can pause before or after individual commands. See {ref}`enter` and {ref}`sleep` for examples. - ::: +#### Non-interactive freeze improvements (#701) - ```yaml - session_name: Should not execute - windows: - - panes: - - shell_command: - - echo "this sends" - - cmd: echo "___$((1 + 3))___" - enter: false - # pane-wide skip - - shell_command: - - echo "___$((1 + 3))___" - enter: false - ``` +{ref}`cli-freeze` gained `--quiet`, `--yes`, `--config-format`, and `--save-to`, making one-command save flows and tmux key bindings practical. -- #750: Pause execution via `sleep_before: [int]` and `sleep_after: [int]` +#### Pane `shell` command support (#672) - See {ref}`sleep`. +Pane configuration can specify a `shell` for the initial command, matching tmux's `split-window [shell-command]` behavior. Thanks @jerri. - :::{note} +### Fixes - _Experimental setting_: behavior and api is subject to change until stable. +#### `.yml` conversion support (#725) - ::: +{ref}`cli-convert` now loads `.yml` files correctly. Thanks @kalixi. - ```yaml - session_name: Pause / skip command execution (command-level) - windows: - - panes: - - shell_command: - # Executes immediately - - echo "___$((11 + 1))___" - # Delays before sending 2 seconds - - cmd: echo "___$((1 + 3))___" - sleep_before: 2 - # Executes immediately - - cmd: echo "___$((1 + 3))___" - # Pauses 2 seconds after - - cmd: echo "Stuff rendering here!" - sleep_after: 2 - # Executes after earlier commands (after 2 sec) - - cmd: echo "2 seconds later" - ``` +### Development -- #701: `tmuxp freeze` now accepts `--quiet` and `--yes` along with the - `--config-format` and filename (`--save-to`). This means you can do it all in - one command: +#### Command parsing refactor (#752) - `tmuxp freeze -yqo .tmuxp.yaml` +Internally, command entries moved from bare strings to dictionaries so per-command options can be represented without changing normal user configuration. - Or bind it to `.tmux.conf` itself: `bind -T root C-s run-shell "tmuxp freeze -yqo .tmuxp.yaml"` +#### Tooling and docs cleanup (#738, #745) - Credit: [@davidatbu](https://github.com/davidatbu) +The codebase was formatted with Black and isort, run through pyupgrade, and the docs moved to Furo with expanded command-execution examples. -- #672: Panes now accept `shell` for their initial command. +## tmuxp 1.9.4 (2022-01-10) - Equivalent to `tmux split-windows`'s `[shell-command]` +tmuxp 1.9.4 moves packaging to Poetry and adds the edit command. - ```yaml - session_name: Pane shell example - windows: - - window_name: first - window_shell: /usr/bin/python2 - layout: even-vertical - suppress_history: false - options: - remain-on-exit: true - panes: - - shell: /usr/bin/python3 - shell_command: - - print('This is python 3') - - shell: /usr/bin/vim -u none - shell_command: - - iAll panes have the `remain-on-exit` setting on. - - When you exit out of the shell or application, the panes will remain. - - Use tmux command `:kill-pane` to remove the pane. - - Use tmux command `:respawn-pane` to restart the shell in the pane. - - Use and then `:q!` to get out of this vim window. :-) - - shell_command: - - print('Hello World 2') - - shell: /usr/bin/top - ``` +### What's new - Credit: @jerri +#### `tmuxp edit` (#707) -### Improvements +The new {ref}`cli-edit` command opens workspace files from a project or config directory for editing. -- Improve `tmuxp freeze` UX flow, credit @joseph-flinn (#657, in re: #627) -- `tmuxp freeze` will now detect the attached session if no session name - is specified. Credit: @will-ockmore. (#660) +### Breaking changes -### Bugs +#### Python 3.6 support removed (#726) -- Fix loading of `.yml` files with `tmuxp convert`, thank you @kalixi! (#725) +Python 3.6 support ends on this release line. -### Internal API +### Packaging -- #752: Command structure (internal API) +#### Poetry build and publish (#729) - To pave the way for per-command options such as `enter: false` (#53), commands are now a different format: +Packages are built with `poetry build` and published with `poetry publish`; libtmux is pinned to a matching Poetry-built release. - Before, [`str`](str): +### Development - ```python - "echo hello" - ``` +#### Pre-commit trial and formatter updates (#726) - After, {py:class}`dict`: +The project began trying pre-commit in pull requests, updated Poetry, and moved Black to 21.12b0. - ```python - { - "cmd": "echo hello" - } - ``` +## tmuxp 1.9.3 (2021-10-30) - This is purely internal. Normal usage should be the same since the - configuration emits the equivalent result. +tmuxp 1.9.3 is a small CLI and tooling maintenance release. -- #752: Configuration parsing refactorings +### Fixes -### Development +#### Help flag and typo fixes (#696, #700) -- Run through black + isort with string normalization (#738). This way we can - use black without any configuration. (One-time, big diff) -- Run codebase through pyupgrade (#745) -- Add `codeql-analysis.yml` to try it out +The CLI gained `-h`/`--help`, and documentation typos were fixed. -### Documentation +### Development -- Move to `furo` sphinx theme -- Reorganize documentation into sections -- Added examples for `enter: false` and `sleep: [second]` +#### Poetry 1.1 update (#689) -## tmuxp 1.9.4 (2022-01-10) +CI and lock files moved to Poetry 1.1.7. -### Packaging +## tmuxp 1.9.2 (2021-06-17) -- `poetry build` used to package in place of `python setup.py build` (#729) +tmuxp 1.9.2 allows Click 8.0.x and moves tmux manuals out of the repo. - Package maintainers: If you run into any issues check in at #625 and file an issue. +### Fixes - Additionally, `libtmux` has been pinned to a similar release at - [0.10.3](https://pypi.org/project/libtmux/0.10.3/) which has used the new - build process. +#### Click 8.0 compatibility (#686) -- `poetry publish` instead of `twine upload dist/*` (#729) +The dependency range now allows Click 8.0.x. - Similar to the above, reach out to the #625 issue if you bump into problems. +### Documentation -### What's new +#### tmux manuals split out -- `tmuxp edit` for configuration changes (#707, @GlebPoljakov) +The old `manual/` tree moved to [tmux-python/tmux-manuals](https://github.com/tmux-python/tmux-manuals). - Inside of configuration directory: `tmuxp edit yourconfig` +## tmuxp 1.9.1 (2021-06-16) - Inside a project: `tmuxp edit .` +tmuxp 1.9.1 picks up a libtmux window-selection fix. -### Removed support +### Dependencies -- Python 3.6 support has been removed (#726) +#### libtmux 0.10.1+ -### Development +The libtmux bump includes the `Window.select_window()` fix from [libtmux#271](https://github.com/tmux-python/libtmux/pull/271). -- We are trying `.pre-commit-config.yaml` in pull requests to automate - black, isort and flake8 for those who forget (#726) -- Poetry update 1.1.7 -> 1.1.12 and use new installer URL (#726) -- Black updated 21.9b0 -> 21.12b0 (#726) +## tmuxp 1.9.0 (2021-06-16) -## tmuxp 1.9.3 (2021-10-30) +tmuxp 1.9.0 moves to libtmux 0.10.x. -- #700: Add `-h` / `--help` option, thanks @GHPS -- #689: Update poetry to 1.1 - - CI: Use poetry 1.1.7 and `install-poetry.py` installer - - Relock poetry.lock at 1.1 (w/ 1.1.7's fix) -- #696: Typo fix, thanks @inkch +### Dependencies -## tmuxp 1.9.2 (2021-06-17) +#### libtmux 0.10.x -- #686: Allow click 8.0.x -- Remove `manual/`, move to https://github.com/tmux-python/tmux-manuals +tmuxp tracks the current libtmux 0.10 release line. -## tmuxp 1.9.1 (2021-06-16) +## tmuxp 1.8.2 (2021-06-15) -- libtmux: Update to 0.10.1+ to include `Window.select_window()` fix +tmuxp 1.8.2 republishes the package with missing test files restored. - https://github.com/tmux-python/libtmux/pull/271 +### Packaging -## tmuxp 1.9.0 (2021-06-16) +#### Source distribution test files (#474) -- libtmux: Update to 0.10.x +The release was rebuilt with `python setup.py sdist bdist_wheel` to include the missing test files. -## tmuxp 1.8.2 (2021-06-15) +## tmuxp 1.8.1 (2021-06-14) -- #474 Re-release with `python setup.py sdist bdist_wheel` to - fix missing test files +tmuxp 1.8.1 is a Homebrew packaging helper release. -## tmuxp 1.8.1 (2021-06-14) +### Packaging + +#### Version bump for Homebrew (#681) -- #681 Bump version to make homebrew release easier +The version was bumped to make the Homebrew release flow easier. ## tmuxp 1.8.0.post0 (2021-06-14) -- #681 tmuxp is now available on homebrew! Thank you @jvcarli! +tmuxp 1.8.0.post0 announces the Homebrew package. + +### Packaging + +#### Homebrew availability (#681) + +tmuxp became available on Homebrew. Thanks @jvcarli. ## tmuxp 1.8.0 (2021-06-14) -- #662 CI: Only update docs when changed -- #666 CI: Move test plugin packages from pyproject.toml to - pytest fixtures. Fixes #658 -- #661 +tmuxp 1.8.0 drops Python 2.7, raises the Python floor, and cleans up plugin-test packaging. + +### Breaking changes + +#### Python 3.6+ is now required (#661) + +Python 2.7 support was removed, syntax was modernized, and Black moved to 21.6b0. - - Bump minimum version 3.5 -> 3.6 - - Drop python 2.7 support - - Modernize syntax (remove `__future__` and modesets) - - Update black to 21.6b0 +### Development + +#### Plugin test package handling (#666) + +Test plugin packages moved from `pyproject.toml` metadata into pytest fixtures, fixing #658. + +#### Docs deploy only when changed (#662) + +CI avoids unnecessary docs updates when docs are untouched. ## tmuxp 1.7.2 (2021-02-03) -- #666 CI: Move test plugin packages from pyproject.toml to - pytest fixtures. Fixes #658 +tmuxp 1.7.2 backports plugin test package handling. + +### Development + +#### Plugin test packages through pytest fixtures (#666) + +The 1.8 test package fix was also applied on this line. ## tmuxp 1.7.1 (2021-02-03) -- #665 Support for passing tmux config file (`-f`), thanks - @jfindlay! Fixes #654 +tmuxp 1.7.1 adds support for a tmux config file flag. + +### What's new + +#### tmux config file pass-through (#665) + +tmuxp can pass `-f` to tmux for a specific configuration file. Thanks @jfindlay. ## tmuxp 1.6.5 (2021-02-03) -- #665 Support for passing tmux config file (`-f`), thanks @jfindlay! Fixes - #654 +tmuxp 1.6.5 backports tmux config file support to the 1.6 line. -## tmuxp 1.7.0 (2021-01-09) +### What's new + +#### tmux config file pass-through (#665) -This will be the last Python 2.7 release of tmuxp. Bug fixes for python -2.7 will live in the [1.7.x branch]. +The `-f` config-file support from 1.7.1 was applied to the 1.6 branch. -- #530 New feature: Plugin system +## tmuxp 1.7.0 (2021-01-09) + +tmuxp 1.7.0 is the last Python 2.7 release and the first stable release with plugins, append-loading, file logging, and debug information. - - Add plugin system for user customization of tmuxp - - Add tests for the plugin system - - Update existing tests for the plugin system - - Add the plugin interface to the tmuxp package - - Add in depth documentation for the plugin system +### Breaking changes - Thank you @joseph-flinn! +#### Last Python 2.7 release -- #656 New feature: Ability to append windows to a session +Bug fixes for Python 2.7 moved to the [`1.7.x`](https://github.com/tmux-python/tmuxp/tree/v1.7.x) branch. - `tmuxp load -a configfile` will append a configuration to your current - tmux session. +### What's new - Thank you @will-ockmore! +#### Plugin system (#530) -- #647 Improvement: Logging to file: +The release adds the plugin system, tests, public plugin interface, and documentation. See {ref}`plugins`. - `tmuxp load --log-level outputfile.log` +#### Append windows to the current session (#656) -- #643 New command: Debug information +`tmuxp load -a configfile` can append a workspace to the current tmux session. Thanks @will-ockmore. - Port `tmuxp debug-info` from via v1.6.2 +#### Load logging and debug info (#643, #647) -[1.7.x branch]: https://github.com/tmux-python/tmuxp/tree/v1.7.x +`tmuxp load` can write output to a log file, and {ref}`tmuxp-debug-info` is available for collecting issue-reporting context. Thanks @joseph-flinn. ## tmuxp 1.7.0a4 (2021-01-06) -- Port click package fix from 1.6.4 +tmuxp 1.7.0a4 carries a Click packaging fix onto the alpha line. + +### Fixes + +#### Click package fix + +The 1.6.4 Click packaging fix was ported. ## tmuxp 1.7.0a3 (2020-11-22) -- Port `tmuxp load --log-level outputfile.log` from - 1.6.3 +tmuxp 1.7.0a3 ports load logging to the alpha line. + +### What's new + +#### Load output log file + +The `tmuxp load --log-file` feature from 1.6.3 was ported. ## tmuxp 1.7.0a2 (2020-11-08) -- Port `tmuxp debug-info` from #643 from via v1.6.2 +tmuxp 1.7.0a2 ports debug information support to the alpha line. + +### What's new + +#### `tmuxp debug-info` + +The debug-info command from 1.6.2 was ported. ## tmuxp 1.7.0a1 (2020-11-07) -- #530 Plugin system +tmuxp 1.7.0a1 previews the plugin system. - - Add plugin system for user customization of tmuxp - - Add tests for the plugin system - - Update existing tests for the plugin system - - Add the plugin interface to the tmuxp package - - Add in depth documentation for the plugin system +### What's new + +#### Plugin system (#530) - Thank you @joseph-flinn! +The alpha adds plugin hooks, tests, interface code, and documentation. Thanks @joseph-flinn. ## tmuxp 1.6.4 (2021-01-06) -- #651 Fix packaging issue with click, thanks @dougharris! Fixes - #649 +tmuxp 1.6.4 fixes a Click packaging issue. + +### Fixes + +#### Click packaging fix (#651) + +The release fixes the Click package issue tracked in #649. Thanks @dougharris. ## tmuxp 1.6.3 (2020-11-22) -- #647 Adding option to dump `load` output to log file, thank you - @joseph-flinn! +tmuxp 1.6.3 adds log-file output to `tmuxp load`. - `tmuxp load file.yaml --log-file yourfile.txt` +### What's new - Adjust log levels: +#### Load output to a file (#647) - `tmuxp --log-level DEBUG load file.yaml --log-file yourfile.txt` +`tmuxp load file.yaml --log-file yourfile.txt` writes load output to a file, and the root `--log-level` flag controls verbosity. ## tmuxp 1.6.2 (2020-11-08) -- #643 New command `tmuxp debug-info` for creating github - issues, fixes #352. Thank you @joseph-flinn! +tmuxp 1.6.2 adds a debug-info command for issue reporting. + +### What's new + +#### `tmuxp debug-info` (#643) + +The new command collects system information for GitHub issues, fixing #352. Thanks @joseph-flinn. (v1-6-1)= ## tmuxp 1.6.1 (2020-11-07) -- #641 Improvements to `shell` - - Thanks [django-extensions] (licensed MIT) for the shell detection abstraction. +tmuxp 1.6.1 improves the interactive Python shell command. - - Deprecate `shell_plus` - - `tmuxp shell` now detects the best shell available by default - - Python 3.7+ with `PYTHONBREAKPOINT` set in env will drop into `pdb` by - default - - Drop into `code.interact` by default instead of `pdb` if no third - party shells found - - New options, override: +### What's new - - `--pdb`: Use plain old `breakpoint()` (python 3.7+) or - `pdb.set_trace` - - `--code`: Drop into `code.interact`, accepts `--use-pythonrc` - - `--bpython`: Drop into [bpython] - - `--ipython`: Drop into [ipython] - - `--ptpython`: Drop into [ptpython], accepts `--use-vi-mode` - - `--ptipython`: Drop into [ipython], accepts - `--use-vi-mode` +#### Smarter `tmuxp shell` selection (#641) -[django-extensions]: https://github.com/django-extensions/django-extensions +`tmuxp shell` deprecates `shell_plus`, chooses the best available shell by default, honors `PYTHONBREAKPOINT` on Python 3.7+, and exposes explicit `--pdb`, `--code`, `--bpython`, `--ipython`, `--ptpython`, and `--ptipython` choices. ## tmuxp 1.6.0 (2020-11-06) -- #636 + #638 New command: `tmuxp shell` +tmuxp 1.6.0 introduces {ref}`tmuxp-shell`, a Python console preloaded with the current tmux session, window, and pane. - Automatically preloads session, window, and pane via [libtmux] - {ref}`API objects ` and makes them available in a python - console. +### What's new - ```{image} _static/tmuxp-shell.gif - :width: 100% +#### Python shell with tmux context (#636, #638) - ``` +`tmuxp shell` opens an interactive Python environment with libtmux objects already available. It can also execute expressions directly with `-c`, making quick session/window/pane inspection possible from scripts. - As of {ref}`1.6.1 (above) `, `tmuxp shell` will find the most - feature-rich shell available. If you have [ipython], or - [bpython] available, it will be selected automatically. Pass `--pdb` - to use standard library pdb, or `--code` to use `code.interact`. +## tmuxp 1.5.8 (2020-10-31) - In python 3.7+, supports `PYTHONBREAKPOINT`: +tmuxp 1.5.8 fixes session `start_directory` propagation. - ```{code-block} sh +### Fixes - $ pip install --user ipdb - $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell +#### `start_directory` passed to new sessions (#639) - ``` +New tmux sessions receive the configured `start_directory`, fixing #631. Thanks @joseph-flinn. - Inside a [uv](https://docs.astral.sh/uv/getting-started/features/#python-versions) - project you can add `ipdb` as a development dependency instead: +## tmuxp 1.5.7 (2020-10-31) - ```{code-block} sh +tmuxp 1.5.7 fixes project path loading for directories with periods. - $ uv add --dev ipdb +### Fixes - ``` +#### Directory paths with periods load correctly (#637) - For a pipx-style ad hoc execution, reach for - [uvx](https://docs.astral.sh/uv/guides/tools/): +`tmuxp load ~/work/your.project` now works without requiring the explicit `.tmuxp.yaml` path, fixing #212 and #201. - ```{code-block} sh +## tmuxp 1.5.6 (2020-10-12) - $ uvx --from ipdb ipdb3 --help +tmuxp 1.5.6 is a mixed freeze, prompt, session-name, docs, CI, and packaging update. - ``` +### What's new - You can execute python directly via `-c`: +#### Freeze overwrite and session-name options (#618, #626) - ```{code-block} sh +`tmuxp freeze` can accept `--overwrite`, and the CLI gained a new session-name option with tests and docs. - $ tmuxp shell -c 'print(session.name); print(window.name)' - my_server - my_window +#### Auto-confirm prompt option (#589) - $ tmuxp shell my_server -c 'print(session.name); print(window.name)' - my_server - my_window +The confirm command can auto-confirm prompts. Thanks @aRkedos. - $ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' - my_server - my_window +### Development - $ tmuxp shell my_server my_window -c 'print(window.name.upper())' - MY_WINDOW +#### Docs, CI, and packaging modernization (#619, #623, #629) - ``` +Docs moved to the self-hosted site, tests moved to GitHub Actions, Makefiles were modernized, Poetry packaging experiments began, isort moved to 5.x, and Black moved to 20.08b1. -[bpython]: https://bpython-interpreter.org/ -[ipython]: https://ipython.org/ -[ptpython]: https://github.com/prompt-toolkit/ptpython +## tmuxp 1.5.5 (2020-07-26) -## tmuxp 1.5.8 (2020-10-31) +tmuxp 1.5.5 adds the `ls` command and includes a broad maintenance pass. -- #639 Passes start_directory through to new tmux session - Fixes #631, thank you @joseph-flinn! +### What's new -## tmuxp 1.5.7 (2020-10-31) +#### `tmuxp ls` (#616) -- #637 Support for loading directories with periods in it +The new `tmuxp ls` command lists workspaces available from the config directory so they can be loaded by name. Thanks @pythops. - `tmuxp load ~/work/your.project` will now work +### Fixes - Earlier workaround was to do `tmuxp load ~/work/your.project/.tmuxp.yaml` +#### Documentation typos and CI cleanup (#480, #506, #519, #578) - Fixes #212 and #201 +The release includes community typo fixes, Travis cleanup, cached tmux builds, tmux 2.9/3.0a testing, and the move from Pipenv to Poetry. -## tmuxp 1.5.6 (2020-10-12) +## tmuxp 1.5.4 (2019-11-06) -- #618: allow passing `--overwrite` to `tmuxp freeze`. Thank you - @betoSolares! -- #589 added option for the the confirm command to auto-confirm the prompt. - Thank you @aRkedos! -- #626 Add new session name option to cli. Thank you @joseph-flinn! -- #626 Add test for new session name option -- #626 Update docs for new session name option -- #623 Move docs from RTD to self-serve site -- #623 Modernize Makefiles -- #623 New development docs -- #623 Move doc -> docs -- #623 Move tests to GitHub Actions -- #623 Update pyproject.toml to experiment with poetry packaging -- #619 isort 5 -- #629 Update black from 19.10b0 to 20.08b1 +tmuxp 1.5.4 fixes window focus and Python 3.7 CI. -## tmuxp 1.5.5 (2020-07-26) +### Fixes -- #616 (via: #599) New command: `tmuxp ls` +#### Window focus and Travis CI (#500) - List commands available via config directory. If the config is printed, - it's loadable via `tmuxp load configfilename` without needing to type the - full filepath. Thank you @pythops! +Window focus handling was corrected, and Travis builds were fixed for Python 3.7. -- #480 Fix typo, thanks @jstoja -- #578 Fix typo, thanks @mauroporras -- #519 Fix typo, thanks @timgates42 -- #506 Fix Makefile typo, thanks @wolfgangpfnuer -- #619 Update isort to 5.x -- Travis: Only run on master and PRs one time -- Travis: Add caching for tmux builds -- Travis: Test 2.9 and 3.0a -- #613: Move from Pipenv to Poetry +## tmuxp 1.5.3 (2019-06-06) -## tmuxp 1.5.4 (2019-11-06) +tmuxp 1.5.3 fixes the source distribution contents. -- #500: Fix window focus -- Fix travis CI builds for python 3.7 +### Packaging -## tmuxp 1.5.3 (2019-06-06) +#### Examples included in sdist (#377) -- #377: Include examples in source distribution package +Example files are included in the source distribution. ## tmuxp 1.5.2 (2019-06-02) -- Loosen libtmux version constraint to >0.8 and <0.9 (libtmux 0.8.2 - released today) -- #484 CHANGES converted to plain reStructuredText -- #491 `tmuxp freeze` will now infer active session with freezing -- #490 Fix XDG's `$XDG_CONFIG_HOME` behavior -- #483, #482, #480 Doc fixes -- #487 Simplifying handling of configs with no panes (Fixes - #470) +tmuxp 1.5.2 fixes packaging constraints, XDG config handling, and freeze defaults. -## tmuxp 1.5.1 (2019-02-18) +### Fixes -- Add tests/\*.sh scripts to MANIFEST.in to include them in Pypi package. -- Include twine to dev packages on requirements and Pipfile files. +#### Freeze and config-path fixes (#483, #487, #490, #491) -## tmuxp 1.5.0 (2018-10-02) +`tmuxp freeze` can infer the active session, XDG `$XDG_CONFIG_HOME` handling was fixed, empty-pane configs were simplified, docs were corrected, and libtmux constraints were loosened for the 0.8.2 release. -- Support Click 7.0 -- Remove unused `__future__` imports -- #471 Update libtmux 0.8.0 -> 0.8.1 -- #404 from @anddam, support XDG base directory -- Sort imports -- Add configuration and make command for isort. -- Add sphinxcontrib-napoleon. -- Assure _requirements/dev.txt_ dependencies are in _Pipfile_ -- Update sphinx, releases to latest version -- Sync _requirements/_.txt* dependencies with *Pipfile\*. -- Update docstring style to use numpy-style documentation. - This enhances readability and plays nicely with sphinx documentation. -- Documentation overhaul. - - - Areas like {meth}`tmuxp.cli.load_workspace` are now documented verbosely. - This is so contributors helping on the project can more quickly gain - situational awareness in this tricky area of code. +### Documentation -## tmuxp 1.4.2 (2018-09-30) +#### CHANGES converted to plain reStructuredText (#484) -- #431 Include tests in source distribution +The changelog format moved to plain reStructuredText at that point in the project history. -## tmuxp 1.4.1 (2018-09-26) +## tmuxp 1.5.1 (2019-02-18) -- Loosen click restraint to <7 +tmuxp 1.5.1 fixes package contents and development dependencies. -## tmuxp 1.4.0 (2018-03-11) +### Packaging -- Bump libtmux to 0.8.0 -- #264 Update license from BSD to MIT -- #348 Continuous integration updates and fixes for Travis CI +#### Test scripts included in source distributions - - Update builds to use trusty - - Remove older python 3 versions (before 3.6) - - Update pypy versions +Shell test scripts are included in package manifests, and Twine was added to development dependency files. -- #349 flake8 via continuous integration -- Improve reliability of time-sensitive tests by - using `while True` with a timeout. -- Update sphinx to 1.7.1 -- Update alagitpull (sphinx theme) to 0.0.19. - External websites open in new window. -- Update pytest to 3.4.1 +## tmuxp 1.5.0 (2018-10-02) -## tmuxp 1.3.5 (2017-11-10) +tmuxp 1.5.0 is a broad maintenance and documentation release around Click 7, XDG support, import sorting, and API docs. -- #312 Support for tmux 2.6 layout setting (via hooks) in the - following scenarios: +### What's new - - loading outside tmux - - loading inside tmux, via switch-client - - loading inside tmux, with session in background (with -d), and - reattaching/switching to after - - loading session outside tmux in background with -d, and - reattaching/switching after +#### XDG base directory support (#404) -- #308 Fix bug where layouts don't correctly set on tmux 2.6 -- Upgrade libtmux to 0.7.7 +tmuxp gained support for the XDG base directory convention. -## tmuxp 1.3.4 (2017-10-12) +#### Click 7 compatibility -- `before_script` now respects `start_directory` - in the session root. This makes it easier to run things like `pipenv install` as a `before_script`. +The CLI supports Click 7.0. -## tmuxp 1.3.3 (2017-10-07) +### Development -- Update libtmux to 0.7.5 for tmux 2.6 hotfix +#### Documentation and style modernization (#471) -## tmuxp 1.3.2 (2017-08-20) +The release updates libtmux, removes stale `__future__` imports, adds isort configuration, adopts NumPy-style docstrings, updates Sphinx tooling, and expands documentation for contributors working near the load workspace path. -- #184 - update libtmux to fix environmental variables in the - session scope -- Update libtmux to 0.7.4 -- Updates to pytest and pytest-rerunfailures +## tmuxp 1.4.2 (2018-09-30) -## tmuxp 1.3.1 (2017-05-29) +tmuxp 1.4.2 fixes source distribution contents. -- #252 Fix bug where loading a session with a name matching a subset - of current session causes undesired behavior. -- Update libtmux to 0.7.3 -- Switch theme to alagitpull (alabaster subtheme) -- Remove unneeded doc dependency packages +### Packaging -## tmuxp 1.3.0 (2017-04-27) +#### Tests included in source distributions (#431) -- #239 Improve support for formatted options when freezing and - using configs with them. -- #236 Support for symlinked directories, thanks @rafi. -- #235 Support for `options_after`, for setting options like - `synchronize-panes`. Thanks @sebastianst. -- #248 Drop python 2.6 support -- #248 Upgrade libtmux to 0.7.1 -- Upgrade colorama from 0.3.7 to 0.3.9 +Test files are included in the source distribution. -## tmuxp 1.2.8 (2017-04-02) +## tmuxp 1.4.1 (2018-09-26) -- #229 More helpful error message on systems missing - tmux. -- Update libtmux from 0.6.4 to 0.6.5. +tmuxp 1.4.1 loosens the Click dependency constraint. -## tmuxp 1.2.7 (2017-03-25) +### Dependencies -- Support for OpenBSD. +#### Click constraint loosened -## tmuxp 1.2.6 (2017-02-24) +The Click version constraint was relaxed to `<7`. -- #218 Fix pane ordering by running `select-layout` before - splits. +## tmuxp 1.4.0 (2018-03-11) -## tmuxp 1.2.5 (2017-02-08) +tmuxp 1.4.0 updates licensing, CI, docs, and dependency versions. -- #207 add custom tmuxp config directory via - `TMUXP_CONFIGDIR` variable. -- #199 support for running tmuxp on tmux `master`. -- update libtmux from 0.6.2 to 0.6.3. +### Breaking changes -## tmuxp 1.2.4 (2017-01-13) +#### License changed to MIT (#264) -- #198 bump click from 6.6 to 6.7 -- #195 pin packages for colorama and doc requirements +The project license moved from BSD to MIT. -## tmuxp 1.2.3 (2016-12-21) +### Development -- bump libtmux 0.6.0 to 0.6.1 -- #193 improve suppress history test, courtesy of @abeyer. -- #191 documentation typo from @modille -- #186 documentation typo from @joelwallis +#### CI and dependency refresh (#348, #349) -## tmuxp 1.2.2 (2016-09-16) +Travis moved to Trusty, older Python 3 versions were removed from CI, PyPy versions were updated, flake8 entered CI, time-sensitive tests became more reliable, and Sphinx, theme, and pytest versions were bumped. -- #181 Support tmux 2.3 +### Dependencies -## tmuxp 1.2.1 (2016-09-16) +#### libtmux 0.8.0 -- #132 Handle cases with invalid session names -- update libtmux from 0.5.0 to 0.6.0 +tmuxp tracks libtmux 0.8.0. -## tmuxp 1.2.0 (2016-06-16) +## tmuxp 1.3.5 (2017-11-10) -- #65 Ability to specify `options` and `global_options` via - configuration. Also you can specify environment variables via that. +tmuxp 1.3.5 improves tmux 2.6 layout handling. - Include tests and add example. +### Fixes -## tmuxp 1.1.1 (2016-06-02) +#### tmux 2.6 layout support (#308, #312) -- #167 fix attaching multiple sessions -- #165 fix typo in error output, thanks @fpietka -- #166 add new docs on zsh/bash completion -- Add back `tmuxp -V` for version info +Layouts now set correctly across outside-tmux loads, switch-client loads, detached sessions, and background loads followed by reattach or switch. libtmux moved to 0.7.7. -## tmuxp 1.1.0 (2016-06-01) +## tmuxp 1.3.4 (2017-10-12) -- #160 load tmuxp configs by name -- #134 Use `click` for command-line completion, Rewrite command - line functionality for importing, config finding, conversion and prompts. -- Remove `-l` from `tmuxp import tmuxinator|teamocil` -- #158 argparse bug overcome by switch to click +tmuxp 1.3.4 fixes `before_script` working directories. -## tmuxp 1.0.2 (2016-05-25) +### Fixes -- #163 fix issue re-attaching sessions that are already loaded -- #159 improved support for tmuxinator imports, from @fpietka. -- #161 readme link fixes from @Omeryl. +#### `before_script` respects session `start_directory` -## tmuxp 1.0.1 (2016-05-25) +Pre-load scripts now run relative to the session root, which makes project setup commands such as `pipenv install` work as expected. -- switch to readthedocs.io for docs -- #157 bump libtmux to 0.4.1 +## tmuxp 1.3.3 (2017-10-07) -## tmuxp 1.0.0-rc1 (2016-05-25) +tmuxp 1.3.3 is a tmux 2.6 hotfix release. -- version jump 0.11.1 to 1.0 -- tests moved to py.test framework -- [libtmux] core split into its own project -- #145 Add new-window command functionality, @ikirudennis -- #146 Optionally disable shell history suppression, @kmactavish -- #147 Patching unittest timing for shell history suppression -- move doc building, tests and watcher to Makefile -- update .tmuxp.yaml and .tmuxp.json for Makefile change -- overhaul README +### Dependencies -## tmuxp 0.11.0 (2016-02-29) +#### libtmux 0.7.5 -- #137 Support for environment settings in configs, thanks - `@tasdomas` -- Spelling correction, thanks [@sehe]. +The libtmux update carries a tmux 2.6 hotfix. -## tmuxp 0.10.0 (2016-01-30) +## tmuxp 1.3.2 (2017-08-20) -- #135 Load multiple tmux sessions at once, thanks [@madprog]. -- #131 #133 README and Documentation fixes +tmuxp 1.3.2 fixes session-scope environment variables through libtmux. -## tmuxp 0.9.3 (2016-01-06) +### Fixes -- switch to `.venv` for virtualenv directory to not conflict - with `.env` (used by [autoenv]). -- #130 move to [entr(1)] for file watching in tests. update docs. -- [compatibility] Support [Anaconda Python] 2 and 3 +#### Session-scope environment variables (#184) -## tmuxp 0.9.2 (2015-10-21) +The libtmux 0.7.4 update fixes environment variables in the session scope and refreshes pytest dependencies. -- #122 Update to support tmux 2.1, thank you [@estin]. -- use travis container infrastructure for faster tests -- change test in workspace builder test to use `top(1)` instead of - `man(1)`. `man(1)` caused errors on some systems where `PAGER` is set. +## tmuxp 1.3.1 (2017-05-29) -## tmuxp 0.9.1 (2015-08-23) +tmuxp 1.3.1 fixes ambiguous session-name matching and refreshes docs dependencies. -- #119 Add fix python 3 for [sysutils/pytmuxp] on FreeBSD ports. - See GH issue 119 and [#201564] @ FreeBSD Bugzilla. Thanks Ruslan - Makhmatkhanov. +### Fixes -## tmuxp 0.9.0 (2015-07-08) +#### Exact session-name matching (#252) -- Renamed `config.expandpath` to `config.expandshell`. -- compat 2.7/3.3 wrapper for `EnvironmentVarGuard` for - testing. -- You can now use environment variables inside of - `start_directory`, `before_script`, `shell_command_before`, - `session_name` and `window_name`. -- [examples]: add example for environmental variables, - `examples/env-variables.json` and `examples/env-variables.yaml`. -- #110 de-vendorize [colorama]. -- #109 fix failure of test_pane_order on fedora machines from - [@marbu] -- #105 append `.txt` extension to manuals (repo only) - from [@yegortimoshenko]. -- #107 Fix Server.attached_sessions return type by - [@thomasballinger]. -- update travis to use new tmux git repository. +Loading a session whose name is a subset of another session no longer causes the wrong attach/switch behavior. -## tmuxp 0.8.1 (2015-05-09) +### Dependencies -- [testing]: fix sniffer test runner in python 3 -- new animated image demo for RTD and README +#### libtmux 0.7.3 and docs theme update -## tmuxp 0.8.0 (2015-05-07) +tmuxp updated libtmux, switched docs to the alagitpull theme, and removed unneeded docs dependencies. -- version bump 0.1.13 -> 0.8.0 -- tmux 2.0 support -- Fix documentation for :meth:`Session.switch_client()`. -- Add `--log-level` argument. -- Refactor `{Server,Session,Window,Pane}.tmux` into: +## tmuxp 1.3.0 (2017-04-27) - - {meth}`Server.cmd()` - - {meth}`Session.cmd()` - - {meth}`Window.cmd()` - - {meth}`Pane.cmd()` +tmuxp 1.3.0 adds better formatted-option support, symlinked directory support, and `options_after`. - (See conversation at ) +### What's new -- Refactor `util.tmux` into {meth}`util.tmux_cmd`. +#### Formatted options, symlinked directories, and `options_after` (#235, #236, #239) -## tmuxp 0.1.13 (2015-03-25) +Freezing and loading handle formatted options more accurately, symlinked directories are supported, and `options_after` can set late tmux options such as `synchronize-panes`. -- Remove `package_metadata.py` in favor of `__about__.py`. -- `scent.py` for building docs -- docutils from 0.11 to 0.12 -- `bootstrap_env.py` will check for linux, darwin (OS X) and - windows and install the correct [sniffer] file watcher plugin. -- testsuite for cli uses {py:func}`tempfile.mkdtemp()` instead - `TMP_DIR` (which resolved to `.tmuxp` in the testsuite directory. -- replace [watchingtestrunner] in examples. - `.tmuxp.conf` and `.tmux.json` updated -- updates to doc links -- `make checkbuild` for verifying internal / intersphinx doc - references. -- Add Warning tmux versions less than 1.4 from [@techtonik]. -- Add documentation on leading space in `send_keys` - from [@thomasballinger]. -- Update about page from teamocil and erb support from [@raine]. +### Breaking changes -## tmuxp 0.1.12 (2014-08-06) +#### Python 2.7+ baseline (#248) -- [config] {meth}`config.expand` now resolves directories in configuration - via {py:func}`os.path.expanduser` and {py:func}`os.path.expandvars`. -- [config] {meth}`config.expandpath` for helping resolve paths. -- improved support for loading tmuxp project files from - outside current working directory. e.g. +Python 2.6 support was dropped, libtmux moved to 0.7.1, and colorama was updated. - ``` - $ tmuxp load /path/to/my/project/.tmuxp.yaml - ``` +## tmuxp 1.2.8 (2017-04-02) - Will behave better with relative directories. +tmuxp 1.2.8 improves missing-tmux errors. -## tmuxp 0.1.11 (2014-04-06) +### Fixes -- `before_script` now loads relative to project directory with - `./`. -- Use `bootstrap_env.py` in tmuxp's `.tmuxp.yaml` and - `.tmuxp.json` project files. -- Improvements to {meth}`util.run_before_script()`, - {class}`exc.BeforeLoadScriptFailed` behavior to print `stdout` and - return `stderr` is a non-zero exit is returned. -- `run_script_before` has moved to `util`. -- `BeforeLoadScriptFailed` and `BeforeLoadScriptNotExists` - has moved to the `exc` module. -- Tests for `run_script_before` refactored. +#### Helpful missing-tmux message (#229) -## tmuxp 0.1.10 (2014-04-02) +Systems without `tmux` on PATH receive a clearer error message. libtmux moved from 0.6.4 to 0.6.5. -- 2 bug fixes and allow panes with no shell commands to accept options, - thanks for these 3 patches, [@ThiefMaster]: -- #73 Fix an error caused by spaces in - `start_directory`. -- #77 Fix bug where having a `-` in a - `shell_command` would cauesd a build error. -- #76 Don't require `shell_command` to - pass options to panes (like `focus: true`). +## tmuxp 1.2.7 (2017-03-25) -## tmuxp 0.1.9 (2014-04-01) +tmuxp 1.2.7 adds OpenBSD support. -- The `--force` was not with us. +### What's new -## tmuxp 0.1.8 (2014-03-30) +#### OpenBSD support -- #72 Create destination directory if it doesn't exist. Thanks - [@ThiefMaster]. -- New context manager for tests, `temp_session`. -- New testsuite, `testsuite.test_utils` for testing testsuite - tools. -- New command, `before_script`, which is a file to - be executed with a return code. It can be a bash, perl, python etc. - script. -- #56 {ref}`python_api_quickstart ` +The release adds platform support for OpenBSD. -## tmuxp 0.1.7 (2014-02-25) +## tmuxp 1.2.6 (2017-02-24) -- #55 where tmuxp would crash with letter numbers in version. - Write tests. +tmuxp 1.2.6 fixes pane ordering. -## tmuxp 0.1.6 (2014-02-08) +### Fixes -- {meth}`Window.split_window()` now allows `-c start_directory`. -- #35 Builder will now use `-c start_directory` to - create new windows and panes. +#### Layout selected before splits (#218) - This removes a hack where `default-path` would be set for new pane and - window creations. This would bleed into tmux user sessions after - creations. +Pane order is preserved by running `select-layout` before creating splits. -## tmuxp 0.1.5-1 (2014-02-05) +## tmuxp 1.2.5 (2017-02-08) -- #49 bug where `package_manifest.py` missing - from `MANIFEST.in` would cause error installing. +tmuxp 1.2.5 adds custom config-directory support and tracks tmux master. -## tmuxp 0.1.5 (2014-02-05) +### What's new -- section heading normalization. -- tao of tmux section now treated as a chatper. tao of tmux may be - split off into its own project. -- use conventions from [tony/cookiecutter-pypackage]. +#### `TMUXP_CONFIGDIR` (#207) -## tmuxp 0.1.4 (2014-02-02) +Users can choose a custom tmuxp config directory with `TMUXP_CONFIGDIR`. See {ref}`TMUXP_CONFIGDIR`. -- Fix `$ tmuxp freeze` CLI output. -- Update `_compat` support module. -- Fix extra space in [PEP 263]. +### Development -## tmuxp 0.1.3 (2014-01-29) +#### tmux master support (#199) -- #48 Fix Python 3 CLI issue. -- #48 `$ tmuxp` without option raises an error. -- Add space before send-keys to not populate bash and zsh - history. +The project added support for running against tmux master and updated libtmux to 0.6.3. -## tmuxp 0.1.2 (2014-01-08) +## tmuxp 1.2.4 (2017-01-13) -- now using werkzeug / flask style testsuites. -- #43 Merge `tmuxp -d` for loading in detached mode. - Thanks [roxit]. +tmuxp 1.2.4 is a dependency pin release. -## tmuxp 0.1.1 (2013-12-25) +### Dependencies -- #32 Fix bug where special characters caused unicode caused - unexpected outcomes loading and freezing sessions. +#### Click 6.7 and pinned docs dependencies (#195, #198) -## tmuxp 0.1.0 (2013-12-18) +Click moved from 6.6 to 6.7, and colorama/docs dependencies were pinned. -- fix duplicate print out of filename with using `tmuxp load .`. -- version to 0.1. No `--pre` needed. Future versions will not use rc. +## tmuxp 1.2.3 (2016-12-21) -## tmuxp 0.1-rc8 (2013-12-17) +tmuxp 1.2.3 is a small libtmux, test, and docs patch. -- `unicode_literals` -- Move py2/py3 compliance code to `_compat`. +### Fixes -## tmuxp 0.1-rc7 (2013-12-07) +#### Suppress-history test and docs fixes (#186, #191, #193) -- #33 Partial rewrite of {meth}`config.expand`. -- tmuxp will exit silently with `Ctrl-c`. +The release improves suppress-history tests, fixes documentation typos, and bumps libtmux from 0.6.0 to 0.6.1. -## tmuxp 0.1-rc6 (2013-12-06) +## tmuxp 1.2.2 (2016-09-16) -- #31 [examples] from stratoukos add `window_index` option, - and example. +tmuxp 1.2.2 adds tmux 2.3 support. -## tmuxp 0.1-rc5 (2013-12-04) +### What's new -- #28 shell_command_before in session scope of config causing - duplication. New test. -- #26 #29 for OS X tests. Thanks stratoukos. -- #27 `$ tmuxp freeze` raises unhelpful message if session doesn't - exist. +#### tmux 2.3 support (#181) -## tmuxp 0.1-rc4 (2013-12-03) +tmuxp now supports tmux 2.3. -- fix bug were `focus: true` would not launch sessions when using - `$ tmuxp load` in a tmux session. +## tmuxp 1.2.1 (2016-09-16) -## tmuxp 0.1-rc3 (2013-12-03) +tmuxp 1.2.1 fixes invalid session-name handling. -- #25 `focus: true` not working in panes. Add - tests for focusing panes in config. -- {meth}`Pane.select_pane()`. -- add new example for `focus: true`. +### Fixes -## tmuxp 0.1-rc2 (2013-11-23) +#### Invalid session names (#132) -- #23 fix bug where workspace would not build with pane-base-index - set to 1. Update tests to fix if `pane-base-index` is not 0. -- removed `$ tmuxp load --list` functionality. Update - {ref}`quickstart` accordingly. +Invalid session names are handled correctly, and libtmux moved from 0.5.0 to 0.6.0. -## tmuxp 0.1-rc1 (2013-11-23) +## tmuxp 1.2.0 (2016-06-16) -- [pep8] in unit tests. -- Changelog will now be updated on a version basis, use [pep440] - versioning. +tmuxp 1.2.0 adds configuration support for tmux options and environment variables. -## tmuxp 0.1-dev (2013-11-21) +### What's new -- {meth}`Session.show_options`, {meth}`Session.show_option` now - accept `g` to pass in `-g`. +#### Session options and global options (#65) -## tmuxp 0.1-dev (2013-11-20) +Workspace configuration can define `options`, `global_options`, and environment variables, with examples and tests added. -- {meth}`Window.show_window_options`, - {meth}`Window.show_window_option` now accept `g` to pass in `-g`. -- #15 Behavioral changes in the WorkspaceBuilder to fix pane - ordering. -- #21 Error with unit testing python 2.6 python configuration tests. - Use {py:mod}`tempfile` instead. -- WorkspaceBuilder tests have been improved to use async better. +## tmuxp 1.1.1 (2016-06-02) -## tmuxp 0.1-dev (2013-11-17) +tmuxp 1.1.1 fixes attach behavior and restores version output. -- fix a bug where missing tmux didn't show correct warning. +### Fixes -## tmuxp 0.1-dev (2013-11-15) +#### Multiple-session attach and CLI polish (#165, #166, #167) -- Travis now tests python 2.6 as requirement and not allowed to - fail. +Attaching multiple sessions works again, typo fixes landed, zsh/bash completion docs were added, and `tmuxp -V` returned for version info. -## tmuxp 0.1-dev (2013-11-13) +## tmuxp 1.1.0 (2016-06-01) -- #19 accept `-y` argument to answer yes to questions. -- {meth}`cli.SessionCompleter` no longer allows a duplicate session - after one is added. -- ongoing work on {ref}`about-tmux`. +tmuxp 1.1.0 rewrites the CLI around Click and adds config-name loading. -## tmuxp 0.1-dev (2013-11-09) +### What's new -- [translation] [documentation in Chinese]. -- More work done on the {ref}`about-tmux` page. -- {meth}`Pane.split_window()` for splitting {class}`Window` at - `target-pane` location. +#### Load configs by name (#160) -## tmuxp 0.1-dev (2013-11-08) +tmuxp can load named configs from the configured search paths. -- [freeze] - `$ tmuxp freeze` will now freeze a window with a - `start_directory` when all panes in a window are inside the same - directory. -- [config] {meth}`config.inline` will now turn panes with no - other attributes and 1 command into a single item value. +#### Click CLI rewrite (#134, #158) - ``` - - panes: - - shell_command: top +Click replaced argparse for completions, importing, config finding, conversion, and prompts. The `-l` option was removed from `tmuxp import tmuxinator|teamocil`. - # will now inline to: +## tmuxp 1.0.2 (2016-05-25) - - panes - - top +tmuxp 1.0.2 fixes reattaching and improves tmuxinator imports. - This will improve ``$ tmuxp freeze`` - ``` +### Fixes -## tmuxp 0.1-dev (2013-11-07) +#### Already-loaded session reattach (#159, #161, #163) -- Remove old logger (based on [tornado's log.py]), replace - with new, simpler one. -- fix [teamocil] import. -- support import teamocil `root` to - `start_directory`. +Reattaching to loaded sessions was fixed, tmuxinator imports improved, and README links were corrected. -## tmuxp 0.1-dev (2013-11-06) +## tmuxp 1.0.1 (2016-05-25) -- tagged v0.0.37. Many fixes. Python 2.6 support. Will - switch to per-version changelog after 0.1 release. -- support for blank panes (null, `pane`, `blank`) and panes - with empty strings. -- tmuxp freeze supports exporting to blank panes. -- tmuxp freeze will now return a blank pane for panes that would - previously return a duplicate shell command, or generic python, node - interpreter. +tmuxp 1.0.1 moves docs hosting and updates libtmux. -## tmuxp 0.1-dev (2013-11-05) +### Documentation -- Support for `[-L socket-name]` and `[-S socket-path]` in - autocompletion and when loading. Note, switching client into another - socket may cause an error. -- Documentation tweaking to {ref}`API`, {ref}`about-tmux`. -- [pep257]. +#### Read the Docs hosting -## tmuxp 0.1-dev (2013-11-04) +Documentation moved to readthedocs.io. -- [pep257]. -- tagged version `v0.0.36`. +### Dependencies -## tmuxp 0.1-dev (2013-11-02) +#### libtmux 0.4.1 (#157) -- Many documentation, [pep257] fixes -- move old {class}`Server` methods `__list_panes()`, - `__list_windows` and `__list_sessions` into the single underscore. -- #12 fix for `$ tmuxp freeze` by @finder. -- Support for spaces in `$ tmuxp attach-session` and - `$ tmuxp kill-session`, and `$ tmuxp freeze`. -- [config] support for relative paths of `start_directory`. Add an - update config in _Start Directory_ on {ref}`examples`. +tmuxp tracks libtmux 0.4.1. -## tmuxp 0.1-dev (2013-11-01) +## tmuxp 1.0.0-rc1 (2016-05-25) -- New servers for {class}`Server` arguments `socket_name`, - `socket_path`, `config_file`. -- {class}`Server` support for `-2` with `colors=256` and - `colors=8`. -- `$ tmuxp -2` for forcing 256 colors and `tmuxp -8` for forcing 88. -- [config] Concatenation with `start_directory` via - {meth}`config.trickle()` if window `start_directory` is alphanumeric / - relative (doesn't start with `/`). See {ref}`Examples` in _start directory_. -- Fix bug with import teamocil and tmuxinator -- Improve quality of tmuxinator imports. Especially `session_name` - and `start_directory`. -- Allow saving with `~` in file destination. +tmuxp 1.0.0-rc1 is the release-candidate jump from the 0.11 line to 1.0. -## tmuxp 0.1-dev (2013-10-31) +### What's new -- {meth}`util.is_version()` -- correctly {meth}`config.trickle()` the `start_directory`. -- get `start_directory` working for configs -- fix :meth:`Window.kill_window()` target to - `session_id:window_index` for compatibility and pass tests. -- [examples]: Example for `start_directory`. -- fix bug where first and second window would load in mixed order -- {class}`Window.move_window()` for moving window. -- doc overhaul. front page, renamed orm_al.rst to internals.rst. +#### libtmux split and pytest migration (#145, #146, #147) -## tmuxp 0.1-dev (2013-10-30) +Core tmux APIs split into [libtmux](https://github.com/tmux-python/libtmux), tests moved to pytest, new-window support landed, shell-history suppression became configurable, Makefile-based docs/test tasks were refreshed, and the README was overhauled. -- fix bug where if inside tmux, loading a workspace via switch_client - wouldn't work. -- fix bug where `tmuxp load .` would return an error instead of a - notice. -- `tmuxp freeze ` experimental -- tmuxp now has experimental support for freezing live - sessions. -- {meth}`Window.kill_window()` -- support for `start_directory` (work in progress) +## tmuxp 0.11.0 (2016-02-29) -## tmuxp 0.1-dev (2013-10-29) +tmuxp 0.11.0 adds environment settings in configs. -- {meth}`Window.select_pane` now accepts `-l`, `-U`, `-D`, - `-L`, `-R`. -- support for `automatic-rename` option. -- 3 new {ref}`examples`, 'main-pane-height', 'automatic-rename', and - 'shorthands'. -- enhancements to prompts -- `tmuxp import` for teamocil and tmuxinator now has a wizard and offers - to save in JSON or YAML format. -- [b6c2e84] Fix bug where tmuxp load w/ session already loaded would - switch/attach even if no was entered -- when workspace loader crashes, give option to kill session, attach it or - detach it. -- tmux 1.8 `set-option` / `set-window-options` command - `target-window` fix. -- {class}`WorkspaceBuilder` now has `.session` attribute accessible - publicly. -- tmux will now use {meth}`Session.switch_client` and - {meth}`Session.attach_session` to open new sessions instead of `os.exec`. -- [config] tmuxp now allows a new shorter form for panes. Panes can just be a - string. See the shorthand form in the {ref}`examples` section. -- [config] support loading `.yml`. +### What's new -## tmuxp 0.1-dev (2013-10-28) +#### Config environment settings (#137) -- fix `tmuxp load .` fixed -- fix `tmuxp convert ` fixed. -- [pep257] fixes. -- {class}`Pane` now has {meth}`Pane.set_width` and - {meth}`Pane.set_height`. -- `./run_tests.py --tests` now automatically prepends - `tmuxp.testsuite` to names. -- {meth}`Window.tmux` and {meth}`Pane.tmux` will automatically add - their `{window/pane}_id` if one isn't specific. +Configuration files can now include environment settings. Thanks @tasdomas. -## tmuxp 0.1-dev (2013-10-27) +### Documentation -- [argcomplete] overhaul for CLI bash completion. -- `tmuxp load`, `tmuxp convert` and `tmuxp import` now support - relative and full filenames in addition to searching the config - directory. +#### Spelling correction -## tmuxp 0.1-dev (2013-10-26) +Spelling fixes landed from @sehe. -- initial version of [tmuxinator] - config importer. it does not support all options and it not guaranteed - to fully convert window/pane size and state. -- {meth}`config.in_dir` supports a list of `extensions` for - filetypes to search, i.e. `['.yaml', '.json']`. -- {meth}`config.is_config_file` now supports `extensions` - argument as a string also. -- fix `$ tmuxp load -l` to work correctly alongside - `$ tmuxp load filename`. +## tmuxp 0.10.0 (2016-01-30) -## tmuxp 0.1-dev (2013-10-25) +tmuxp 0.10.0 adds multi-session loading. -- fix bug where `-v` and `--version` wouldn't print version. -- property handle case where no tmux server exists when - `attach-session` or `kill-session` is used. -- test fixtures and initial work for importing - [tmuxinator] configs +### What's new -## tmuxp 0.1-dev (2013-10-24) +#### Load multiple sessions (#135) -- clean out old code for `automatic-rename` option. it will - be reimplemented fresh. -- check for `oh-my-zsh` when using `$SHELL` `zsh`. Prompt if - `DISABLE_AUTO_TITLE` is unset or set to `true`. -- tmuxp can now `$ tmuxp convert ` from JSON <=> YAML, back - and forth. -- New examples in JSON. Update the {ref}`examples` page in the - docs. -- [dev] `.tmuxp.json` now exists as a config for tmuxp development and - as an example. -- Fix bug where `tmuxp kill-session` would give bad output -- Fix bug in tab completion for listing sessions with no tmux server - is active. +tmuxp can load multiple tmux sessions at once. Thanks @madprog. -## tmuxp 0.1-dev (2013-10-23) +### Documentation -- zsh/bash/tcsh completion improvements for tab-completion options -- tmuxp `kill-session` with tab-completion. -- tmuxp `attach-session` with tab-completion. Attach session will - `switch-client` for you if you are inside of of a tmux client. -- tmuxp `load` for loading configs. -- unit test fixes. +#### README and docs fixes (#131, #133) -## tmuxp 0.1-dev (2013-10-21) +Documentation fixes landed alongside the feature. -- Make 1.8 the official minimym version, give warning notice to - upgrade tmux if out of date -- Fix regression causing unexpected build behavior due to unremoved code - supporting old tmux versions. -- Added 2 new examples to the {ref}`examples` page. -- Examples now have graphics -- `$ tmuxp -v` will print the version info. +## tmuxp 0.9.3 (2016-01-06) -## tmuxp 0.1-dev (2013-10-19) +tmuxp 0.9.3 improves development environment compatibility. -- tmuxp will now give warning and sys.exit() with a message if - `tmux` not found in system PATH -- internal overhaul of {class}`Server`, {class}`Session` - , {class}`Window`, and {class}`Pane` continues. - - - {class}`Server` has @property {meth}`Server.sessions`, which is forward - to {meth}`Server.list_sessions()` (kept to keep tmux commands in - serendipty with api), {meth}`Server._list_sessions()` returns dict - object from {meth}`Server.__list_sessions()` tmux command. - {meth}`Server.__list_sessions()` exists to keep the command layered so - it can be tested against in a matrix with travis and compatibility - methods can be made. - - {class}`Session` now has @property {meth}`Session.windows` returning a - list of {class}`Window` objects via {meth}`Session.list_windows()`. - @property {meth}`Session._windows` to {meth}`Session._list_windows()` - to return a list of dicts without making objects. - - {class}`Window` now has @property {meth}`Window.panes` returning a - list of {class}`Pane` objects via {meth}`Window.list_panes()`. - @property {meth}`Window._panes` to {meth}`Window._list_panes()` - to return a list of dicts without making objects. +### Development -## tmuxp 0.1-dev (2013-10-18) +#### `.venv`, entr, and Anaconda support (#130) -- internal overhaul of {class}`Server`, {class}`Session`, - {class}`Window`, and {class}`Pane`. +Virtualenv directories moved from `.env` to `.venv`, tests moved to [entr](http://entrproject.org/) for file watching, and Anaconda Python 2 and 3 were supported. - - `Session`, `Window` and `Pane` now refer to a data object - in {class}`Server` internally and always pull the freshest data. - - A lot of code and complexity regarding setting new data for objects - has been reduced since objects use their unique key identifier to - filter their objects through the windows and panes in `Server` - object. - - `Server` object is what does the updating now. +## tmuxp 0.9.2 (2015-10-21) -- [project] some research into supporting legacy tmux versions. tmux 1.6 - and 1.7 support seem likely eventually if there is enough demand. -- python 3 support +tmuxp 0.9.2 adds tmux 2.1 support and fixes test portability. -## tmuxp 0.1-dev (2013-10-17) +### What's new -- updated README docs with new project details, screenshots -- new example `.tmuxp.yaml` file updated to include - development workflow. Removed nodemon as the tool for checking files for - now. -- Support for switching sessions from within tmux. In both cases - after the the session is built and if session already exists. +#### tmux 2.1 support (#122) -## tmuxp 0.1-dev (2013-10-16) +tmuxp now supports tmux 2.1. Thanks @estin. -- use {meth}`util.which()` from salt.util to find tmux binary. -- add MANIFEST.in, fix issue where package would not - install because missing file -- bash / zsh completion. -- New page on {ref}`internals`. -- Updates to {ref}`about-tmux` page. -- add vim modeline for rst to bottom of this page -- Server is now a subclass of `util.TmuxObject`. -- subclasses of {class}`util.TmuxRelationalObject`, - {class}`Server`, {class}`Session`, {class}`Window`, {class}`Pane` now - have {meth}`util.TmuxRelationalObject.getById` (similar to [.get()] in - [backbone.js] collection), {meth}`util.TmuxRelationalObject.where` and - {meth}`util.TmuxRelationalObject.findWhere` ([.where()] and - [.findWhere()]), to easily find child objects. -- tmux object mapping has been split into - {class}`util.TmuxMappingObject`. The mapping and the relational has been - decoupled to allow {class}`Server` to have children while not being a - dict-like object. -- {class}`Server`, {class}`Session`, {class}`Window`, - {class}`Pane` now explicitly mixin subclasses. +### Development -## tmuxp 0.1-dev (2013-10-15) +#### Faster CI and safer pane-order tests -- new theme -- initial examples, misc. updates, front page update. -- support for `$ tmux .` to load `.tmuxp.{yaml/json/py}` in current - working directory. -- support for `socket-name` (`-L`) and `socket-path` - (`socket-path`) -- [config] Support for 1-command pane items. - - ``` - session_name: my session - windows: - - window_name: hi - panes: - - bash - - htop - ``` - -- If session name is already exists, prompt to attach. +Travis moved to container infrastructure, and pane-order tests stopped relying on `man(1)`. -## tmuxp 0.1-dev (2013-10-14) +## tmuxp 0.9.1 (2015-08-23) -- can now -l to list configs in current directory and $HOME/.tmuxp -- tmuxp can now launch configs and build sessions -- new exceptions -- {meth}`config.check_consistency()` to verify and diagnose - issues with config files. -- {meth}`cli.startup()` -- {meth}`config.is_config_file()` -- {meth}`config.in_dir()` -- {meth}`config.in_cwd()` +tmuxp 0.9.1 fixes FreeBSD Python 3 packaging support. -## tmuxp 0.1-dev (2013-10-13) +### Fixes -- {meth}`config.inline()` to produce far far better looking - config exports and tests. -- {meth}`Pane.resize_pane()` and tests -- documentation fixes and updates -- {meth}`Session.refresh()`, {meth}`Window.refresh()`, - {meth}`Pane.refresh()`. -- {meth}`Server.find()`, {meth}`Session.find()`, - {meth}`Window.find()`. +#### FreeBSD ports Python 3 fix (#119) -## tmuxp 0.1-dev (2013-10-12) +The release includes the Python 3 fix for [sysutils/pytmuxp](http://www.freshports.org/sysutils/py-tmuxp/) in FreeBSD ports. -- Test documentation updates -- Builder is now {class}`WorkspaceBuilder` + tests. - - WorkspaceBuilder can build panes - - WorkspaceBuilder can build windows and set options -- {meth}`Window.show_window_options()`, - {meth}`Window.show_window_option()`, {meth}`Window.set_window_option()` -- {meth}`Session.show_options()`, - {meth}`Session.show_option()`, {meth}`Session.set_option()` +## tmuxp 0.9.0 (2015-07-08) -## tmuxp 0.1-dev (2013-10-11) +tmuxp 0.9.0 expands shell expansion, environment-variable support, and tmux 2.0-era compatibility. -- More preparation for builder / session maker utility. -- test runner and test suite overhaul. -- Documentation for development environment and test runner updated. -- Travis now tests against tmux 1.8 and latest source. Door open for - future testing against python 3 and earlier tmux versions in the future. -- Quiet logger down in some areas -- **future** imports for future python 3 compatibility -- setup.py import **version** via regex from tmuxp package -- move beginnings of cli to `tmuxp.cli` +### Breaking changes -## tmuxp 0.1-dev (2013-10-09) +#### `config.expandpath` renamed to `config.expandshell` -- New logging module -- Removed dependency logutils -- Removed dependency sh +The old config helper was renamed as environment and shell expansion behavior grew. -## tmuxp 0.1-dev (2013-10-08) +### What's new + +#### Environment variables in workspace fields + +Environment variables can be used in `start_directory`, `before_script`, `shell_command_before`, `session_name`, and `window_name`, with JSON and YAML examples added. + +### Fixes + +#### Test and dependency cleanup (#105, #107, #109, #110) + +The release devendorizes colorama, fixes Fedora pane-order tests, updates manual file extensions, fixes an attached-sessions return type, and tracks the new tmux git repository. + +## tmuxp 0.8.1 (2015-05-09) + +tmuxp 0.8.1 is a test and docs media patch. + +### Fixes + +#### Python 3 sniffer test runner + +The sniffer test runner works under Python 3, and a new animated demo was added to docs and README. + +## tmuxp 0.8.0 (2015-05-07) + +tmuxp 0.8.0 jumps from 0.1.13 to the 0.8 line for tmux 2.0 support and command API cleanup. + +### What's new + +#### tmux 2.0 support and log-level option + +The release adds tmux 2.0 support, improves `Session.switch_client()` docs, and adds `--log-level`. + +### Breaking changes + +#### `.tmux` helpers renamed to `.cmd` + +Historical `{Server,Session,Window,Pane}.tmux` helpers were refactored into `.cmd()` methods, and `util.tmux` became `util.tmux_cmd`. These old names remain inline here because they describe the 2015 API surface. + +## tmuxp 0.1.13 (2015-03-25) + +tmuxp 0.1.13 cleans up package metadata, docs building, and tests. + +### Development + +#### Metadata and docs runner cleanup + +`package_metadata.py` was replaced with `__about__.py`, docs building moved to `scent.py`, docutils moved to 0.12, `bootstrap_env.py` learned platform-specific watcher setup, CLI tests stopped using the old `TMP_DIR`, and stale watchingtestrunner examples were replaced. + +### Documentation + +#### tmux compatibility and history docs + +The release adds warnings for tmux versions below 1.4, documents leading spaces in `send_keys`, and updates the about page from teamocil and erb support. + +## tmuxp 0.1.12 (2014-08-06) + +tmuxp 0.1.12 improves path expansion when loading project files from outside the current directory. + +### Fixes + +#### Relative project file loading + +Config path expansion now resolves user and environment variables, and project files such as `/path/to/project/.tmuxp.yaml` behave better with relative directories. + +## tmuxp 0.1.11 (2014-04-06) + +tmuxp 0.1.11 improves `before_script` handling. + +### Fixes + +#### Project-relative `before_script` + +`before_script` runs relative to the project directory, reports stdout/stderr more clearly on failure, and the script-runner exceptions moved into the exception module. + +## tmuxp 0.1.10 (2014-04-02) + +tmuxp 0.1.10 fixes early pane-option and command parsing bugs. + +### Fixes + +#### Pane command and option edge cases (#73, #76, #77) + +Patches from @ThiefMaster fix spaces in `start_directory`, dashes in `shell_command`, and panes that need options but no shell command. + +## tmuxp 0.1.9 (2014-04-01) + +tmuxp 0.1.9 fixes force behavior. + +### Fixes + +#### `--force` restored + +The release restores the intended `--force` behavior. + +## tmuxp 0.1.8 (2014-03-30) + +tmuxp 0.1.8 adds pre-load scripts and directory creation. + +### What's new + +#### `before_script` and destination directory creation (#56, #72) + +tmuxp can create missing destination directories and run a `before_script` before starting a tmux session. The release also adds test helpers and links users toward the libtmux Python API quickstart. + +## tmuxp 0.1.7 (2014-02-25) + +tmuxp 0.1.7 fixes version parsing. + +### Fixes + +#### Lettered version support (#55) + +tmuxp no longer crashes on lettered tmux version strings. + +## tmuxp 0.1.6 (2014-02-08) + +tmuxp 0.1.6 stops relying on tmux `default-path` for start directories. + +### Fixes + +#### `-c start_directory` for windows and panes (#35) + +Window and pane creation now use tmux's `-c start_directory`, avoiding the old `default-path` hack that could bleed into user sessions. + +## tmuxp 0.1.5-1 (2014-02-05) + +tmuxp 0.1.5-1 fixes an installation manifest issue. + +### Packaging + +#### Manifest package metadata fix (#49) + +`package_manifest.py` is included correctly so installs no longer fail. + +## tmuxp 0.1.5 (2014-02-05) + +tmuxp 0.1.5 normalizes docs structure and packaging conventions. + +### Documentation + +#### Tao of tmux and section-heading cleanup + +The Tao of tmux docs became their own chapter candidate, headings were normalized, and project structure borrowed conventions from `tony/cookiecutter-pypackage`. + +## tmuxp 0.1.4 (2014-02-02) + +tmuxp 0.1.4 fixes CLI output and compatibility helpers. + +### Fixes + +#### Freeze output and compatibility cleanup + +`tmuxp freeze` output was corrected, `_compat` was updated, and a PEP 263 spacing issue was fixed. + +## tmuxp 0.1.3 (2014-01-29) + +tmuxp 0.1.3 fixes Python 3 CLI behavior and shell-history suppression. + +### Fixes + +#### Python 3 CLI and history suppression (#48) + +Running `tmuxp` without an option raises the expected error, Python 3 CLI behavior was fixed, and sent keys are prefixed with a space to avoid populating bash and zsh history. + +## tmuxp 0.1.2 (2014-01-08) + +tmuxp 0.1.2 adds detached loading and refreshes test style. + +### What's new + +#### Detached load mode (#43) + +`tmuxp -d` can load sessions detached. Thanks roxit. + +### Development + +#### Werkzeug/Flask-style tests + +The testsuite moved toward Werkzeug/Flask-style testing helpers. + +## tmuxp 0.1.1 (2013-12-25) + +tmuxp 0.1.1 fixes special-character handling. + +### Fixes + +#### Unicode and special characters (#32) + +Loading and freezing sessions now handle special characters more predictably. + +## tmuxp 0.1.0 (2013-12-18) + +tmuxp 0.1.0 marks the first stable 0.1 release. + +### Fixes + +#### Current-directory load output + +The duplicate filename output from `tmuxp load .` was fixed, and future releases no longer require `--pre`. + +## tmuxp 0.1-rc8 (2013-12-17) + +tmuxp 0.1-rc8 tightens Python 2/3 compatibility. + +### Development + +#### Compatibility helpers + +`unicode_literals` was adopted, and Python 2/3 compatibility code moved into `_compat`. + +## tmuxp 0.1-rc7 (2013-12-07) + +tmuxp 0.1-rc7 improves config expansion and interrupt behavior. + +### Fixes + +#### Config expansion and Ctrl-C (#33) + +The config expansion path was partially rewritten, and tmuxp exits silently on `Ctrl-C`. + +## tmuxp 0.1-rc6 (2013-12-06) + +tmuxp 0.1-rc6 adds window-index configuration. + +### What's new + +#### `window_index` option (#31) + +`window_index` support and examples were added from stratoukos. + +## tmuxp 0.1-rc5 (2013-12-04) + +tmuxp 0.1-rc5 fixes early pre-command and test behavior. + +### Fixes + +#### Session-scope `shell_command_before` and freeze errors (#26, #27, #28, #29) + +The release fixes duplicated session-scope pre-commands, improves OS X tests, and makes the missing-session error from `tmuxp freeze` less unhelpful. + +## tmuxp 0.1-rc4 (2013-12-03) + +tmuxp 0.1-rc4 fixes focused pane loading inside tmux. + +### Fixes + +#### `focus: true` inside tmux + +Focused panes no longer prevent sessions from launching when `tmuxp load` is run inside tmux. + +## tmuxp 0.1-rc3 (2013-12-03) + +tmuxp 0.1-rc3 adds focused-pane support and tests. + +### Fixes + +#### Pane focus option (#25) + +`focus: true` works for panes, tests cover focused pane config, and an example was added. + +## tmuxp 0.1-rc2 (2013-11-23) + +tmuxp 0.1-rc2 fixes pane-base-index handling. + +### Fixes + +#### `pane-base-index` set to 1 (#23) + +Workspaces build correctly when `pane-base-index` is not zero. + +### Breaking changes + +#### `tmuxp load --list` removed + +The old list behavior was removed and docs were updated. + +## tmuxp 0.1-rc1 (2013-11-23) + +tmuxp 0.1-rc1 starts per-version changelogging. + +### Development + +#### PEP 8 tests and PEP 440 versions + +Unit tests adopted PEP 8 checks, and changelog entries moved to a versioned PEP 440 scheme. + +## tmuxp 0.1-dev (2013-11-21) + +The November 21 development snapshot adds global option reads for sessions. + +### Development + +#### Session option helpers accept `g` + +`Session.show_options` and `Session.show_option` can pass `-g`. + +## tmuxp 0.1-dev (2013-11-20) + +The November 20 development snapshot improves pane ordering and option tests. + +### Fixes + +#### Pane ordering and base-index tests (#15, #21) + +Workspace builder behavior changed to fix pane ordering, Python 2.6 config tests were corrected, and async builder tests improved. + +### Development + +#### Window option helpers accept `g` + +`Window.show_window_options` and `Window.show_window_option` can pass `-g`. + +## tmuxp 0.1-dev (2013-11-17) + +The November 17 development snapshot improves missing-tmux errors. + +### Fixes + +#### Missing tmux warning + +Missing tmux now produces the correct warning. + +## tmuxp 0.1-dev (2013-11-15) + +The November 15 development snapshot makes Python 2.6 a required CI target. + +### Development + +#### Python 2.6 required in Travis + +Travis no longer treats Python 2.6 as an allowed failure. + +## tmuxp 0.1-dev (2013-11-13) + +The November 13 development snapshot adds yes-to-all prompting and duplicate-session completion protection. + +### What's new + +#### `-y` prompt confirmation (#19) + +The CLI can answer yes to questions. + +### Fixes + +#### Session completion deduplication + +The session completer no longer offers a duplicate session after one is added, and work continued on {ref}`about-tmux`. + +## tmuxp 0.1-dev (2013-11-09) + +The November 9 development snapshot adds translated docs and pane splitting at a target location. + +### Documentation + +#### Chinese documentation and about page work + +Chinese documentation was linked, and the tmux background page continued to improve. + +### Development + +#### Targeted pane splitting + +The old `Pane.split_window()` path can split a window at a target pane. + +## tmuxp 0.1-dev (2013-11-08) + +The November 8 development snapshot improves freeze output and pane shorthand. + +### What's new + +#### Freeze start directories and inline pane output + +`tmuxp freeze` can record a window `start_directory` when panes share a directory, and config exports inline simple one-command panes for more readable output. + +## tmuxp 0.1-dev (2013-11-07) + +The November 7 development snapshot replaces the logger and improves teamocil imports. + +### Development + +#### Simpler logging and teamocil root import + +The old Tornado-derived logger was replaced, teamocil import was fixed, and teamocil `root` maps to `start_directory`. + +## tmuxp 0.1-dev (2013-11-06) + +The November 6 development snapshot improves blank panes and freeze output. + +### What's new + +#### Blank panes and cleaner freeze output + +tmuxp supports blank panes (`null`, `pane`, `blank`, and empty strings), and freeze exports blank panes where it previously emitted duplicate or generic commands. + +### Development + +#### Python 2.6 support + +Python 2.6 support was restored while the project prepared to switch to per-version changelogs. + +## tmuxp 0.1-dev (2013-11-05) + +The November 5 development snapshot adds socket options to completion and loading. + +### What's new + +#### `-L` and `-S` socket support + +Autocompletion and loading support socket name and socket path arguments. Switching clients across sockets could still error in this early implementation. + +### Documentation + +#### API and about-tmux docs + +The API and {ref}`about-tmux` docs received more updates, and PEP 257 work continued. + +## tmuxp 0.1-dev (2013-11-04) + +The November 4 development snapshot is a PEP 257 and version-tag update. + +### Development + +#### PEP 257 cleanup + +Documentation style work continued, and `v0.0.36` was tagged. + +## tmuxp 0.1-dev (2013-11-02) + +The November 2 development snapshot fixes freeze paths, paths with spaces, and internal server method names. + +### Fixes + +#### Freeze, spaces, and relative `start_directory` (#12) + +`tmuxp freeze`, attach-session, kill-session, and relative `start_directory` support improved, including paths with spaces. + +### Development + +#### Internal server method cleanup + +Old double-underscore server list methods moved to single-underscore names, and docs/PEP 257 work continued. + +## tmuxp 0.1-dev (2013-11-01) + +The November 1 development snapshot expands server construction and import quality. + +### What's new + +#### Socket, config-file, and color flags + +Server construction gained `socket_name`, `socket_path`, and `config_file` support, plus `-2`/`-8` color options. + +### Fixes + +#### Relative `start_directory` and import quality + +Relative start directories concatenate correctly, teamocil and tmuxinator imports improved, and saving to `~` destinations became possible. + +## tmuxp 0.1-dev (2013-10-31) + +The October 31 development snapshot gets `start_directory` working and fixes early window ordering. + +### Fixes + +#### Window order, kill targets, and start directories + +The first and second windows no longer load in mixed order, `Window.kill_window()` targets were corrected for compatibility, and examples for `start_directory` were added. + +### Development + +#### Window moving and docs overhaul + +`Window.move_window()` landed, `util.is_version()` appeared, and the front page/internal docs were overhauled. + +## tmuxp 0.1-dev (2013-10-30) + +The October 30 development snapshot adds experimental session freezing. + +### What's new + +#### Experimental `tmuxp freeze` + +tmuxp can experimentally freeze live sessions to a file, while `tmuxp load .` and inside-tmux switching bugs were fixed. + +### Development + +#### Start directory work + +Support for `start_directory` continued, with `Window.kill_window()` work in the same snapshot. + +## tmuxp 0.1-dev (2013-10-29) + +The October 29 development snapshot adds shorthand panes, import wizards, and better crash handling. + +### What's new + +#### Pane shorthand, `.yml`, and import wizard + +Panes can be written as strings, `.yml` files load, and teamocil/tmuxinator imports gained a wizard that can save JSON or YAML. + +#### Automatic rename and pane selection + +The configuration gained `automatic-rename`, examples for pane sizing and shorthands, and pane selection accepted directional flags. + +### Fixes + +#### Loaded-session prompt and builder crash recovery + +tmuxp no longer switches or attaches after a negative prompt response, and workspace loader crashes offer kill, attach, or detach recovery options. + +## tmuxp 0.1-dev (2013-10-28) + +The October 28 development snapshot fixes current-directory load and conversion. + +### Fixes + +#### `tmuxp load .` and `tmuxp convert` + +Both commands were fixed, and test runner name handling improved. + +### Development + +#### Pane sizing and target defaults + +Historical pane sizing helpers and automatic window/pane target behavior landed during this API-building period. + +## tmuxp 0.1-dev (2013-10-27) + +The October 27 development snapshot overhauls filename completion. + +### What's new + +#### Relative and full filenames in CLI commands + +`tmuxp load`, `tmuxp convert`, and `tmuxp import` accept relative and full filenames in addition to config-directory discovery. + +### Development + +#### argcomplete CLI completion + +The CLI completion implementation was overhauled with argcomplete. + +## tmuxp 0.1-dev (2013-10-26) + +The October 26 development snapshot starts tmuxinator import support. + +### What's new + +#### Initial tmuxinator importer + +The first tmuxinator importer can convert some options, but was not expected to fully preserve window/pane size and state. + +### Fixes + +#### Config file extension handling + +Config discovery accepts extension lists and string extension arguments, and `tmuxp load -l` works alongside `tmuxp load filename`. + +## tmuxp 0.1-dev (2013-10-25) + +The October 25 development snapshot fixes version output and serverless session commands. + +### Fixes + +#### Version flag and no-server attach/kill + +`-v` and `--version` print correctly, and attach-session/kill-session handle the case where no tmux server exists. + +### Development + +#### Import fixtures + +Test fixtures and initial teamocil import work were added. + +## tmuxp 0.1-dev (2013-10-24) + +The October 24 development snapshot adds config conversion and JSON examples. + +### What's new + +#### JSON/YAML conversion + +`tmuxp convert` can convert between JSON and YAML in both directions, and JSON examples were added to the docs. + +### Fixes + +#### zsh auto-title prompts and session output + +tmuxp checks oh-my-zsh auto-title settings, fixes bad kill-session output, and improves tab completion with no active tmux server. + +## tmuxp 0.1-dev (2013-10-23) + +The October 23 development snapshot expands tab completion and core CLI commands. + +### What's new + +#### Completion for sessions and commands + +zsh, bash, and tcsh completions improved for `kill-session`, `attach-session`, and command options. `attach-session` switches clients when already inside tmux, and `load` can load configs. + +## tmuxp 0.1-dev (2013-10-21) + +The October 21 development snapshot makes tmux 1.8 the official minimum and restores version output. + +### Breaking changes + +#### tmux 1.8 minimum + +tmuxp warns when tmux is out of date and removed old compatibility code that caused build regressions. + +### Documentation + +#### Examples and graphics + +Two examples and graphics were added to {ref}`examples`, and `$ tmuxp -v` prints version info. + +## tmuxp 0.1-dev (2013-10-19) + +The October 19 development snapshot improves missing-binary handling and continues the early object-model overhaul. + +### Fixes + +#### Missing tmux exits clearly + +tmuxp exits with a clear message when `tmux` is not on PATH. + +### Development + +#### Server, session, window, and pane object refresh + +The early libtmux-style object model continued to separate public object lists from lower-level dict data returned by tmux commands. + +## tmuxp 0.1-dev (2013-10-18) + +The October 18 development snapshot moves more state refresh behavior into the server object. + +### Development + +#### Object data refresh model + +Session, window, and pane objects now refer back to server-owned data and refresh through unique identifiers, reducing manual data-setting complexity. + +#### Python 3 and legacy tmux research + +Python 3 support and possible tmux 1.6/1.7 support were under active research. + +## tmuxp 0.1-dev (2013-10-17) + +The October 17 development snapshot refreshes project docs and session switching. + +### What's new + +#### Switching sessions from inside tmux + +tmuxp can switch sessions from inside tmux after a session is built and when a session already exists. + +### Documentation + +#### README and development example update + +The README, screenshots, and development `.tmuxp.yaml` example were updated. + +## tmuxp 0.1-dev (2013-10-16) + +The October 16 development snapshot adds manifest fixes, completions, and an early object mapping layer. + +### Fixes + +#### Missing manifest file + +`MANIFEST.in` was added so packages install with required files. + +### What's new + +#### Shell completion and tmux binary lookup + +bash/zsh completion landed, and tmuxp uses a `which` helper to find the tmux binary. + +### Development + +#### Early relational object API + +Server/session/window/pane object mapping gained Backbone-inspired lookup helpers and split mapping behavior from relational behavior. + +## tmuxp 0.1-dev (2013-10-15) + +The October 15 development snapshot adds the first practical config loading flow. + +### What's new + +#### Load current-directory configs and one-command panes + +`tmuxp .` can load `.tmuxp.{yaml,json,py}` in the current directory, configs can express one-command panes compactly, and sessions prompt to attach when already present. + +#### Socket options and theme refresh + +Socket name/path support, initial examples, and a new theme landed in the same snapshot. + +## tmuxp 0.1-dev (2013-10-14) + +The October 14 development snapshot can list and build configs. + +### What's new + +#### Config listing and session building + +tmuxp can list configs in the current directory and `$HOME/.tmuxp`, launch configs, and build sessions. + +### Development + +#### Config validation helpers + +Early helpers for config consistency, config-file detection, and config-directory discovery were added. + +## tmuxp 0.1-dev (2013-10-13) + +The October 13 development snapshot improves exported config readability and object refresh helpers. + +### Development + +#### Inline config output and refresh helpers + +`config.inline()` produces cleaner exported configs, pane resizing tests were added, and session/window/pane refresh and find helpers landed. + +## tmuxp 0.1-dev (2013-10-12) + +The October 12 development snapshot introduces the workspace builder. + +### Development + +#### WorkspaceBuilder starts building sessions + +The builder can create panes, build windows, and set tmux options, with early option helpers on session and window objects. + +## tmuxp 0.1-dev (2013-10-11) + +The October 11 development snapshot prepares the builder and test runner. + +### Development + +#### Test runner, Travis matrix, and CLI beginnings + +The test suite and runner were overhauled, Travis tested tmux 1.8 and tmux source, logging was quieted, Python 3 compatibility imports were added, setup reads package version via regex, and CLI code began moving into `tmuxp.cli`. + +## tmuxp 0.1-dev (2013-10-09) + +The October 9 development snapshot simplifies logging dependencies. + +### Development + +#### Logging dependency cleanup + +A new logging module replaced the `logutils` and `sh` dependencies. + +## tmuxp 0.1-dev (2013-10-08) + +The October 8 development snapshot moves the project to semantic versioning. + +### Development + +#### Semantic versioning -- switch to semver - -[tmuxinator]: https://github.com/aziz/tmuxinator -[teamocil]: https://github.com/remiprev/teamocil -[argcomplete]: https://github.com/kislyuk/argcomplete -[pep257]: http://www.python.org/dev/peps/pep-0257/ -[pep8]: http://www.python.org/dev/peps/pep-0008/ -[pep440]: http://www.python.org/dev/peps/pep-0440/ -[tony/cookiecutter-pypackage]: https://github.com/tony/cookiecutter-pypackage -[@tasdomas]: https://github.com/tasdomas -[@sehe]: https://github.com/sehe -[@madprog]: https://github.com/madprog -[autoenv]: https://github.com/kennethreitz/autoenv -[entr(1)]: http://entrproject.org/ -[anaconda python]: http://docs.continuum.io/anaconda/index -[@estin]: https://github.com/estin -[sysutils/pytmuxp]: http://www.freshports.org/sysutils/py-tmuxp/ -[#201564]: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201564 -[colorama]: https://pypi.python.org/pypi/colorama -[@marbu]: https://github.com/marbu -[@yegortimoshenko]: https://github.com/yegortimoshenko -[@thomasballinger]: https://github.com/thomasballinger -[sniffer]: https://github.com/jeffh/sniffer -[watchingtestrunner]: https://pypi.python.org/pypi/watching_testrunner/1.0 -[@raine]: https://github.com/raine -[@techtonik]: https://github.com/techtonik -[@thiefmaster]: https://github.com/ThiefMaster -[pep 263]: http://www.python.org/dev/peps/pep-0263/ -[roxit]: https://github.com/roxit -[documentation in chinese]: http://tmuxp-zh.readthedocs.io -[wrongwaycn]: https://github.com/wrongwaycn -[tornado's log.py]: https://github.com/facebook/tornado/blob/master/tornado/log.py -[underscore.js]: http://underscorejs.org/ -[backbone.js]: http://backbonejs.org/ -[.get()]: http://backbonejs.org/#Collection-get -[.where()]: http://underscorejs.org/#where -[.findwhere()]: http://underscorejs.org/#findWhere -[libtmux]: https://github.com/tmux-python/libtmux - - +tmuxp switched to semver for early release numbering. From ad9c77b019fe6b42b6bc16a050aca1da3069e81e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 18:23:30 -0500 Subject: [PATCH 2851/2998] Tag v1.68.0 (libtmux 0.56.0) --- CHANGES | 4 +++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 5c77d12ee6..7a20ddd0b8 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.68.0 (Yet to be released) +## tmuxp 1.69.0 (Yet to be released) @@ -44,6 +44,8 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.68.0 (2026-05-10) + tmuxp 1.68.0 refreshes the documentation stack and developer workflow for the next release train. The docs now sit on the shared [gp-sphinx](https://gp-sphinx.git-pull.com/) platform, the API pages pick up the newer gp-furo visual language, and the test suite avoids paying for each contributor's interactive shell startup. The release also raises the libtmux floor so {ref}`tmuxp-shell` users can script against the expanded tmux command wrapper surface. ### Dependencies diff --git a/pyproject.toml b/pyproject.toml index fb5eb937b5..48272a5746 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.67.0" +version = "1.68.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 48ad3629a1..67acb4eed5 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.67.0" +__version__ = "1.68.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index b6280f3133..66783ec351 100644 --- a/uv.lock +++ b/uv.lock @@ -1606,7 +1606,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.67.0" +version = "1.68.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From b0d738ebe0bb5e93762c354bb470153e2a83e461 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 21:11:25 -0500 Subject: [PATCH 2852/2998] =?UTF-8?q?docs(deps[gp-sphinx])=20bump=200.0.1a?= =?UTF-8?q?17=20=E2=86=92=200.0.1a18.dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a18.dev0 ships the curated autodoc rendering work from PR git-pull/gp-sphinx#36 — default-value source text, identifier cross-references in parameter signatures, canonical field-list xrefs, responsive autodoc layout, and a workspace-wide linkcode_resolve factory. what: - bump every gp-sphinx workspace pin in pyproject.toml + uv.lock - add [tool.uv].prerelease = "allow" so uv resolves the *.dev0 pins --- pyproject.toml | 19 ++++++++---- uv.lock | 79 +++++++++++++++++++++++++------------------------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 48272a5746..ba0ca9b507 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a17", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a17", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a17", + "gp-sphinx==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a18.dev0", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a17", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a17", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a17", + "gp-sphinx==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a18.dev0", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -113,6 +113,13 @@ lint = [ requires = ["hatchling"] build-backend = "hatchling.build" +[tool.uv] +# `[DO NOT MERGE]`: gp-sphinx workspace ships on the 0.0.1a18.devN +# pre-release track until PR git-pull/gp-sphinx#36 is proven +# end-to-end. uv otherwise refuses to resolve `*.dev0` markers +# without this allow. +prerelease = "allow" + [tool.uv.exclude-newer-package] # git-pull packages release in lockstep with their workspaces, so a # fresh release blocking on the 3-day cooldown blocks every diff --git a/uv.lock b/uv.lock index 66783ec351..2ba2e9cb68 100644 --- a/uv.lock +++ b/uv.lock @@ -8,6 +8,7 @@ resolution-markers = [ ] [options] +prerelease-mode = "allow" exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" @@ -423,7 +424,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -433,9 +434,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/f1/1a75cc2d02a2c9da9063304270fd81012cccf0529657c897861d01f0f853/gp_furo_theme-0.0.1a17.tar.gz", hash = "sha256:3d3d634d9df214990a5d2aa33ab31ce64886ad2e631c76287ce9b1ea25d0a341", size = 33431, upload-time = "2026-05-09T10:05:57.41Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/81/b139789a38b3cccfc6203dc27a082ea5a04d9d41fc3a43c328928bf1a47a/gp_furo_theme-0.0.1a18.dev0.tar.gz", hash = "sha256:65fb3736b8b944e77eec19234b921610c44089fcef69a52fa12e63042bf8ae24", size = 33512, upload-time = "2026-05-11T02:02:55.1Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/ad/b75738a1a8ce51b2371bdb4c556dbc9f83c2192511c52bffff4dc76d6b31/gp_furo_theme-0.0.1a17-py3-none-any.whl", hash = "sha256:2868c310f62b03e27a4daa191fc95f57d4a7baacac0a614b103a810119be1af0", size = 42735, upload-time = "2026-05-09T10:05:33.412Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0f/54af170559cd1699b66258603a369662bf504c901a4e8fcfd35c90c0c38a/gp_furo_theme-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:70209ff27768c4233053b8ef7ebd3e267798c2430c51ee96a26728eb528f1391", size = 42873, upload-time = "2026-05-11T02:02:34.32Z" }, ] [[package]] @@ -454,7 +455,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -475,9 +476,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/b9/5d99d315c8fb36a9af2cb3901f7d1a4cdaa4fcbcd1c271b927aff0b056d3/gp_sphinx-0.0.1a17.tar.gz", hash = "sha256:976b3ddc529cc2792b2d31acd8f24083e7db18ffab60ee7151d40371c45d3570", size = 18516, upload-time = "2026-05-09T10:05:58.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/a0/40bb998a11639ff52cb59e9a080d8f24f7dab989b92ec756b18cac415e9c/gp_sphinx-0.0.1a18.dev0.tar.gz", hash = "sha256:19fb580cd52563fc705b31538ec196ac50285b94bbf28c83126655c3eae05a11", size = 19539, upload-time = "2026-05-11T02:02:56.238Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/57/96ddfeab4af002be9cc7a40cd39a8730c4d99b0448e5dcef18a01b324275/gp_sphinx-0.0.1a17-py3-none-any.whl", hash = "sha256:a4bb3311e2748f91da9a1299d5b6e9c71475024824e563611b20ce6e37174eba", size = 18980, upload-time = "2026-05-09T10:05:35.153Z" }, + { url = "https://files.pythonhosted.org/packages/06/0b/100b54a1ef4394dff6fa402151a263e05fc48c77c19c70d5c2114cedbaab/gp_sphinx-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:415461dea0554370da2c54c3764f1a99908ca99a5009982812956d89863a3e2b", size = 20081, upload-time = "2026-05-11T02:02:36.038Z" }, ] [[package]] @@ -1334,7 +1335,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1342,14 +1343,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/6e/0818edd3024997e53be5db981bba6e40cc9b176b326e3a67ddc8d3b40ba9/sphinx_autodoc_api_style-0.0.1a17.tar.gz", hash = "sha256:10b58f1071498b34b68fea77df2787efe39a6335beb42acf621fc88028154517", size = 8296, upload-time = "2026-05-09T10:06:00.279Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/de/397c6d90c8f3f131bc8d172798b8708c6523b2e497bbdbbd15e262a8568c/sphinx_autodoc_api_style-0.0.1a18.dev0.tar.gz", hash = "sha256:275a89d2ccce3c43709d01734b814ad774f7f8a0094d3e8591906b7011be3adf", size = 8986, upload-time = "2026-05-11T02:02:57.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/f6/aca230523ab055b4e8e652034802237a80cb250648f83a2e3b97fb3d4bfa/sphinx_autodoc_api_style-0.0.1a17-py3-none-any.whl", hash = "sha256:85848088c93adb18f757752856ecbf7f8f0db26939701099ed917dadc9694de8", size = 8308, upload-time = "2026-05-09T10:05:36.797Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7f/7b8c100177db7fc10ce27d4367025a9ecaae00365ab45467f510db45b29a/sphinx_autodoc_api_style-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:089b62e96161a8686672f7789b5c94f8b763c4dace46a9875503191196e29ebf", size = 9102, upload-time = "2026-05-11T02:02:37.495Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1357,22 +1358,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/45/4c2710e16893305675589c9a439fc938fe9d01ad4a2444b44617ff689d1e/sphinx_autodoc_argparse-0.0.1a17.tar.gz", hash = "sha256:c6ab49e9a15e20bf20c5d3bca11e4478b3af72546a890df162f904a4882d4a50", size = 42459, upload-time = "2026-05-09T10:06:01.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/60/dd2201f93e1bbce95fb984cc30742da0212c1f86168f4a44dcdee93bed3a/sphinx_autodoc_argparse-0.0.1a18.dev0.tar.gz", hash = "sha256:d0e94de2a761516b67e2eb889797dbf7a05194e7b6a7eef420a209ce3bb5249b", size = 42479, upload-time = "2026-05-11T02:02:57.864Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/d3/2b00ae5f73a1deb838da9fd5f30a5328c85559b8281612df3f0683dba215/sphinx_autodoc_argparse-0.0.1a17-py3-none-any.whl", hash = "sha256:f6355aef4493173eab4ddcedbdab0b5376a48e7a557d07b8a062ee025fc9552b", size = 47275, upload-time = "2026-05-09T10:05:38.422Z" }, + { url = "https://files.pythonhosted.org/packages/2d/08/ed8b89a2327d80c13b8c5a9f8868ba760178e9de2e59ddcea3c937206e1f/sphinx_autodoc_argparse-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:f87dab5ab41e166c0657316362eeef9f88d945c61bd19489466e4806a517de9e", size = 47317, upload-time = "2026-05-11T02:02:38.553Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/2b/e1341a8be6c457a9fbab67e6cc91dfdcfa20f6aad7f8311b0e94246a4b07/sphinx_autodoc_typehints_gp-0.0.1a17.tar.gz", hash = "sha256:eb74bb993a8437b97bf3ad6b84b990646a032ad0123f76dfc2d046ac17ad4265", size = 18587, upload-time = "2026-05-09T10:06:06.99Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/2d/e856f878ecb4ae066c41ecf40d9cf641dd29ca0bdc4669d7a31a3ef9c08e/sphinx_autodoc_typehints_gp-0.0.1a18.dev0.tar.gz", hash = "sha256:a91e9f577c66755b6915a11d55ed7f2620cffb49e7df8f0dda83f8aa223e2725", size = 36438, upload-time = "2026-05-11T02:03:03.144Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/1c/ab3a668ada94871728582d161ef376095665958ec51d663e6337fb7dc1d1/sphinx_autodoc_typehints_gp-0.0.1a17-py3-none-any.whl", hash = "sha256:7452c6e6740e2d9defbe7a22e3273586927a8b132ba2a0fd52bca1f68e1d8231", size = 19009, upload-time = "2026-05-09T10:05:45.776Z" }, + { url = "https://files.pythonhosted.org/packages/67/9d/af8d3c20e0c2337ae683ff3f09f89573624c289423358ee25d976cbae567/sphinx_autodoc_typehints_gp-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:63990bd56b346daa77d03f8a01c66624f355ede12f3db9c2567759279a9a4733", size = 38550, upload-time = "2026-05-11T02:02:45.5Z" }, ] [[package]] @@ -1434,55 +1435,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/72/e1b365ebeffd7b3c494628e6730b91ed2dfbe4fb2cac6d496263de383344/sphinx_fonts-0.0.1a17.tar.gz", hash = "sha256:c5138145cd2b3af3024e155add69d9eb9201dfb0e887af77fe8d0e2990f4ba3b", size = 5788, upload-time = "2026-05-09T10:06:07.934Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/79/933fab3f10e2ef97beb4acda4a4d1298711151c4538faf9064a5f9931c07/sphinx_fonts-0.0.1a18.dev0.tar.gz", hash = "sha256:4ef0a5ed42093ca6b40268b71fc2ecff249be28d2515fa320a64aab81aeb4d93", size = 5791, upload-time = "2026-05-11T02:03:03.982Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/ae/0ee78cab53f2d864e3d765c141f577a0c9928cb764fd77eca340cce51262/sphinx_fonts-0.0.1a17-py3-none-any.whl", hash = "sha256:835d74e89aae56a96f034ea002fa322ba6dc9b87304c15cfc514d1ff5f7733d1", size = 4363, upload-time = "2026-05-09T10:05:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3d/a530ab979776d8f515a0baceff9de37c4526729eb929124320e3dbff7099/sphinx_fonts-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:055cb87411f299365a69dd0d37b8409c666a5bde491818b0345bb04e36ef8ba6", size = 4404, upload-time = "2026-05-11T02:02:46.615Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/fa/c0f3d81529d7f1bd25e58ffbbf9a033f3a812edf9b47c20e494f03916769/sphinx_gp_opengraph-0.0.1a17.tar.gz", hash = "sha256:7977856c45d7b60cbb14d7a892e17d2ea306dcd713062108aede8a790a592a4b", size = 11947, upload-time = "2026-05-09T10:06:08.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/e6/e15eefaa923bb69ffe2198438d6c82f6fbe6efaf0228d315a56f8380f262/sphinx_gp_opengraph-0.0.1a18.dev0.tar.gz", hash = "sha256:07e0cd6d12c8ea2a8953e745864366c23905f81a521e82adbed986f3afaf46eb", size = 11946, upload-time = "2026-05-11T02:03:04.772Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/7d/719d93a65c363a687eb1dca92a6bb093acbdf64cb0671adbf83c0ab3df98/sphinx_gp_opengraph-0.0.1a17-py3-none-any.whl", hash = "sha256:769b00d1eea11c44ccd5bd67fc02554905751d96ba2a2f342e96ab1a009f0a33", size = 12184, upload-time = "2026-05-09T10:05:48.761Z" }, + { url = "https://files.pythonhosted.org/packages/fd/f3/0a5992ccdbf8032bc0d6e79da87dfa0c46f6cdeb9423aaffccafcb5b8392/sphinx_gp_opengraph-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:7de5af310088a54fbb4001b70fa1bb2728a69ea2e661ef270c6fe06846767e4f", size = 12226, upload-time = "2026-05-11T02:02:48.142Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7d/2119503abf54b6dc8baadced9a854ffc78a085b25bf8a24740437b1d4859/sphinx_gp_sitemap-0.0.1a17.tar.gz", hash = "sha256:588709e5e84497803528a09d90f2dd3b9536026f4a80f9dd45dad076f107198b", size = 9956, upload-time = "2026-05-09T10:06:09.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/40/bd9268d49f9c1648a44e554da7a16eb7b3371149bf3e3cae94d9b83a4009/sphinx_gp_sitemap-0.0.1a18.dev0.tar.gz", hash = "sha256:496ce73e0b7afac69e5e01dcd90be74681b3112dbc62ac0bf18cfb58005465e5", size = 9961, upload-time = "2026-05-11T02:03:05.797Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/d0/1d82d17811b189d30f953ba1630f17d959efa53849fe12b2efc350328892/sphinx_gp_sitemap-0.0.1a17-py3-none-any.whl", hash = "sha256:214b903689f8027c3e10906a5dbf873f1f5151b859c9cf47a75cf521322528c6", size = 8985, upload-time = "2026-05-09T10:05:50.033Z" }, + { url = "https://files.pythonhosted.org/packages/db/e7/577a94ffaeb868fe2e4217fb40e2366e8e3d9cceb897d9059f5ba7495a5f/sphinx_gp_sitemap-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:cf68680a7cfebbe56e4f9c067d4bc73258e08389daaa18d363dd4a5031637346", size = 9027, upload-time = "2026-05-11T02:02:49.207Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/07/13c5ef75c0034732e79dc9fec7295d80419b5f325d210abb6f4ac60c54bb/sphinx_gp_theme-0.0.1a17.tar.gz", hash = "sha256:b27dd1071bb070d946b2d54f2ebae1f6ac3e96a752bd16d5449e6da72e50d54d", size = 18040, upload-time = "2026-05-09T10:06:10.888Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/18/f522a940f9468bf49e891e0e15276532c1c0f0ec6c816bdaad20b166efb4/sphinx_gp_theme-0.0.1a18.dev0.tar.gz", hash = "sha256:8d68fc508555709a8023a5b5caef50acb9431198df0d9931339a62c0a9cfc1d3", size = 18222, upload-time = "2026-05-11T02:03:06.577Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/86/95bc9410ba5df636c756ea2500a04061ed6e9ad960dfe01e04909e6085fc/sphinx_gp_theme-0.0.1a17-py3-none-any.whl", hash = "sha256:f49aa5f34ca534140a2f17149d912de2836237f59441678d0f4965edb6a9304b", size = 19610, upload-time = "2026-05-09T10:05:51.215Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a4/e8f7888e68a564a6a02c3e41d4eba5ba21b82150b1adc22a8e5bbfdff429/sphinx_gp_theme-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:5faf8fceb25346583a62dfb69dc3c30f2e7d394f52c4ff0e6807b2c1374bcca2", size = 19870, upload-time = "2026-05-11T02:02:50.299Z" }, ] [[package]] @@ -1500,28 +1501,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/20/ad0b557f63a4d708f24d20347de53f1e592b1142ec01a19ffae673c0d470/sphinx_ux_autodoc_layout-0.0.1a17.tar.gz", hash = "sha256:001333f0ce166630ccb41b4500d4d2e1f837d5e060cbe2e7b2aa669b394e34e6", size = 21467, upload-time = "2026-05-09T10:06:11.86Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/99/b5c8e7e61759f22e8b118435ae5d16d6b6f37d3af9af11cb875403326dbe/sphinx_ux_autodoc_layout-0.0.1a18.dev0.tar.gz", hash = "sha256:32d369cf744ad47ea6072959d3492154efd189fec3830d90709d84b52524a29f", size = 29109, upload-time = "2026-05-11T02:03:07.448Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/59/7d0930f5c23dc03d5bd0c9e33d94d3a06dbd803138d167161f36b1a7d342/sphinx_ux_autodoc_layout-0.0.1a17-py3-none-any.whl", hash = "sha256:8fec752202d683608ac91e2d58bace793c870be83a90cb391f132922e076110d", size = 25144, upload-time = "2026-05-09T10:05:52.592Z" }, + { url = "https://files.pythonhosted.org/packages/49/8f/26603ee78767f88a88f91dd974951d129a2609a0b3adbf3da447969f260e/sphinx_ux_autodoc_layout-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:e35570bd8d46785d5e02564ab1f61698cf3dd38bc12cec3b8c5c10c0444671e2", size = 33110, upload-time = "2026-05-11T02:02:51.422Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a17" +version = "0.0.1a18.dev0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/6b/753df32ceb23f0457ae2119b4668aaf6f7c568b25718ab9dd4d931a0e6ac/sphinx_ux_badges-0.0.1a17.tar.gz", hash = "sha256:0833fdae7e5b443eb298712170929bb8b19d4cd027033c7348573693a2940a06", size = 15417, upload-time = "2026-05-09T10:06:12.823Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/4b/86ad32d31ccf91a90a4bf35a782a2820ebd856e133852750c289a59e98b5/sphinx_ux_badges-0.0.1a18.dev0.tar.gz", hash = "sha256:2ee8e7abe0be36c0232f744752e0bc51fa5e53449b39b1259d4d44b4293c465c", size = 15570, upload-time = "2026-05-11T02:03:08.595Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/46/a07c367fab1420e342d6e04d49268b1c33d410097c313cd725947e0008b6/sphinx_ux_badges-0.0.1a17-py3-none-any.whl", hash = "sha256:3e5d01b493c9b73078d17036840706b394c4f542ac8f4647dcf8b2a69efbee9c", size = 16280, upload-time = "2026-05-09T10:05:54.239Z" }, + { url = "https://files.pythonhosted.org/packages/3f/1a/15459a1e42b46fde653b3243aa71799752fa78f4077da841e772dbb66cac/sphinx_ux_badges-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:c00687ae6acc3ad4e6befc293eabc1ed5ce4d9cb90abb8c48696f1a1190d7c12", size = 16489, upload-time = "2026-05-11T02:02:52.854Z" }, ] [[package]] @@ -1683,7 +1684,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a17" }, + { name = "gp-sphinx", specifier = "==0.0.1a18.dev0" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1693,8 +1694,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a17" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a17" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18.dev0" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18.dev0" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1702,11 +1703,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a17" }, + { name = "gp-sphinx", specifier = "==0.0.1a18.dev0" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a17" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a17" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18.dev0" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18.dev0" }, ] lint = [ { name = "mypy" }, From 65ce12c3c63edf564a63ef59ec9a24183a931c6e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 10 May 2026 21:35:33 -0500 Subject: [PATCH 2853/2998] =?UTF-8?q?release(deps[gp-sphinx])=20bump=200.0?= =?UTF-8?q?.1a18.dev0=20=E2=86=92=200.0.1a18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a18 is now live on PyPI with the curated autodoc rendering work from PR git-pull/gp-sphinx#36 (merged to main). The dev0 scaffolding can come out. what: - bump every gp-sphinx workspace pin from 0.0.1a18.dev0 to 0.0.1a18 - remove [tool.uv].prerelease = "allow" — no longer needed now that the dev marker is gone --- pyproject.toml | 19 ++++------- uv.lock | 87 +++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 57 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ba0ca9b507..15635a2a0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a18.dev0", + "gp-sphinx==0.0.1a18", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a18", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a18", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a18.dev0", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a18.dev0", + "gp-sphinx==0.0.1a18", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a18", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a18", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -113,13 +113,6 @@ lint = [ requires = ["hatchling"] build-backend = "hatchling.build" -[tool.uv] -# `[DO NOT MERGE]`: gp-sphinx workspace ships on the 0.0.1a18.devN -# pre-release track until PR git-pull/gp-sphinx#36 is proven -# end-to-end. uv otherwise refuses to resolve `*.dev0` markers -# without this allow. -prerelease = "allow" - [tool.uv.exclude-newer-package] # git-pull packages release in lockstep with their workspaces, so a # fresh release blocking on the 3-day cooldown blocks every diff --git a/uv.lock b/uv.lock index 2ba2e9cb68..38b964ce1f 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,6 @@ resolution-markers = [ ] [options] -prerelease-mode = "allow" exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P3D" @@ -415,7 +414,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -424,7 +423,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -434,9 +433,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/81/b139789a38b3cccfc6203dc27a082ea5a04d9d41fc3a43c328928bf1a47a/gp_furo_theme-0.0.1a18.dev0.tar.gz", hash = "sha256:65fb3736b8b944e77eec19234b921610c44089fcef69a52fa12e63042bf8ae24", size = 33512, upload-time = "2026-05-11T02:02:55.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/ba/6178b21a784644a1eb613a58db1e06e206f3ceab706a444ff7901d390b69/gp_furo_theme-0.0.1a18.tar.gz", hash = "sha256:8b46c2bcd1f9bd8f315e70e08e38dfd3f9585bcec803b1ad0aabe626bb86a4ff", size = 33502, upload-time = "2026-05-11T02:23:36.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/0f/54af170559cd1699b66258603a369662bf504c901a4e8fcfd35c90c0c38a/gp_furo_theme-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:70209ff27768c4233053b8ef7ebd3e267798c2430c51ee96a26728eb528f1391", size = 42873, upload-time = "2026-05-11T02:02:34.32Z" }, + { url = "https://files.pythonhosted.org/packages/17/a1/8b9beebfa9113e0bc484fd3d1e75088510fe9cac42ea48a5126269221cdb/gp_furo_theme-0.0.1a18-py3-none-any.whl", hash = "sha256:071c18f2b3b79c266c2a56c6f29df9144548714930defbc5aae9807dfd850171", size = 42813, upload-time = "2026-05-11T02:23:14.178Z" }, ] [[package]] @@ -455,7 +454,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -476,9 +475,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/a0/40bb998a11639ff52cb59e9a080d8f24f7dab989b92ec756b18cac415e9c/gp_sphinx-0.0.1a18.dev0.tar.gz", hash = "sha256:19fb580cd52563fc705b31538ec196ac50285b94bbf28c83126655c3eae05a11", size = 19539, upload-time = "2026-05-11T02:02:56.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/da/d4452b03d2ed91991dc5a7bb6112b7d6c845f9b184df35b5eb6d5ee9e40f/gp_sphinx-0.0.1a18.tar.gz", hash = "sha256:47bbf475230b242f01c7802a070d50d1b8b580a3485d6ff4d3073ef7a8a960d4", size = 19537, upload-time = "2026-05-11T02:23:37.175Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0b/100b54a1ef4394dff6fa402151a263e05fc48c77c19c70d5c2114cedbaab/gp_sphinx-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:415461dea0554370da2c54c3764f1a99908ca99a5009982812956d89863a3e2b", size = 20081, upload-time = "2026-05-11T02:02:36.038Z" }, + { url = "https://files.pythonhosted.org/packages/e5/cb/b44c7f4eaa8d8bf8490ac83b7ab073cca8f3e178d37ad74009b663004a61/gp_sphinx-0.0.1a18-py3-none-any.whl", hash = "sha256:57950a1d630b7437c7143a93d933d62bbccfddd055af4f5dad0bfd73ffd97038", size = 20033, upload-time = "2026-05-11T02:23:15.391Z" }, ] [[package]] @@ -1335,7 +1334,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1343,14 +1342,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/de/397c6d90c8f3f131bc8d172798b8708c6523b2e497bbdbbd15e262a8568c/sphinx_autodoc_api_style-0.0.1a18.dev0.tar.gz", hash = "sha256:275a89d2ccce3c43709d01734b814ad774f7f8a0094d3e8591906b7011be3adf", size = 8986, upload-time = "2026-05-11T02:02:57.048Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/0c/cd4d6481374ce9cb9ab3112593f94cc03d0ab1d37324dc7f0451c571cdc5/sphinx_autodoc_api_style-0.0.1a18.tar.gz", hash = "sha256:93169e01c2b2957e1308822bbc92c4b16231996bb415295f64425ca6b5594212", size = 8976, upload-time = "2026-05-11T02:23:38.022Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7f/7b8c100177db7fc10ce27d4367025a9ecaae00365ab45467f510db45b29a/sphinx_autodoc_api_style-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:089b62e96161a8686672f7789b5c94f8b763c4dace46a9875503191196e29ebf", size = 9102, upload-time = "2026-05-11T02:02:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/bc/3c/ebad54ba8bdd66689341b957e72442da0f8b134aa83df18bb6076d1ee33e/sphinx_autodoc_api_style-0.0.1a18-py3-none-any.whl", hash = "sha256:e2320b6d5a0b03f91041cd9f40e7f7c42c33080ced0dc6679f0f515b4b504ba3", size = 9065, upload-time = "2026-05-11T02:23:16.582Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1358,22 +1357,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/60/dd2201f93e1bbce95fb984cc30742da0212c1f86168f4a44dcdee93bed3a/sphinx_autodoc_argparse-0.0.1a18.dev0.tar.gz", hash = "sha256:d0e94de2a761516b67e2eb889797dbf7a05194e7b6a7eef420a209ce3bb5249b", size = 42479, upload-time = "2026-05-11T02:02:57.864Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/af/0702370bd444dc4fd0e15e8e30137d7572870e7dc680587cad94dc62a9ff/sphinx_autodoc_argparse-0.0.1a18.tar.gz", hash = "sha256:3dc040b21b978c05bf4aab4c9108593d4f88dbe0ab81f0d7f8fd587ba4edf73e", size = 42457, upload-time = "2026-05-11T02:23:38.839Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/08/ed8b89a2327d80c13b8c5a9f8868ba760178e9de2e59ddcea3c937206e1f/sphinx_autodoc_argparse-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:f87dab5ab41e166c0657316362eeef9f88d945c61bd19489466e4806a517de9e", size = 47317, upload-time = "2026-05-11T02:02:38.553Z" }, + { url = "https://files.pythonhosted.org/packages/b4/be/15748463600101a82b09013dae21c1d12437615a38a11d9bfa6de9ade5f3/sphinx_autodoc_argparse-0.0.1a18-py3-none-any.whl", hash = "sha256:51aa8e550a467cd3c94e6f7832eccb87f77264652293aef3bac9dfba519814b6", size = 47275, upload-time = "2026-05-11T02:23:17.771Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/2d/e856f878ecb4ae066c41ecf40d9cf641dd29ca0bdc4669d7a31a3ef9c08e/sphinx_autodoc_typehints_gp-0.0.1a18.dev0.tar.gz", hash = "sha256:a91e9f577c66755b6915a11d55ed7f2620cffb49e7df8f0dda83f8aa223e2725", size = 36438, upload-time = "2026-05-11T02:03:03.144Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/cf/08843e9c877fa5e3ea90f286fa3e6dc3999b19c429c561b75d2aabb18d00/sphinx_autodoc_typehints_gp-0.0.1a18.tar.gz", hash = "sha256:c9e92ca14e038d85545357a175ff04d7f3469446dae270185a582b2704e39355", size = 36364, upload-time = "2026-05-11T02:23:44.019Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/9d/af8d3c20e0c2337ae683ff3f09f89573624c289423358ee25d976cbae567/sphinx_autodoc_typehints_gp-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:63990bd56b346daa77d03f8a01c66624f355ede12f3db9c2567759279a9a4733", size = 38550, upload-time = "2026-05-11T02:02:45.5Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c9/3b4682b23435136adcf8e3a3578aa4e0d09e2f5ba7437f658764744daf80/sphinx_autodoc_typehints_gp-0.0.1a18-py3-none-any.whl", hash = "sha256:3aebf97911f5c9d90b924f87bee7fe1ab523c9407eeadefd9b7d575166bd1c81", size = 38509, upload-time = "2026-05-11T02:23:25.274Z" }, ] [[package]] @@ -1435,55 +1434,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/79/933fab3f10e2ef97beb4acda4a4d1298711151c4538faf9064a5f9931c07/sphinx_fonts-0.0.1a18.dev0.tar.gz", hash = "sha256:4ef0a5ed42093ca6b40268b71fc2ecff249be28d2515fa320a64aab81aeb4d93", size = 5791, upload-time = "2026-05-11T02:03:03.982Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2c/afe37dc06e97a42e0bf3a4030710653fae2f21362ed344cb3d5bf25d3b1e/sphinx_fonts-0.0.1a18.tar.gz", hash = "sha256:c7b76664eebbc91c5882de912dcbf332a58b415bcf29f29ce90a76f5f30cd954", size = 5789, upload-time = "2026-05-11T02:23:44.878Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/3d/a530ab979776d8f515a0baceff9de37c4526729eb929124320e3dbff7099/sphinx_fonts-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:055cb87411f299365a69dd0d37b8409c666a5bde491818b0345bb04e36ef8ba6", size = 4404, upload-time = "2026-05-11T02:02:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a1/c65c34aa562cc09a2aa426e648372a8dcb91cead1ac01241002b729dc74a/sphinx_fonts-0.0.1a18-py3-none-any.whl", hash = "sha256:aa4d8c110b6b3fde2a508e05121958e0eca72cd0c1dc70dd12c90cc7ecbc225b", size = 4360, upload-time = "2026-05-11T02:23:26.417Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/e6/e15eefaa923bb69ffe2198438d6c82f6fbe6efaf0228d315a56f8380f262/sphinx_gp_opengraph-0.0.1a18.dev0.tar.gz", hash = "sha256:07e0cd6d12c8ea2a8953e745864366c23905f81a521e82adbed986f3afaf46eb", size = 11946, upload-time = "2026-05-11T02:03:04.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/ef/f19b191f1343a2e6132fb4b0141ccfdae5db18d0d6826ca312816b66e4c1/sphinx_gp_opengraph-0.0.1a18.tar.gz", hash = "sha256:d50dd7fe2dbfbc4f67b0f8850944ae0671b7c34b86af3feeec87680394c710c3", size = 11945, upload-time = "2026-05-11T02:23:45.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/f3/0a5992ccdbf8032bc0d6e79da87dfa0c46f6cdeb9423aaffccafcb5b8392/sphinx_gp_opengraph-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:7de5af310088a54fbb4001b70fa1bb2728a69ea2e661ef270c6fe06846767e4f", size = 12226, upload-time = "2026-05-11T02:02:48.142Z" }, + { url = "https://files.pythonhosted.org/packages/74/39/8257951f05120c2a4744b2a1fd8d31a6b022094b087fef15a6541e402087/sphinx_gp_opengraph-0.0.1a18-py3-none-any.whl", hash = "sha256:c205b5f3cd91fd01c710e93e25f3a6f45771c227cc45ecf60554b77a1102ef86", size = 12185, upload-time = "2026-05-11T02:23:27.656Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/40/bd9268d49f9c1648a44e554da7a16eb7b3371149bf3e3cae94d9b83a4009/sphinx_gp_sitemap-0.0.1a18.dev0.tar.gz", hash = "sha256:496ce73e0b7afac69e5e01dcd90be74681b3112dbc62ac0bf18cfb58005465e5", size = 9961, upload-time = "2026-05-11T02:03:05.797Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/41/bf88bd6103b77fada6dfed4dc8a2e9ab8f24b09fbe8b2d96acbd55952042/sphinx_gp_sitemap-0.0.1a18.tar.gz", hash = "sha256:c5935a8bfbeb1df586ed1e119b85ff38615779f34495ca265f667f71662297db", size = 9957, upload-time = "2026-05-11T02:23:46.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/e7/577a94ffaeb868fe2e4217fb40e2366e8e3d9cceb897d9059f5ba7495a5f/sphinx_gp_sitemap-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:cf68680a7cfebbe56e4f9c067d4bc73258e08389daaa18d363dd4a5031637346", size = 9027, upload-time = "2026-05-11T02:02:49.207Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9e/1b7a543db5a7862c726375aca53c4cffa6788f1f7e62484be5b1df9d0ded/sphinx_gp_sitemap-0.0.1a18-py3-none-any.whl", hash = "sha256:81418fbcc30c19821ecc2fc913794407c69bca5d6a3df48516f7e8ab9920be9e", size = 8982, upload-time = "2026-05-11T02:23:29.055Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/18/f522a940f9468bf49e891e0e15276532c1c0f0ec6c816bdaad20b166efb4/sphinx_gp_theme-0.0.1a18.dev0.tar.gz", hash = "sha256:8d68fc508555709a8023a5b5caef50acb9431198df0d9931339a62c0a9cfc1d3", size = 18222, upload-time = "2026-05-11T02:03:06.577Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/ea/f3b5cb3b61edfd46409d7c849c65819b361890f82f3f1caec64ec8b36267/sphinx_gp_theme-0.0.1a18.tar.gz", hash = "sha256:b3b45c72a07405a2a7aa7100f1324716e346eb66a451f4b016c13f7248fdd1b7", size = 18220, upload-time = "2026-05-11T02:23:47.671Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/a4/e8f7888e68a564a6a02c3e41d4eba5ba21b82150b1adc22a8e5bbfdff429/sphinx_gp_theme-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:5faf8fceb25346583a62dfb69dc3c30f2e7d394f52c4ff0e6807b2c1374bcca2", size = 19870, upload-time = "2026-05-11T02:02:50.299Z" }, + { url = "https://files.pythonhosted.org/packages/b5/96/db2a18c9ff7ce42970de3df73e72d51a6c4de7066de223ee7e9eaaa6854d/sphinx_gp_theme-0.0.1a18-py3-none-any.whl", hash = "sha256:8179775890181315d28a9e9438d9885b2ca48f818689a60797737a98050c6fc0", size = 19817, upload-time = "2026-05-11T02:23:30.497Z" }, ] [[package]] @@ -1501,28 +1500,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/99/b5c8e7e61759f22e8b118435ae5d16d6b6f37d3af9af11cb875403326dbe/sphinx_ux_autodoc_layout-0.0.1a18.dev0.tar.gz", hash = "sha256:32d369cf744ad47ea6072959d3492154efd189fec3830d90709d84b52524a29f", size = 29109, upload-time = "2026-05-11T02:03:07.448Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/7b/c9065f265e7046ce3f3655417ce10d9bda55e8ab975e4f6ac661afac4d50/sphinx_ux_autodoc_layout-0.0.1a18.tar.gz", hash = "sha256:deffcffd5147afdacb44751b604ecbfe50c50a1722e35281ec05393e06be81a7", size = 29098, upload-time = "2026-05-11T02:23:48.892Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/8f/26603ee78767f88a88f91dd974951d129a2609a0b3adbf3da447969f260e/sphinx_ux_autodoc_layout-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:e35570bd8d46785d5e02564ab1f61698cf3dd38bc12cec3b8c5c10c0444671e2", size = 33110, upload-time = "2026-05-11T02:02:51.422Z" }, + { url = "https://files.pythonhosted.org/packages/cb/30/952a3207d1d689dcca3dfa8a4a512b41b5a6531be673fece6ca2966a8386/sphinx_ux_autodoc_layout-0.0.1a18-py3-none-any.whl", hash = "sha256:d50bd77c2c38b0d496d700076ecd1fe680705afc235129256b6098a5810a7afb", size = 33068, upload-time = "2026-05-11T02:23:31.635Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a18.dev0" +version = "0.0.1a18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/4b/86ad32d31ccf91a90a4bf35a782a2820ebd856e133852750c289a59e98b5/sphinx_ux_badges-0.0.1a18.dev0.tar.gz", hash = "sha256:2ee8e7abe0be36c0232f744752e0bc51fa5e53449b39b1259d4d44b4293c465c", size = 15570, upload-time = "2026-05-11T02:03:08.595Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/73/a81b7dc6f4c722e4c9f3170e95ccdbe291d8e33e386303523dfe822df346/sphinx_ux_badges-0.0.1a18.tar.gz", hash = "sha256:7e7f2bbd82a3948336289ef854e90cdf367eda760371df031a175166d72a4b18", size = 15570, upload-time = "2026-05-11T02:23:49.814Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/1a/15459a1e42b46fde653b3243aa71799752fa78f4077da841e772dbb66cac/sphinx_ux_badges-0.0.1a18.dev0-py3-none-any.whl", hash = "sha256:c00687ae6acc3ad4e6befc293eabc1ed5ce4d9cb90abb8c48696f1a1190d7c12", size = 16489, upload-time = "2026-05-11T02:02:52.854Z" }, + { url = "https://files.pythonhosted.org/packages/10/8a/9b51c80a52686d27662844561c02cb9e412518a6e17b5ab13fd277cc5f4a/sphinx_ux_badges-0.0.1a18-py3-none-any.whl", hash = "sha256:978320cce8b8b4f5b821fd622e7bd19970c5f5e81cc022e630372e5433d51585", size = 16446, upload-time = "2026-05-11T02:23:33.109Z" }, ] [[package]] @@ -1684,7 +1683,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a18.dev0" }, + { name = "gp-sphinx", specifier = "==0.0.1a18" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1694,8 +1693,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18.dev0" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18.dev0" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1703,11 +1702,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a18.dev0" }, + { name = "gp-sphinx", specifier = "==0.0.1a18" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18.dev0" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18.dev0" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18" }, ] lint = [ { name = "mypy" }, @@ -1828,11 +1827,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] From 4d9cc0a1d35f5c10644b04fba82a473ec297b011 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 16 May 2026 04:38:47 -0500 Subject: [PATCH 2854/2998] .tool-versions(uv) uv 0.11.12 -> 0.11.14 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.14 - https://github.com/astral-sh/uv/blob/0.11.14/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 298af84d17..5a4b485889 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.50 -uv 0.11.12 +uv 0.11.14 python 3.14 3.13 3.12 3.11 3.10 From 00345a769f020b224b293d6107c6406223dfe5c0 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 16 May 2026 04:39:34 -0500 Subject: [PATCH 2855/2998] py(deps[dev]) Bump dev packages --- uv.lock | 524 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 262 insertions(+), 262 deletions(-) diff --git a/uv.lock b/uv.lock index 38b964ce1f..5646e14f0b 100644 --- a/uv.lock +++ b/uv.lock @@ -284,115 +284,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.13.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/33/e8c48488c29a73fd089f9d71f9653c1be7478f2ad6b5bc870db11a55d23d/coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5", size = 219255, upload-time = "2026-03-17T10:29:51.081Z" }, - { url = "https://files.pythonhosted.org/packages/da/bd/b0ebe9f677d7f4b74a3e115eec7ddd4bcf892074963a00d91e8b164a6386/coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf", size = 219772, upload-time = "2026-03-17T10:29:52.867Z" }, - { url = "https://files.pythonhosted.org/packages/48/cc/5cb9502f4e01972f54eedd48218bb203fe81e294be606a2bc93970208013/coverage-7.13.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8", size = 246532, upload-time = "2026-03-17T10:29:54.688Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d8/3217636d86c7e7b12e126e4f30ef1581047da73140614523af7495ed5f2d/coverage-7.13.5-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4", size = 248333, upload-time = "2026-03-17T10:29:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/2b/30/2002ac6729ba2d4357438e2ed3c447ad8562866c8c63fc16f6dfc33afe56/coverage-7.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d", size = 250211, upload-time = "2026-03-17T10:29:57.938Z" }, - { url = "https://files.pythonhosted.org/packages/6c/85/552496626d6b9359eb0e2f86f920037c9cbfba09b24d914c6e1528155f7d/coverage-7.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930", size = 252125, upload-time = "2026-03-17T10:29:59.388Z" }, - { url = "https://files.pythonhosted.org/packages/44/21/40256eabdcbccdb6acf6b381b3016a154399a75fe39d406f790ae84d1f3c/coverage-7.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d", size = 247219, upload-time = "2026-03-17T10:30:01.199Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/96e2a6c3f21a0ea77d7830b254a1542d0328acc8d7bdf6a284ba7e529f77/coverage-7.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40", size = 248248, upload-time = "2026-03-17T10:30:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/da/ba/8477f549e554827da390ec659f3c38e4b6d95470f4daafc2d8ff94eaa9c2/coverage-7.13.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878", size = 246254, upload-time = "2026-03-17T10:30:04.832Z" }, - { url = "https://files.pythonhosted.org/packages/55/59/bc22aef0e6aa179d5b1b001e8b3654785e9adf27ef24c93dc4228ebd5d68/coverage-7.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400", size = 250067, upload-time = "2026-03-17T10:30:06.535Z" }, - { url = "https://files.pythonhosted.org/packages/de/1b/c6a023a160806a5137dca53468fd97530d6acad24a22003b1578a9c2e429/coverage-7.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0", size = 246521, upload-time = "2026-03-17T10:30:08.486Z" }, - { url = "https://files.pythonhosted.org/packages/2d/3f/3532c85a55aa2f899fa17c186f831cfa1aa434d88ff792a709636f64130e/coverage-7.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0", size = 247126, upload-time = "2026-03-17T10:30:09.966Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2e/b9d56af4a24ef45dfbcda88e06870cb7d57b2b0bfa3a888d79b4c8debd76/coverage-7.13.5-cp310-cp310-win32.whl", hash = "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58", size = 221860, upload-time = "2026-03-17T10:30:11.393Z" }, - { url = "https://files.pythonhosted.org/packages/9f/cc/d938417e7a4d7f0433ad4edee8bb2acdc60dc7ac5af19e2a07a048ecbee3/coverage-7.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e", size = 222788, upload-time = "2026-03-17T10:30:12.886Z" }, - { url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" }, - { url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" }, - { url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" }, - { url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" }, - { url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" }, - { url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" }, - { url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" }, - { url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" }, - { url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" }, - { url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" }, - { url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" }, - { url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" }, - { url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" }, - { url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" }, - { url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" }, - { url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" }, - { url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" }, - { url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" }, - { url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" }, - { url = "https://files.pythonhosted.org/packages/74/8c/74fedc9663dcf168b0a059d4ea756ecae4da77a489048f94b5f512a8d0b3/coverage-7.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1", size = 219576, upload-time = "2026-03-17T10:31:09.045Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c9/44fb661c55062f0818a6ffd2685c67aa30816200d5f2817543717d4b92eb/coverage-7.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3", size = 219942, upload-time = "2026-03-17T10:31:10.708Z" }, - { url = "https://files.pythonhosted.org/packages/5f/13/93419671cee82b780bab7ea96b67c8ef448f5f295f36bf5031154ec9a790/coverage-7.13.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26", size = 250935, upload-time = "2026-03-17T10:31:12.392Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/1666e3a4462f8202d836920114fa7a5ee9275d1fa45366d336c551a162dd/coverage-7.13.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3", size = 253541, upload-time = "2026-03-17T10:31:14.247Z" }, - { url = "https://files.pythonhosted.org/packages/4e/5e/3ee3b835647be646dcf3c65a7c6c18f87c27326a858f72ab22c12730773d/coverage-7.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b", size = 254780, upload-time = "2026-03-17T10:31:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/44/b3/cb5bd1a04cfcc49ede6cd8409d80bee17661167686741e041abc7ee1b9a9/coverage-7.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a", size = 256912, upload-time = "2026-03-17T10:31:17.89Z" }, - { url = "https://files.pythonhosted.org/packages/1b/66/c1dceb7b9714473800b075f5c8a84f4588f887a90eb8645282031676e242/coverage-7.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969", size = 251165, upload-time = "2026-03-17T10:31:19.605Z" }, - { url = "https://files.pythonhosted.org/packages/b7/62/5502b73b97aa2e53ea22a39cf8649ff44827bef76d90bf638777daa27a9d/coverage-7.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161", size = 252908, upload-time = "2026-03-17T10:31:21.312Z" }, - { url = "https://files.pythonhosted.org/packages/7d/37/7792c2d69854397ca77a55c4646e5897c467928b0e27f2d235d83b5d08c6/coverage-7.13.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15", size = 250873, upload-time = "2026-03-17T10:31:23.565Z" }, - { url = "https://files.pythonhosted.org/packages/a3/23/bc866fb6163be52a8a9e5d708ba0d3b1283c12158cefca0a8bbb6e247a43/coverage-7.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1", size = 255030, upload-time = "2026-03-17T10:31:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/7d/8b/ef67e1c222ef49860701d346b8bbb70881bef283bd5f6cbba68a39a086c7/coverage-7.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6", size = 250694, upload-time = "2026-03-17T10:31:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/46/0d/866d1f74f0acddbb906db212e096dee77a8e2158ca5e6bb44729f9d93298/coverage-7.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17", size = 252469, upload-time = "2026-03-17T10:31:29.472Z" }, - { url = "https://files.pythonhosted.org/packages/7a/f5/be742fec31118f02ce42b21c6af187ad6a344fed546b56ca60caacc6a9a0/coverage-7.13.5-cp313-cp313-win32.whl", hash = "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85", size = 222112, upload-time = "2026-03-17T10:31:31.526Z" }, - { url = "https://files.pythonhosted.org/packages/66/40/7732d648ab9d069a46e686043241f01206348e2bbf128daea85be4d6414b/coverage-7.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b", size = 222923, upload-time = "2026-03-17T10:31:33.633Z" }, - { url = "https://files.pythonhosted.org/packages/48/af/fea819c12a095781f6ccd504890aaddaf88b8fab263c4940e82c7b770124/coverage-7.13.5-cp313-cp313-win_arm64.whl", hash = "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664", size = 221540, upload-time = "2026-03-17T10:31:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/23/d2/17879af479df7fbbd44bd528a31692a48f6b25055d16482fdf5cdb633805/coverage-7.13.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d", size = 220262, upload-time = "2026-03-17T10:31:37.184Z" }, - { url = "https://files.pythonhosted.org/packages/5b/4c/d20e554f988c8f91d6a02c5118f9abbbf73a8768a3048cb4962230d5743f/coverage-7.13.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0", size = 220617, upload-time = "2026-03-17T10:31:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/f9f5277b95184f764b24e7231e166dfdb5780a46d408a2ac665969416d61/coverage-7.13.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806", size = 261912, upload-time = "2026-03-17T10:31:41.324Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f6/7f1ab39393eeb50cfe4747ae8ef0e4fc564b989225aa1152e13a180d74f8/coverage-7.13.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3", size = 263987, upload-time = "2026-03-17T10:31:43.724Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d7/62c084fb489ed9c6fbdf57e006752e7c516ea46fd690e5ed8b8617c7d52e/coverage-7.13.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9", size = 266416, upload-time = "2026-03-17T10:31:45.769Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f6/df63d8660e1a0bff6125947afda112a0502736f470d62ca68b288ea762d8/coverage-7.13.5-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd", size = 267558, upload-time = "2026-03-17T10:31:48.293Z" }, - { url = "https://files.pythonhosted.org/packages/5b/02/353ca81d36779bd108f6d384425f7139ac3c58c750dcfaafe5d0bee6436b/coverage-7.13.5-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606", size = 261163, upload-time = "2026-03-17T10:31:50.125Z" }, - { url = "https://files.pythonhosted.org/packages/2c/16/2e79106d5749bcaf3aee6d309123548e3276517cd7851faa8da213bc61bf/coverage-7.13.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e", size = 263981, upload-time = "2026-03-17T10:31:51.961Z" }, - { url = "https://files.pythonhosted.org/packages/29/c7/c29e0c59ffa6942030ae6f50b88ae49988e7e8da06de7ecdbf49c6d4feae/coverage-7.13.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0", size = 261604, upload-time = "2026-03-17T10:31:53.872Z" }, - { url = "https://files.pythonhosted.org/packages/40/48/097cdc3db342f34006a308ab41c3a7c11c3f0d84750d340f45d88a782e00/coverage-7.13.5-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87", size = 265321, upload-time = "2026-03-17T10:31:55.997Z" }, - { url = "https://files.pythonhosted.org/packages/bb/1f/4994af354689e14fd03a75f8ec85a9a68d94e0188bbdab3fc1516b55e512/coverage-7.13.5-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479", size = 260502, upload-time = "2026-03-17T10:31:58.308Z" }, - { url = "https://files.pythonhosted.org/packages/22/c6/9bb9ef55903e628033560885f5c31aa227e46878118b63ab15dc7ba87797/coverage-7.13.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2", size = 262688, upload-time = "2026-03-17T10:32:00.141Z" }, - { url = "https://files.pythonhosted.org/packages/14/4f/f5df9007e50b15e53e01edea486814783a7f019893733d9e4d6caad75557/coverage-7.13.5-cp313-cp313t-win32.whl", hash = "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a", size = 222788, upload-time = "2026-03-17T10:32:02.246Z" }, - { url = "https://files.pythonhosted.org/packages/e1/98/aa7fccaa97d0f3192bec013c4e6fd6d294a6ed44b640e6bb61f479e00ed5/coverage-7.13.5-cp313-cp313t-win_amd64.whl", hash = "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819", size = 223851, upload-time = "2026-03-17T10:32:04.416Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8b/e5c469f7352651e5f013198e9e21f97510b23de957dd06a84071683b4b60/coverage-7.13.5-cp313-cp313t-win_arm64.whl", hash = "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911", size = 222104, upload-time = "2026-03-17T10:32:06.65Z" }, - { url = "https://files.pythonhosted.org/packages/8e/77/39703f0d1d4b478bfd30191d3c14f53caf596fac00efb3f8f6ee23646439/coverage-7.13.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f", size = 219621, upload-time = "2026-03-17T10:32:08.589Z" }, - { url = "https://files.pythonhosted.org/packages/e2/3e/51dff36d99ae14639a133d9b164d63e628532e2974d8b1edb99dd1ebc733/coverage-7.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e", size = 219953, upload-time = "2026-03-17T10:32:10.507Z" }, - { url = "https://files.pythonhosted.org/packages/6a/6c/1f1917b01eb647c2f2adc9962bd66c79eb978951cab61bdc1acab3290c07/coverage-7.13.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a", size = 250992, upload-time = "2026-03-17T10:32:12.41Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/06b1f88f42a5a99df42ce61208bdec3bddb3d261412874280a19796fc09c/coverage-7.13.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510", size = 253503, upload-time = "2026-03-17T10:32:14.449Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/2a148a51e5907e504fa7b85490277734e6771d8844ebcc48764a15e28155/coverage-7.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247", size = 254852, upload-time = "2026-03-17T10:32:16.56Z" }, - { url = "https://files.pythonhosted.org/packages/61/77/50e8d3d85cc0b7ebe09f30f151d670e302c7ff4a1bf6243f71dd8b0981fa/coverage-7.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6", size = 257161, upload-time = "2026-03-17T10:32:19.004Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c4/b5fd1d4b7bf8d0e75d997afd3925c59ba629fc8616f1b3aae7605132e256/coverage-7.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0", size = 251021, upload-time = "2026-03-17T10:32:21.344Z" }, - { url = "https://files.pythonhosted.org/packages/f8/66/6ea21f910e92d69ef0b1c3346ea5922a51bad4446c9126db2ae96ee24c4c/coverage-7.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882", size = 252858, upload-time = "2026-03-17T10:32:23.506Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ea/879c83cb5d61aa2a35fb80e72715e92672daef8191b84911a643f533840c/coverage-7.13.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740", size = 250823, upload-time = "2026-03-17T10:32:25.516Z" }, - { url = "https://files.pythonhosted.org/packages/8a/fb/616d95d3adb88b9803b275580bdeee8bd1b69a886d057652521f83d7322f/coverage-7.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16", size = 255099, upload-time = "2026-03-17T10:32:27.944Z" }, - { url = "https://files.pythonhosted.org/packages/1c/93/25e6917c90ec1c9a56b0b26f6cad6408e5f13bb6b35d484a0d75c9cf000d/coverage-7.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0", size = 250638, upload-time = "2026-03-17T10:32:29.914Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7b/dc1776b0464145a929deed214aef9fb1493f159b59ff3c7eeeedf91eddd0/coverage-7.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0", size = 252295, upload-time = "2026-03-17T10:32:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/ea/fb/99cbbc56a26e07762a2740713f3c8f9f3f3106e3a3dd8cc4474954bccd34/coverage-7.13.5-cp314-cp314-win32.whl", hash = "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc", size = 222360, upload-time = "2026-03-17T10:32:34.233Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b7/4758d4f73fb536347cc5e4ad63662f9d60ba9118cb6785e9616b2ce5d7fa/coverage-7.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633", size = 223174, upload-time = "2026-03-17T10:32:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f2/24d84e1dfe70f8ac9fdf30d338239860d0d1d5da0bda528959d0ebc9da28/coverage-7.13.5-cp314-cp314-win_arm64.whl", hash = "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8", size = 221739, upload-time = "2026-03-17T10:32:38.736Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/4a168591057b3668c2428bff25dd3ebc21b629d666d90bcdfa0217940e84/coverage-7.13.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b", size = 220351, upload-time = "2026-03-17T10:32:41.196Z" }, - { url = "https://files.pythonhosted.org/packages/f5/21/1fd5c4dbfe4a58b6b99649125635df46decdfd4a784c3cd6d410d303e370/coverage-7.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c", size = 220612, upload-time = "2026-03-17T10:32:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fe/2a924b3055a5e7e4512655a9d4609781b0d62334fa0140c3e742926834e2/coverage-7.13.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9", size = 261985, upload-time = "2026-03-17T10:32:45.514Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/c8928f2bd518c45990fe1a2ab8db42e914ef9b726c975facc4282578c3eb/coverage-7.13.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29", size = 264107, upload-time = "2026-03-17T10:32:47.971Z" }, - { url = "https://files.pythonhosted.org/packages/ef/ae/4ae35bbd9a0af9d820362751f0766582833c211224b38665c0f8de3d487f/coverage-7.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607", size = 266513, upload-time = "2026-03-17T10:32:50.1Z" }, - { url = "https://files.pythonhosted.org/packages/9c/20/d326174c55af36f74eac6ae781612d9492f060ce8244b570bb9d50d9d609/coverage-7.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90", size = 267650, upload-time = "2026-03-17T10:32:52.391Z" }, - { url = "https://files.pythonhosted.org/packages/7a/5e/31484d62cbd0eabd3412e30d74386ece4a0837d4f6c3040a653878bfc019/coverage-7.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3", size = 261089, upload-time = "2026-03-17T10:32:54.544Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d8/49a72d6de146eebb0b7e48cc0f4bc2c0dd858e3d4790ab2b39a2872b62bd/coverage-7.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab", size = 263982, upload-time = "2026-03-17T10:32:56.803Z" }, - { url = "https://files.pythonhosted.org/packages/06/3b/0351f1bd566e6e4dd39e978efe7958bde1d32f879e85589de147654f57bb/coverage-7.13.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562", size = 261579, upload-time = "2026-03-17T10:32:59.466Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ce/796a2a2f4017f554d7810f5c573449b35b1e46788424a548d4d19201b222/coverage-7.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2", size = 265316, upload-time = "2026-03-17T10:33:01.847Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/d5ae91455541d1a78bc90abf495be600588aff8f6db5c8b0dae739fa39c9/coverage-7.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea", size = 260427, upload-time = "2026-03-17T10:33:03.945Z" }, - { url = "https://files.pythonhosted.org/packages/48/11/07f413dba62db21fb3fad5d0de013a50e073cc4e2dc4306e770360f6dfc8/coverage-7.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a", size = 262745, upload-time = "2026-03-17T10:33:06.285Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/d792371332eb4663115becf4bad47e047d16234b1aff687b1b18c58d60ae/coverage-7.13.5-cp314-cp314t-win32.whl", hash = "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215", size = 223146, upload-time = "2026-03-17T10:33:08.756Z" }, - { url = "https://files.pythonhosted.org/packages/db/51/37221f59a111dca5e85be7dbf09696323b5b9f13ff65e0641d535ed06ea8/coverage-7.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43", size = 224254, upload-time = "2026-03-17T10:33:11.174Z" }, - { url = "https://files.pythonhosted.org/packages/54/83/6acacc889de8987441aa7d5adfbdbf33d288dad28704a67e574f1df9bcbb/coverage-7.13.5-cp314-cp314t-win_arm64.whl", hash = "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45", size = 222276, upload-time = "2026-03-17T10:33:13.466Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, +version = "7.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, + { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, + { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, + { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, + { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, + { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, + { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, + { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, + { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, + { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, + { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, + { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, + { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, + { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, + { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, + { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, + { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, + { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, + { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, + { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, + { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, + { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, + { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, + { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, + { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, + { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, + { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, + { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, + { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, + { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, + { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, + { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, + { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, + { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, + { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, + { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, + { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, + { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, + { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, + { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, + { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, ] [package.optional-dependencies] @@ -445,7 +445,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/38/00b2d342ee47102225054c0a3e9507e99a988bd6a89da3948f21bad4ddb0/gp_libs-0.0.17.tar.gz", hash = "sha256:e7f0fa2913f79d0403ae9c38468d02d28d8348edccba949de40dba8e72c419ce", size = 15159, upload-time = "2025-12-07T22:44:49.618Z" } wheels = [ @@ -461,7 +461,7 @@ dependencies = [ { name = "gp-libs" }, { name = "linkify-it-py" }, { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "myst-parser", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-typehints-gp" }, @@ -491,11 +491,11 @@ wheels = [ [[package]] name = "idna" -version = "3.13" +version = "3.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] @@ -530,87 +530,87 @@ wheels = [ [[package]] name = "librt" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/39/cb/c1945e506893b5b8577fb45a60c80e3ffe4a82092a04a6f29b0b951d9a24/librt-0.10.0.tar.gz", hash = "sha256:1aba1e8aa4e3307a7be68a74149545fde7451964dc0235a8bec5704a17bdda42", size = 191799, upload-time = "2026-05-05T16:31:23.535Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/18/827e5c1262a88c2602e86f99aee0f288ffea3280dbd2ff448858ef9dc6e9/librt-0.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dc99f9642100b86e5f6bb14cdc9970009e31a9ef7d64df6704b7018451524a3", size = 76461, upload-time = "2026-05-05T16:29:00.422Z" }, - { url = "https://files.pythonhosted.org/packages/ee/90/54254e30287f5a5abec6fef22d976987476e966be5fdff51fe8c2d5d73d1/librt-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8298cedfcfaff3790000bd057aaaa3df1b0ab54cf7b48eeab16184cbb1bc66b9", size = 79740, upload-time = "2026-05-05T16:29:01.926Z" }, - { url = "https://files.pythonhosted.org/packages/4c/20/e93264b52113669d98d3b63ff94d4ce0c4dd49ae0503f1788440a884e5f0/librt-0.10.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7dbe312dbf76468255b79a7ba311236fde620f2f7055fc09d421e31340314e", size = 243472, upload-time = "2026-05-05T16:29:03.373Z" }, - { url = "https://files.pythonhosted.org/packages/35/ad/34a5141178e8b18a4cfa45d1a0d523c84397e2abd5d06fea2d846da687e8/librt-0.10.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:56ed90c48c19249012dadfd79a1bc13bd5168ea60a70722d330a3a600c0b1852", size = 232073, upload-time = "2026-05-05T16:29:04.815Z" }, - { url = "https://files.pythonhosted.org/packages/97/1f/67240e910cd9f9ab1498c1470738345fc29dce5dc9719db1e0e09d1e861f/librt-0.10.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d74ca0f4b2b09c117f913d4df01f6b934dff8a271096b35167d5264a31649f0", size = 256956, upload-time = "2026-05-05T16:29:06.516Z" }, - { url = "https://files.pythonhosted.org/packages/22/50/3a2b3482c27d607f6e8216d913c6bc592b9a2141d96990309452340a78e3/librt-0.10.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8eb2daa9375f93c0e55ff5e44a4bbe98f39e5fe52e1abf9c97acb67743b61bf8", size = 250593, upload-time = "2026-05-05T16:29:08.324Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1c/07dba133d79f93322fa17514062f1a2a50d6bdfb7baec4acf78193d7fad1/librt-0.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7b09b90e634e6dff57978cd358070046071e2b120501f10787aeb35425f504f6", size = 263582, upload-time = "2026-05-05T16:29:09.866Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ac/033f2c6d6ab0b48f15f02e5bf065521b11a51922806017f8b6274df30d69/librt-0.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2cf22fd379d60c739b800d4295ed34045f8b04aa8df9c12bd2f8f43f7fe672b7", size = 259307, upload-time = "2026-05-05T16:29:11.675Z" }, - { url = "https://files.pythonhosted.org/packages/6e/10/679046cd75d5a52c0104c890d8f69574ef4e619c683e59c15584d03a2457/librt-0.10.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:74c798793fcf29a84d442278ebe0bb1fff79fe58ac4106eeff7019cbba861423", size = 257342, upload-time = "2026-05-05T16:29:13.14Z" }, - { url = "https://files.pythonhosted.org/packages/1e/d5/dbaac9c0884f78a53dda22b9ec92bb788e1400e762ed7623fa96928c8da5/librt-0.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dc4f1573401e8dbe6c26511fe027620b0fb30ae9a7ab814e02e510626b8b5f9c", size = 280141, upload-time = "2026-05-05T16:29:14.922Z" }, - { url = "https://files.pythonhosted.org/packages/cc/81/71f18cf8eb340d9fda011498870910f6a8697aeb50833005d3d8107653fd/librt-0.10.0-cp310-cp310-win32.whl", hash = "sha256:e1428275f5fe3d4db6822e58d8b005a5b28ffca55e8433ebc051247fbe46429f", size = 62257, upload-time = "2026-05-05T16:29:16.226Z" }, - { url = "https://files.pythonhosted.org/packages/df/52/6bcebc2f870c4836bcb372be885fae7f17a1d25037d3a8250ef79fbe0124/librt-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:0708e9408f585b0f065081680583a577652099680ccf820c7538904322b679c3", size = 70321, upload-time = "2026-05-05T16:29:17.41Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a3/1472717d2325adacc8d335ba2e4078015c09d75b599f3cf48e967b3d306e/librt-0.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01b4500ca3a625450c032a9142a8e843923ce263fa8a92ad1b38927cabe2fe72", size = 76045, upload-time = "2026-05-05T16:29:18.731Z" }, - { url = "https://files.pythonhosted.org/packages/a6/31/bfe32355d4b369aef3d7aa442df663bb5558c2ffa2de286cb2956346bc24/librt-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b7e42d1b3e300d20bfc87e72ffd62f0a92a2cb3c35f7bf90df90c9d2a49f74c", size = 79466, upload-time = "2026-05-05T16:29:20.052Z" }, - { url = "https://files.pythonhosted.org/packages/e9/f1/83f8a2c715ba2cac9b7387a5a5cea25f717f7184320cfe48b36bed9c58e9/librt-0.10.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8ef7b8c61ce3a1b597cd3e15348ff1574325165c2e7ce09a718154cde2a7950", size = 242283, upload-time = "2026-05-05T16:29:21.596Z" }, - { url = "https://files.pythonhosted.org/packages/cc/94/c3a4ce94857f0004a542f86662806383611858f522722db58efaec0a1472/librt-0.10.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e73c84f72d1fa0d6eaa7a1930b436ba8d2c90c58d77bfabb09995a69ad35f6c0", size = 230735, upload-time = "2026-05-05T16:29:23.335Z" }, - { url = "https://files.pythonhosted.org/packages/d1/41/e962bb26c7728eb7b3a69e490d0c800fd9968a6970e390c1f18ddb56093d/librt-0.10.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9728cb98713bd862fb8f4fd6a642d1896c86058a41d77c70f3d5cee75e725275", size = 256606, upload-time = "2026-05-05T16:29:24.91Z" }, - { url = "https://files.pythonhosted.org/packages/66/3a/4e46a707b1ecc993fd691071623b9beab89703a63bd21cc7807e06c28209/librt-0.10.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:648b7e941d20acd72f9652115e0e53facd98156d61f9ebf7a812bdef8bdccea9", size = 249739, upload-time = "2026-05-05T16:29:26.648Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f5/dc5b7eb294656ad23d4ff4cf8514208d54fe1026b909d726a0dc026689c9/librt-0.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c3e33747c068e86a9007c20fdb777eb5ba8d3d19136d7812f88e69a713041b6f", size = 261414, upload-time = "2026-05-05T16:29:28.702Z" }, - { url = "https://files.pythonhosted.org/packages/58/e4/990ed8d12c7f114ac8f8ccd47f7d9bd9704ef61acfcb1df4a05047da7710/librt-0.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d509c745bf7e77d1107cf05e6abb249dc03fad13eb39f2286a49deedaeb2bcd7", size = 256614, upload-time = "2026-05-05T16:29:30.357Z" }, - { url = "https://files.pythonhosted.org/packages/60/eb/52d2726c7fb22818507dc3cc166c8f36dd4a4b68a7be67f12006ac8777c1/librt-0.10.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:786ad5a15e99d0e0e74f3adbeecc198a5ac58f340be07e984723d1e0074838de", size = 255144, upload-time = "2026-05-05T16:29:32.106Z" }, - { url = "https://files.pythonhosted.org/packages/bc/df/bd5591a78f7531fce4b6eb9962aadc6adc9560a01570442a884b6e554abe/librt-0.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:075582d877a97ee3d8e77bda3689dbe617b14f6469224a2d80b4b6c38e3951aa", size = 279121, upload-time = "2026-05-05T16:29:33.688Z" }, - { url = "https://files.pythonhosted.org/packages/fd/df/7c2b838dfc89a1762dd156d8b0c39848a7a2845d725a50be5a6e021fb8ba/librt-0.10.0-cp311-cp311-win32.whl", hash = "sha256:75ecdc3f5a90065aa2af2e574706c5495adc392520762dcf10b1aa716f0b8090", size = 62593, upload-time = "2026-05-05T16:29:35.152Z" }, - { url = "https://files.pythonhosted.org/packages/91/19/22ff572981049a9d436a083dbea1572d0f5dc068b7353637d2dd9977c8f1/librt-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:b6f6084884131d8a52cb9d7095ff2aa52c1e786d9fdaefab1fb4515415e9e083", size = 70914, upload-time = "2026-05-05T16:29:36.407Z" }, - { url = "https://files.pythonhosted.org/packages/12/22/1697cc64f4a5c7e9bce55e99c6d234a346beaedaefcd1e2ca90dd285f98c/librt-0.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:0140bd62151160047e89b2730cb6f8506cdac5127baa1afb9231e4dd3fe7f681", size = 61176, upload-time = "2026-05-05T16:29:37.62Z" }, - { url = "https://files.pythonhosted.org/packages/12/8e/cbb5b6f6e45e65c10a42449a69eaccc44d73e6a081ea752fbc5221c6dc1c/librt-0.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b4b58a44b407e91f633dafee008de9ddea6aa2a555ed94929c099260910bd0ba", size = 77327, upload-time = "2026-05-05T16:29:38.919Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3d/8233cbee8e99e6a8992f02bfc2dec8d787509566a511d1fde2574ee7473f/librt-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:950b79b11762531bdf45a9df909d2f9a2a8445c70c88665c01d14c8511a27dc5", size = 79971, upload-time = "2026-05-05T16:29:40.96Z" }, - { url = "https://files.pythonhosted.org/packages/87/6f/5264b298cef2b72fc97d2dde56c66181eda35204bf5dcd1ed0c3d0a0a782/librt-0.10.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4538453f51be197633b425912c150e25b0667252d3741c53e8368176d98d9d37", size = 246559, upload-time = "2026-05-05T16:29:42.701Z" }, - { url = "https://files.pythonhosted.org/packages/07/7b/19b1b859cc60d5f99276cc2b3144d91556c6d1b1e4ebb50359696bebf7a8/librt-0.10.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:70b955f091beac93e994a0b7ec616934f63b3ea5c3d6d7af847562f935aceca7", size = 235216, upload-time = "2026-05-05T16:29:44.193Z" }, - { url = "https://files.pythonhosted.org/packages/6e/56/a2f40717142a8af46289f57874ef914353d8faccd5e4f8e594ab1e16e8c7/librt-0.10.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:483e685e06b6163728ba6c85d74315176be7190f432ec2a41226e5e14355d5f0", size = 263108, upload-time = "2026-05-05T16:29:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/67/ca/15c625c3bdc0167c01e04ef8878317e9713f3bfa788438342f7a94c7b22c/librt-0.10.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ac53d946a009d1a38c44a60812708c9458fb2a239a5f630d8e625571386650f", size = 255280, upload-time = "2026-05-05T16:29:48.087Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c5/ba301d571d9e05844e2435b73aba30bee77bb75ce155c9affcfd2173dd03/librt-0.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc8771c9fcf0ea894ca41fdc2abd83572c2fbda221f232d86e718614e57ff513", size = 268829, upload-time = "2026-05-05T16:29:49.628Z" }, - { url = "https://files.pythonhosted.org/packages/8b/60/af70e135bc1f1fe15dd3894b1e4bbefc7ecdf911749a925a39eb86ceb2a1/librt-0.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:70805dbc5257892ac572f86290a61e3c8d90224ecce1a8b2d1f7ed51965417f4", size = 262051, upload-time = "2026-05-05T16:29:51.244Z" }, - { url = "https://files.pythonhosted.org/packages/83/c2/c8236eb8b421bac5a172ba208f965abaa89805da2a3fa112bdf1764caf8f/librt-0.10.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d3b4f300f7bcba6e2ff73fb8bef1898479e9772bfa2682998c636391633ec826", size = 264347, upload-time = "2026-05-05T16:29:53.013Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f5/15b6d32bc25dacd4a60886a683d8128d6219910c122202b995a40dd4f8d2/librt-0.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:943bc943f92f4fb3408fae62485c6a3ad68ce4f2ee205643a39641525c19a276", size = 286482, upload-time = "2026-05-05T16:29:54.675Z" }, - { url = "https://files.pythonhosted.org/packages/fb/8e/b1b959bacd323eb4360579db992513e1406d1c6ef7edb57b5511fd0666fd/librt-0.10.0-cp312-cp312-win32.whl", hash = "sha256:6065c1a758fba1010b41401013903d3d5d2750eab425ddedd584abac31d0630e", size = 62955, upload-time = "2026-05-05T16:29:56.39Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4c/d4cd6e4b9fc24098e63cc85537d1b6689682aee96809c38f08072067cc2b/librt-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:d788ecbe208ab352dab0e105cc06057bf9a2fc7e58cabb0d751ad9e30062b9e2", size = 71191, upload-time = "2026-05-05T16:29:57.682Z" }, - { url = "https://files.pythonhosted.org/packages/2b/19/8641da1f63d24b92354a492f893c022d6b3a0df44e70c8eff49364613983/librt-0.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:6003d1f295bdba02656dc81308208fc060d0a51d8c0d0a6db70f7f3c57b9ba0a", size = 61432, upload-time = "2026-05-05T16:29:58.971Z" }, - { url = "https://files.pythonhosted.org/packages/e5/29/681a75c82f4cc90d29e4b257a3299b79fe13fe927a04c57b8109d70b6957/librt-0.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0ede79d682e73f91c1b599a76d78b7464b9b5d213754cedb13372d9df36e596", size = 77299, upload-time = "2026-05-05T16:30:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/62/24/0c7ca445a55d04be79cac19819437fd094782347fa116f6681844fa6143e/librt-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0ba0b131fdb336c8b9c948e397f4a7e649d0f783b529f07b647bf4961df392e", size = 79930, upload-time = "2026-05-05T16:30:01.555Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1f/1e2b8f6443ef9e9a81e89486ca70e22f3684f93db003ce6eaefc3d0839b9/librt-0.10.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2728117da2afb96fb957768725ee43dc9a2d73b031e02da424b818a3cdd3a275", size = 246195, upload-time = "2026-05-05T16:30:03.261Z" }, - { url = "https://files.pythonhosted.org/packages/74/61/9dc9e03de0439ad84c1c240aac8b747f12c90cb797ea6042f7bdb8d3410f/librt-0.10.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:723ba80594c49cdf0584196fc430752262605dc9449902fc9bd3d9b79976cb77", size = 234951, upload-time = "2026-05-05T16:30:04.881Z" }, - { url = "https://files.pythonhosted.org/packages/55/f4/635223117d7590875bca441275065a3bf491203ad4208bd1cc3ffd90c5a1/librt-0.10.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7292edaaca294a61a978c53a3c7d6130d099b0dfbc8f0a65916cdc6b891b9852", size = 262768, upload-time = "2026-05-05T16:30:06.638Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/b04152d0cd8b6ca2b428a8bd3230343230c35ed304a932f35b5375f2f828/librt-0.10.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89fe9d539f2c10a1666633eeeac507ce95dd06d9ecc58de3c6390dba156a3d3a", size = 255075, upload-time = "2026-05-05T16:30:08.216Z" }, - { url = "https://files.pythonhosted.org/packages/35/1e/25bac4c7f2ca36f0e612cade186970683cf79153d96beccc3a11a9e19b97/librt-0.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4efa7b9587503fa5b67f40593302b9c8836d211d222ff9f7cafe67be5f8f0b10", size = 268559, upload-time = "2026-05-05T16:30:10.1Z" }, - { url = "https://files.pythonhosted.org/packages/18/54/4601faab35b6632a13200faa146ca62bfd111ffbe2568be430d65c89493a/librt-0.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:22dc982ef59df0136df36092ccbdbb570ced8aafb33e49585739b2f1de1c13b6", size = 261753, upload-time = "2026-05-05T16:30:11.912Z" }, - { url = "https://files.pythonhosted.org/packages/1b/cf/39f4023509e94fade8b074666fa3292db9cb6b34ea5dcbe7af53df9fca1d/librt-0.10.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6f2e5f3606253a84cea719c94a3bb1c54487b5d617d0254d46e0920d8a06be3f", size = 264055, upload-time = "2026-05-05T16:30:13.465Z" }, - { url = "https://files.pythonhosted.org/packages/8e/00/40247209fc46a8e308a91412d5206aedf8efb667ee89eb625820106a5c2f/librt-0.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40884bfaa1e29f6b6a9be255007d8f359bfc9e61d68bdef8ed3158bfcbc95df9", size = 286190, upload-time = "2026-05-05T16:30:15.073Z" }, - { url = "https://files.pythonhosted.org/packages/d8/6e/5566beb94431a985abe1787af5ef86e087750172ff9d0bbf20f93e88132d/librt-0.10.0-cp313-cp313-win32.whl", hash = "sha256:3cd34cd8254eba756660bff6c2da91278248184301054fe3e4feb073bdd49b14", size = 62949, upload-time = "2026-05-05T16:30:16.503Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c2/3ea3301d6c8dff51d39dbe8ed75db3dc92896947d4afb5eeadf821c1e67f/librt-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:7baac5313e2d8dce1386f97777a8d03ab28f5fe1e780b3b9ac2ee7544551fedc", size = 71152, upload-time = "2026-05-05T16:30:17.766Z" }, - { url = "https://files.pythonhosted.org/packages/3c/de/5d49cb92cadcbc77d3abc27b93fd6030ed8437487dde2eae38cab5e6704d/librt-0.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:afc5b4406c8e2515698d922a5c7823a009312835ea58196671fff40e35cb8166", size = 61336, upload-time = "2026-05-05T16:30:19.021Z" }, - { url = "https://files.pythonhosted.org/packages/6a/64/7165e08108cc185a13a9c069f0685e6ef92e70e07fddf7edf5e7348c6316/librt-0.10.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f09588a30e6a22ec624090d72a3ab1a6d4d5485c3ed739603e76aa3c16efa688", size = 76794, upload-time = "2026-05-05T16:30:20.392Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ef/bf8613febf651b90c5222ee79dea5ae58d4cc2b544df69d3033424448934/librt-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:131ade118d12bd7a0adc4e655474a553f1b76cf78385868885944d21d51e45e0", size = 79662, upload-time = "2026-05-05T16:30:22.025Z" }, - { url = "https://files.pythonhosted.org/packages/b6/67/9eddd165c1d8397bdf99b38bf12b5a55b3def5035b49eedb49f2775d1430/librt-0.10.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8b9ab28e40d011c373a189eae900c916e66d6fbecf7983e9e4883089ee085ef", size = 242390, upload-time = "2026-05-05T16:30:23.51Z" }, - { url = "https://files.pythonhosted.org/packages/10/d1/d95da80334501866cd37004ab5d7483220d05862fab4b5405394f0264f0d/librt-0.10.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:67c39bb30da73bae1f293d1ed8bc2f8f6642649dd0928d3600aeff3041ac23d6", size = 232603, upload-time = "2026-05-05T16:30:25.198Z" }, - { url = "https://files.pythonhosted.org/packages/0c/fa/e6d64d28718bc1be4e1736fcb037ca1c4dfca927e7167df75a7d5215665e/librt-0.10.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c3273c6b774614f093c8927c2bf1b077d0fefde988fe98f46a333734e5597ab", size = 259187, upload-time = "2026-05-05T16:30:26.772Z" }, - { url = "https://files.pythonhosted.org/packages/72/3f/3fdb77e7f937dad59cfd76b720be7e7643400ec76b2da35befab8d66ba30/librt-0.10.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9dd7c1b86a4baa583ab5db977484b93a2c474e69e96ef3e9538387ea54229cb9", size = 251846, upload-time = "2026-05-05T16:30:28.56Z" }, - { url = "https://files.pythonhosted.org/packages/18/ca/f4d49133dd86a6f55d79eca30bf412fa722f511a9abe67f62f57aa64e66a/librt-0.10.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a77385c5a202e831149f7ad03be9e67cf80e957e52c614e83dcb822c95222eb8", size = 264936, upload-time = "2026-05-05T16:30:30.491Z" }, - { url = "https://files.pythonhosted.org/packages/de/66/a8df2fbadc1f6c1827a096d11c40175bd526133480bd3bc88ec64a03d257/librt-0.10.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c6a5eafa74b5655bad59886138ed68426f098a6beb8cb95a71f2cc3cd8bb33fe", size = 258699, upload-time = "2026-05-05T16:30:32.002Z" }, - { url = "https://files.pythonhosted.org/packages/bb/73/1e3c83613fe05451bb969e27b68a573d177f08d5f63533cc29fec0989658/librt-0.10.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1fc93d0439204c50ab4d1512611ce2c206f1b369b419f69c7c27c761561e3291", size = 259825, upload-time = "2026-05-05T16:30:35.077Z" }, - { url = "https://files.pythonhosted.org/packages/09/24/5e2f926ee9d3ef348d9339526d7062abb5c44d8419e3179528c01d78c102/librt-0.10.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:79e713c178bc7a744adfbee6b4619a288eecc0c914da2a9313a20255abe2f0cf", size = 282548, upload-time = "2026-05-05T16:30:36.639Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7d/3e89ed6ad0162561fa8bef9df3195e24263104c955713cd0237d3711fad2/librt-0.10.0-cp314-cp314-win32.whl", hash = "sha256:2eba9d955a68c41d9f326be3da42f163ec3518b7ab20f1c826224e7bed71e0bf", size = 58970, upload-time = "2026-05-05T16:30:38.183Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/579e731c94a7086a268bfa3e7a4945cd47836bebd3cbf3faeafd2e7eaef9/librt-0.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbfaf7f5145e9917f5d18bffa298eff6a19d74e7b8b11dabdca95785befe8dbf", size = 67260, upload-time = "2026-05-05T16:30:39.804Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f8/235822b7ae0b2334f12ee18bcf2476d07924077a5efeea57dbe927704be2/librt-0.10.0-cp314-cp314-win_arm64.whl", hash = "sha256:8d6d385d1969849a6b1397114df22714b6ded917bada98668e3e974dc663477e", size = 57156, upload-time = "2026-05-05T16:30:41.412Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e3/9b919cbf1e8eb770bf91bb7df28125e0f1daf4587169afefd95402636e9a/librt-0.10.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:6c3a82d3bd32631ef5c79922dfc028520c9ad840255979ab4d908271818039ee", size = 79150, upload-time = "2026-05-05T16:30:42.761Z" }, - { url = "https://files.pythonhosted.org/packages/6a/f5/72a944aa3bc3498169a168087eff58ca48b58bf1b704e59d091fd30739f3/librt-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d64cc66005dc324c9bb1fa3fc2841f529002f6eb15966d55e46d430f56955a6a", size = 82304, upload-time = "2026-05-05T16:30:44.082Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e3/fcc290a33e295019759472dfa794d204e43504b276ac65eab7fd9da20ea3/librt-0.10.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb562cd28c88cd2c6a9a6c78f99dc39348d6b16c94adc25de0e574acf1176e9", size = 272556, upload-time = "2026-05-05T16:30:45.497Z" }, - { url = "https://files.pythonhosted.org/packages/fd/54/546975e4c997573885e7f040a05012f8838e06fb12b0c3c1fbb76254e9d7/librt-0.10.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b809aa2854d019c28773b03605df22adc675ee4f3f4402d673581313e8906119", size = 256941, upload-time = "2026-05-05T16:30:47.059Z" }, - { url = "https://files.pythonhosted.org/packages/70/8c/f1d03401571b331653acddbd4e8cd955c06d945241dd08b25192fac0d04b/librt-0.10.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc15acabdd519bd4176fdadc2119e5e3093485d86f89138daf47e5b4cedb983a", size = 285855, upload-time = "2026-05-05T16:30:48.86Z" }, - { url = "https://files.pythonhosted.org/packages/0c/08/62cf80ff046c339faf56718b3a940244d4beb70f1c6407289b5830ec11e9/librt-0.10.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b1b2d835307d08ddadd94568e2369648ec9173bd3eea6d7f52a1abe717c81f98", size = 275321, upload-time = "2026-05-05T16:30:50.63Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ea/da5918d4070362e9a4d2ee9cd34f9dc84902daad8fd4275f8504a727ff4e/librt-0.10.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d261c6a2f93335a5167887fb0223e8b98ffce20ee3fde242e8e58a37ece6d0e5", size = 293993, upload-time = "2026-05-05T16:30:52.577Z" }, - { url = "https://files.pythonhosted.org/packages/c9/8d/68b6086bed1fcdc314c640ea04e31e52d18052e08059fa595409d66a51a9/librt-0.10.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e2ffd44963f8e7f68995504d90f9881d64e94dc1d8e310039b9526108fc0c0f7", size = 284254, upload-time = "2026-05-05T16:30:55.086Z" }, - { url = "https://files.pythonhosted.org/packages/06/c8/b810f1d84ec34a5a7ed93d7b510ab04164d75fbdf23088d5c3fbe6b08357/librt-0.10.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f285f6455ed495791c4d8630e5af732960adea93cac4c893d15619f2eae53e8", size = 284925, upload-time = "2026-05-05T16:30:56.728Z" }, - { url = "https://files.pythonhosted.org/packages/5a/00/3c82d4158c5a2c62528b8fccce65a8c9ad700e480e86f9389387435089a5/librt-0.10.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f6034ff52e663d34c7b82ef2aa2f94ad7c1d939e2368e63b06844bc4d127d2e1", size = 307830, upload-time = "2026-05-05T16:30:58.377Z" }, - { url = "https://files.pythonhosted.org/packages/99/3a/9c635ac3e8a00383ff689161d3eac8a30b3b2ddc711b40471e6b8983ea29/librt-0.10.0-cp314-cp314t-win32.whl", hash = "sha256:657860fd877fba6a241ea088ef99f63ca819945d3c715265da670bad56c37ebe", size = 60147, upload-time = "2026-05-05T16:31:00.293Z" }, - { url = "https://files.pythonhosted.org/packages/dc/e8/6f65f3e565d4ac212cddddd552eacc8035ffdf941ca0ad6fe945a211d41f/librt-0.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:56ded2d66010203a0cb5af063b609e3f079531a0e5e576d618dece859fd2e1af", size = 68649, upload-time = "2026-05-05T16:31:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/51/78/a0705a67cacd81e5fa01a5035b3adbdfbb43a7b8d4bd27e2b282ae61baf2/librt-0.10.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1ee63f30abf18ed4830fdbaf87b2b6f4bba1e198d46085c314edde4045e56715", size = 58247, upload-time = "2026-05-05T16:31:03.191Z" }, +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", size = 141706, upload-time = "2026-05-10T18:15:16.129Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", size = 142605, upload-time = "2026-05-10T18:15:18.148Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", size = 476555, upload-time = "2026-05-10T18:15:19.569Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", size = 468434, upload-time = "2026-05-10T18:15:20.87Z" }, + { url = "https://files.pythonhosted.org/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", size = 496918, upload-time = "2026-05-10T18:15:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", size = 490334, upload-time = "2026-05-10T18:15:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", size = 511287, upload-time = "2026-05-10T18:15:26.226Z" }, + { url = "https://files.pythonhosted.org/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", size = 517202, upload-time = "2026-05-10T18:15:27.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", size = 497517, upload-time = "2026-05-10T18:15:29.614Z" }, + { url = "https://files.pythonhosted.org/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", size = 538878, upload-time = "2026-05-10T18:15:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", size = 100070, upload-time = "2026-05-10T18:15:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", size = 117918, upload-time = "2026-05-10T18:15:33.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, ] [[package]] @@ -752,15 +752,15 @@ wheels = [ [[package]] name = "mdit-py-plugins" -version = "0.6.0" +version = "0.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/3d/e0e8d9d1cee04f758120915e2b2a3a07eb41f8cf4654b4734788a522bcd1/mdit_py_plugins-0.6.0.tar.gz", hash = "sha256:2436f14a7295837ac9228a36feeabda867c4abc488c8d019ad5c0bda88eee040", size = 56025, upload-time = "2026-05-07T12:20:42.295Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/d6/48f5b9e44e2e760855d7b489b1317cd7620e82dcb73197961e5cc1391348/mdit_py_plugins-0.6.0-py3-none-any.whl", hash = "sha256:f7e7a25d8b616fee99cb1e330da73451d11a8061baf39bb9663ab9ce0e005b90", size = 66655, upload-time = "2026-05-07T12:20:41.226Z" }, + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, ] [[package]] @@ -774,7 +774,7 @@ wheels = [ [[package]] name = "mypy" -version = "2.0.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, @@ -784,51 +784,51 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/dc/7e6d49f04fca40b9dd5c752a51a432ffe67fb45200702bc9eee0cb4bbb26/mypy-2.0.0.tar.gz", hash = "sha256:1a9e3900ac5c40f1fe813506c7739da6e6f0eab2729067ebd94bfb0bbba53532", size = 3869036, upload-time = "2026-05-06T19:26:43.22Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/1e/9983d2d5b5d2dc3677177bcf0fa6b25185ecf750cc0559e02199625a31c5/mypy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:65d6f22d643bccaeb182d41d2a9f0990a05a871673c4ae3f97d4931eca0d2294", size = 14663140, upload-time = "2026-05-06T19:25:59.474Z" }, - { url = "https://files.pythonhosted.org/packages/69/bc/b4009c91d3ced13c8f406acf47bbe56365025cd21bf6585cd1e87375a708/mypy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:106650bce72114f43019bf72197296f51c2cd47adfa9d073ea2976c247a404c5", size = 13526733, upload-time = "2026-05-06T19:22:56.425Z" }, - { url = "https://files.pythonhosted.org/packages/f0/99/2403cb0ceeb1552f70e70e779e3d0713b24f84c7ca0e9e14b2b7bc684cf0/mypy-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c734b7eb89a4cc4ec347f8187ffa730e2b59693407bc93dcb878183037f80a17", size = 13951940, upload-time = "2026-05-06T19:24:43.45Z" }, - { url = "https://files.pythonhosted.org/packages/1d/f7/4848a14c2667b6eb62841c9aeb7e1f6479613b1ef9a65564fe1f5518a35b/mypy-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd9e60388944d0f1432a2419ab938a78d5658df1d143a7172cfe1a197276cf49", size = 14833983, upload-time = "2026-05-06T19:23:16.827Z" }, - { url = "https://files.pythonhosted.org/packages/ec/28/c51831f9f1c6e46cbce765bd0a18981b84696e40bd1eea14e0a08494af44/mypy-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95e3890666c3be41af7a7179f4872341c08e90c161ba8e7a08a21f9be92c131", size = 15135591, upload-time = "2026-05-06T19:24:32.96Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/3c25e503a94f9ec18352464551bc6c506dee2bca93c6d0e0b5568eefc269/mypy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8e8709ce1b1046b8aad77a506dd01491157102dd727128c0b374b5025c7d769", size = 10983019, upload-time = "2026-05-06T19:20:30.942Z" }, - { url = "https://files.pythonhosted.org/packages/75/da/5cf833fd3b53fd4b5797e55dc16fb7efab16fddbc7205d49ff65b15d554e/mypy-2.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:0165968759c99ab79dc1a9f8aaec18e93a1bedcf7c13edd70e68dd3d5faf17cb", size = 9914165, upload-time = "2026-05-06T19:21:49.165Z" }, - { url = "https://files.pythonhosted.org/packages/8b/1e/268b81393b81d64683f670680215553e70ae92c55805915b3440080e05e4/mypy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17b7222e9fdfd352e61fb3131da117e55cc465f701ff232f1bd97a02bbad91f", size = 14580849, upload-time = "2026-05-06T19:23:06.567Z" }, - { url = "https://files.pythonhosted.org/packages/6e/32/d159a8002d9e5c44e59ece9d641a26956c89be5b6827f819d9a9dc678c65/mypy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc0a61adea1a5ffc2d47a4dc4bb180d8103f477fc2a90a1cdcbb168c2cc6caff", size = 13444955, upload-time = "2026-05-06T19:25:11.982Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5d/3b28d5a2799591da0ee5490418e94497eaf5d701e42d8b001b5e17a9b3d6/mypy-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8578f857b519993d065e5805290b71467ebfae772407a5f57e823755e4fdb850", size = 13873124, upload-time = "2026-05-06T19:20:39.684Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/f40f723955617b814d5ddc1154d8938b77aaf6926c2dbf72846e8943a0b7/mypy-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:33f668a37a650df60f7b825c1ac61e6baadd4ac3c89519e929badde58d28edf5", size = 14748822, upload-time = "2026-05-06T19:25:30.972Z" }, - { url = "https://files.pythonhosted.org/packages/d6/16/eded971224a483e422a141ffd580c00e1b919df8e529f06d03a4a987878c/mypy-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29ea6da86c8c5e9addd48fa6e624f467341b3814f54ded871b28980468686dea", size = 14992675, upload-time = "2026-05-06T19:23:34.511Z" }, - { url = "https://files.pythonhosted.org/packages/ea/6a/1cbd7290f00b4dbaa4c4502e53ac05645ea635e4d1e3dcd42687c2fc39cd/mypy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:904baa0124ebbccf0c7ba94f722cf9186ee30478f5e5b11432ffc8929248ee55", size = 10983628, upload-time = "2026-05-06T19:26:39.48Z" }, - { url = "https://files.pythonhosted.org/packages/83/3f/8caa9bcc2636cd512642050747466b695fa2540d7040544fd7ddb721d671/mypy-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:440165501295e523bf1e5d3e411b62b367b901c65610938e75f0e56ba0462461", size = 9906041, upload-time = "2026-05-06T19:24:03.199Z" }, - { url = "https://files.pythonhosted.org/packages/f6/4b/f6cd12ef1eb63be1c342da3e8ca811d2280276177f6de4ef20cb2366d79b/mypy-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:660790551c988e69d8bf7a35c8b4149edeb22f4a339165702be843532e9dcdb5", size = 14756610, upload-time = "2026-05-06T19:26:19.221Z" }, - { url = "https://files.pythonhosted.org/packages/32/73/67d09ca28bee21feaca264b2a680cf2d300bcc2071136ad064928324c843/mypy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7a15bf92cd8781f8e72f69ffa7e30d1f434402d065ee1ecd5223ef2ef100f914", size = 13554270, upload-time = "2026-05-06T19:26:08.977Z" }, - { url = "https://files.pythonhosted.org/packages/61/b3/44718b5c6b1b5a27440ff2effe6a1be0fa2a190c0f4e2e21a83728416f95/mypy-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ff370b43d7def05bbcd2f5267f0bcda72dd6a552ef2ea9375b02d6fe06da270", size = 13924663, upload-time = "2026-05-06T19:21:24.932Z" }, - { url = "https://files.pythonhosted.org/packages/6a/2b/bbb9cc5773f946846a7c340097e59bcf84095437dda0d56bb4f6cf1f6541/mypy-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37bd246590a018e5a11703b7b09c39d47ede3df5ba3fa863c5b8590b465beb01", size = 14946862, upload-time = "2026-05-06T19:24:23.023Z" }, - { url = "https://files.pythonhosted.org/packages/43/25/e9318566f443a5130b4ff0ad3367ee6c4c4c49ff083fe5214a7318c18282/mypy-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cce87e92214fac8bf8feb8a680d0c1b6fb748d50e9b57fbb13e4b1d83a3ed19b", size = 15175090, upload-time = "2026-05-06T19:26:28.794Z" }, - { url = "https://files.pythonhosted.org/packages/67/65/2ec28c834f21e164c33bc296a7db538ad50c74f83e517c7a0be95ff6de86/mypy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:e19e9cb69b66a4141009d24898259914fa2b71d026de0b46edf9fafdbf4fd46e", size = 11052899, upload-time = "2026-05-06T19:25:39.084Z" }, - { url = "https://files.pythonhosted.org/packages/9e/72/d1ec625cfc9bd101c07a6834ef1f94e820296f8fdbad2eb03f50e0983f8c/mypy-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:b021614cb08d44785b025982163ec3c39c94bff766ead071fa9e82b4ef6f62cd", size = 9972935, upload-time = "2026-05-06T19:23:24.204Z" }, - { url = "https://files.pythonhosted.org/packages/e5/c6/996a1e535e5d0d597c3b1460fc962733091f885f312e749350eb2ac10965/mypy-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ef5f581b61240d1cc629b12f8df6565ed6ffac0d82ed745eef7833222ab50b9", size = 14737259, upload-time = "2026-05-06T19:20:23.081Z" }, - { url = "https://files.pythonhosted.org/packages/94/c5/0f9460e26b77f434bd53f47d1ce32a3cd4580c92a5331fa5dfc059f9421a/mypy-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20e3470a165dbc249bdfbe8d1c5172727ef22688cffc279f8c3aa264ab9d4d9a", size = 13538377, upload-time = "2026-05-06T19:21:08.804Z" }, - { url = "https://files.pythonhosted.org/packages/b2/3e/8ea2f8dd1e5c9c279fb3c28193bdb850adf4d3d8172880abad829eced609/mypy-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:224ba142eee8b4d65d4db657cb1fc22abec30b135ded6ab297302ba1f62e505d", size = 13914264, upload-time = "2026-05-06T19:24:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/be/ce/78bd3b8520f676acee9dab48ea71473e68f6d5cf14b59fbd800bea50a92b/mypy-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e879ad8a03908ff74d15e8a9b42bf049918e6798d52c011011f1873d0b5877e", size = 14926761, upload-time = "2026-05-06T19:20:12.846Z" }, - { url = "https://files.pythonhosted.org/packages/61/ef/b52fa340522da3d22e669117c3b83155c2660f7cdc035856958fbfffb224/mypy-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:65c5c15bcbd18d6fe927cc55c459597a3517d69cc3123f067be3b020010e115e", size = 15157014, upload-time = "2026-05-06T19:25:49.78Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0c/dde7614250c6d017936c7aa3bb63b9b52c7cfd298d3f1be9be45f307870b/mypy-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:d1a068acd7c9fb77e9f8923f1556f2f49d6d7895821121b8d97fa5642b9c52f5", size = 11067049, upload-time = "2026-05-06T19:21:16.116Z" }, - { url = "https://files.pythonhosted.org/packages/27/ec/1d6af4830a94a285442db19caa02f160cc1a255e4f324eec5458e6c2bafb/mypy-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:ef9d96da1ddffbc21f27d3939319b6846d12393baa17c4d2f3e81e040e73ce2c", size = 9967903, upload-time = "2026-05-06T19:22:15.52Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2c/6fefe954207860aed6eeb91776795e64a257d3ce0360862288984ce121f5/mypy-2.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c918c64e8ce36557851b0347f84eb12f1965d3a06813c36df253eb0c0afd1d82", size = 14729633, upload-time = "2026-05-06T19:24:53.383Z" }, - { url = "https://files.pythonhosted.org/packages/23/d6/d336f5b820af189eb0390cce21de62d264c0a4e64713dfbe81bfc4fc7739/mypy-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:301f1a8ccc7d79b542ee218b28bb49443a83e194eb3d10da63ff1649e5aa5d34", size = 13559524, upload-time = "2026-05-06T19:22:24.906Z" }, - { url = "https://files.pythonhosted.org/packages/af/a6/d7bb54fde1770f0484e5fbdbdce37a41e95ed0a1cd493ec60ead111e356c/mypy-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fdf4ef489d44ce350bac3fd699907834e551d4c934e9cc862ef201215ab1558d", size = 13936018, upload-time = "2026-05-06T19:25:02.992Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ba/5be51316b91e6a6bf6e3a8adb3de500e7e1fb5bf9491743b8cbc81a34a2c/mypy-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cde2d0989f912fc850890f727d0d76495e7a6c5bdd9912a1efdb64952b4398d", size = 14910712, upload-time = "2026-05-06T19:25:21.83Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/e2c8c3b373e20ebfb66e6c83a99027fd67df4ec43b08879f74e822d2dc4c/mypy-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdf05693c231a14fe37dbfce192a3a1372c26a833af4a80f550547742952e719", size = 15141499, upload-time = "2026-05-06T19:20:50.924Z" }, - { url = "https://files.pythonhosted.org/packages/12/36/07756f933e00416d912e35878cfcf89a593a3350a885691c0bb85ae0226a/mypy-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:73aee2da33a2237e66cbe84a94780e53599847e86bb3aa7b93e405e8cd9905f2", size = 11240511, upload-time = "2026-05-06T19:21:32.39Z" }, - { url = "https://files.pythonhosted.org/packages/70/05/79ac1f20f2397353f3845f7b8bb5d8006cda7c8ef9092f04f9de3c6135f2/mypy-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:1f6dcd8f39971f41edab2728c877c4ac8b50ad3c387ff2770423b79a05d23910", size = 10149336, upload-time = "2026-05-06T19:22:08.383Z" }, - { url = "https://files.pythonhosted.org/packages/53/e0/0db84e0ebbad6e99e566c68e4b465784f2a2294f7719e8db9d509ef23087/mypy-2.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a04e980b9275c76159da66c6e1723c7798306f9802b31bdaf9358d0c84030ce8", size = 15797362, upload-time = "2026-05-06T19:22:00.835Z" }, - { url = "https://files.pythonhosted.org/packages/0a/a4/14cc0768164dd53bec48aa41a20270b18df9bf72aa5054278bf133608315/mypy-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33f9cf4825469b2bc73c53ba55f6d9a9b4cdb60f9e6e228745581520f29b8771", size = 14635914, upload-time = "2026-05-06T19:23:43.675Z" }, - { url = "https://files.pythonhosted.org/packages/08/48/d866a3e23b4dc5974c77d9cf65a435bf22de01a84dd4620917950e233960/mypy-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191675c3c7dc2a5c7722a035a6909c277f14046c5e4e02aa5fbf65f8524f08ad", size = 15270866, upload-time = "2026-05-06T19:22:34.756Z" }, - { url = "https://files.pythonhosted.org/packages/71/eb/de9ef94958eb2078a6b908ceb247757dc384d3a238d3bd6ed7d81de5eaf8/mypy-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3d26c4321a3b06fc9f04c741e0733af693f82d823f8e64e47b2e63b7f19fa84", size = 16093131, upload-time = "2026-05-06T19:23:56.541Z" }, - { url = "https://files.pythonhosted.org/packages/ad/07/0ab2c1a9d26e90942612724cbd5788f16b7810c5dd39bfcf79286c6c4524/mypy-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bbcbc4d5917ca6ce12de70e051de7f533e3bf92d548b41a38a2232a6fe356525", size = 16330685, upload-time = "2026-05-06T19:21:42.037Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8f/46f85d1371a5be642dad263828118ae1efd536d91d8bd2000c68acff3920/mypy-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:dbc6ba6d40572ae49268531565793a8f07eac7fc65ad76d482c9b4c8765b6043", size = 12752017, upload-time = "2026-05-06T19:22:44.002Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e6/94ca48800cac19eb28a58188a768aaec0d16cac0f373915f073058ab0855/mypy-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:77926029dfcb7e1a3ecb0acb2ddbb24ca36be03f7d623e1759ad5376be8f6c01", size = 10527097, upload-time = "2026-05-06T19:20:58.973Z" }, - { url = "https://files.pythonhosted.org/packages/5c/14/fd0694aa594d6e9f9fd16ce821be2eff295197a273262ef56ddcc1388d68/mypy-2.0.0-py3-none-any.whl", hash = "sha256:8a92b2be3146b4fa1f062af7eb05574cbf3e6eb8e1f14704af1075423144e4e5", size = 2673434, upload-time = "2026-05-06T19:26:32.856Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", size = 14778792, upload-time = "2026-05-11T18:36:23.605Z" }, + { url = "https://files.pythonhosted.org/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", size = 13645739, upload-time = "2026-05-11T18:37:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", size = 14074199, upload-time = "2026-05-11T18:35:09.292Z" }, + { url = "https://files.pythonhosted.org/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", size = 14953128, upload-time = "2026-05-11T18:31:57.678Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", size = 15249378, upload-time = "2026-05-11T18:33:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", size = 11060994, upload-time = "2026-05-11T18:33:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", size = 9976743, upload-time = "2026-05-11T18:31:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, ] [[package]] @@ -862,7 +862,7 @@ wheels = [ [[package]] name = "myst-parser" -version = "5.0.0" +version = "5.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15'", @@ -876,9 +876,9 @@ dependencies = [ { name = "pyyaml", marker = "python_full_version >= '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, + { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, ] [[package]] @@ -1061,15 +1061,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.1" +version = "16.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/04/71e9520551fc8fe2cf5c1a1842e4e600265b0815f2016b7c27ec85688682/pytest_rerunfailures-16.1.tar.gz", hash = "sha256:c38b266db8a808953ebd71ac25c381cb1981a78ff9340a14bcb9f1b9bff1899e", size = 30889, upload-time = "2025-10-10T07:06:01.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/27/fd0209642f3a1069da3e0be3c7e339f942d052d81ccb1fb4eb9b187d3633/pytest_rerunfailures-16.2.tar.gz", hash = "sha256:5f5a32f15674a3d54f7598388fcd3cc1bc5c37284731a4704a44485dcdda5e23", size = 32121, upload-time = "2026-05-13T08:13:26.998Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/54/60eabb34445e3db3d3d874dc1dfa72751bfec3265bd611cb13c8b290adea/pytest_rerunfailures-16.1-py3-none-any.whl", hash = "sha256:5d11b12c0ca9a1665b5054052fcc1084f8deadd9328962745ef6b04e26382e86", size = 14093, upload-time = "2025-10-10T07:06:00.019Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a5/d8c1ad74529b483044b787ead2d24ecc624bca4084a509002102e4bab8cc/pytest_rerunfailures-16.2-py3-none-any.whl", hash = "sha256:c22a53d2827becc76f057d4ded123c0e726523f2f0e5f0bb4efb31fd59e1f14e", size = 14505, upload-time = "2026-05-13T08:13:25.485Z" }, ] [[package]] @@ -1151,7 +1151,7 @@ wheels = [ [[package]] name = "requests" -version = "2.33.1" +version = "2.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1159,9 +1159,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" }, ] [[package]] @@ -1779,32 +1779,32 @@ wheels = [ [[package]] name = "types-docutils" -version = "0.22.3.20260408" +version = "0.22.3.20260508" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3c/49/48a386fe15539556de085b87a69568b028cca2fa4b92596a3d4f79ac6784/types_docutils-0.22.3.20260408.tar.gz", hash = "sha256:22d5d45e4e0d65a1bc8280987a73e28669bb1cc9d16b18d0afc91713d1be26da", size = 57383, upload-time = "2026-04-08T04:27:26.924Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/fa/38121f440851d813099c73296219e1b7be327cdd5b250b171744053dc87e/types_docutils-0.22.3.20260508.tar.gz", hash = "sha256:f043dd1fffad161cb671b0e3bf593bb5229b8d40bf365ac7d8337296dc97e6bc", size = 57431, upload-time = "2026-05-08T04:46:34.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/47/1667fda6e9fcb044f8fb797f6dc4367b88dc2ab40f1a035e387f5405e870/types_docutils-0.22.3.20260408-py3-none-any.whl", hash = "sha256:2545a86966022cdf1468d430b0007eba0837be77974a7f3fafa1b04a6815d531", size = 91981, upload-time = "2026-04-08T04:27:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/57/07/f407403b94fc80a22e9ff9c31f17d78a3272f6cce9773081fbaf853a09e7/types_docutils-0.22.3.20260508-py3-none-any.whl", hash = "sha256:47bbac43bee53bcaf99f12f5b4253bf864777c31ac4eda6e3bf6660aa6ceac40", size = 91919, upload-time = "2026-05-08T04:46:33.336Z" }, ] [[package]] name = "types-pygments" -version = "2.20.0.20260408" +version = "2.20.0.20260508" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/89/4b443128fa540c54a8f7ecdeec225aab4818534167c4a2d133099dc00fa6/types_pygments-2.20.0.20260408.tar.gz", hash = "sha256:e8a56a3ab1aee7f4ed8f1876d2f62c96e0f41ede52405a7d30c888f3989d8f00", size = 21115, upload-time = "2026-04-08T04:34:24.29Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/9c/b5c7f3d26108e88594d5d5fa0aaae7edab0ad3e90746cb212a1548f58820/types_pygments-2.20.0.20260508.tar.gz", hash = "sha256:6ec4e232784e427eea12e798fe28d5a28321023937795527a94582d5f56feed7", size = 21102, upload-time = "2026-05-08T04:50:34.545Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/d8/30924b38eef70caef6b05af5440c84d7673cea2a042e206f404c8100a88d/types_pygments-2.20.0.20260408-py3-none-any.whl", hash = "sha256:6d347d5967b5f0654b659a8b8461a870b207b7e60cd4d646bbc047f6a8db8e1e", size = 29055, upload-time = "2026-04-08T04:34:23.412Z" }, + { url = "https://files.pythonhosted.org/packages/63/e6/767672dd4df860550da0aade55ea5b4e6244b3f58edc209f0bb36dca55f2/types_pygments-2.20.0.20260508-py3-none-any.whl", hash = "sha256:42d9c45f3397a46bdb7bf718d9fe9c2d001c842ffa5afe748a4d7a5b5f0708fe", size = 28989, upload-time = "2026-05-08T04:50:33.354Z" }, ] [[package]] name = "types-pyyaml" -version = "6.0.12.20260408" +version = "6.0.12.20260510" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/73/b759b1e413c31034cc01ecdfb96b38115d0ab4db55a752a3929f0cd449fd/types_pyyaml-6.0.12.20260408.tar.gz", hash = "sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307", size = 17735, upload-time = "2026-04-08T04:30:50.974Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/85/0d9fafce21be112e977a89677f1ce9d1aef921d745b17c758c93e861c11f/types_pyyaml-6.0.12.20260510.tar.gz", hash = "sha256:09c1f1cb65a6eebea1e2e51ccf4918b8288e152909609a35cdb0d805efd125ad", size = 17831, upload-time = "2026-05-10T05:26:28.136Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/f0/c391068b86abb708882c6d75a08cd7d25b2c7227dab527b3a3685a3c635b/types_pyyaml-6.0.12.20260408-py3-none-any.whl", hash = "sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384", size = 20339, upload-time = "2026-04-08T04:30:50.113Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ad/fd618a218925daada7b8a5e7326e662599fa5fdff4a4c44ab2795bd2d9ca/types_pyyaml-6.0.12.20260510-py3-none-any.whl", hash = "sha256:3492eb9ba4d9d833473214c4d5736cccf5f37d93f5854059721e1c84f785309d", size = 20304, upload-time = "2026-05-10T05:26:26.981Z" }, ] [[package]] From e86277acc29e274a49137abb4ebdadf14efbb30b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 16 May 2026 07:43:00 -0500 Subject: [PATCH 2856/2998] ai(rules[AGENTS]) Shipped vs. Branch-Internal Narrative breaker why: Roll out the narrative-bleed guard rule (defined in tony/ai-workflow-plugins#15) so every project in the portfolio shares the same "shipped artifacts hold current state; commits hold history" discipline and the same Published-Release Test diagnostic. what: - Add the Shipped vs. Branch-Internal Narrative section to AGENTS.md. - For repos that did not have AGENTS.md, create it with a minimal header. Refs https://github.com/tony/ai-workflow-plugins/pull/15 --- AGENTS.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 6252a23946..dee9faa48b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -497,3 +497,60 @@ colors.error("failed") # Red (errors) **Avoid dim/faint styling.** The ANSI dim attribute (`\x1b[2m`) is too dark to read on black terminal backgrounds. This includes both standard and bright color variants with dim. **Bold may not render distinctly.** Some terminal/font combinations don't differentiate bold from normal weight. Don't rely on bold alone for visual distinction - pair it with color differences. + +## Shipped vs. Branch-Internal Narrative + +Long-running branches accumulate tactical decisions — renames, +refactors, attempts-then-reverts, intermediate states. Commit messages +and the diff hold *what changed* and *why*. Do not restate either in +artifacts the downstream reader holds: code, docstrings, README, +CHANGES, PR descriptions, release notes, migration guides. + +When deciding what counts as branch-internal, use trunk or the parent +branch as the baseline — not intermediate states inside the current +branch. + +**The Published-Release Test** + +Before adding rename history, "previously" / "formerly" / "no longer +X" phrasing, "removed" / "moved" / "refactored" / "fixed" diff +paraphrases, or `### Fixes` entries to a user-facing surface, ask: + +> Did users of the most recently published release ever experience +> this old name, old behavior, or bug? + +If the answer is no, it is branch-internal narrative. Move it to the +commit message and describe only the current state in the artifact. + +**Keep in shipped artifacts** + +- Deprecations and migration guides for symbols that actually shipped. +- `### Fixes` entries for bugs that affected users of a published + release. +- Comments explaining *why the current code looks this way* — + invariants, platform quirks, upstream bug workarounds — that make + sense to a reader who never saw the previous version. + +**Default**: when in doubt, keep the artifact clean and put the story +in the commit. + +### Cleanup in Hindsight + +When applying this rule retroactively from inside a feature branch, +first establish scope by diffing against the parent branch (or trunk) +to identify which commits this branch actually introduced. Then: + +- **Commits introduced in this branch** — prompt the user with two + options: `fixup!` commits with `git rebase --autosquash` to address + each causal commit at its source, or a single cleanup commit at + branch tip. User chooses. +- **Commits already in trunk or a parent branch** — default to + leaving them alone. Do not raise them as cleanup candidates; act + only on explicit user instruction. If the user opts in, fold the + cleanup into a single commit at branch tip and do not rewrite trunk + or parent-branch history. +- **Scope guard** — if cleaning in-branch bleed would touch a + colleague's in-flight work or expand the branch beyond its stated + goal, default to staying in lane: protect the project's current + goal, leave prior bleed alone, and don't introduce new bleed in the + current change. From f67224f70efdddb51dfa31e2e428046ffb822c89 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 17 May 2026 14:32:56 -0500 Subject: [PATCH 2857/2998] =?UTF-8?q?release(deps[gp-sphinx])=20bump=200.0?= =?UTF-8?q?.1a18=20=E2=86=92=200.0.1a19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 12 ++++---- uv.lock | 80 +++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 15635a2a0a..7dfb732280 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a18", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a18", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a18", + "gp-sphinx==0.0.1a19", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a19", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a19", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a18", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a18", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a18", + "gp-sphinx==0.0.1a19", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a19", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a19", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 5646e14f0b..2b2135421b 100644 --- a/uv.lock +++ b/uv.lock @@ -414,7 +414,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -423,7 +423,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -433,9 +433,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/ba/6178b21a784644a1eb613a58db1e06e206f3ceab706a444ff7901d390b69/gp_furo_theme-0.0.1a18.tar.gz", hash = "sha256:8b46c2bcd1f9bd8f315e70e08e38dfd3f9585bcec803b1ad0aabe626bb86a4ff", size = 33502, upload-time = "2026-05-11T02:23:36.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/d0/c8e4b39a92048c9704922edcde03e52e8a79087469df8ab72845e6d06810/gp_furo_theme-0.0.1a19.tar.gz", hash = "sha256:0b462e7292c8bae99be9fd5474609c5de0f1b4eea35432fcb33b3c6e6d6d3dee", size = 33517, upload-time = "2026-05-17T19:11:12.052Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/a1/8b9beebfa9113e0bc484fd3d1e75088510fe9cac42ea48a5126269221cdb/gp_furo_theme-0.0.1a18-py3-none-any.whl", hash = "sha256:071c18f2b3b79c266c2a56c6f29df9144548714930defbc5aae9807dfd850171", size = 42813, upload-time = "2026-05-11T02:23:14.178Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/1aeb91c43176152aa4ad073d525a0fafb750a27fcac6fe867260350ecf22/gp_furo_theme-0.0.1a19-py3-none-any.whl", hash = "sha256:1d86197fee7f2a0499d3586fee978411d03da1daa7fe4d70af938211e7cd189d", size = 42845, upload-time = "2026-05-17T19:10:48.289Z" }, ] [[package]] @@ -454,7 +454,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -475,9 +475,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/da/d4452b03d2ed91991dc5a7bb6112b7d6c845f9b184df35b5eb6d5ee9e40f/gp_sphinx-0.0.1a18.tar.gz", hash = "sha256:47bbf475230b242f01c7802a070d50d1b8b580a3485d6ff4d3073ef7a8a960d4", size = 19537, upload-time = "2026-05-11T02:23:37.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/92/b26071eb61be61ae3524a74645c818f6530f2ac6668cd8255680d71b0403/gp_sphinx-0.0.1a19.tar.gz", hash = "sha256:5067394164586b6e2c32ad88c5143c2f748c545253254f70ad9c4adf448dde3d", size = 19536, upload-time = "2026-05-17T19:11:12.904Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/cb/b44c7f4eaa8d8bf8490ac83b7ab073cca8f3e178d37ad74009b663004a61/gp_sphinx-0.0.1a18-py3-none-any.whl", hash = "sha256:57950a1d630b7437c7143a93d933d62bbccfddd055af4f5dad0bfd73ffd97038", size = 20033, upload-time = "2026-05-11T02:23:15.391Z" }, + { url = "https://files.pythonhosted.org/packages/6c/00/ce4daba1a2fa7e29b1de74ceb77dcbda889023d458d32b7b21ec2df0036e/gp_sphinx-0.0.1a19-py3-none-any.whl", hash = "sha256:96b0258a041dacb03eb84f89a6bd1fecd2a39d6c60941fadafa2e40500ff4f86", size = 20033, upload-time = "2026-05-17T19:10:50.198Z" }, ] [[package]] @@ -1334,7 +1334,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1342,14 +1342,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/0c/cd4d6481374ce9cb9ab3112593f94cc03d0ab1d37324dc7f0451c571cdc5/sphinx_autodoc_api_style-0.0.1a18.tar.gz", hash = "sha256:93169e01c2b2957e1308822bbc92c4b16231996bb415295f64425ca6b5594212", size = 8976, upload-time = "2026-05-11T02:23:38.022Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/19/01577b52e5160c42a876becad8efda02c7b26f871fb75f4853fb9a2c80ae/sphinx_autodoc_api_style-0.0.1a19.tar.gz", hash = "sha256:008592f830b790d068613fe7d29d16c6484a3ca7c5bdae8176765a2988f1dd1e", size = 8980, upload-time = "2026-05-17T19:11:13.707Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/3c/ebad54ba8bdd66689341b957e72442da0f8b134aa83df18bb6076d1ee33e/sphinx_autodoc_api_style-0.0.1a18-py3-none-any.whl", hash = "sha256:e2320b6d5a0b03f91041cd9f40e7f7c42c33080ced0dc6679f0f515b4b504ba3", size = 9065, upload-time = "2026-05-11T02:23:16.582Z" }, + { url = "https://files.pythonhosted.org/packages/45/d3/6e7ac4a4f960c0550a675e66146985717dc290e61f0defb9340a077c05c0/sphinx_autodoc_api_style-0.0.1a19-py3-none-any.whl", hash = "sha256:67081799de11b9a213437401e437a89bb6f9ddf33cce0cb164531011c998c450", size = 9065, upload-time = "2026-05-17T19:10:52.077Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1357,22 +1357,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/af/0702370bd444dc4fd0e15e8e30137d7572870e7dc680587cad94dc62a9ff/sphinx_autodoc_argparse-0.0.1a18.tar.gz", hash = "sha256:3dc040b21b978c05bf4aab4c9108593d4f88dbe0ab81f0d7f8fd587ba4edf73e", size = 42457, upload-time = "2026-05-11T02:23:38.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6c/439e26adb06d9170925a0cd8c05f4465f2bd003302bf93be386fa7e96623/sphinx_autodoc_argparse-0.0.1a19.tar.gz", hash = "sha256:1c5e9c942234c372a98d4951d2adf373c8bef4e9a864d4a2384c37601ad9463d", size = 42461, upload-time = "2026-05-17T19:11:14.839Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/be/15748463600101a82b09013dae21c1d12437615a38a11d9bfa6de9ade5f3/sphinx_autodoc_argparse-0.0.1a18-py3-none-any.whl", hash = "sha256:51aa8e550a467cd3c94e6f7832eccb87f77264652293aef3bac9dfba519814b6", size = 47275, upload-time = "2026-05-11T02:23:17.771Z" }, + { url = "https://files.pythonhosted.org/packages/59/80/784ab7c5e8add8e25cbc1b01925df5198b1c82d5e9d14bfb601093bad304/sphinx_autodoc_argparse-0.0.1a19-py3-none-any.whl", hash = "sha256:6f9497d32082f02aff736fa174b9cf1321e95222458ec1817c7bf0b1fab93963", size = 47276, upload-time = "2026-05-17T19:10:53.271Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/cf/08843e9c877fa5e3ea90f286fa3e6dc3999b19c429c561b75d2aabb18d00/sphinx_autodoc_typehints_gp-0.0.1a18.tar.gz", hash = "sha256:c9e92ca14e038d85545357a175ff04d7f3469446dae270185a582b2704e39355", size = 36364, upload-time = "2026-05-11T02:23:44.019Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/e3/ed5252fff9f333dcecdb1434ae9a7183b5660c60237e11465b9ccf05b09a/sphinx_autodoc_typehints_gp-0.0.1a19.tar.gz", hash = "sha256:851a853e1ba73eaccedadcbeeb3f5b0b8303ccd78daa3171078dedff2e46f223", size = 36362, upload-time = "2026-05-17T19:11:19.561Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c9/3b4682b23435136adcf8e3a3578aa4e0d09e2f5ba7437f658764744daf80/sphinx_autodoc_typehints_gp-0.0.1a18-py3-none-any.whl", hash = "sha256:3aebf97911f5c9d90b924f87bee7fe1ab523c9407eeadefd9b7d575166bd1c81", size = 38509, upload-time = "2026-05-11T02:23:25.274Z" }, + { url = "https://files.pythonhosted.org/packages/72/df/3b8b76ce3a484e401e158c4d32b7f42d54d10a5e31713b4858e003c8bda5/sphinx_autodoc_typehints_gp-0.0.1a19-py3-none-any.whl", hash = "sha256:a4f11bf91d615960ccd66679a5658dd76bffb7674c560aea248c31eabc0d54b8", size = 38510, upload-time = "2026-05-17T19:11:00.345Z" }, ] [[package]] @@ -1434,55 +1434,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2c/afe37dc06e97a42e0bf3a4030710653fae2f21362ed344cb3d5bf25d3b1e/sphinx_fonts-0.0.1a18.tar.gz", hash = "sha256:c7b76664eebbc91c5882de912dcbf332a58b415bcf29f29ce90a76f5f30cd954", size = 5789, upload-time = "2026-05-11T02:23:44.878Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/a8/cba69fdf24c27475afd6bbc489eb3fe674928ce02b26c1b144148578871b/sphinx_fonts-0.0.1a19.tar.gz", hash = "sha256:3ebd5d3e6c14c99a8633ecbf473103669f3c22ca1a6cd70244a48ff9278e459d", size = 5790, upload-time = "2026-05-17T19:11:20.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/a1/c65c34aa562cc09a2aa426e648372a8dcb91cead1ac01241002b729dc74a/sphinx_fonts-0.0.1a18-py3-none-any.whl", hash = "sha256:aa4d8c110b6b3fde2a508e05121958e0eca72cd0c1dc70dd12c90cc7ecbc225b", size = 4360, upload-time = "2026-05-11T02:23:26.417Z" }, + { url = "https://files.pythonhosted.org/packages/b2/db/6ea1cff505ba2fb131174dba5cf9f00a69e1eda7196bac9feb451ccff48a/sphinx_fonts-0.0.1a19-py3-none-any.whl", hash = "sha256:fd530c651cfe37ed035310c8f8038075ef4560b311f061a3cc7f97e8423e6fb1", size = 4363, upload-time = "2026-05-17T19:11:01.415Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/ef/f19b191f1343a2e6132fb4b0141ccfdae5db18d0d6826ca312816b66e4c1/sphinx_gp_opengraph-0.0.1a18.tar.gz", hash = "sha256:d50dd7fe2dbfbc4f67b0f8850944ae0671b7c34b86af3feeec87680394c710c3", size = 11945, upload-time = "2026-05-11T02:23:45.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/4c/71732d2799b643a9fd1d96dead2f1f4021bfb6c7aa9a1ec04506d9e823e7/sphinx_gp_opengraph-0.0.1a19.tar.gz", hash = "sha256:390ff298ba8e8b2c9fe9e61097d314b9217b44e3bf104023a8e4fd28c1f7f227", size = 11948, upload-time = "2026-05-17T19:11:21.176Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/39/8257951f05120c2a4744b2a1fd8d31a6b022094b087fef15a6541e402087/sphinx_gp_opengraph-0.0.1a18-py3-none-any.whl", hash = "sha256:c205b5f3cd91fd01c710e93e25f3a6f45771c227cc45ecf60554b77a1102ef86", size = 12185, upload-time = "2026-05-11T02:23:27.656Z" }, + { url = "https://files.pythonhosted.org/packages/1a/6e/30720abb30d313320650b9179da0566f3f2aa6d4fd840b9cac776c6dfeec/sphinx_gp_opengraph-0.0.1a19-py3-none-any.whl", hash = "sha256:f177344aae4125dab513d4eb968f0a319b5f40d3444a2f129197d00fa177911f", size = 12185, upload-time = "2026-05-17T19:11:03.123Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/41/bf88bd6103b77fada6dfed4dc8a2e9ab8f24b09fbe8b2d96acbd55952042/sphinx_gp_sitemap-0.0.1a18.tar.gz", hash = "sha256:c5935a8bfbeb1df586ed1e119b85ff38615779f34495ca265f667f71662297db", size = 9957, upload-time = "2026-05-11T02:23:46.841Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/be/d06a98e0eee553771601676e1ed362fb06b71d734607e4625652765b1e86/sphinx_gp_sitemap-0.0.1a19.tar.gz", hash = "sha256:66e07cf2bc4e8d931ea7a60d780e6adbaf4e144203a9031c821c1f56959f4ae9", size = 9955, upload-time = "2026-05-17T19:11:21.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/9e/1b7a543db5a7862c726375aca53c4cffa6788f1f7e62484be5b1df9d0ded/sphinx_gp_sitemap-0.0.1a18-py3-none-any.whl", hash = "sha256:81418fbcc30c19821ecc2fc913794407c69bca5d6a3df48516f7e8ab9920be9e", size = 8982, upload-time = "2026-05-11T02:23:29.055Z" }, + { url = "https://files.pythonhosted.org/packages/47/2d/9dbf6bc4e7358dc817ed2b10bee5a4cffc3cff38eda2cdfcf85d43429b4d/sphinx_gp_sitemap-0.0.1a19-py3-none-any.whl", hash = "sha256:0adaa66b16fa2b70961bcd54372f0181c2a68245f15f8894f3296b3c7a63dc6f", size = 8980, upload-time = "2026-05-17T19:11:04.289Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/ea/f3b5cb3b61edfd46409d7c849c65819b361890f82f3f1caec64ec8b36267/sphinx_gp_theme-0.0.1a18.tar.gz", hash = "sha256:b3b45c72a07405a2a7aa7100f1324716e346eb66a451f4b016c13f7248fdd1b7", size = 18220, upload-time = "2026-05-11T02:23:47.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/2e/2d356cf6fa3ba945bffc3262b444b2b7be4d6615a03e1161e0ce1d1768c3/sphinx_gp_theme-0.0.1a19.tar.gz", hash = "sha256:76075c052e5fd796d6c97d722a26548e1e31254e710b5875301d0d30dbb13765", size = 18224, upload-time = "2026-05-17T19:11:23.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/96/db2a18c9ff7ce42970de3df73e72d51a6c4de7066de223ee7e9eaaa6854d/sphinx_gp_theme-0.0.1a18-py3-none-any.whl", hash = "sha256:8179775890181315d28a9e9438d9885b2ca48f818689a60797737a98050c6fc0", size = 19817, upload-time = "2026-05-11T02:23:30.497Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/89edc99113299d6fb41a9cc9f0bd9fe5d032840b309a6f503c59bfcf9fc1/sphinx_gp_theme-0.0.1a19-py3-none-any.whl", hash = "sha256:d5e760bb053529ddca0e54d15857e2434af34738b6bd8086075d6e8a8cd92411", size = 19819, upload-time = "2026-05-17T19:11:05.347Z" }, ] [[package]] @@ -1500,28 +1500,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/7b/c9065f265e7046ce3f3655417ce10d9bda55e8ab975e4f6ac661afac4d50/sphinx_ux_autodoc_layout-0.0.1a18.tar.gz", hash = "sha256:deffcffd5147afdacb44751b604ecbfe50c50a1722e35281ec05393e06be81a7", size = 29098, upload-time = "2026-05-11T02:23:48.892Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/a1/a89a78249dc4dcb0b7a3f04710c106d20a99166a20d1724785d07898b0c3/sphinx_ux_autodoc_layout-0.0.1a19.tar.gz", hash = "sha256:ab1a2852c6ccf8b4968364f51d45bea9eca4fa5ad845ecb543b6f02755aa50d9", size = 29102, upload-time = "2026-05-17T19:11:24.472Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/30/952a3207d1d689dcca3dfa8a4a512b41b5a6531be673fece6ca2966a8386/sphinx_ux_autodoc_layout-0.0.1a18-py3-none-any.whl", hash = "sha256:d50bd77c2c38b0d496d700076ecd1fe680705afc235129256b6098a5810a7afb", size = 33068, upload-time = "2026-05-11T02:23:31.635Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2e/c4f937ba41c84efb25bd173f57c8f8135cc47a4ac3c5f449387c6939ec28/sphinx_ux_autodoc_layout-0.0.1a19-py3-none-any.whl", hash = "sha256:5bbb2369eaccab857e7a80418ac82334fc1f4ed6f6aa63a988875ffabb11abef", size = 33069, upload-time = "2026-05-17T19:11:06.764Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a18" +version = "0.0.1a19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/73/a81b7dc6f4c722e4c9f3170e95ccdbe291d8e33e386303523dfe822df346/sphinx_ux_badges-0.0.1a18.tar.gz", hash = "sha256:7e7f2bbd82a3948336289ef854e90cdf367eda760371df031a175166d72a4b18", size = 15570, upload-time = "2026-05-11T02:23:49.814Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/3e/318604a0a2472f45e50ca6bfe55ea3400413864194f93460ca81847c7569/sphinx_ux_badges-0.0.1a19.tar.gz", hash = "sha256:faf55a7841b5c39d61f848fba7fc4ce497933e4f7832c4bcf813749af88e1fb7", size = 15570, upload-time = "2026-05-17T19:11:25.387Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/8a/9b51c80a52686d27662844561c02cb9e412518a6e17b5ab13fd277cc5f4a/sphinx_ux_badges-0.0.1a18-py3-none-any.whl", hash = "sha256:978320cce8b8b4f5b821fd622e7bd19970c5f5e81cc022e630372e5433d51585", size = 16446, upload-time = "2026-05-11T02:23:33.109Z" }, + { url = "https://files.pythonhosted.org/packages/2d/62/51dddb1c31cd7a052f0fde5bebf1a9dc9b2cc229c92e310c46b933dfd9de/sphinx_ux_badges-0.0.1a19-py3-none-any.whl", hash = "sha256:35d486b1ed9e4d46c13f14a7117a1d90c2e8688eb3b3f3de591de821ec4d730b", size = 16447, upload-time = "2026-05-17T19:11:08.488Z" }, ] [[package]] @@ -1683,7 +1683,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a18" }, + { name = "gp-sphinx", specifier = "==0.0.1a19" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1693,8 +1693,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a19" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a19" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1702,11 +1702,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a18" }, + { name = "gp-sphinx", specifier = "==0.0.1a19" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a18" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a18" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a19" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a19" }, ] lint = [ { name = "mypy" }, From 525510932c63c9081dcfb1786486b47ac79a76a9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 04:29:27 -0500 Subject: [PATCH 2858/2998] .tool-versions(uv) uv 0.11.14 -> 0.11.16 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.16 - https://github.com/astral-sh/uv/blob/0.11.16/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 5a4b485889..771216983e 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.50 -uv 0.11.14 +uv 0.11.16 python 3.14 3.13 3.12 3.11 3.10 From 98f77848de817f74cccc7fc917f84cf592b6588a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 04:29:34 -0500 Subject: [PATCH 2859/2998] py(deps[dev]) Bump dev packages --- uv.lock | 354 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 185 insertions(+), 169 deletions(-) diff --git a/uv.lock b/uv.lock index 2b2135421b..1c1e630f96 100644 --- a/uv.lock +++ b/uv.lock @@ -76,40 +76,42 @@ wheels = [ [[package]] name = "ast-serialize" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/9d/912fefab0e30aee6a3af8a62bbea4a81b29afa4ba2c973d31170620a26de/ast_serialize-0.3.0.tar.gz", hash = "sha256:1bc3ca09a63a021376527c4e938deedd11d11d675ce850e6f9c7487f5889992b", size = 60689, upload-time = "2026-04-30T23:24:48.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/57/a54d4de491d6cdd7a4e4b0952cc3ca9f60dcefa7b5fb48d6d492debe1649/ast_serialize-0.3.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3a867927df59f76a18dc1d874a0b2c079b42c58972dca637905576deb0912e14", size = 1182966, upload-time = "2026-04-30T23:23:57.376Z" }, - { url = "https://files.pythonhosted.org/packages/ee/9e/a5db014bb0f91b209236b57c429389e31290c0093532b8436d577699b2fa/ast_serialize-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a6fb063bf040abf8321e7b8113a0554eda445ffc508aa51287f8808886a5ae22", size = 1171316, upload-time = "2026-04-30T23:23:59.63Z" }, - { url = "https://files.pythonhosted.org/packages/15/59/fd55133e478c4326f60a11df02573bf7ccb2ac685810b50f1803d0f68053/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5075cd8482573d743586779e5f9b652a015e37d4e95132d7e5a9bc5c8f483d8f", size = 1232234, upload-time = "2026-04-30T23:24:01.168Z" }, - { url = "https://files.pythonhosted.org/packages/cc/79/0ca1d26357ecb4a697d74d00b73ef3137f24c140424125393a0de820eb09/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41560b27794f4553b0f77811e9fb325b77db4a2b39018d437e09932275306e66", size = 1233437, upload-time = "2026-04-30T23:24:03.151Z" }, - { url = "https://files.pythonhosted.org/packages/53/3e/7078ec94dd6e124b8e028ac77016a4f13c83fa1c145790f2e68f3816998b/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b967c01ca74909c5d90e0fe4393401e2cc5da5ebd9a6262a19e45ffd3757dec8", size = 1440188, upload-time = "2026-04-30T23:24:04.717Z" }, - { url = "https://files.pythonhosted.org/packages/21/16/cca7195ef55a012f8013c3442afa91d287a0a36dcf88b480b262475135b3/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:424ebb8f46cd993f7cec4009d119312d8433dd90e6b0df0499cd2c91bdcc5af9", size = 1254211, upload-time = "2026-04-30T23:24:06.18Z" }, - { url = "https://files.pythonhosted.org/packages/a0/0f/f3d4dfae67dee6580534361a6343367d34217e7d25cff858bd1d8f03b8ed/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d14b1d566b56e2ee70b11fec1de7e0b94ec7cd83717ec7d189967841a361190e", size = 1255973, upload-time = "2026-04-30T23:24:07.772Z" }, - { url = "https://files.pythonhosted.org/packages/14/41/55fbfe02c42f40fbe3e74eda167d977d555ff720ce1abfa08515236efd88/ast_serialize-0.3.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba30b18735f047ec11103d1ab92f4789cf1fea1e0dc89b04a2f5a0632fd79de", size = 1298629, upload-time = "2026-04-30T23:24:09.4Z" }, - { url = "https://files.pythonhosted.org/packages/28/36/7d2501cacc7989fb8504aa9da2a2022a174200a59d4e6639de4367a57fdd/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e6ea0754cb7b0f682ebb005ffb0d18f8d17993490d9c289863cd69cacc4ab8df", size = 1408435, upload-time = "2026-04-30T23:24:11.013Z" }, - { url = "https://files.pythonhosted.org/packages/03/e7/54e3b469c3fa0bf9cd532fa643d1d33b73303f8d70beac3e366b68dd64b7/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a0c5aa1073a5ba7b2abaa4b54abe8b8d75c4d1e2d54a2ff70b0ca6222fea5728", size = 1508174, upload-time = "2026-04-30T23:24:12.635Z" }, - { url = "https://files.pythonhosted.org/packages/b5/2a/9b9621865b02c60539e26d9b114a312b4fa46aa703e33e79317174bfea21/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4e52650d834c1ea7791969a361de2c54c13b2fb4c519ec79445fa8b9021a147d", size = 1502354, upload-time = "2026-04-30T23:24:14.186Z" }, - { url = "https://files.pythonhosted.org/packages/34/dd/f138bc5c43b0c414fdd12eefe15677839323078b6e75301ad7f96cd26d45/ast_serialize-0.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15bd6af3f136c61dae27805eb6b8f3269e85a545c4c27ffe9e530ead78d2b36d", size = 1450504, upload-time = "2026-04-30T23:24:16.076Z" }, - { url = "https://files.pythonhosted.org/packages/68/cf/97ef9e1c315601db74365955c8edd3292e3055500d6317602815dbdf08ae/ast_serialize-0.3.0-cp314-cp314t-win32.whl", hash = "sha256:d188bfe37b674b49708497683051d4b571366a668799c9b8e8a94513694969d9", size = 1058662, upload-time = "2026-04-30T23:24:17.535Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d6/e2c3483c31580fdb623f92ad38d2f856cde4b9205a3e6bd84760f3de7d82/ast_serialize-0.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5832c2fdf8f8a6cf682b4cfcf677f5eaf39b4ddbc490f5480cfccdd1e7ce8fa1", size = 1100349, upload-time = "2026-04-30T23:24:18.992Z" }, - { url = "https://files.pythonhosted.org/packages/ab/89/29abcb1fe18a429cda60c6e0bbd1d6e90499339842a2f548d7567542357e/ast_serialize-0.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:670f177188d128fb7f9f15b5ad0e1b553d22c34e3f584dcb83eb8077600437f0", size = 1072895, upload-time = "2026-04-30T23:24:20.706Z" }, - { url = "https://files.pythonhosted.org/packages/bc/93/72abad83966ed6235647c9f956417dc1e17e997696388521910e3d1fa3f4/ast_serialize-0.3.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ec2fafa5e4313cc8feed96e436ebe19ac7bc6fa41fbc2827e826c48b9e4c3a9", size = 1190024, upload-time = "2026-04-30T23:24:22.486Z" }, - { url = "https://files.pythonhosted.org/packages/85/4f/eb88584b2f0234e581762011208ca203252bf6c98e59b4769daa571f3576/ast_serialize-0.3.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ef6d3c08b7b4cd29b48410338e134764a00e76d25841eb02c1084e868c888ecc", size = 1178633, upload-time = "2026-04-30T23:24:24.35Z" }, - { url = "https://files.pythonhosted.org/packages/56/51/cf1ec1ff3e616373d0dcbd5fad502e0029dc541f13ab642259762a7d127f/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d841424f41b886e98044abc80769c14a956e6e5ccd5fb5b0d9f5ead72be18a4", size = 1241351, upload-time = "2026-04-30T23:24:25.987Z" }, - { url = "https://files.pythonhosted.org/packages/0d/44/68fcf50478cf1093f2d423f034ae06453122c8b415d8e21a44668eca485d/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d21453734ad39367ede5d37efe4f59f830ce1c09f432fc72a90e368f77a4a3e7", size = 1239582, upload-time = "2026-04-30T23:24:27.808Z" }, - { url = "https://files.pythonhosted.org/packages/9d/c1/a6c9fa284eceb5fc6f21347e968445a051d7ca2c4d34e6a04314646dbcee/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5e110cdce2a347e1dd987529c88ef54d26f67848dce3eba1b3b2cc2cf085c94", size = 1448853, upload-time = "2026-04-30T23:24:29.534Z" }, - { url = "https://files.pythonhosted.org/packages/23/5f/8ad3829a09e4e8c5328a53ce7d4711d660944e3e164c5f6abcc2c8f27167/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6e23a98e57560a055f5c4b68700a0fd5ce483d2814c23140b3638c7f5d1e61", size = 1262204, upload-time = "2026-04-30T23:24:31.482Z" }, - { url = "https://files.pythonhosted.org/packages/25/13/44aa28d97f10e25247e8576b5f6b2795d4fa1a80acc88acc942c508d06f7/ast_serialize-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1c9e763d70293d65ce1e1ea8c943140c68d0953f0268c7ee0998f2e07f77dd0", size = 1266458, upload-time = "2026-04-30T23:24:33.088Z" }, - { url = "https://files.pythonhosted.org/packages/d8/58/b3a8be3777cd3744324fd5cec0d80d37cd96fc7cbb0fb010e03dff1e870f/ast_serialize-0.3.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4388a1796c228f1ce5c391426f7d21a0003ad3b47f677dbeded9bd1a85c7209f", size = 1308700, upload-time = "2026-04-30T23:24:34.657Z" }, - { url = "https://files.pythonhosted.org/packages/13/03/f8312d6b57f5471a9dc7946f22b8798a1fc296d38c25766223aacadec42c/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5283cdcc0c64c3d8b9b688dc6aaa012d9c0cf1380a7f774a6bae6a1c01b3205a", size = 1416724, upload-time = "2026-04-30T23:24:36.562Z" }, - { url = "https://files.pythonhosted.org/packages/50/5d/13fc3789a7abac00559da2e2e9f386db4612aa1f84fc53d09bf714c37545/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ef88cc5842a5d7a6ac09dc0d5fc2c98f5d276c1f076f866d55047ce886785b", size = 1515441, upload-time = "2026-04-30T23:24:38.018Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b9/7ab43fc7a23b1f970281093228f5f79bed6edeed7a3e672bde6d7a832a58/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cc14bf402bdc0978594ecce783793de2c7470cd4f5cd7eb286ca97ed8ff7cba9", size = 1510522, upload-time = "2026-04-30T23:24:39.798Z" }, - { url = "https://files.pythonhosted.org/packages/56/ec/d75fc2b788d319f1fad77c14156896f31afdfc68af85b505e5bdebcb9592/ast_serialize-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:11eae0cf1b7b3e0678133cc2daa974ea972caf02eb4b3aa062af6fa9acd52c57", size = 1460917, upload-time = "2026-04-30T23:24:41.305Z" }, - { url = "https://files.pythonhosted.org/packages/95/74/f99c81193a2725911e1911ae567ed27c2f2419332c7f3537366f9d238cac/ast_serialize-0.3.0-cp39-abi3-win32.whl", hash = "sha256:2db3dd99de5e6a5a11d7dda73de8750eb6e5baaf25245adf7bdcfe64b6108ae2", size = 1067804, upload-time = "2026-04-30T23:24:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/16/81/76af00c47daa151e89f98ae21fbbcb2840aaa9f5766579c4da76a3c57188/ast_serialize-0.3.0-cp39-abi3-win_amd64.whl", hash = "sha256:a2cd125adccf7969470621905d302750cd25951f22ea430d9a25b7be031e5549", size = 1105561, upload-time = "2026-04-30T23:24:44.578Z" }, - { url = "https://files.pythonhosted.org/packages/bd/46/d3ec57ad500f598d1554bd14ce4df615960549ab2844961bc4e1f5fbd174/ast_serialize-0.3.0-cp39-abi3-win_arm64.whl", hash = "sha256:0dd00da29985f15f50dc35728b7e1e7c84507bccfea1d9914738530f1c72238a", size = 1077165, upload-time = "2026-04-30T23:24:46.377Z" }, +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, ] [[package]] @@ -250,14 +252,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.3" +version = "8.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, ] [[package]] @@ -414,7 +416,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1151,7 +1153,7 @@ wheels = [ [[package]] name = "requests" -version = "2.34.0" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1159,9 +1161,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -1187,27 +1189,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +version = "0.15.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, + { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, + { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, + { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, + { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, + { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, + { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, + { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, + { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, + { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, ] [[package]] @@ -1779,32 +1781,32 @@ wheels = [ [[package]] name = "types-docutils" -version = "0.22.3.20260508" +version = "0.22.3.20260518" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/fa/38121f440851d813099c73296219e1b7be327cdd5b250b171744053dc87e/types_docutils-0.22.3.20260508.tar.gz", hash = "sha256:f043dd1fffad161cb671b0e3bf593bb5229b8d40bf365ac7d8337296dc97e6bc", size = 57431, upload-time = "2026-05-08T04:46:34.541Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/91/81b520d0869a41aa0d86e713417b63e8604b4280c304bc09b02d74c7efd4/types_docutils-0.22.3.20260518.tar.gz", hash = "sha256:2c45ba63a9ac64246335359b68fe9c27602926499c9b67caec3780745f6aadee", size = 57504, upload-time = "2026-05-18T06:03:53.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/07/f407403b94fc80a22e9ff9c31f17d78a3272f6cce9773081fbaf853a09e7/types_docutils-0.22.3.20260508-py3-none-any.whl", hash = "sha256:47bbac43bee53bcaf99f12f5b4253bf864777c31ac4eda6e3bf6660aa6ceac40", size = 91919, upload-time = "2026-05-08T04:46:33.336Z" }, + { url = "https://files.pythonhosted.org/packages/01/9b/243fb84ede4f987f303a89e734c5def35ead2f8bd962ad301c1e99680958/types_docutils-0.22.3.20260518-py3-none-any.whl", hash = "sha256:9c4cbc37d9e37f47dfe971ac09e9880380dc948ff1f23956892e810d0bf08676", size = 91970, upload-time = "2026-05-18T06:03:52.388Z" }, ] [[package]] name = "types-pygments" -version = "2.20.0.20260508" +version = "2.20.0.20260518" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/9c/b5c7f3d26108e88594d5d5fa0aaae7edab0ad3e90746cb212a1548f58820/types_pygments-2.20.0.20260508.tar.gz", hash = "sha256:6ec4e232784e427eea12e798fe28d5a28321023937795527a94582d5f56feed7", size = 21102, upload-time = "2026-05-08T04:50:34.545Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/66/3e27e8dbe72947d51355d1fcba222a55bf5f0770ee660e9cc9df0d1ce5d7/types_pygments-2.20.0.20260518.tar.gz", hash = "sha256:bcab233d0389cb0a91146eb860e7bdcbceaa0f30bee73cefc7b367129cc4a330", size = 21152, upload-time = "2026-05-18T06:07:26.927Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/e6/767672dd4df860550da0aade55ea5b4e6244b3f58edc209f0bb36dca55f2/types_pygments-2.20.0.20260508-py3-none-any.whl", hash = "sha256:42d9c45f3397a46bdb7bf718d9fe9c2d001c842ffa5afe748a4d7a5b5f0708fe", size = 28989, upload-time = "2026-05-08T04:50:33.354Z" }, + { url = "https://files.pythonhosted.org/packages/66/d6/5f19f5b633af6a7666c6096fdd06b70f0d4a8f585af5e18a3ef58ad47ec1/types_pygments-2.20.0.20260518-py3-none-any.whl", hash = "sha256:e40728efd00c9da5936366648d5b3c55e72ed52bdd80495a96577b4d717c4fcb", size = 29002, upload-time = "2026-05-18T06:07:26.054Z" }, ] [[package]] name = "types-pyyaml" -version = "6.0.12.20260510" +version = "6.0.12.20260518" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/85/0d9fafce21be112e977a89677f1ce9d1aef921d745b17c758c93e861c11f/types_pyyaml-6.0.12.20260510.tar.gz", hash = "sha256:09c1f1cb65a6eebea1e2e51ccf4918b8288e152909609a35cdb0d805efd125ad", size = 17831, upload-time = "2026-05-10T05:26:28.136Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/83/4a1afc3fbfcf5b8d46fc390cd95ed6b0dc9010a265f4e9f46314efffa37a/types_pyyaml-6.0.12.20260518.tar.gz", hash = "sha256:d917f83fb38462550338c1297faedd860b3ec83912b96b1e3d73255f7473e466", size = 17850, upload-time = "2026-05-18T06:01:58.675Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/ad/fd618a218925daada7b8a5e7326e662599fa5fdff4a4c44ab2795bd2d9ca/types_pyyaml-6.0.12.20260510-py3-none-any.whl", hash = "sha256:3492eb9ba4d9d833473214c4d5736cccf5f37d93f5854059721e1c84f785309d", size = 20304, upload-time = "2026-05-10T05:26:26.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/a2/c01db32be2ae7d6a1689972f3c492b149ee4e164b12fdfd9f64b50888215/types_pyyaml-6.0.12.20260518-py3-none-any.whl", hash = "sha256:d2150f75a231c9fe9c7463bd29487d93e60bac90400287351384bc2284eba7cd", size = 20312, upload-time = "2026-05-18T06:01:57.368Z" }, ] [[package]] @@ -1836,16 +1838,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.46.0" +version = "0.47.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b1/8e7077a8641086aea449e1b5752a570f1b5906c64e0a33cd6d93b63a066b/uvicorn-0.47.0.tar.gz", hash = "sha256:7c9a0ea1a9414106bbab7324609c162d8fa0cdcdcb703060987269d77c7bb533", size = 90582, upload-time = "2026-05-14T18:16:54.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/15/41/ac2dfdbc1f60c7af4f994c7a335cfa7040c01642b605d65f611cecc2a1e4/uvicorn-0.47.0-py3-none-any.whl", hash = "sha256:2c5715bc12d1892d84752049f400cd1c3cb018514967fdfeb97640443a6a9432", size = 71301, upload-time = "2026-05-14T18:16:51.762Z" }, ] [[package]] @@ -1882,105 +1884,119 @@ wheels = [ [[package]] name = "watchfiles" -version = "1.1.1" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318, upload-time = "2025-10-14T15:04:18.753Z" }, - { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478, upload-time = "2025-10-14T15:04:20.297Z" }, - { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894, upload-time = "2025-10-14T15:04:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065, upload-time = "2025-10-14T15:04:22.795Z" }, - { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377, upload-time = "2025-10-14T15:04:24.138Z" }, - { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837, upload-time = "2025-10-14T15:04:25.057Z" }, - { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456, upload-time = "2025-10-14T15:04:26.497Z" }, - { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614, upload-time = "2025-10-14T15:04:27.539Z" }, - { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690, upload-time = "2025-10-14T15:04:28.495Z" }, - { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459, upload-time = "2025-10-14T15:04:29.491Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663, upload-time = "2025-10-14T15:04:30.435Z" }, - { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453, upload-time = "2025-10-14T15:04:31.53Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, - { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, - { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, - { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, - { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, - { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, - { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, - { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, - { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, - { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, - { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, - { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, - { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, - { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, - { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, - { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, - { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, - { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, - { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, - { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, - { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, - { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, - { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, - { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, - { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, - { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, - { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, - { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611, upload-time = "2025-10-14T15:06:05.809Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889, upload-time = "2025-10-14T15:06:07.035Z" }, - { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616, upload-time = "2025-10-14T15:06:08.072Z" }, - { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413, upload-time = "2025-10-14T15:06:09.209Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, - { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, - { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/5a/2bf22ecb24916983bf1cc0095e7dea2741d14d6553b0d6a2ac8bc96eca93/watchfiles-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bb68bf4df85abebe5efddc53cf2075520f243a59868d9b3973278b23e76962a9", size = 400471, upload-time = "2026-05-18T04:31:08.908Z" }, + { url = "https://files.pythonhosted.org/packages/55/70/dea1f6a0e76607841a60fb51af150e70124864673f61704abb62b90cdcc7/watchfiles-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c16cb06dd17d43b9d185094268459eac92c9538356f050e55b54e82cf700e1d4", size = 394599, upload-time = "2026-05-18T04:30:19.845Z" }, + { url = "https://files.pythonhosted.org/packages/18/52/752dcc7dc817baef5e89518732925795ce52e36a683a9a3c9fb68b21504e/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a0feab9af4c021c581f695258c642b3d10c5fd4c676e33a0d8606425d82631", size = 455458, upload-time = "2026-05-18T04:30:29.126Z" }, + { url = "https://files.pythonhosted.org/packages/12/48/366ebbb22fcc504c2f72b45f0b7e72f40a18795cc01752c16066d597b67a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a16ffe19bf5cf9f5edaa1ad1dd830c5a816e8feec430c522302ab55483a4b994", size = 460513, upload-time = "2026-05-18T04:31:40.85Z" }, + { url = "https://files.pythonhosted.org/packages/ad/44/1f9e1b15e7a729062e0d0c3d0d7225ea4ab98b2267ef87287153be2495fc/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204f299afcbd65918ab78dbc52626b0ae45e9d8cef403fdbf33ecf9e40eac66e", size = 493616, upload-time = "2026-05-18T04:30:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/7e/55/8b1086dcc8a1d6a697a62767bd7ea368e74c61c6fd171683cfe24a3fe5d2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11743adfa510bfffebe97659fb280182b5c9b238708f667e866f308c3430dc19", size = 573154, upload-time = "2026-05-18T04:30:37.903Z" }, + { url = "https://files.pythonhosted.org/packages/14/7a/242f400cc77fafa7b18d53d19d9cb64fc6a6f61f28c55913bae7c674d92a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb72919d93e3a16fc451d3aa3d4b1698423daca1b382d3d959c9ac51297c12a8", size = 467046, upload-time = "2026-05-18T04:30:41.869Z" }, + { url = "https://files.pythonhosted.org/packages/02/c8/79eee650c62d2c186598489814468e389b5def0ebe755399ff645b35b1b2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62f042afde2dde21ec1d2c1a74361e804673df86f51e418a999c9acfe671b07", size = 457100, upload-time = "2026-05-18T04:31:13.064Z" }, + { url = "https://files.pythonhosted.org/packages/81/36/519f6dbb7a95e4fe7c1513ed25b1520295ef9905a27f1f2226a73892bfb7/watchfiles-1.2.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:027ae72bfdfd254862065d8b3e2a815c6ab9b1853ce41e6648ece84afd34a551", size = 467038, upload-time = "2026-05-18T04:30:32.915Z" }, + { url = "https://files.pythonhosted.org/packages/2f/12/951af6b9f89097e02511122258402cb3578443021930b70cf968d6310dc0/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1cfd51e97e13ff3bd047c140764d277fc9b95b7cb5da59e46a47d167adab310", size = 632563, upload-time = "2026-05-18T04:30:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/28/cc/0cba1f0a6117b7ec117271bdc3cb3a5a252005959755a2c09a745e0942cc/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:24b2405c0a46738dd9e1cf7135aa5dbdb9d42d024628651b3b13d5117e99f8df", size = 660851, upload-time = "2026-05-18T04:31:53.186Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f2/26347558cc8bf6877845e66b315f644d03c173906aa09e233a3f4fd23928/watchfiles-1.2.0-cp310-cp310-win32.whl", hash = "sha256:8c520725602756229f045b032a1ff33d7ef0f7404189d62f6c2438cb6d8ef6a1", size = 277023, upload-time = "2026-05-18T04:30:18.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/68/a5e67b6b68e94f4c1511d61c46c55eba0737583620b6febf194c7b9cc23f/watchfiles-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:03b14855c6f35539e2d95c442ae9530a75762f1e26567152b9ed05f96534a74d", size = 290107, upload-time = "2026-05-18T04:32:09.677Z" }, + { url = "https://files.pythonhosted.org/packages/fc/3d/8024c801df84d1587740d0359e7fdd80afeae3d159011f3d5376dd82f18e/watchfiles-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:704fd259e332e01f9b9c178f4bce9e49027e5587cc2600eeeaf8e76e1c846201", size = 400242, upload-time = "2026-05-18T04:31:19.014Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", size = 394562, upload-time = "2026-05-18T04:30:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", size = 456611, upload-time = "2026-05-18T04:30:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", size = 461379, upload-time = "2026-05-18T04:31:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/b1/57/7e669002082c0a0f4fb5113bb70125f7110124b846b0a11bc5ae8e90eac1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d158cd89df6053823533e06fb1d73c549133bff5f0396170c0e53d9559340717", size = 493556, upload-time = "2026-05-18T04:30:05.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", size = 575255, upload-time = "2026-05-18T04:30:40.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", size = 467052, upload-time = "2026-05-18T04:31:17.942Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", size = 456858, upload-time = "2026-05-18T04:30:30.182Z" }, + { url = "https://files.pythonhosted.org/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", size = 467579, upload-time = "2026-05-18T04:32:15.897Z" }, + { url = "https://files.pythonhosted.org/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", size = 633253, upload-time = "2026-05-18T04:31:37.123Z" }, + { url = "https://files.pythonhosted.org/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", size = 660713, upload-time = "2026-05-18T04:31:24.62Z" }, + { url = "https://files.pythonhosted.org/packages/a9/07/f97736a5fc605364fe67b25e9fa4a6965dfd4840d50c406ada507e9d735f/watchfiles-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9342472aff9b093c5acd4f6d8f70ae0937964ab56542502bcf5579782da69ae8", size = 277222, upload-time = "2026-05-18T04:31:21.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/99/2b04981977fc2608afd60360d928c6aecf6b950292ca221d98f4005f6694/watchfiles-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:dbd6c97045dad81227c8d040173da044c1de08de64a5ea8b555da4aee1d5fa22", size = 290274, upload-time = "2026-05-18T04:31:45.966Z" }, + { url = "https://files.pythonhosted.org/packages/3c/74/f7f58a7075ee9cf612b0cfcddb78b8cd8234f0742d6f0075cf0da2dde1c6/watchfiles-1.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:57a2d9fa4fb4c2ecae57b13dfff2c7ab53e21a2ba674fe9f05506680fcdcc0d7", size = 283460, upload-time = "2026-05-18T04:31:39.126Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/23/f4/7513ef1e85fc4c6331b59479d6d72661fc391fbe543678052ac72c8b6c19/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4674d49eb94706dfe666c069fc0a1b646ffcf920473492e209f6d5f60d3f0cc2", size = 403050, upload-time = "2026-05-18T04:30:36.753Z" }, + { url = "https://files.pythonhosted.org/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", size = 396629, upload-time = "2026-05-18T04:32:03.268Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", size = 457318, upload-time = "2026-05-18T04:31:01.932Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, ] [[package]] From 3e3510a06a6efa5165fc90ce4ab83b7f98c1f0be Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 08:30:37 -0500 Subject: [PATCH 2860/2998] py(deps[dev]) Bump dev packages --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index 1c1e630f96..6d80a11585 100644 --- a/uv.lock +++ b/uv.lock @@ -138,11 +138,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] From 1bfabfba15006f14ce555987644859331fbe79d7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 08:31:32 -0500 Subject: [PATCH 2861/2998] py(deps) Bump libtmux 0.56.0 -> 0.57.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pick up two libtmux releases (0.57.0, 0.57.1) adding typed client objects, tmux-native filtering, and broader format-token coverage. tmuxp's runtime behavior is unchanged — the new surface is available to users scripting through `tmuxp shell`. - **0.57.0**: Typed `Client` object and `Server.clients` accessor, `search_*()` methods with tmux-native `-f` filtering, `Server.display_message()` and `Window.display_message()`, subcommand-tagged `LibTmuxException`. - **0.57.1**: Restores lenient-by-default `Server.sessions` and `Server.clients` (0.57.0 briefly raised on tmux errors). Release: https://github.com/tmux-python/libtmux/releases/tag/v0.57.1 Changelog: https://libtmux.git-pull.com/history.html#libtmux-0-57-1-2026-05-18 --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7dfb732280..6dc3f2b33e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.56.0", + "libtmux~=0.57.1", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index 6d80a11585..a141bcdf92 100644 --- a/uv.lock +++ b/uv.lock @@ -617,11 +617,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.56.0" +version = "0.57.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/62/896e1e0412dd76c88926604d5a231feb9b116d6f32abe19054e244504dbc/libtmux-0.56.0.tar.gz", hash = "sha256:bddf52214405e4f64850826d44cbc958d4a01c53432983cee0e2856bdbbaaedb", size = 476168, upload-time = "2026-05-10T13:40:23.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/42/790280a61c8c49a15b3213614f52d0a4f79ec913e9520d35096b1bcb28f2/libtmux-0.57.1.tar.gz", hash = "sha256:c216671a066d06e093d7a8e806d0b7467e5f7edfe08742686de33073e1f9cf2a", size = 518481, upload-time = "2026-05-18T22:35:45.591Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/ce/4319c912164fa142956c73ba50ed6f2aac2ca7cced2e96c8320114f1c937/libtmux-0.56.0-py3-none-any.whl", hash = "sha256:ddf70de0f287666fb0f02082732f28eed46450de1828c995da3de2b12042ab60", size = 97768, upload-time = "2026-05-10T13:40:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4b/42768db9ef24ee1c9b95f3feb782c3b45afb1227a4b432af71096b970246/libtmux-0.57.1-py3-none-any.whl", hash = "sha256:8f1bb904476e209831c61c9e58814f52e01c0877ef1080e550566db75bee9a2a", size = 113650, upload-time = "2026-05-18T22:35:43.903Z" }, ] [[package]] @@ -1670,7 +1670,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.56.0" }, + { name = "libtmux", specifier = "~=0.57.1" }, { name = "pyyaml", specifier = ">=6.0" }, ] From 2b2ba95f4e3bfb11e10bf4d3f6e9a388248838fd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 08:34:59 -0500 Subject: [PATCH 2862/2998] docs(CHANGES): libtmux 0.57.1 floor bump why: Document the dependency bump for the upcoming release. what: - Add Dependencies section noting libtmux ~=0.57.1 floor - Highlight tmuxp-shell gains: client objects, native filtering --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 7a20ddd0b8..3b9576a7aa 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,12 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.57.1` (was `~=0.56.0`) (#1043) + +The libtmux bump pulls in the 0.57.x command-coverage and client-awareness releases. Scripts launched through {ref}`tmuxp-shell` can now work with attached-client objects and use tmux-native filtering to query sessions, windows, and panes without manual post-filtering. + ## tmuxp 1.68.0 (2026-05-10) tmuxp 1.68.0 refreshes the documentation stack and developer workflow for the next release train. The docs now sit on the shared [gp-sphinx](https://gp-sphinx.git-pull.com/) platform, the API pages pick up the newer gp-furo visual language, and the test suite avoids paying for each contributor's interactive shell startup. The release also raises the libtmux floor so {ref}`tmuxp-shell` users can script against the expanded tmux command wrapper surface. From 0fcad168f6c1034ab89d1028bf305b6e3f895935 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 08:44:57 -0500 Subject: [PATCH 2863/2998] Tag v1.69.0 --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 3b9576a7aa..1df7b6cc2a 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.69.0 (Yet to be released) +## tmuxp 1.70.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.69.0 (2026-05-23) + +tmuxp 1.69.0 is a libtmux that expands functionality of `tmuxp shell` under the hood. + ### Dependencies #### Minimum `libtmux~=0.57.1` (was `~=0.56.0`) (#1043) diff --git a/pyproject.toml b/pyproject.toml index 6dc3f2b33e..026567fb26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.68.0" +version = "1.69.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 67acb4eed5..958fef6059 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.68.0" +__version__ = "1.69.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index a141bcdf92..4bb63b1081 100644 --- a/uv.lock +++ b/uv.lock @@ -416,7 +416,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1608,7 +1608,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.68.0" +version = "1.69.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From ee0eea58b08e55d6109376dce1de40260c4bceef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 11:11:39 -0500 Subject: [PATCH 2864/2998] py(deps): Bump libtmux ~=0.57.1 -> ~=0.58.0 why: libtmux 0.58.0 fixes subprocess output decoding on non-UTF-8 locales, resolving empty list-accessor results for users whose system locale is not UTF-8. --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 026567fb26..3f5f33d810 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.57.1", + "libtmux~=0.58.0", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index 4bb63b1081..8a723aeec9 100644 --- a/uv.lock +++ b/uv.lock @@ -617,11 +617,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.57.1" +version = "0.58.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/42/790280a61c8c49a15b3213614f52d0a4f79ec913e9520d35096b1bcb28f2/libtmux-0.57.1.tar.gz", hash = "sha256:c216671a066d06e093d7a8e806d0b7467e5f7edfe08742686de33073e1f9cf2a", size = 518481, upload-time = "2026-05-18T22:35:45.591Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/4e/daccd4fd72ad3f17b8fb97f69403774d6c510b5d513521b454fdaedb0561/libtmux-0.58.0.tar.gz", hash = "sha256:abbe330bec2c45687a4bf417ee436373b37046afe123ba547495ee0448e1145a", size = 522080, upload-time = "2026-05-23T16:03:38.566Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/4b/42768db9ef24ee1c9b95f3feb782c3b45afb1227a4b432af71096b970246/libtmux-0.57.1-py3-none-any.whl", hash = "sha256:8f1bb904476e209831c61c9e58814f52e01c0877ef1080e550566db75bee9a2a", size = 113650, upload-time = "2026-05-18T22:35:43.903Z" }, + { url = "https://files.pythonhosted.org/packages/49/d5/1cee7c13865d0d55ddb54709aaf85e0dc645e2998ce85ffce2c36d3bf08d/libtmux-0.58.0-py3-none-any.whl", hash = "sha256:1aec9875983a8eb121a8de7be7dffa6b97d9754c013ce960944d058764e47ec3", size = 113680, upload-time = "2026-05-23T16:03:37.049Z" }, ] [[package]] @@ -1670,7 +1670,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.57.1" }, + { name = "libtmux", specifier = "~=0.58.0" }, { name = "pyyaml", specifier = ">=6.0" }, ] From d852e9e0143de86050d41215617906f7171be7f5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 11:16:08 -0500 Subject: [PATCH 2865/2998] docs(CHANGES): libtmux 0.58.0 floor bump why: Document the dependency bump for the upcoming release. what: - Add Fixes section noting libtmux ~=0.58.0 floor - Highlight the non-UTF-8 locale decoding fix --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 1df7b6cc2a..d183517586 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,16 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.58.0` (was `~=0.57.1`) (#1045) + +### Fixes + +#### Non-UTF-8 locale decoding (#1045) + +Session and window listing could silently return empty results when the system locale was not UTF-8. Fixed by the libtmux 0.58.0 floor bump. + ## tmuxp 1.69.0 (2026-05-23) tmuxp 1.69.0 is a libtmux that expands functionality of `tmuxp shell` under the hood. From 5cbcf42449ecf0bcf71afe718f45a80165977dda Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 11:31:07 -0500 Subject: [PATCH 2866/2998] py(deps[dev]) Bump dev packages --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 8a723aeec9..3def5964a8 100644 --- a/uv.lock +++ b/uv.lock @@ -416,7 +416,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From 49aa777e329dcf530f20e0934ea53641149e57fb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 11:33:23 -0500 Subject: [PATCH 2867/2998] Tag v1.70.0 --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index d183517586..35e90e910a 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.70.0 (Yet to be released) +## tmuxp 1.71.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.70.0 (2026-05-23) + +tmuxp 1.70.0 bumps libtmux to 0.58.0, fixing session and window listing on systems whose locale is not UTF-8. + ### Dependencies #### Minimum `libtmux~=0.58.0` (was `~=0.57.1`) (#1045) diff --git a/pyproject.toml b/pyproject.toml index 3f5f33d810..c73284cb0e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.69.0" +version = "1.70.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 958fef6059..06e39e62f3 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.69.0" +__version__ = "1.70.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index 3def5964a8..e233021ab6 100644 --- a/uv.lock +++ b/uv.lock @@ -416,7 +416,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1608,7 +1608,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.69.0" +version = "1.70.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From 3f23b2eb8724bc489b9ec90dc9a03fd95f100a7b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 12:59:23 -0500 Subject: [PATCH 2868/2998] ai(rules[AGENTS]) Release commit conventions --- AGENTS.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index dee9faa48b..24adc90169 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -152,6 +152,15 @@ what: - Update send_keys to pass -l flag when literal=True - Add tests for literal key sending ``` +#### Release commits + +Never create tags. Never push tags. The user handles tagging and tag +pushes (tags trigger the CI publish workflow). + +Release commit subjects are plain and short: `Tag v`. Put +the detailed why/what in the commit body. Don't use the +`Scope(type[detail]):` format for releases — don't bury the lede. + For multi-line commits, use heredoc to preserve formatting: ```bash git commit -m "$(cat <<'EOF' From d0be1caf2de96dcafdd8a50ac403b8d5e4328f07 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 14:16:57 -0500 Subject: [PATCH 2869/2998] ai(rules[AGENTS]) add AI slop prevention standards why: AI-assisted contributions need clear signals to reduce noise and preserve technical context beyond simple narrative bleed. what: - Expand narrative bleed rules into full AI Slop Prevention rubric - Add specific prohibitions for AI signatures and prose inflation - Include safety guardrails to preserve load-bearing context --- AGENTS.md | 110 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 40 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 24adc90169..a11b5825c8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -507,59 +507,89 @@ colors.error("failed") # Red (errors) **Bold may not render distinctly.** Some terminal/font combinations don't differentiate bold from normal weight. Don't rely on bold alone for visual distinction - pair it with color differences. -## Shipped vs. Branch-Internal Narrative +## AI Slop Prevention + +Treat AI slop as **review-hostile noise**, not as proof that text or +code is wrong. The goal is to maximize information density by removing +artifacts that make the repository harder to trust or navigate. + +### The Anti-Slop Rubric + +Before committing, audit all AI-assisted changes for these noise +patterns: + +- **AI Signatures:** Remove "Generated by", footers, conversational + filler ("Certainly!", "Here is..."), unexplained emojis (🤖, ✨), and + AI-tool metadata. +- **Brittle References:** Avoid hard-coded line numbers, fragile + file/test counts, dated "as of" claims, bare SHAs, and local + absolute paths unless they are strict evidentiary artifacts (e.g., + benchmark logs). +- **Diff Narration:** Do not restate what moved, was renamed, or was + removed in artifacts the downstream reader holds: code, docstrings, + README, CHANGES, PR descriptions, or release notes. The diff and + commit message already carry this history. +- **Branch-Internal Narrative:** Do not mention intermediate branch + states, abandoned approaches, or "no longer" behavior unless users + of a published release actually experienced the old state (**The + Published-Release Test**). +- **Low-Value Scaffolding:** Remove ownerless TODOs (`TODO: revisit`), + unused future-proofing, debug artifacts, and defensive wrappers that + do not protect a currently reachable failure mode. +- **Prose Inflation:** Replace generic AI "tells" like *comprehensive, + robust, seamless, production-ready, leverage, delve, tapestry,* and + *best practices* with concrete descriptions of behavior, + constraints, or trade-offs. + +### Preservation & Context + +**When unsure, leave the text in place and ask.** Subjective cleanup +must never be a reason to remove load-bearing rationale. + +- **Preserve the "Why":** You MUST NOT delete comments that document + invariants, protocol constraints, platform quirks, security + boundaries, and upstream workarounds. +- **Evidence is Immune:** Preserve exact counts, dates, and SHAs when + they serve as evidence in benchmark results, release notes, stack + traces, or lockfiles. +- **Behavior Over Inventory:** A useful description explains what + changed for the *system or user*; it does not provide an inventory + of files or functions the diff already shows. + +### The Published-Release Test Long-running branches accumulate tactical decisions — renames, -refactors, attempts-then-reverts, intermediate states. Commit messages -and the diff hold *what changed* and *why*. Do not restate either in -artifacts the downstream reader holds: code, docstrings, README, -CHANGES, PR descriptions, release notes, migration guides. - -When deciding what counts as branch-internal, use trunk or the parent -branch as the baseline — not intermediate states inside the current -branch. - -**The Published-Release Test** - -Before adding rename history, "previously" / "formerly" / "no longer -X" phrasing, "removed" / "moved" / "refactored" / "fixed" diff -paraphrases, or `### Fixes` entries to a user-facing surface, ask: +refactors, attempts-then-reverts. When deciding what counts as +branch-internal, use trunk or the parent branch as the baseline — not +intermediate states inside the current branch. Ask: > Did users of the most recently published release ever experience > this old name, old behavior, or bug? -If the answer is no, it is branch-internal narrative. Move it to the -commit message and describe only the current state in the artifact. - -**Keep in shipped artifacts** +If the answer is **no**, it is branch-internal narrative. Move it to +the commit message and describe only the final state in the artifact. +**Keep in shipped artifacts:** - Deprecations and migration guides for symbols that actually shipped. - `### Fixes` entries for bugs that affected users of a published release. -- Comments explaining *why the current code looks this way* — - invariants, platform quirks, upstream bug workarounds — that make - sense to a reader who never saw the previous version. - -**Default**: when in doubt, keep the artifact clean and put the story -in the commit. +- Comments explaining *why the current code looks this way* + (invariants, platform quirks) that make sense to a reader who never + saw the previous version. ### Cleanup in Hindsight -When applying this rule retroactively from inside a feature branch, +When applying these rules retroactively from inside a feature branch, first establish scope by diffing against the parent branch (or trunk) to identify which commits this branch actually introduced. Then: -- **Commits introduced in this branch** — prompt the user with two - options: `fixup!` commits with `git rebase --autosquash` to address - each causal commit at its source, or a single cleanup commit at - branch tip. User chooses. -- **Commits already in trunk or a parent branch** — default to - leaving them alone. Do not raise them as cleanup candidates; act - only on explicit user instruction. If the user opts in, fold the - cleanup into a single commit at branch tip and do not rewrite trunk - or parent-branch history. -- **Scope guard** — if cleaning in-branch bleed would touch a - colleague's in-flight work or expand the branch beyond its stated - goal, default to staying in lane: protect the project's current - goal, leave prior bleed alone, and don't introduce new bleed in the - current change. +- **In-branch commits:** Prompt the user with two options: `fixup!` + commits with `git rebase --autosquash` to address each causal commit + at its source, or a single cleanup commit at branch tip. +- **Trunk/Parent commits:** Default to leaving them alone. Act only on + explicit user instruction. If the user opts in, fold the cleanup + into a single commit at branch tip; do not rewrite shared history. +- **Scope guard:** If cleaning prior slop would touch a colleague's + work or expand the branch beyond its stated goal, stay in lane: + protect the current goal and leave prior slop alone. + From 03bf5188d073e2afc148918a2b8573f2127d4568 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 23 May 2026 18:49:40 -0500 Subject: [PATCH 2870/2998] =?UTF-8?q?release(deps[gp-sphinx])=20bump=200.0?= =?UTF-8?q?.1a19=20=E2=86=92=200.0.1a21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 12 ++++---- uv.lock | 78 +++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c73284cb0e..2358096f7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a19", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a19", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a19", + "gp-sphinx==0.0.1a21", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a21", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a21", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a19", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a19", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a19", + "gp-sphinx==0.0.1a21", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a21", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a21", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index e233021ab6..e7d2ab94bf 100644 --- a/uv.lock +++ b/uv.lock @@ -425,7 +425,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/d0/c8e4b39a92048c9704922edcde03e52e8a79087469df8ab72845e6d06810/gp_furo_theme-0.0.1a19.tar.gz", hash = "sha256:0b462e7292c8bae99be9fd5474609c5de0f1b4eea35432fcb33b3c6e6d6d3dee", size = 33517, upload-time = "2026-05-17T19:11:12.052Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/dc69a60975b174f90e212210e58e6cdd1cf03fae18f066a43076793ceecf/gp_furo_theme-0.0.1a21.tar.gz", hash = "sha256:4853b0021f5b2f1300167c3bdeba8f81c188a7ffceeae3ad69420255e98e8233", size = 33848, upload-time = "2026-05-23T23:41:31.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/e6/1aeb91c43176152aa4ad073d525a0fafb750a27fcac6fe867260350ecf22/gp_furo_theme-0.0.1a19-py3-none-any.whl", hash = "sha256:1d86197fee7f2a0499d3586fee978411d03da1daa7fe4d70af938211e7cd189d", size = 42845, upload-time = "2026-05-17T19:10:48.289Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c8/6c45a63cd81dee5673012af8344c359be71c53cb04aeea372796364db4ca/gp_furo_theme-0.0.1a21-py3-none-any.whl", hash = "sha256:f57b4be3a8e516389c35d4a18c0c1e258ec259ab3f425da7c12f747b9b7c7e33", size = 43215, upload-time = "2026-05-23T23:41:09.814Z" }, ] [[package]] @@ -456,7 +456,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -477,9 +477,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/92/b26071eb61be61ae3524a74645c818f6530f2ac6668cd8255680d71b0403/gp_sphinx-0.0.1a19.tar.gz", hash = "sha256:5067394164586b6e2c32ad88c5143c2f748c545253254f70ad9c4adf448dde3d", size = 19536, upload-time = "2026-05-17T19:11:12.904Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/5e/3fef58c509210abbd9eb5ea2528ad9fd4ff46563e2d9e82e2eb9008fe5b2/gp_sphinx-0.0.1a21.tar.gz", hash = "sha256:ff188c38ce68403b8fbd27645985c70d7b1e988082a14896774f7bd4869491ac", size = 19536, upload-time = "2026-05-23T23:41:32.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/00/ce4daba1a2fa7e29b1de74ceb77dcbda889023d458d32b7b21ec2df0036e/gp_sphinx-0.0.1a19-py3-none-any.whl", hash = "sha256:96b0258a041dacb03eb84f89a6bd1fecd2a39d6c60941fadafa2e40500ff4f86", size = 20033, upload-time = "2026-05-17T19:10:50.198Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1f/fc0e1b1126a3baa53388e0b3030231e4b9e650061fc4dc78b0978265b66f/gp_sphinx-0.0.1a21-py3-none-any.whl", hash = "sha256:68776c5fa0f32681edfd9a28b83be975ebcf1fa91506ea614fe77511e591c2fe", size = 20032, upload-time = "2026-05-23T23:41:11.527Z" }, ] [[package]] @@ -1336,7 +1336,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1344,14 +1344,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/19/01577b52e5160c42a876becad8efda02c7b26f871fb75f4853fb9a2c80ae/sphinx_autodoc_api_style-0.0.1a19.tar.gz", hash = "sha256:008592f830b790d068613fe7d29d16c6484a3ca7c5bdae8176765a2988f1dd1e", size = 8980, upload-time = "2026-05-17T19:11:13.707Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/80/f23bdc1a565960b2c0fbfc52ce7d8de5dea85533986d2757c226fa453dda/sphinx_autodoc_api_style-0.0.1a21.tar.gz", hash = "sha256:557dac8c693d1956f0cbe59c3590d2cdfce58a3d109f703e770ae386aba249a8", size = 8977, upload-time = "2026-05-23T23:41:33.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/d3/6e7ac4a4f960c0550a675e66146985717dc290e61f0defb9340a077c05c0/sphinx_autodoc_api_style-0.0.1a19-py3-none-any.whl", hash = "sha256:67081799de11b9a213437401e437a89bb6f9ddf33cce0cb164531011c998c450", size = 9065, upload-time = "2026-05-17T19:10:52.077Z" }, + { url = "https://files.pythonhosted.org/packages/ef/31/6a3891dd3d8439a527dcb47907d88e58b246b8064d104dbddad43eff53dc/sphinx_autodoc_api_style-0.0.1a21-py3-none-any.whl", hash = "sha256:e21809955155141dd4a63875d07299c05b7b6cc9f43b2f2e861900f60baccd13", size = 9064, upload-time = "2026-05-23T23:41:13.112Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1359,22 +1359,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/6c/439e26adb06d9170925a0cd8c05f4465f2bd003302bf93be386fa7e96623/sphinx_autodoc_argparse-0.0.1a19.tar.gz", hash = "sha256:1c5e9c942234c372a98d4951d2adf373c8bef4e9a864d4a2384c37601ad9463d", size = 42461, upload-time = "2026-05-17T19:11:14.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/32/e1eca8ff034e4030c9f61ce328b4cbdc5c203a0287f6a615f540973c8dd4/sphinx_autodoc_argparse-0.0.1a21.tar.gz", hash = "sha256:c5bcb35f47c368fc504612d69e1d92aa54b5a6b87a36046e1fafd2257d664ad8", size = 42462, upload-time = "2026-05-23T23:41:34.406Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/80/784ab7c5e8add8e25cbc1b01925df5198b1c82d5e9d14bfb601093bad304/sphinx_autodoc_argparse-0.0.1a19-py3-none-any.whl", hash = "sha256:6f9497d32082f02aff736fa174b9cf1321e95222458ec1817c7bf0b1fab93963", size = 47276, upload-time = "2026-05-17T19:10:53.271Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1b/ee12363430471a4e22b6613075dbf35e0d7402faed5b4276c09622802d39/sphinx_autodoc_argparse-0.0.1a21-py3-none-any.whl", hash = "sha256:43f8fa3b3e2ea3faee313d12baae9670089aac02ef66413e0080d205ce2b44bb", size = 47275, upload-time = "2026-05-23T23:41:14.653Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/e3/ed5252fff9f333dcecdb1434ae9a7183b5660c60237e11465b9ccf05b09a/sphinx_autodoc_typehints_gp-0.0.1a19.tar.gz", hash = "sha256:851a853e1ba73eaccedadcbeeb3f5b0b8303ccd78daa3171078dedff2e46f223", size = 36362, upload-time = "2026-05-17T19:11:19.561Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/8d/8bbe81d27df91b0773d19d5f411a5dd2083b9c120a567a71ba818d322258/sphinx_autodoc_typehints_gp-0.0.1a21.tar.gz", hash = "sha256:4222470d92398255be6ba8ae31207bb6edfde421d64367e0357feeb9e24483e6", size = 36361, upload-time = "2026-05-23T23:41:39.209Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/df/3b8b76ce3a484e401e158c4d32b7f42d54d10a5e31713b4858e003c8bda5/sphinx_autodoc_typehints_gp-0.0.1a19-py3-none-any.whl", hash = "sha256:a4f11bf91d615960ccd66679a5658dd76bffb7674c560aea248c31eabc0d54b8", size = 38510, upload-time = "2026-05-17T19:11:00.345Z" }, + { url = "https://files.pythonhosted.org/packages/46/d6/5f4513c36dd622624a11d1c2c0f931f67cd943138def7ac0fb6edc4789eb/sphinx_autodoc_typehints_gp-0.0.1a21-py3-none-any.whl", hash = "sha256:8f66fa9cb8968c88da648930f122163846b59faa1f868bd4ba7778a20d2f05db", size = 38508, upload-time = "2026-05-23T23:41:21.573Z" }, ] [[package]] @@ -1436,55 +1436,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/a8/cba69fdf24c27475afd6bbc489eb3fe674928ce02b26c1b144148578871b/sphinx_fonts-0.0.1a19.tar.gz", hash = "sha256:3ebd5d3e6c14c99a8633ecbf473103669f3c22ca1a6cd70244a48ff9278e459d", size = 5790, upload-time = "2026-05-17T19:11:20.396Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/3a/3316bc3bc0b16ea433085ba7b48425071ce8a3e02ddec1c9c7377514b736/sphinx_fonts-0.0.1a21.tar.gz", hash = "sha256:9ec7d1c3568d135c2360f2597b0b62c325c4aba46445eafcbc1605c91c9783a5", size = 5790, upload-time = "2026-05-23T23:41:40.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/db/6ea1cff505ba2fb131174dba5cf9f00a69e1eda7196bac9feb451ccff48a/sphinx_fonts-0.0.1a19-py3-none-any.whl", hash = "sha256:fd530c651cfe37ed035310c8f8038075ef4560b311f061a3cc7f97e8423e6fb1", size = 4363, upload-time = "2026-05-17T19:11:01.415Z" }, + { url = "https://files.pythonhosted.org/packages/68/6e/dee455e8430aaa5548b51c27beb45e7fe7f6428e48931ccec2099fe62785/sphinx_fonts-0.0.1a21-py3-none-any.whl", hash = "sha256:cc25b5a894ac9f5796316a60b264f5163a02bb8dc4518e83bb8401a3642a451b", size = 4362, upload-time = "2026-05-23T23:41:22.949Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/4c/71732d2799b643a9fd1d96dead2f1f4021bfb6c7aa9a1ec04506d9e823e7/sphinx_gp_opengraph-0.0.1a19.tar.gz", hash = "sha256:390ff298ba8e8b2c9fe9e61097d314b9217b44e3bf104023a8e4fd28c1f7f227", size = 11948, upload-time = "2026-05-17T19:11:21.176Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/ed/7d4e13034b5b7d2b80a23aaf389de6d98ce226416b4ee0855052f53b611e/sphinx_gp_opengraph-0.0.1a21.tar.gz", hash = "sha256:830a488f0fdbadc950fe377f23e443713f879c473ccd3e6d71ad2762e8b72410", size = 11946, upload-time = "2026-05-23T23:41:40.929Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/6e/30720abb30d313320650b9179da0566f3f2aa6d4fd840b9cac776c6dfeec/sphinx_gp_opengraph-0.0.1a19-py3-none-any.whl", hash = "sha256:f177344aae4125dab513d4eb968f0a319b5f40d3444a2f129197d00fa177911f", size = 12185, upload-time = "2026-05-17T19:11:03.123Z" }, + { url = "https://files.pythonhosted.org/packages/1e/06/4d0a3f89f4b1b223d647b57d4189d157f372774fc2a379a4e1348ec0dd9e/sphinx_gp_opengraph-0.0.1a21-py3-none-any.whl", hash = "sha256:5a72a6c39c3c2b09e9afc3554835e49a570ca1056f5fda1a6da26ac0fb42fc8c", size = 12183, upload-time = "2026-05-23T23:41:24.154Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/be/d06a98e0eee553771601676e1ed362fb06b71d734607e4625652765b1e86/sphinx_gp_sitemap-0.0.1a19.tar.gz", hash = "sha256:66e07cf2bc4e8d931ea7a60d780e6adbaf4e144203a9031c821c1f56959f4ae9", size = 9955, upload-time = "2026-05-17T19:11:21.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/95/ec8b29e116a3ccb4cab18f48557c648bd17461632903f437c03c688adea4/sphinx_gp_sitemap-0.0.1a21.tar.gz", hash = "sha256:f78b89b1da8cac33efbae2610e714006771762b647efb258802c9cb9d69b8bb1", size = 9958, upload-time = "2026-05-23T23:41:41.685Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/2d/9dbf6bc4e7358dc817ed2b10bee5a4cffc3cff38eda2cdfcf85d43429b4d/sphinx_gp_sitemap-0.0.1a19-py3-none-any.whl", hash = "sha256:0adaa66b16fa2b70961bcd54372f0181c2a68245f15f8894f3296b3c7a63dc6f", size = 8980, upload-time = "2026-05-17T19:11:04.289Z" }, + { url = "https://files.pythonhosted.org/packages/82/e7/69e226922f01f75d70298c62855f8da7421846be86dc403a93b1a3cc3b9e/sphinx_gp_sitemap-0.0.1a21-py3-none-any.whl", hash = "sha256:047cb461543dbdb90a75f705dea6666e14960eeacdac2be866726da498ac6274", size = 8980, upload-time = "2026-05-23T23:41:25.624Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/2e/2d356cf6fa3ba945bffc3262b444b2b7be4d6615a03e1161e0ce1d1768c3/sphinx_gp_theme-0.0.1a19.tar.gz", hash = "sha256:76075c052e5fd796d6c97d722a26548e1e31254e710b5875301d0d30dbb13765", size = 18224, upload-time = "2026-05-17T19:11:23.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ce/925711bd63a8dadc186d84358a75db5c3dd0100949db0de2fad75d202f58/sphinx_gp_theme-0.0.1a21.tar.gz", hash = "sha256:da1b8012bff9539f20d9d882587d6603da02a775c2ea578e84e8980cddb2373d", size = 18236, upload-time = "2026-05-23T23:41:42.786Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/44/89edc99113299d6fb41a9cc9f0bd9fe5d032840b309a6f503c59bfcf9fc1/sphinx_gp_theme-0.0.1a19-py3-none-any.whl", hash = "sha256:d5e760bb053529ddca0e54d15857e2434af34738b6bd8086075d6e8a8cd92411", size = 19819, upload-time = "2026-05-17T19:11:05.347Z" }, + { url = "https://files.pythonhosted.org/packages/1b/70/c8f385c07ae586ae8f5f0d1f2338fd1845f7a87b50cc9ccaa223e1d0021f/sphinx_gp_theme-0.0.1a21-py3-none-any.whl", hash = "sha256:0a331bdf7ce6720182a29ef7b68bd6ff291cd5968d0ea0980dbcea64cd9c208b", size = 19826, upload-time = "2026-05-23T23:41:27.016Z" }, ] [[package]] @@ -1502,28 +1502,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/a1/a89a78249dc4dcb0b7a3f04710c106d20a99166a20d1724785d07898b0c3/sphinx_ux_autodoc_layout-0.0.1a19.tar.gz", hash = "sha256:ab1a2852c6ccf8b4968364f51d45bea9eca4fa5ad845ecb543b6f02755aa50d9", size = 29102, upload-time = "2026-05-17T19:11:24.472Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/b3/2b8940092399b48c68117755f3133166b21ce7084372176e7fa4ca3812e5/sphinx_ux_autodoc_layout-0.0.1a21.tar.gz", hash = "sha256:1ecf16050265427f4807888ed46a76adb0ec41db747ac2caa01e664ad2f8b9c2", size = 29124, upload-time = "2026-05-23T23:41:43.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/2e/c4f937ba41c84efb25bd173f57c8f8135cc47a4ac3c5f449387c6939ec28/sphinx_ux_autodoc_layout-0.0.1a19-py3-none-any.whl", hash = "sha256:5bbb2369eaccab857e7a80418ac82334fc1f4ed6f6aa63a988875ffabb11abef", size = 33069, upload-time = "2026-05-17T19:11:06.764Z" }, + { url = "https://files.pythonhosted.org/packages/9a/37/8c9340e2226d8db53672695d3323055dc1d329e9758dcd67a671d1cc0963/sphinx_ux_autodoc_layout-0.0.1a21-py3-none-any.whl", hash = "sha256:5dc0a5702a46d004433ebb491303de9de1d2f8e6b4b30ff8713c9c5a7bc597cf", size = 33082, upload-time = "2026-05-23T23:41:28.218Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a19" +version = "0.0.1a21" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/3e/318604a0a2472f45e50ca6bfe55ea3400413864194f93460ca81847c7569/sphinx_ux_badges-0.0.1a19.tar.gz", hash = "sha256:faf55a7841b5c39d61f848fba7fc4ce497933e4f7832c4bcf813749af88e1fb7", size = 15570, upload-time = "2026-05-17T19:11:25.387Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/ed/7ef73f21f86f9e7959fde11e9636b581bea937c189ba42a70dbfb87a5d49/sphinx_ux_badges-0.0.1a21.tar.gz", hash = "sha256:e244ea4a7657f0fd0f996bf764570b9a80b0d77b348378708aa0085ce91b2d05", size = 15569, upload-time = "2026-05-23T23:41:44.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/62/51dddb1c31cd7a052f0fde5bebf1a9dc9b2cc229c92e310c46b933dfd9de/sphinx_ux_badges-0.0.1a19-py3-none-any.whl", hash = "sha256:35d486b1ed9e4d46c13f14a7117a1d90c2e8688eb3b3f3de591de821ec4d730b", size = 16447, upload-time = "2026-05-17T19:11:08.488Z" }, + { url = "https://files.pythonhosted.org/packages/34/81/468c169f61379440f7d4b4e5b9da7465342b23534ee76b1d51ff42598830/sphinx_ux_badges-0.0.1a21-py3-none-any.whl", hash = "sha256:e6b8810b7774a5fbbf7e65fdbfb9ca119221ef954d8e0f24f2b0c517fd757b78", size = 16444, upload-time = "2026-05-23T23:41:29.359Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a19" }, + { name = "gp-sphinx", specifier = "==0.0.1a21" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1695,8 +1695,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a19" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a19" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a21" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a21" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1704,11 +1704,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a19" }, + { name = "gp-sphinx", specifier = "==0.0.1a21" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a19" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a19" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a21" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a21" }, ] lint = [ { name = "mypy" }, From 2d9e64fe1d4b1faf744b1742012ea4977ad4911b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 May 2026 11:45:09 -0500 Subject: [PATCH 2871/2998] py(deps[dev]) Bump dev packages --- pyproject.toml | 12 ++++---- uv.lock | 78 +++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2358096f7a..f432738963 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a21", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a21", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a21", + "gp-sphinx==0.0.1a22", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a22", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a22", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a21", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a21", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a21", + "gp-sphinx==0.0.1a22", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a22", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a22", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index e7d2ab94bf..bdc6084847 100644 --- a/uv.lock +++ b/uv.lock @@ -425,7 +425,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/22/dc69a60975b174f90e212210e58e6cdd1cf03fae18f066a43076793ceecf/gp_furo_theme-0.0.1a21.tar.gz", hash = "sha256:4853b0021f5b2f1300167c3bdeba8f81c188a7ffceeae3ad69420255e98e8233", size = 33848, upload-time = "2026-05-23T23:41:31.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/34/4ea9a229ac3f507cee04e3a3006ee66776b3d6e7c08f88a556975c7c7265/gp_furo_theme-0.0.1a22.tar.gz", hash = "sha256:e755de491cade34a2de246c16d303bc96fcb51ae036b542fa4980f753af1464c", size = 33846, upload-time = "2026-05-24T16:33:01.385Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/c8/6c45a63cd81dee5673012af8344c359be71c53cb04aeea372796364db4ca/gp_furo_theme-0.0.1a21-py3-none-any.whl", hash = "sha256:f57b4be3a8e516389c35d4a18c0c1e258ec259ab3f425da7c12f747b9b7c7e33", size = 43215, upload-time = "2026-05-23T23:41:09.814Z" }, + { url = "https://files.pythonhosted.org/packages/44/3c/8b7e2e358bac2dc7acccb4544032ed4a16bb9aebf4ebbb8a7b61995f89c1/gp_furo_theme-0.0.1a22-py3-none-any.whl", hash = "sha256:7ab1a81c54cebde96d6bc99bb907920a2f457a7f81850d2dee44cb59ee2699dc", size = 43216, upload-time = "2026-05-24T16:32:38.28Z" }, ] [[package]] @@ -456,7 +456,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -477,9 +477,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/5e/3fef58c509210abbd9eb5ea2528ad9fd4ff46563e2d9e82e2eb9008fe5b2/gp_sphinx-0.0.1a21.tar.gz", hash = "sha256:ff188c38ce68403b8fbd27645985c70d7b1e988082a14896774f7bd4869491ac", size = 19536, upload-time = "2026-05-23T23:41:32.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/1c/f2950b1d70540aa392207954d6702c6bfd41e44762abda3288317c6510f9/gp_sphinx-0.0.1a22.tar.gz", hash = "sha256:f16ce005c0ae11ed3d2d2c4c33d48646037a95f5062c79f92cf19880ef666850", size = 19536, upload-time = "2026-05-24T16:33:02.567Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/1f/fc0e1b1126a3baa53388e0b3030231e4b9e650061fc4dc78b0978265b66f/gp_sphinx-0.0.1a21-py3-none-any.whl", hash = "sha256:68776c5fa0f32681edfd9a28b83be975ebcf1fa91506ea614fe77511e591c2fe", size = 20032, upload-time = "2026-05-23T23:41:11.527Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/3f2d7bb4531107f12846e16d3714afc8e22ddde41f06e8bfe9538ab40471/gp_sphinx-0.0.1a22-py3-none-any.whl", hash = "sha256:3e55a0b6b7f718ae5d496c33e5c935bd3ad62ed0e5b759d90100d845c80853d9", size = 20032, upload-time = "2026-05-24T16:32:39.795Z" }, ] [[package]] @@ -1336,7 +1336,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1344,14 +1344,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/80/f23bdc1a565960b2c0fbfc52ce7d8de5dea85533986d2757c226fa453dda/sphinx_autodoc_api_style-0.0.1a21.tar.gz", hash = "sha256:557dac8c693d1956f0cbe59c3590d2cdfce58a3d109f703e770ae386aba249a8", size = 8977, upload-time = "2026-05-23T23:41:33.604Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/54/805fb51b5cbc91c61a649b89eee16a022c941bb7c16e32349c504cf1f6ec/sphinx_autodoc_api_style-0.0.1a22.tar.gz", hash = "sha256:759cf842036a9070e65a365a3b932ac7500d9ffcc7a38a9ed93e411293be981c", size = 8976, upload-time = "2026-05-24T16:33:03.602Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/31/6a3891dd3d8439a527dcb47907d88e58b246b8064d104dbddad43eff53dc/sphinx_autodoc_api_style-0.0.1a21-py3-none-any.whl", hash = "sha256:e21809955155141dd4a63875d07299c05b7b6cc9f43b2f2e861900f60baccd13", size = 9064, upload-time = "2026-05-23T23:41:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/95/d9/2d5cc17fb6d6119f39c65e98532c174cf0b38878701ac67d9d1a747fdc52/sphinx_autodoc_api_style-0.0.1a22-py3-none-any.whl", hash = "sha256:75f460e5e83bf3f165cf0b9e7559a9d0e0236720b933668c6ccdedfa6a83f4aa", size = 9064, upload-time = "2026-05-24T16:32:41.36Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1359,22 +1359,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/32/e1eca8ff034e4030c9f61ce328b4cbdc5c203a0287f6a615f540973c8dd4/sphinx_autodoc_argparse-0.0.1a21.tar.gz", hash = "sha256:c5bcb35f47c368fc504612d69e1d92aa54b5a6b87a36046e1fafd2257d664ad8", size = 42462, upload-time = "2026-05-23T23:41:34.406Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/9c/ffe4a07527c341a88cfcd30abf51926da13f50a73ac656a2306a9ff3ce5f/sphinx_autodoc_argparse-0.0.1a22.tar.gz", hash = "sha256:2d9f2e7f31ba4b81a73fc720cbc007c88b358dd479269e7a434e43fa3736e06e", size = 42459, upload-time = "2026-05-24T16:33:04.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/1b/ee12363430471a4e22b6613075dbf35e0d7402faed5b4276c09622802d39/sphinx_autodoc_argparse-0.0.1a21-py3-none-any.whl", hash = "sha256:43f8fa3b3e2ea3faee313d12baae9670089aac02ef66413e0080d205ce2b44bb", size = 47275, upload-time = "2026-05-23T23:41:14.653Z" }, + { url = "https://files.pythonhosted.org/packages/73/2b/d49a73d54e0482226439d20d14f1196ec64355ec42565ce8d9fdd257ebfe/sphinx_autodoc_argparse-0.0.1a22-py3-none-any.whl", hash = "sha256:fba18c6788588705afd9b8982bd4a527c5c567b79bb1f75a6a056b273994c9f4", size = 47275, upload-time = "2026-05-24T16:32:43.435Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/8d/8bbe81d27df91b0773d19d5f411a5dd2083b9c120a567a71ba818d322258/sphinx_autodoc_typehints_gp-0.0.1a21.tar.gz", hash = "sha256:4222470d92398255be6ba8ae31207bb6edfde421d64367e0357feeb9e24483e6", size = 36361, upload-time = "2026-05-23T23:41:39.209Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/19/783336a0f1bcb3869ea697ee595425c64722f1bdf1ade340f40c636173c7/sphinx_autodoc_typehints_gp-0.0.1a22.tar.gz", hash = "sha256:0139f498abf1f8eed705f5afbd5ac5e836b52432e1477d2018ccdf2b05044812", size = 36360, upload-time = "2026-05-24T16:33:10.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/d6/5f4513c36dd622624a11d1c2c0f931f67cd943138def7ac0fb6edc4789eb/sphinx_autodoc_typehints_gp-0.0.1a21-py3-none-any.whl", hash = "sha256:8f66fa9cb8968c88da648930f122163846b59faa1f868bd4ba7778a20d2f05db", size = 38508, upload-time = "2026-05-23T23:41:21.573Z" }, + { url = "https://files.pythonhosted.org/packages/89/34/47d212b0f9f117cbed409b0ba183dbf5ae8441b218166fd46927912afc0d/sphinx_autodoc_typehints_gp-0.0.1a22-py3-none-any.whl", hash = "sha256:abd008b7c775e5a4954c6bbe6bf9dfe3a5b6c461deceb385aabd97882093579d", size = 38508, upload-time = "2026-05-24T16:32:50.336Z" }, ] [[package]] @@ -1436,55 +1436,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/3a/3316bc3bc0b16ea433085ba7b48425071ce8a3e02ddec1c9c7377514b736/sphinx_fonts-0.0.1a21.tar.gz", hash = "sha256:9ec7d1c3568d135c2360f2597b0b62c325c4aba46445eafcbc1605c91c9783a5", size = 5790, upload-time = "2026-05-23T23:41:40.104Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/8f/13273f32c5f6ed5aff7f223946bb47e77f4d195b1cb8694282698d48f80d/sphinx_fonts-0.0.1a22.tar.gz", hash = "sha256:52ebd06c276c645691d947d7728afda504f3bab5237f46de3a2a70a57397fe4f", size = 5789, upload-time = "2026-05-24T16:33:11.733Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/6e/dee455e8430aaa5548b51c27beb45e7fe7f6428e48931ccec2099fe62785/sphinx_fonts-0.0.1a21-py3-none-any.whl", hash = "sha256:cc25b5a894ac9f5796316a60b264f5163a02bb8dc4518e83bb8401a3642a451b", size = 4362, upload-time = "2026-05-23T23:41:22.949Z" }, + { url = "https://files.pythonhosted.org/packages/b9/1f/ddfe65dcbaa55f1817a104e4fd92624cb36909e06196260de9001fc56582/sphinx_fonts-0.0.1a22-py3-none-any.whl", hash = "sha256:ad314627782b0ad0a7fa8eef755f9072f5ef4051174c9a623b148daff8bc13ea", size = 4359, upload-time = "2026-05-24T16:32:51.72Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/ed/7d4e13034b5b7d2b80a23aaf389de6d98ce226416b4ee0855052f53b611e/sphinx_gp_opengraph-0.0.1a21.tar.gz", hash = "sha256:830a488f0fdbadc950fe377f23e443713f879c473ccd3e6d71ad2762e8b72410", size = 11946, upload-time = "2026-05-23T23:41:40.929Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/40/6ab84894200a3124b0a6d8d2a88a5cef87d6353e469e72c8fe6279cde709/sphinx_gp_opengraph-0.0.1a22.tar.gz", hash = "sha256:8a3eaabbba997767e8f9d36aecdee50e762035a2bc43d50c4abcb4c0030cc877", size = 11944, upload-time = "2026-05-24T16:33:12.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/06/4d0a3f89f4b1b223d647b57d4189d157f372774fc2a379a4e1348ec0dd9e/sphinx_gp_opengraph-0.0.1a21-py3-none-any.whl", hash = "sha256:5a72a6c39c3c2b09e9afc3554835e49a570ca1056f5fda1a6da26ac0fb42fc8c", size = 12183, upload-time = "2026-05-23T23:41:24.154Z" }, + { url = "https://files.pythonhosted.org/packages/72/0b/27d2609f11f9b5bac789fffafc7108e391e34561e38918d782fceb545670/sphinx_gp_opengraph-0.0.1a22-py3-none-any.whl", hash = "sha256:2ca3ac71776f237c147336511cb43396958cc8779ee052008f72b52c2f044b41", size = 12183, upload-time = "2026-05-24T16:32:52.752Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/95/ec8b29e116a3ccb4cab18f48557c648bd17461632903f437c03c688adea4/sphinx_gp_sitemap-0.0.1a21.tar.gz", hash = "sha256:f78b89b1da8cac33efbae2610e714006771762b647efb258802c9cb9d69b8bb1", size = 9958, upload-time = "2026-05-23T23:41:41.685Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/56/7e131f5849214b0ef31dfab0d15ec458325a8d8131fbbec9c0dd31697b5b/sphinx_gp_sitemap-0.0.1a22.tar.gz", hash = "sha256:32b7ca09600191b403e3c83972e1ec30c5524575ea31a7500604fcf4560643ff", size = 9957, upload-time = "2026-05-24T16:33:13.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/e7/69e226922f01f75d70298c62855f8da7421846be86dc403a93b1a3cc3b9e/sphinx_gp_sitemap-0.0.1a21-py3-none-any.whl", hash = "sha256:047cb461543dbdb90a75f705dea6666e14960eeacdac2be866726da498ac6274", size = 8980, upload-time = "2026-05-23T23:41:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/d6/82/8f1fbd33492052ccdacafab7991583c3d1d874607abd00f6f2ed51049a16/sphinx_gp_sitemap-0.0.1a22-py3-none-any.whl", hash = "sha256:15a4ecd583c9d7f97607317e4eee7e579d245a9e8743aa00191e29428c02fe94", size = 8980, upload-time = "2026-05-24T16:32:54.225Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/ce/925711bd63a8dadc186d84358a75db5c3dd0100949db0de2fad75d202f58/sphinx_gp_theme-0.0.1a21.tar.gz", hash = "sha256:da1b8012bff9539f20d9d882587d6603da02a775c2ea578e84e8980cddb2373d", size = 18236, upload-time = "2026-05-23T23:41:42.786Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/05/dc90c2fa992a739f94026c2d5f17dc1e53b220e3eb02f363931192fa3a97/sphinx_gp_theme-0.0.1a22.tar.gz", hash = "sha256:498dc6c394a5560b7a288c2d49e027ca79eb8c78ec16e116e15134f515d9245e", size = 18241, upload-time = "2026-05-24T16:33:14.993Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/70/c8f385c07ae586ae8f5f0d1f2338fd1845f7a87b50cc9ccaa223e1d0021f/sphinx_gp_theme-0.0.1a21-py3-none-any.whl", hash = "sha256:0a331bdf7ce6720182a29ef7b68bd6ff291cd5968d0ea0980dbcea64cd9c208b", size = 19826, upload-time = "2026-05-23T23:41:27.016Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/762db3b8aa0cc8c1f988d97b2156679db2a57e0c2c4ba8e851aea8c67cd5/sphinx_gp_theme-0.0.1a22-py3-none-any.whl", hash = "sha256:5e5d0b69cff249e74f83e691d705c9aefe6b74b9f744020d99829c5b52d8f4a2", size = 19828, upload-time = "2026-05-24T16:32:55.642Z" }, ] [[package]] @@ -1502,28 +1502,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/b3/2b8940092399b48c68117755f3133166b21ce7084372176e7fa4ca3812e5/sphinx_ux_autodoc_layout-0.0.1a21.tar.gz", hash = "sha256:1ecf16050265427f4807888ed46a76adb0ec41db747ac2caa01e664ad2f8b9c2", size = 29124, upload-time = "2026-05-23T23:41:43.653Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/4d/a4b8626be020187364e09d8475fd5ad5036e597d9cf6a954eecb24dda478/sphinx_ux_autodoc_layout-0.0.1a22.tar.gz", hash = "sha256:1a29b96c920dfefb2ca8cf3db6828e9c487c5a40a59ff370b67463fd18428d0e", size = 29139, upload-time = "2026-05-24T16:33:15.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/37/8c9340e2226d8db53672695d3323055dc1d329e9758dcd67a671d1cc0963/sphinx_ux_autodoc_layout-0.0.1a21-py3-none-any.whl", hash = "sha256:5dc0a5702a46d004433ebb491303de9de1d2f8e6b4b30ff8713c9c5a7bc597cf", size = 33082, upload-time = "2026-05-23T23:41:28.218Z" }, + { url = "https://files.pythonhosted.org/packages/52/e2/f9a781561fbeacce5857c36a98cdf3be471f61876009571f559e3ddfd046/sphinx_ux_autodoc_layout-0.0.1a22-py3-none-any.whl", hash = "sha256:caabbb1cd961e49c8fe97478b5cc4aaf117ce62a03c2fea4f880f3298f2386b4", size = 33107, upload-time = "2026-05-24T16:32:57.183Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a21" +version = "0.0.1a22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/ed/7ef73f21f86f9e7959fde11e9636b581bea937c189ba42a70dbfb87a5d49/sphinx_ux_badges-0.0.1a21.tar.gz", hash = "sha256:e244ea4a7657f0fd0f996bf764570b9a80b0d77b348378708aa0085ce91b2d05", size = 15569, upload-time = "2026-05-23T23:41:44.496Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/5f/dfe15eb6ab969691a48a9e437598e99d056c4aabae254d7b12dc2b0a1947/sphinx_ux_badges-0.0.1a22.tar.gz", hash = "sha256:b3788d104e0e4583e1578816bc08bdec49a64a2072a9813043ec5e66cfeb47eb", size = 15569, upload-time = "2026-05-24T16:33:16.771Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/81/468c169f61379440f7d4b4e5b9da7465342b23534ee76b1d51ff42598830/sphinx_ux_badges-0.0.1a21-py3-none-any.whl", hash = "sha256:e6b8810b7774a5fbbf7e65fdbfb9ca119221ef954d8e0f24f2b0c517fd757b78", size = 16444, upload-time = "2026-05-23T23:41:29.359Z" }, + { url = "https://files.pythonhosted.org/packages/35/a0/c8246c6745ffacc9d882da9c8dd7397824744139841d6565bb92620b49c2/sphinx_ux_badges-0.0.1a22-py3-none-any.whl", hash = "sha256:723dce443896151757a5ee3308e8708f5e827c9b7c1ae71eefd54a9be7a16138", size = 16444, upload-time = "2026-05-24T16:32:58.666Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a21" }, + { name = "gp-sphinx", specifier = "==0.0.1a22" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1695,8 +1695,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a21" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a21" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a22" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a22" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1704,11 +1704,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a21" }, + { name = "gp-sphinx", specifier = "==0.0.1a22" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a21" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a21" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a22" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a22" }, ] lint = [ { name = "mypy" }, From 1324ee5cf6dd01ac4d4a7623981b1252963a4494 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 24 May 2026 12:49:38 -0500 Subject: [PATCH 2872/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a22?= =?UTF-8?q?=20=E2=86=92=200.0.1a23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up sidebar updates — AI section, gp-sphinx link, GitHub link. what: - Bump gp-sphinx and sibling packages 0.0.1a22 → 0.0.1a23 --- pyproject.toml | 12 ++++---- uv.lock | 78 +++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f432738963..edf04b9492 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a22", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a22", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a22", + "gp-sphinx==0.0.1a23", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a23", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a23", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a22", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a22", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a22", + "gp-sphinx==0.0.1a23", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a23", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a23", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index bdc6084847..da4c493fcd 100644 --- a/uv.lock +++ b/uv.lock @@ -425,7 +425,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/34/4ea9a229ac3f507cee04e3a3006ee66776b3d6e7c08f88a556975c7c7265/gp_furo_theme-0.0.1a22.tar.gz", hash = "sha256:e755de491cade34a2de246c16d303bc96fcb51ae036b542fa4980f753af1464c", size = 33846, upload-time = "2026-05-24T16:33:01.385Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/51/888813962c10dbc217ba91c5be273cf7466573457d2eedad6dd0eea16ae4/gp_furo_theme-0.0.1a23.tar.gz", hash = "sha256:0710c14be742732b4e4f452d048bae48e3b8b366792c47d937cb8d7306551080", size = 33849, upload-time = "2026-05-24T17:39:47.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/3c/8b7e2e358bac2dc7acccb4544032ed4a16bb9aebf4ebbb8a7b61995f89c1/gp_furo_theme-0.0.1a22-py3-none-any.whl", hash = "sha256:7ab1a81c54cebde96d6bc99bb907920a2f457a7f81850d2dee44cb59ee2699dc", size = 43216, upload-time = "2026-05-24T16:32:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b2/88f69e1f8b77ca3ccc4f8d169f3a0d4f781c5a428b288463ae30c1f0566a/gp_furo_theme-0.0.1a23-py3-none-any.whl", hash = "sha256:9a57147fa78f1c830a17efbf117f06de009bb0cee7b80271304cf1eca3038600", size = 43216, upload-time = "2026-05-24T17:39:25.329Z" }, ] [[package]] @@ -456,7 +456,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -477,9 +477,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/1c/f2950b1d70540aa392207954d6702c6bfd41e44762abda3288317c6510f9/gp_sphinx-0.0.1a22.tar.gz", hash = "sha256:f16ce005c0ae11ed3d2d2c4c33d48646037a95f5062c79f92cf19880ef666850", size = 19536, upload-time = "2026-05-24T16:33:02.567Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/1a/d08bf8415807819ff90f44a6feca5ebfb7f40a2c4cec211abf2f818e8a72/gp_sphinx-0.0.1a23.tar.gz", hash = "sha256:fd776c4427ea12adbc0c87cae96df8f4a87131ba2d89de33a119a7d3edd0e145", size = 19536, upload-time = "2026-05-24T17:39:48.774Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/86/3f2d7bb4531107f12846e16d3714afc8e22ddde41f06e8bfe9538ab40471/gp_sphinx-0.0.1a22-py3-none-any.whl", hash = "sha256:3e55a0b6b7f718ae5d496c33e5c935bd3ad62ed0e5b759d90100d845c80853d9", size = 20032, upload-time = "2026-05-24T16:32:39.795Z" }, + { url = "https://files.pythonhosted.org/packages/86/dd/8565339a1a5158bbd1b5040391f4885a70ef27203fce3091ed40f159d080/gp_sphinx-0.0.1a23-py3-none-any.whl", hash = "sha256:50c9048c14a7669a2cc8c60780e875f930b19a4728baa6fb2690c9ce4d76f756", size = 20035, upload-time = "2026-05-24T17:39:26.859Z" }, ] [[package]] @@ -1336,7 +1336,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1344,14 +1344,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/54/805fb51b5cbc91c61a649b89eee16a022c941bb7c16e32349c504cf1f6ec/sphinx_autodoc_api_style-0.0.1a22.tar.gz", hash = "sha256:759cf842036a9070e65a365a3b932ac7500d9ffcc7a38a9ed93e411293be981c", size = 8976, upload-time = "2026-05-24T16:33:03.602Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/83/e1352f74b0bacd22a825a58c39a120392d9bce0533bc179864bbee0ed2bd/sphinx_autodoc_api_style-0.0.1a23.tar.gz", hash = "sha256:976aa57470219c16bda23c40e6dfd524308971c4741dee078b8acd005a7b245d", size = 8977, upload-time = "2026-05-24T17:39:49.574Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/d9/2d5cc17fb6d6119f39c65e98532c174cf0b38878701ac67d9d1a747fdc52/sphinx_autodoc_api_style-0.0.1a22-py3-none-any.whl", hash = "sha256:75f460e5e83bf3f165cf0b9e7559a9d0e0236720b933668c6ccdedfa6a83f4aa", size = 9064, upload-time = "2026-05-24T16:32:41.36Z" }, + { url = "https://files.pythonhosted.org/packages/06/8b/43923b114b695f0d29bf3b1cb2d133eea6332068814f1b0006111bcfb045/sphinx_autodoc_api_style-0.0.1a23-py3-none-any.whl", hash = "sha256:66f738cad5ba3877f1b800fa7db06688bd6d44a609e4bc4c8d73460fb6e285e8", size = 9064, upload-time = "2026-05-24T17:39:28.31Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1359,22 +1359,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/9c/ffe4a07527c341a88cfcd30abf51926da13f50a73ac656a2306a9ff3ce5f/sphinx_autodoc_argparse-0.0.1a22.tar.gz", hash = "sha256:2d9f2e7f31ba4b81a73fc720cbc007c88b358dd479269e7a434e43fa3736e06e", size = 42459, upload-time = "2026-05-24T16:33:04.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/b6/45ca139a9d1b2b4550197bd23317c8ef48f433b77ba15a97f8eca988b4b5/sphinx_autodoc_argparse-0.0.1a23.tar.gz", hash = "sha256:430797075333f1b521bbd5d19b54bcd33df4dd4a4a65259b7948b8a4198d860d", size = 42458, upload-time = "2026-05-24T17:39:50.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/2b/d49a73d54e0482226439d20d14f1196ec64355ec42565ce8d9fdd257ebfe/sphinx_autodoc_argparse-0.0.1a22-py3-none-any.whl", hash = "sha256:fba18c6788588705afd9b8982bd4a527c5c567b79bb1f75a6a056b273994c9f4", size = 47275, upload-time = "2026-05-24T16:32:43.435Z" }, + { url = "https://files.pythonhosted.org/packages/cd/bb/f01c437b68beafb47f614592d0ef2f1a159d7808727006823d2e337dd209/sphinx_autodoc_argparse-0.0.1a23-py3-none-any.whl", hash = "sha256:27e86e9008d075dbde1144e19b865ae90b52a7c64a3ea22656a2e908eee03899", size = 47275, upload-time = "2026-05-24T17:39:29.68Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/19/783336a0f1bcb3869ea697ee595425c64722f1bdf1ade340f40c636173c7/sphinx_autodoc_typehints_gp-0.0.1a22.tar.gz", hash = "sha256:0139f498abf1f8eed705f5afbd5ac5e836b52432e1477d2018ccdf2b05044812", size = 36360, upload-time = "2026-05-24T16:33:10.584Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/ec/19ddac05ba9316b6ca38cfe9be4399b6e77c51c34b7e8bcc08435eab5135/sphinx_autodoc_typehints_gp-0.0.1a23.tar.gz", hash = "sha256:5b67b041212333159cdbb3fd04ab68d8594f247826ab422d218598dc704ffead", size = 36360, upload-time = "2026-05-24T17:39:55.76Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/34/47d212b0f9f117cbed409b0ba183dbf5ae8441b218166fd46927912afc0d/sphinx_autodoc_typehints_gp-0.0.1a22-py3-none-any.whl", hash = "sha256:abd008b7c775e5a4954c6bbe6bf9dfe3a5b6c461deceb385aabd97882093579d", size = 38508, upload-time = "2026-05-24T16:32:50.336Z" }, + { url = "https://files.pythonhosted.org/packages/b8/17/e9c0610bb1b394d3089d6506bd43c572eb1e3ba0cd03e7b4b4a57c0be3da/sphinx_autodoc_typehints_gp-0.0.1a23-py3-none-any.whl", hash = "sha256:a8bbfa952e37a65ceec5ea6361b09c8dabfadc24e823c063cc194f617ad572fd", size = 38506, upload-time = "2026-05-24T17:39:36.4Z" }, ] [[package]] @@ -1436,55 +1436,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/8f/13273f32c5f6ed5aff7f223946bb47e77f4d195b1cb8694282698d48f80d/sphinx_fonts-0.0.1a22.tar.gz", hash = "sha256:52ebd06c276c645691d947d7728afda504f3bab5237f46de3a2a70a57397fe4f", size = 5789, upload-time = "2026-05-24T16:33:11.733Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/7b/1babbd8da7fc802ccc34dcb643f4f6a569da094cfd023cbbb8051078e32f/sphinx_fonts-0.0.1a23.tar.gz", hash = "sha256:63573834b1ef826d631fef17c9d80e75d1ff15cb5c9a0bdb7ce56deecafa2c8a", size = 5789, upload-time = "2026-05-24T17:39:56.905Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/1f/ddfe65dcbaa55f1817a104e4fd92624cb36909e06196260de9001fc56582/sphinx_fonts-0.0.1a22-py3-none-any.whl", hash = "sha256:ad314627782b0ad0a7fa8eef755f9072f5ef4051174c9a623b148daff8bc13ea", size = 4359, upload-time = "2026-05-24T16:32:51.72Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/d6693d8ef160872408d5d641b13bf39b54af7fefe14ae0902bca4efe3eba/sphinx_fonts-0.0.1a23-py3-none-any.whl", hash = "sha256:629d4fe61a67494b11a5f857852609c19ad83e184fd5e184e8d01edce2b87919", size = 4361, upload-time = "2026-05-24T17:39:37.863Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/40/6ab84894200a3124b0a6d8d2a88a5cef87d6353e469e72c8fe6279cde709/sphinx_gp_opengraph-0.0.1a22.tar.gz", hash = "sha256:8a3eaabbba997767e8f9d36aecdee50e762035a2bc43d50c4abcb4c0030cc877", size = 11944, upload-time = "2026-05-24T16:33:12.816Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/93/225479fcb85a5f432f9aebe31f2ce55a0eb67a7d6a383a8ba11be3716191/sphinx_gp_opengraph-0.0.1a23.tar.gz", hash = "sha256:ab06f46e21365d5dcc73fab327c0424a10f9fe0805daa58003921a16b90a3e01", size = 11946, upload-time = "2026-05-24T17:39:57.734Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/0b/27d2609f11f9b5bac789fffafc7108e391e34561e38918d782fceb545670/sphinx_gp_opengraph-0.0.1a22-py3-none-any.whl", hash = "sha256:2ca3ac71776f237c147336511cb43396958cc8779ee052008f72b52c2f044b41", size = 12183, upload-time = "2026-05-24T16:32:52.752Z" }, + { url = "https://files.pythonhosted.org/packages/23/44/cfd19ae4f4e4037a017da364c857c678fbda5b7c2d388aa9e227def7e85e/sphinx_gp_opengraph-0.0.1a23-py3-none-any.whl", hash = "sha256:842db8593051290669e702b2f2e32cd3239d4164561bca3078ad7681d106af4c", size = 12185, upload-time = "2026-05-24T17:39:39.245Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/56/7e131f5849214b0ef31dfab0d15ec458325a8d8131fbbec9c0dd31697b5b/sphinx_gp_sitemap-0.0.1a22.tar.gz", hash = "sha256:32b7ca09600191b403e3c83972e1ec30c5524575ea31a7500604fcf4560643ff", size = 9957, upload-time = "2026-05-24T16:33:13.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/ac/9a14c5578e680a6ee473bec545a1a7488317117335a703ce9d5ec346ebc8/sphinx_gp_sitemap-0.0.1a23.tar.gz", hash = "sha256:576eec30c5ccf5cc41a1bbb80d4ee80c16a54fed994d971df073cbcd6d85f0b0", size = 9958, upload-time = "2026-05-24T17:39:58.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/82/8f1fbd33492052ccdacafab7991583c3d1d874607abd00f6f2ed51049a16/sphinx_gp_sitemap-0.0.1a22-py3-none-any.whl", hash = "sha256:15a4ecd583c9d7f97607317e4eee7e579d245a9e8743aa00191e29428c02fe94", size = 8980, upload-time = "2026-05-24T16:32:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/cf/1e/a2ed9272d1971d0b23d4f86ef1eb611e231bc0259bae3556d01b4e75d3e5/sphinx_gp_sitemap-0.0.1a23-py3-none-any.whl", hash = "sha256:6bfeac4df2601c24c3b51b450a833469bcee942b8e497e538176acb64fba71d9", size = 8981, upload-time = "2026-05-24T17:39:40.916Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/05/dc90c2fa992a739f94026c2d5f17dc1e53b220e3eb02f363931192fa3a97/sphinx_gp_theme-0.0.1a22.tar.gz", hash = "sha256:498dc6c394a5560b7a288c2d49e027ca79eb8c78ec16e116e15134f515d9245e", size = 18241, upload-time = "2026-05-24T16:33:14.993Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/b9/57768c3aca25f30f2629510b7a7c842e109c19deabc30b2eafd3243388f7/sphinx_gp_theme-0.0.1a23.tar.gz", hash = "sha256:75a86c65d9341c490f640d8e46498d7f6eb8e4eaec1528879523ea7479caaf04", size = 18282, upload-time = "2026-05-24T17:39:59.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/d4/762db3b8aa0cc8c1f988d97b2156679db2a57e0c2c4ba8e851aea8c67cd5/sphinx_gp_theme-0.0.1a22-py3-none-any.whl", hash = "sha256:5e5d0b69cff249e74f83e691d705c9aefe6b74b9f744020d99829c5b52d8f4a2", size = 19828, upload-time = "2026-05-24T16:32:55.642Z" }, + { url = "https://files.pythonhosted.org/packages/39/87/2aef9a699dfe8aed95fd5634c8134d73e16e7f9a4ecdeb7e4fd29a6d6985/sphinx_gp_theme-0.0.1a23-py3-none-any.whl", hash = "sha256:8f32f32a1d9d94c531675357227b79a3dd1e549585ede936327bd0c29528fd00", size = 19881, upload-time = "2026-05-24T17:39:42.32Z" }, ] [[package]] @@ -1502,28 +1502,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/4d/a4b8626be020187364e09d8475fd5ad5036e597d9cf6a954eecb24dda478/sphinx_ux_autodoc_layout-0.0.1a22.tar.gz", hash = "sha256:1a29b96c920dfefb2ca8cf3db6828e9c487c5a40a59ff370b67463fd18428d0e", size = 29139, upload-time = "2026-05-24T16:33:15.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/53/1003c373938e67e53765d02cea3d7d99a940e5daa103ba27d829ef66f518/sphinx_ux_autodoc_layout-0.0.1a23.tar.gz", hash = "sha256:fd62589b0928e80306fb4f945cf9f70682c18f105c75b5bcb20ba41ed58e06ca", size = 29139, upload-time = "2026-05-24T17:40:00.562Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/e2/f9a781561fbeacce5857c36a98cdf3be471f61876009571f559e3ddfd046/sphinx_ux_autodoc_layout-0.0.1a22-py3-none-any.whl", hash = "sha256:caabbb1cd961e49c8fe97478b5cc4aaf117ce62a03c2fea4f880f3298f2386b4", size = 33107, upload-time = "2026-05-24T16:32:57.183Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e9/dd957bdda6155423e19367268a7317778f82b5c048933b872cae1a816424/sphinx_ux_autodoc_layout-0.0.1a23-py3-none-any.whl", hash = "sha256:66c6ecc37df4a1f1512d9b9b53c074edd2784c43a391fff81f021f548b21fd9d", size = 33106, upload-time = "2026-05-24T17:39:43.684Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a22" +version = "0.0.1a23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/5f/dfe15eb6ab969691a48a9e437598e99d056c4aabae254d7b12dc2b0a1947/sphinx_ux_badges-0.0.1a22.tar.gz", hash = "sha256:b3788d104e0e4583e1578816bc08bdec49a64a2072a9813043ec5e66cfeb47eb", size = 15569, upload-time = "2026-05-24T16:33:16.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/c5/3f0d50ddd81f3ca99bd39dcb75a58930a6ea589773105ca1c0007a4f81f6/sphinx_ux_badges-0.0.1a23.tar.gz", hash = "sha256:ca5b79459dc786de9038ef0efb7baa47d391ff95e57ac67f13bb7270e26758e2", size = 15569, upload-time = "2026-05-24T17:40:01.49Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/a0/c8246c6745ffacc9d882da9c8dd7397824744139841d6565bb92620b49c2/sphinx_ux_badges-0.0.1a22-py3-none-any.whl", hash = "sha256:723dce443896151757a5ee3308e8708f5e827c9b7c1ae71eefd54a9be7a16138", size = 16444, upload-time = "2026-05-24T16:32:58.666Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a3/50efc0fa0d8053396d7148ca06c208e630cb2382dcfca03c1c6828e3f80a/sphinx_ux_badges-0.0.1a23-py3-none-any.whl", hash = "sha256:d3794ae93ef9b99d9182192501aa53784a3ce5bebfbd693d54093aa80d915b3f", size = 16446, upload-time = "2026-05-24T17:39:44.749Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a22" }, + { name = "gp-sphinx", specifier = "==0.0.1a23" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1695,8 +1695,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a22" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a22" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a23" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a23" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1704,11 +1704,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a22" }, + { name = "gp-sphinx", specifier = "==0.0.1a23" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a22" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a22" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a23" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a23" }, ] lint = [ { name = "mypy" }, From f8748a2699095db0b05123b7ba344c114e3f0f54 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 May 2026 07:15:33 -0500 Subject: [PATCH 2873/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a23?= =?UTF-8?q?=20=E2=86=92=200.0.1a24?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up LLM-friendly documentation outputs — llms.txt, llms-full.txt, docs.json, per-page .md twins, footer links. what: - Bump gp-sphinx and sibling packages 0.0.1a23 → 0.0.1a24 --- pyproject.toml | 12 ++++---- uv.lock | 78 +++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index edf04b9492..46bd803c2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a23", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a23", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a23", + "gp-sphinx==0.0.1a24", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a24", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a24", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a23", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a23", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a23", + "gp-sphinx==0.0.1a24", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a24", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a24", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index da4c493fcd..a04241c720 100644 --- a/uv.lock +++ b/uv.lock @@ -425,7 +425,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -435,9 +435,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/51/888813962c10dbc217ba91c5be273cf7466573457d2eedad6dd0eea16ae4/gp_furo_theme-0.0.1a23.tar.gz", hash = "sha256:0710c14be742732b4e4f452d048bae48e3b8b366792c47d937cb8d7306551080", size = 33849, upload-time = "2026-05-24T17:39:47.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/6d/5c75d335072d892f137edcc0b7dc6aedcb0bb5eb39fcb4ba53b8dab2b78f/gp_furo_theme-0.0.1a24.tar.gz", hash = "sha256:7b3f8818c82e7e78dc9ca01c79be5f7baaac40c3b6f79ab373a0c243b1188f32", size = 34171, upload-time = "2026-05-25T12:08:03.736Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/b2/88f69e1f8b77ca3ccc4f8d169f3a0d4f781c5a428b288463ae30c1f0566a/gp_furo_theme-0.0.1a23-py3-none-any.whl", hash = "sha256:9a57147fa78f1c830a17efbf117f06de009bb0cee7b80271304cf1eca3038600", size = 43216, upload-time = "2026-05-24T17:39:25.329Z" }, + { url = "https://files.pythonhosted.org/packages/46/dd/e740de3860164760ff83384fc1e1bf9361a728a8d73ac53af5f842b7e100/gp_furo_theme-0.0.1a24-py3-none-any.whl", hash = "sha256:e0d4af73665d6e1bffc6ede693b79f1fb02dafd1e98a3b0628615ea435740ea3", size = 43579, upload-time = "2026-05-25T12:07:39.087Z" }, ] [[package]] @@ -456,7 +456,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -477,9 +477,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/37/1a/d08bf8415807819ff90f44a6feca5ebfb7f40a2c4cec211abf2f818e8a72/gp_sphinx-0.0.1a23.tar.gz", hash = "sha256:fd776c4427ea12adbc0c87cae96df8f4a87131ba2d89de33a119a7d3edd0e145", size = 19536, upload-time = "2026-05-24T17:39:48.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/5e/37461931f45165998d6de0a84462e6eea1c5ca19370045a3f56e80748978/gp_sphinx-0.0.1a24.tar.gz", hash = "sha256:4bcc2d3c8bc6963ea05269969d3c7ae1c4717d304991e37f047f451853540969", size = 19540, upload-time = "2026-05-25T12:08:04.961Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/dd/8565339a1a5158bbd1b5040391f4885a70ef27203fce3091ed40f159d080/gp_sphinx-0.0.1a23-py3-none-any.whl", hash = "sha256:50c9048c14a7669a2cc8c60780e875f930b19a4728baa6fb2690c9ce4d76f756", size = 20035, upload-time = "2026-05-24T17:39:26.859Z" }, + { url = "https://files.pythonhosted.org/packages/63/fd/4ef6b588a8e26f0c28188fee470d2405e643a730689a191850a6e580c7da/gp_sphinx-0.0.1a24-py3-none-any.whl", hash = "sha256:dffe2942e2ff89669e18c5b0759cd99fb8485f1438a1e78d7b062ea59c5c7b37", size = 20038, upload-time = "2026-05-25T12:07:40.717Z" }, ] [[package]] @@ -1336,7 +1336,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1344,14 +1344,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/83/e1352f74b0bacd22a825a58c39a120392d9bce0533bc179864bbee0ed2bd/sphinx_autodoc_api_style-0.0.1a23.tar.gz", hash = "sha256:976aa57470219c16bda23c40e6dfd524308971c4741dee078b8acd005a7b245d", size = 8977, upload-time = "2026-05-24T17:39:49.574Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/42/36bef1bb9c2ef37d89a4ae01a61397297ec2c3e0af44e8ac905f87000495/sphinx_autodoc_api_style-0.0.1a24.tar.gz", hash = "sha256:4798838fcdcade0dbf00e323b883d4dec4cd2e13a325befdce1e68d849858c0c", size = 8977, upload-time = "2026-05-25T12:08:06.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/8b/43923b114b695f0d29bf3b1cb2d133eea6332068814f1b0006111bcfb045/sphinx_autodoc_api_style-0.0.1a23-py3-none-any.whl", hash = "sha256:66f738cad5ba3877f1b800fa7db06688bd6d44a609e4bc4c8d73460fb6e285e8", size = 9064, upload-time = "2026-05-24T17:39:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/09/96/560a98a3736888b876efe1d69be25bb910f30f83090244ef4e99275e5c0e/sphinx_autodoc_api_style-0.0.1a24-py3-none-any.whl", hash = "sha256:207f64f23fa349af943f5c538d4cbf618488c013bd1fc1563283b0f7600590df", size = 9064, upload-time = "2026-05-25T12:07:41.846Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1359,22 +1359,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/b6/45ca139a9d1b2b4550197bd23317c8ef48f433b77ba15a97f8eca988b4b5/sphinx_autodoc_argparse-0.0.1a23.tar.gz", hash = "sha256:430797075333f1b521bbd5d19b54bcd33df4dd4a4a65259b7948b8a4198d860d", size = 42458, upload-time = "2026-05-24T17:39:50.402Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/15/9b587c4cbcab54a65fc9bd7024cf10b9761d7ae7514c8002c65ab80ddb27/sphinx_autodoc_argparse-0.0.1a24.tar.gz", hash = "sha256:3fb474e401812103c93815a047ccca858deffa4eb4934ebdc8723ed8ec0a5a1b", size = 42461, upload-time = "2026-05-25T12:08:07.022Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/bb/f01c437b68beafb47f614592d0ef2f1a159d7808727006823d2e337dd209/sphinx_autodoc_argparse-0.0.1a23-py3-none-any.whl", hash = "sha256:27e86e9008d075dbde1144e19b865ae90b52a7c64a3ea22656a2e908eee03899", size = 47275, upload-time = "2026-05-24T17:39:29.68Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c7/57ab18384c98f2f3d1342f8f693d8b89b81e0fe9c679d165453b8106cd8c/sphinx_autodoc_argparse-0.0.1a24-py3-none-any.whl", hash = "sha256:b9dbf622f6d1efcf5cb09603237ad4833d46ed64da469dcc28dedab6f7edc29e", size = 47275, upload-time = "2026-05-25T12:07:43.023Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/ec/19ddac05ba9316b6ca38cfe9be4399b6e77c51c34b7e8bcc08435eab5135/sphinx_autodoc_typehints_gp-0.0.1a23.tar.gz", hash = "sha256:5b67b041212333159cdbb3fd04ab68d8594f247826ab422d218598dc704ffead", size = 36360, upload-time = "2026-05-24T17:39:55.76Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/43/8cbcf7e2fc1c59340ecb68dc70e08c29e46dc018500f7d1c7c8aed1f3c10/sphinx_autodoc_typehints_gp-0.0.1a24.tar.gz", hash = "sha256:777f8646d963e455dfa22cc9c4bb7f2c3ae0f94705f918040375c8deeccf2fe6", size = 36360, upload-time = "2026-05-25T12:08:12.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/17/e9c0610bb1b394d3089d6506bd43c572eb1e3ba0cd03e7b4b4a57c0be3da/sphinx_autodoc_typehints_gp-0.0.1a23-py3-none-any.whl", hash = "sha256:a8bbfa952e37a65ceec5ea6361b09c8dabfadc24e823c063cc194f617ad572fd", size = 38506, upload-time = "2026-05-24T17:39:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/e7/68/58eabcd6f2258893b19572d9f8935f7d14d3e4861f51843070cbb717266d/sphinx_autodoc_typehints_gp-0.0.1a24-py3-none-any.whl", hash = "sha256:060afa3da6d15bd56622f062a90a3ba52cdc0ef92f807da9969146e312bc93c0", size = 38510, upload-time = "2026-05-25T12:07:50.27Z" }, ] [[package]] @@ -1436,55 +1436,55 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/7b/1babbd8da7fc802ccc34dcb643f4f6a569da094cfd023cbbb8051078e32f/sphinx_fonts-0.0.1a23.tar.gz", hash = "sha256:63573834b1ef826d631fef17c9d80e75d1ff15cb5c9a0bdb7ce56deecafa2c8a", size = 5789, upload-time = "2026-05-24T17:39:56.905Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/e3/cd5eb59cfbaee93a3199397cb65eb0d6e0ecd355f74a1b30af195bed545c/sphinx_fonts-0.0.1a24.tar.gz", hash = "sha256:41379f19d71bac5ff63da298643a9e15a83515004583008715c8530a21bf1642", size = 5790, upload-time = "2026-05-25T12:08:13.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/9d/d6693d8ef160872408d5d641b13bf39b54af7fefe14ae0902bca4efe3eba/sphinx_fonts-0.0.1a23-py3-none-any.whl", hash = "sha256:629d4fe61a67494b11a5f857852609c19ad83e184fd5e184e8d01edce2b87919", size = 4361, upload-time = "2026-05-24T17:39:37.863Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/3e36ae9c052acfacbe951a457f9061542cc73d6689e40413d0d192b5ee40/sphinx_fonts-0.0.1a24-py3-none-any.whl", hash = "sha256:eea5756159144df573f55020c2c201fbb0e84a3dba1aba8e411c0a66da1d47a2", size = 4360, upload-time = "2026-05-25T12:07:51.665Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/93/225479fcb85a5f432f9aebe31f2ce55a0eb67a7d6a383a8ba11be3716191/sphinx_gp_opengraph-0.0.1a23.tar.gz", hash = "sha256:ab06f46e21365d5dcc73fab327c0424a10f9fe0805daa58003921a16b90a3e01", size = 11946, upload-time = "2026-05-24T17:39:57.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/83/d4aacf6027eddc5822c5e33b12d47d767f69013623347c1e408e6f232b2a/sphinx_gp_opengraph-0.0.1a24.tar.gz", hash = "sha256:2180d0f51babe8a9826649611a0a6096b28b677a813879a0edd97baaa53e8c09", size = 11945, upload-time = "2026-05-25T12:08:15.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/44/cfd19ae4f4e4037a017da364c857c678fbda5b7c2d388aa9e227def7e85e/sphinx_gp_opengraph-0.0.1a23-py3-none-any.whl", hash = "sha256:842db8593051290669e702b2f2e32cd3239d4164561bca3078ad7681d106af4c", size = 12185, upload-time = "2026-05-24T17:39:39.245Z" }, + { url = "https://files.pythonhosted.org/packages/1b/60/263ae291783e8be63e977a3d9a4a6ebe34d46a078b1d81dca0ea0a5d7224/sphinx_gp_opengraph-0.0.1a24-py3-none-any.whl", hash = "sha256:ed7f9964b2e0ba82cf023f6060d74225eba1c6282ea96969a255894ab89bc5c2", size = 12184, upload-time = "2026-05-25T12:07:53.969Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/ac/9a14c5578e680a6ee473bec545a1a7488317117335a703ce9d5ec346ebc8/sphinx_gp_sitemap-0.0.1a23.tar.gz", hash = "sha256:576eec30c5ccf5cc41a1bbb80d4ee80c16a54fed994d971df073cbcd6d85f0b0", size = 9958, upload-time = "2026-05-24T17:39:58.546Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ff/4bfc19e4cb41d109c353f3e07c76108f42228d470d559ba970673dfd4e45/sphinx_gp_sitemap-0.0.1a24.tar.gz", hash = "sha256:abedc7ea6310e5f807810122031fdc5f59e94afac4fc1ee9de7cba0ce798006e", size = 9956, upload-time = "2026-05-25T12:08:16.089Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/1e/a2ed9272d1971d0b23d4f86ef1eb611e231bc0259bae3556d01b4e75d3e5/sphinx_gp_sitemap-0.0.1a23-py3-none-any.whl", hash = "sha256:6bfeac4df2601c24c3b51b450a833469bcee942b8e497e538176acb64fba71d9", size = 8981, upload-time = "2026-05-24T17:39:40.916Z" }, + { url = "https://files.pythonhosted.org/packages/66/65/b12bda3419534c3a986d24cbad88a1053f44a9d0cb1c3bf73dafaea17eed/sphinx_gp_sitemap-0.0.1a24-py3-none-any.whl", hash = "sha256:1153f89a949a8771f985ee055c4b84471e546f49ed8ce4a7165824360f84c666", size = 8983, upload-time = "2026-05-25T12:07:55.328Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/b9/57768c3aca25f30f2629510b7a7c842e109c19deabc30b2eafd3243388f7/sphinx_gp_theme-0.0.1a23.tar.gz", hash = "sha256:75a86c65d9341c490f640d8e46498d7f6eb8e4eaec1528879523ea7479caaf04", size = 18282, upload-time = "2026-05-24T17:39:59.345Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/2d/487405ed87c4a71c1a1d962aede9bd232b624bd6ccbe2d877ebd14a72672/sphinx_gp_theme-0.0.1a24.tar.gz", hash = "sha256:c5f9d326207090478abbefd0f75513a2a36f261ce2908192e7f67dae4b0c4752", size = 18288, upload-time = "2026-05-25T12:08:17.215Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/87/2aef9a699dfe8aed95fd5634c8134d73e16e7f9a4ecdeb7e4fd29a6d6985/sphinx_gp_theme-0.0.1a23-py3-none-any.whl", hash = "sha256:8f32f32a1d9d94c531675357227b79a3dd1e549585ede936327bd0c29528fd00", size = 19881, upload-time = "2026-05-24T17:39:42.32Z" }, + { url = "https://files.pythonhosted.org/packages/28/f2/679783d1575d36e9c3a83a57a0f56b98aadc8b4aefd8a69b764760714750/sphinx_gp_theme-0.0.1a24-py3-none-any.whl", hash = "sha256:876dfa435c0ecdd611b08064864b099743c7040652eaa0a2aac169158149bb1e", size = 19882, upload-time = "2026-05-25T12:07:57.281Z" }, ] [[package]] @@ -1502,28 +1502,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/53/1003c373938e67e53765d02cea3d7d99a940e5daa103ba27d829ef66f518/sphinx_ux_autodoc_layout-0.0.1a23.tar.gz", hash = "sha256:fd62589b0928e80306fb4f945cf9f70682c18f105c75b5bcb20ba41ed58e06ca", size = 29139, upload-time = "2026-05-24T17:40:00.562Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/22/54c5babfb687c827555b5293678c09f4a37be333a178e5f3c52ebe67f33e/sphinx_ux_autodoc_layout-0.0.1a24.tar.gz", hash = "sha256:56e6e8605f4b25909f904c22351f4a65c9af74935f6bbd40a6cbdf57838252bf", size = 29137, upload-time = "2026-05-25T12:08:18.341Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e9/dd957bdda6155423e19367268a7317778f82b5c048933b872cae1a816424/sphinx_ux_autodoc_layout-0.0.1a23-py3-none-any.whl", hash = "sha256:66c6ecc37df4a1f1512d9b9b53c074edd2784c43a391fff81f021f548b21fd9d", size = 33106, upload-time = "2026-05-24T17:39:43.684Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/c8e1f836687b4083e3bf75b991731c2de90d58508895b1ccadaa6d41419a/sphinx_ux_autodoc_layout-0.0.1a24-py3-none-any.whl", hash = "sha256:de2f19056dd8280ec6917df5a9fa0f4e94cdbf421babe06e832fceca626e15d9", size = 33106, upload-time = "2026-05-25T12:07:58.741Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a23" +version = "0.0.1a24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/c5/3f0d50ddd81f3ca99bd39dcb75a58930a6ea589773105ca1c0007a4f81f6/sphinx_ux_badges-0.0.1a23.tar.gz", hash = "sha256:ca5b79459dc786de9038ef0efb7baa47d391ff95e57ac67f13bb7270e26758e2", size = 15569, upload-time = "2026-05-24T17:40:01.49Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/73/ffd223c719e4b93d7db4cac795e8939738805733a25f660e3839df3bdbf6/sphinx_ux_badges-0.0.1a24.tar.gz", hash = "sha256:2d766dbd0550f7db1edb3ce0ffb4e69d926f1ae0795fe830647c9311ef783b62", size = 15569, upload-time = "2026-05-25T12:08:20.923Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/a3/50efc0fa0d8053396d7148ca06c208e630cb2382dcfca03c1c6828e3f80a/sphinx_ux_badges-0.0.1a23-py3-none-any.whl", hash = "sha256:d3794ae93ef9b99d9182192501aa53784a3ce5bebfbd693d54093aa80d915b3f", size = 16446, upload-time = "2026-05-24T17:39:44.749Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f0/1fbb1674eeb59d996ff89b182227adcf53ec4bc0ccb92a62bdff54acdbb7/sphinx_ux_badges-0.0.1a24-py3-none-any.whl", hash = "sha256:cd86def8cd62f7c260122946896dc234a401a4a80447fae0d1446a6961f890a0", size = 16445, upload-time = "2026-05-25T12:08:00.659Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a23" }, + { name = "gp-sphinx", specifier = "==0.0.1a24" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1695,8 +1695,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a23" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a23" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a24" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a24" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1704,11 +1704,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a23" }, + { name = "gp-sphinx", specifier = "==0.0.1a24" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a23" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a23" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a24" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a24" }, ] lint = [ { name = "mypy" }, From c43c64820243a6c70a795ddc0506dc7cf8222b54 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 May 2026 07:23:10 -0500 Subject: [PATCH 2874/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a24?= =?UTF-8?q?=20=E2=86=92=200.0.1a25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: hotfix — sphinx-gp-llms was missing from gp-sphinx runtime dependencies; 0.0.1a25 adds it. what: - Bump gp-sphinx and sibling packages 0.0.1a24 → 0.0.1a25 --- pyproject.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 46bd803c2d..e6d7f15ae4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a24", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a24", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a24", + "gp-sphinx==0.0.1a25", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a25", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a25", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a24", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a24", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a24", + "gp-sphinx==0.0.1a25", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a25", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a25", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] From 6e916ea3b2cd074ab4efe461cd4fe633530f3f50 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 May 2026 07:55:29 -0500 Subject: [PATCH 2875/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a25?= =?UTF-8?q?=20=E2=86=92=200.0.1a26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up SPA footer fix — source path, machine-readable links, and next/prev now update on SPA navigation. what: - Bump gp-sphinx and sibling packages 0.0.1a25 → 0.0.1a26 --- pyproject.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e6d7f15ae4..6b2960d0ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a25", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a25", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a25", + "gp-sphinx==0.0.1a26", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a26", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a26", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a25", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a25", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a25", + "gp-sphinx==0.0.1a26", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a26", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a26", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] From 4fe746b0376ef954fa843ba65d9be32a49ff2b3f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 May 2026 11:31:05 -0500 Subject: [PATCH 2876/2998] py(deps[uv]) Add sphinx-gp-llms to `exclude-newer-package` whitelist why: new gp-sphinx workspace package blocked by exclude-newer cooldown, causing uv sync failures on Python 3.15 splits. what: - Add sphinx-gp-llms = false to [tool.uv.exclude-newer-package] --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 6b2960d0ce..317c2c85af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -133,6 +133,7 @@ sphinx-autodoc-sphinx = false sphinx-autodoc-typehints-gp = false sphinx-fonts = false sphinx-gp-opengraph = false +sphinx-gp-llms = false sphinx-gp-sitemap = false sphinx-gp-theme = false sphinx-ux-autodoc-layout = false From a55107a3d7aafd0e7bd662ff6db991519fa2820d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 25 May 2026 11:19:58 -0500 Subject: [PATCH 2877/2998] py(deps[docs]) Re-lock for sphinx-gp-llms `exclude-newer-package` exemption why: lock file must reflect the newly-exempt package. what: - Regenerate uv.lock --- uv.lock | 95 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 40 deletions(-) diff --git a/uv.lock b/uv.lock index a04241c720..5c3801952c 100644 --- a/uv.lock +++ b/uv.lock @@ -18,8 +18,9 @@ sphinx-autodoc-sphinx = false sphinx-autodoc-api-style = false sphinx-autodoc-fastmcp = false sphinx-autodoc-pytest-fixtures = false -sphinx-ux-autodoc-layout = false +sphinx-gp-llms = false sphinx-autodoc-argparse = false +sphinx-ux-autodoc-layout = false sphinx-ux-badges = false gp-libs = false sphinx-autodoc-docutils = false @@ -425,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -435,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/6d/5c75d335072d892f137edcc0b7dc6aedcb0bb5eb39fcb4ba53b8dab2b78f/gp_furo_theme-0.0.1a24.tar.gz", hash = "sha256:7b3f8818c82e7e78dc9ca01c79be5f7baaac40c3b6f79ab373a0c243b1188f32", size = 34171, upload-time = "2026-05-25T12:08:03.736Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/1a/cb8ca8e0109f0ccaf69b4f60de1dd776feaef6294713bc40b0f12a31655e/gp_furo_theme-0.0.1a26.tar.gz", hash = "sha256:d9c2ac058af8ac550d63fd21265c8f73210206d0da99921df256252a1112e747", size = 34171, upload-time = "2026-05-25T12:52:47.757Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/dd/e740de3860164760ff83384fc1e1bf9361a728a8d73ac53af5f842b7e100/gp_furo_theme-0.0.1a24-py3-none-any.whl", hash = "sha256:e0d4af73665d6e1bffc6ede693b79f1fb02dafd1e98a3b0628615ea435740ea3", size = 43579, upload-time = "2026-05-25T12:07:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/05e0d78211abc1036a1a5edf4da5d95a9a9a656954f5cb2ad749f291b7bb/gp_furo_theme-0.0.1a26-py3-none-any.whl", hash = "sha256:0f40eb0c2a9f83ded4488b99a7bb99ec7f484994f0158e6ae16572f0f4f38324", size = 43580, upload-time = "2026-05-25T12:52:24.215Z" }, ] [[package]] @@ -456,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -471,15 +472,16 @@ dependencies = [ { name = "sphinx-design", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-design", version = "0.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-fonts" }, + { name = "sphinx-gp-llms" }, { name = "sphinx-gp-opengraph" }, { name = "sphinx-gp-sitemap" }, { name = "sphinx-gp-theme" }, { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/5e/37461931f45165998d6de0a84462e6eea1c5ca19370045a3f56e80748978/gp_sphinx-0.0.1a24.tar.gz", hash = "sha256:4bcc2d3c8bc6963ea05269969d3c7ae1c4717d304991e37f047f451853540969", size = 19540, upload-time = "2026-05-25T12:08:04.961Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/d1/c95c68443d64ced8b7f00202ad712bf4ba0a05380b52a0af99eea51f6fc2/gp_sphinx-0.0.1a26.tar.gz", hash = "sha256:a9fc84ab677848f449519cb80ad91aff12eb2fb2ed817b25f2b9cf15432dad66", size = 19549, upload-time = "2026-05-25T12:52:48.729Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/fd/4ef6b588a8e26f0c28188fee470d2405e643a730689a191850a6e580c7da/gp_sphinx-0.0.1a24-py3-none-any.whl", hash = "sha256:dffe2942e2ff89669e18c5b0759cd99fb8485f1438a1e78d7b062ea59c5c7b37", size = 20038, upload-time = "2026-05-25T12:07:40.717Z" }, + { url = "https://files.pythonhosted.org/packages/90/65/80f93c3202eeff6332e19b1758e39e2cdc02986d7f9a78643cca0f6702af/gp_sphinx-0.0.1a26-py3-none-any.whl", hash = "sha256:f32243ca8638093727f9d9c27eeb1768b49a18227b3ba5168ab28cdd8c853fe0", size = 20044, upload-time = "2026-05-25T12:52:25.811Z" }, ] [[package]] @@ -1336,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1344,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/42/36bef1bb9c2ef37d89a4ae01a61397297ec2c3e0af44e8ac905f87000495/sphinx_autodoc_api_style-0.0.1a24.tar.gz", hash = "sha256:4798838fcdcade0dbf00e323b883d4dec4cd2e13a325befdce1e68d849858c0c", size = 8977, upload-time = "2026-05-25T12:08:06.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/ad/7a74189e33610a310cb08e968d390c94ee9168b84366af98c007ba4055ae/sphinx_autodoc_api_style-0.0.1a26.tar.gz", hash = "sha256:aeebb7961cd569c7ea9c51fe8854659ada446af2625d35923f70f874f142bebe", size = 8977, upload-time = "2026-05-25T12:52:49.676Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/96/560a98a3736888b876efe1d69be25bb910f30f83090244ef4e99275e5c0e/sphinx_autodoc_api_style-0.0.1a24-py3-none-any.whl", hash = "sha256:207f64f23fa349af943f5c538d4cbf618488c013bd1fc1563283b0f7600590df", size = 9064, upload-time = "2026-05-25T12:07:41.846Z" }, + { url = "https://files.pythonhosted.org/packages/db/c5/d924b1e343cc7d8e6cdba766fd6d7942b62eab4b24f765de232561c946dd/sphinx_autodoc_api_style-0.0.1a26-py3-none-any.whl", hash = "sha256:69158e9518c6230de989f2a12177c550536c55067f6d1942f2b39b04acbc07bd", size = 9065, upload-time = "2026-05-25T12:52:27.386Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1359,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/15/9b587c4cbcab54a65fc9bd7024cf10b9761d7ae7514c8002c65ab80ddb27/sphinx_autodoc_argparse-0.0.1a24.tar.gz", hash = "sha256:3fb474e401812103c93815a047ccca858deffa4eb4934ebdc8723ed8ec0a5a1b", size = 42461, upload-time = "2026-05-25T12:08:07.022Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/93/fb05be121852b01a186e41dcf84dd056b0ef3f2d2ebb0764bab3a2db70aa/sphinx_autodoc_argparse-0.0.1a26.tar.gz", hash = "sha256:336df04f4ec9f2551994af7d117af44c25a9f59c546a07df64f9c62c84b93737", size = 42459, upload-time = "2026-05-25T12:52:50.53Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/c7/57ab18384c98f2f3d1342f8f693d8b89b81e0fe9c679d165453b8106cd8c/sphinx_autodoc_argparse-0.0.1a24-py3-none-any.whl", hash = "sha256:b9dbf622f6d1efcf5cb09603237ad4833d46ed64da469dcc28dedab6f7edc29e", size = 47275, upload-time = "2026-05-25T12:07:43.023Z" }, + { url = "https://files.pythonhosted.org/packages/5f/25/6aa07bf9e493951e187dc4b75012d1bd0b3072d9f63e8c751ec6cefd2057/sphinx_autodoc_argparse-0.0.1a26-py3-none-any.whl", hash = "sha256:92052e37e61c02f64f44b49199b44d259a65616e5e0916343517134bbc8470a7", size = 47276, upload-time = "2026-05-25T12:52:28.849Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/43/8cbcf7e2fc1c59340ecb68dc70e08c29e46dc018500f7d1c7c8aed1f3c10/sphinx_autodoc_typehints_gp-0.0.1a24.tar.gz", hash = "sha256:777f8646d963e455dfa22cc9c4bb7f2c3ae0f94705f918040375c8deeccf2fe6", size = 36360, upload-time = "2026-05-25T12:08:12.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/07/41249cdab1d9bd2dd5e9d85400dbae86ec2ce3512655bbd33947238f9fff/sphinx_autodoc_typehints_gp-0.0.1a26.tar.gz", hash = "sha256:08c8c048ec466d4a0a99ac2aebac87f5c2c08719aa039d7f25a6e921eef3ff5c", size = 36361, upload-time = "2026-05-25T12:52:55.361Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/68/58eabcd6f2258893b19572d9f8935f7d14d3e4861f51843070cbb717266d/sphinx_autodoc_typehints_gp-0.0.1a24-py3-none-any.whl", hash = "sha256:060afa3da6d15bd56622f062a90a3ba52cdc0ef92f807da9969146e312bc93c0", size = 38510, upload-time = "2026-05-25T12:07:50.27Z" }, + { url = "https://files.pythonhosted.org/packages/08/a7/b2fc8d3fa6c1cdb8235097ff9e7141415f6c663b97d6c0c79af0cdc0e2f1/sphinx_autodoc_typehints_gp-0.0.1a26-py3-none-any.whl", hash = "sha256:cd407876f561841ce49c9662e889c1ee2d8ae04b6fe27de75580956d33f49d11", size = 38509, upload-time = "2026-05-25T12:52:35.137Z" }, ] [[package]] @@ -1436,55 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a24" +version = "0.0.1a26" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/74/b26c87dbc691ed1184c178ba93569b4cbde1824f974826934e5af9b32baa/sphinx_fonts-0.0.1a26.tar.gz", hash = "sha256:dfaf065886f9ce11cbae8e0bea92e6d52e3cd247a944a3cba8927d0982c39760", size = 5788, upload-time = "2026-05-25T12:52:56.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/75/4c79a8913702fb0fa4a277ede26cfd08ae3b763e9408b23eba27cae3bb71/sphinx_fonts-0.0.1a26-py3-none-any.whl", hash = "sha256:0c74b0efe8953351cba60ec8a1448c42fc9bbe120ffaa898fcd085bb1fc60e5b", size = 4361, upload-time = "2026-05-25T12:52:36.304Z" }, +] + +[[package]] +name = "sphinx-gp-llms" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/e3/cd5eb59cfbaee93a3199397cb65eb0d6e0ecd355f74a1b30af195bed545c/sphinx_fonts-0.0.1a24.tar.gz", hash = "sha256:41379f19d71bac5ff63da298643a9e15a83515004583008715c8530a21bf1642", size = 5790, upload-time = "2026-05-25T12:08:13.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/94/678fa25ee7ca866fe3d438cdb246152e6cc3cddbf0a84963b16df2ebc349/sphinx_gp_llms-0.0.1a26.tar.gz", hash = "sha256:ba903955e6a961b35007a2ae033e4f55c8506e2096f1fedef4f3615a77ac7d85", size = 8662, upload-time = "2026-05-25T12:52:57.385Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/10/3e36ae9c052acfacbe951a457f9061542cc73d6689e40413d0d192b5ee40/sphinx_fonts-0.0.1a24-py3-none-any.whl", hash = "sha256:eea5756159144df573f55020c2c201fbb0e84a3dba1aba8e411c0a66da1d47a2", size = 4360, upload-time = "2026-05-25T12:07:51.665Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8f/a642ea5091ff5b89e179a079b920f1586fc326f9e52fce206a44b2716abd/sphinx_gp_llms-0.0.1a26-py3-none-any.whl", hash = "sha256:f4dc1c3ae2abf2d385dae2831ae86e72c2aafb228ed7f995a0d5079a2a77d208", size = 11220, upload-time = "2026-05-25T12:52:37.673Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/83/d4aacf6027eddc5822c5e33b12d47d767f69013623347c1e408e6f232b2a/sphinx_gp_opengraph-0.0.1a24.tar.gz", hash = "sha256:2180d0f51babe8a9826649611a0a6096b28b677a813879a0edd97baaa53e8c09", size = 11945, upload-time = "2026-05-25T12:08:15.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/90/ebc97f235b3b78ab703a88b31c7227b774855dbc50c896706ae752722c76/sphinx_gp_opengraph-0.0.1a26.tar.gz", hash = "sha256:96a499203a8025d0adf93adcf900bde655a124273bbdd9ed5548fd47c8a8bc58", size = 11947, upload-time = "2026-05-25T12:52:58.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/60/263ae291783e8be63e977a3d9a4a6ebe34d46a078b1d81dca0ea0a5d7224/sphinx_gp_opengraph-0.0.1a24-py3-none-any.whl", hash = "sha256:ed7f9964b2e0ba82cf023f6060d74225eba1c6282ea96969a255894ab89bc5c2", size = 12184, upload-time = "2026-05-25T12:07:53.969Z" }, + { url = "https://files.pythonhosted.org/packages/3a/e5/ba878204e833af7465453349825d94359b57ece858a1f653d5ea3ea24bc5/sphinx_gp_opengraph-0.0.1a26-py3-none-any.whl", hash = "sha256:91c6ae4a3c0079f4b817968c4517553d18edf58bd84a4cf9e10299a5d1bfed63", size = 12188, upload-time = "2026-05-25T12:52:38.969Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/ff/4bfc19e4cb41d109c353f3e07c76108f42228d470d559ba970673dfd4e45/sphinx_gp_sitemap-0.0.1a24.tar.gz", hash = "sha256:abedc7ea6310e5f807810122031fdc5f59e94afac4fc1ee9de7cba0ce798006e", size = 9956, upload-time = "2026-05-25T12:08:16.089Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/66/8d3f2f7e40a4b1b55f02ffb1514d0c71b4d049172bbc943f0bea66be6f58/sphinx_gp_sitemap-0.0.1a26.tar.gz", hash = "sha256:b65f84cd8eb067f197ad79b6d8d9b599643be455c2a4cadaea1a51f0184400e9", size = 9956, upload-time = "2026-05-25T12:52:59.53Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/65/b12bda3419534c3a986d24cbad88a1053f44a9d0cb1c3bf73dafaea17eed/sphinx_gp_sitemap-0.0.1a24-py3-none-any.whl", hash = "sha256:1153f89a949a8771f985ee055c4b84471e546f49ed8ce4a7165824360f84c666", size = 8983, upload-time = "2026-05-25T12:07:55.328Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bc/2533f856ba164c67c0cea62cb6097d948159e5bd710502c19cd010f1e81a/sphinx_gp_sitemap-0.0.1a26-py3-none-any.whl", hash = "sha256:64e2919ac82b5bd02fea05b5fd4e607607caf488276372c607cfac303b8f4696", size = 8984, upload-time = "2026-05-25T12:52:40.366Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/2d/487405ed87c4a71c1a1d962aede9bd232b624bd6ccbe2d877ebd14a72672/sphinx_gp_theme-0.0.1a24.tar.gz", hash = "sha256:c5f9d326207090478abbefd0f75513a2a36f261ce2908192e7f67dae4b0c4752", size = 18288, upload-time = "2026-05-25T12:08:17.215Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/b5/471ab8a12ef339e54bdb3fb9db24fb5241c018c1495ee572697dfbeaf730/sphinx_gp_theme-0.0.1a26.tar.gz", hash = "sha256:fed829524da2a6cc5ff0ec522b75cfe5a4a46f1ef976f5d6f0b4c3a42c4f7066", size = 18284, upload-time = "2026-05-25T12:53:00.401Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/f2/679783d1575d36e9c3a83a57a0f56b98aadc8b4aefd8a69b764760714750/sphinx_gp_theme-0.0.1a24-py3-none-any.whl", hash = "sha256:876dfa435c0ecdd611b08064864b099743c7040652eaa0a2aac169158149bb1e", size = 19882, upload-time = "2026-05-25T12:07:57.281Z" }, + { url = "https://files.pythonhosted.org/packages/ed/aa/ddb8fea16c9351da882d5dd42b4f5c36a73f1f3cee22a604530d60168662/sphinx_gp_theme-0.0.1a26-py3-none-any.whl", hash = "sha256:cd1bb61bb9dc89daa4057a5c5986bc34f910220389360e1fe785c02529911cf9", size = 19891, upload-time = "2026-05-25T12:52:41.727Z" }, ] [[package]] @@ -1502,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/22/54c5babfb687c827555b5293678c09f4a37be333a178e5f3c52ebe67f33e/sphinx_ux_autodoc_layout-0.0.1a24.tar.gz", hash = "sha256:56e6e8605f4b25909f904c22351f4a65c9af74935f6bbd40a6cbdf57838252bf", size = 29137, upload-time = "2026-05-25T12:08:18.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/2e/cd1655334695d82d946764b9946266fc8c1179598b716b6b14c0147eb2c8/sphinx_ux_autodoc_layout-0.0.1a26.tar.gz", hash = "sha256:cf59158277ad7e5d74f00e6e514181e81380e319d56685dc8b39c87e3d320c2d", size = 29139, upload-time = "2026-05-25T12:53:01.295Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/eb/c8e1f836687b4083e3bf75b991731c2de90d58508895b1ccadaa6d41419a/sphinx_ux_autodoc_layout-0.0.1a24-py3-none-any.whl", hash = "sha256:de2f19056dd8280ec6917df5a9fa0f4e94cdbf421babe06e832fceca626e15d9", size = 33106, upload-time = "2026-05-25T12:07:58.741Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/6eafc3a2d47e9212f0717020ba121b7d0254fb36beda92a7b5c6976c2a6a/sphinx_ux_autodoc_layout-0.0.1a26-py3-none-any.whl", hash = "sha256:e154c5fa374fa184ffd3e91f346612c4e90f156542b78cf08c5cd445e59f2b09", size = 33108, upload-time = "2026-05-25T12:52:43.652Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a24" +version = "0.0.1a26" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/73/ffd223c719e4b93d7db4cac795e8939738805733a25f660e3839df3bdbf6/sphinx_ux_badges-0.0.1a24.tar.gz", hash = "sha256:2d766dbd0550f7db1edb3ce0ffb4e69d926f1ae0795fe830647c9311ef783b62", size = 15569, upload-time = "2026-05-25T12:08:20.923Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/ac/e232a2cfb1e561bcb0e4ce426f7adae982ec2f7b99ced3ae703e92beb00a/sphinx_ux_badges-0.0.1a26.tar.gz", hash = "sha256:8dacab2ec0edf9fa9b026ae2ff619823efadc60ac5137cd3a6d54e4a2ca99d07", size = 15569, upload-time = "2026-05-25T12:53:02.22Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/f0/1fbb1674eeb59d996ff89b182227adcf53ec4bc0ccb92a62bdff54acdbb7/sphinx_ux_badges-0.0.1a24-py3-none-any.whl", hash = "sha256:cd86def8cd62f7c260122946896dc234a401a4a80447fae0d1446a6961f890a0", size = 16445, upload-time = "2026-05-25T12:08:00.659Z" }, + { url = "https://files.pythonhosted.org/packages/5c/87/4d9ea8af6b2bec991f0f6b692f38fa75fbc24e17ef3ee4df22ef1cfa08ef/sphinx_ux_badges-0.0.1a26-py3-none-any.whl", hash = "sha256:d40a2829733b7bdf908975ad2b12e3be52b6b47f2df465fac9835da6dd255b81", size = 16447, upload-time = "2026-05-25T12:52:45.138Z" }, ] [[package]] @@ -1685,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a24" }, + { name = "gp-sphinx", specifier = "==0.0.1a26" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1695,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a24" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a24" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a26" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a26" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1704,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a24" }, + { name = "gp-sphinx", specifier = "==0.0.1a26" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a24" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a24" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a26" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a26" }, ] lint = [ { name = "mypy" }, From 3464e06be60423cdd19f4d2c7cf878c8b14fff27 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 May 2026 04:54:06 -0500 Subject: [PATCH 2878/2998] .tool-versions(uv, just) uv 0.11.16 -> 0.11.17, just 1.50 -> 1.51 - just - https://github.com/casey/just/blob/1.51.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.51.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.17 - https://github.com/astral-sh/uv/blob/0.11.17/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index 771216983e..854ad70b88 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.50 -uv 0.11.16 +just 1.51 +uv 0.11.17 python 3.14 3.13 3.12 3.11 3.10 From 7974d58bfad9455377c4e2943d4616301af299a5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 30 May 2026 04:54:51 -0500 Subject: [PATCH 2879/2998] py(deps[dev]) Bump dev packages --- uv.lock | 304 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/uv.lock b/uv.lock index 5c3801952c..c4fbff971c 100644 --- a/uv.lock +++ b/uv.lock @@ -253,14 +253,14 @@ wheels = [ [[package]] name = "click" -version = "8.4.0" +version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, ] [[package]] @@ -287,115 +287,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, - { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, - { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, - { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, - { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, - { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, - { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, - { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, - { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, - { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, - { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, - { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, - { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, - { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, - { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, - { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, - { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, - { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, - { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, - { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, - { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, - { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, - { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, - { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, - { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, - { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, - { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, - { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, - { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, - { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, - { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, - { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, - { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, - { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, - { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, - { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, - { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, - { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, - { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, - { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, - { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, - { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, - { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, - { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, - { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, - { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, - { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, - { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, - { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, - { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, - { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, - { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, - { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, - { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, - { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, - { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, - { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, - { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, - { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, - { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, - { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, - { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, - { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, - { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, - { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, - { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, - { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, - { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, - { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, - { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, + { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, + { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, + { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, + { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, + { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, ] [package.optional-dependencies] @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -495,11 +495,11 @@ wheels = [ [[package]] name = "idna" -version = "3.15" +version = "3.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, ] [[package]] @@ -1065,15 +1065,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.2" +version = "16.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/27/fd0209642f3a1069da3e0be3c7e339f942d052d81ccb1fb4eb9b187d3633/pytest_rerunfailures-16.2.tar.gz", hash = "sha256:5f5a32f15674a3d54f7598388fcd3cc1bc5c37284731a4704a44485dcdda5e23", size = 32121, upload-time = "2026-05-13T08:13:26.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f0/74f8e685be7ecd1572c1256132f18fce3a665d7e07649a3f23b7eb2d3bec/pytest_rerunfailures-16.3.tar.gz", hash = "sha256:37c9b1231c8083e9f4e724f50f7a21241822f9516c15c700ebbf218d6452355c", size = 34148, upload-time = "2026-05-22T06:51:22.292Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/a5/d8c1ad74529b483044b787ead2d24ecc624bca4084a509002102e4bab8cc/pytest_rerunfailures-16.2-py3-none-any.whl", hash = "sha256:c22a53d2827becc76f057d4ded123c0e726523f2f0e5f0bb4efb31fd59e1f14e", size = 14505, upload-time = "2026-05-13T08:13:25.485Z" }, + { url = "https://files.pythonhosted.org/packages/f8/98/58a71d68d3126d7f6a6ed1944c37ec207a4ff3dc66cad3bed7b59d38df61/pytest_rerunfailures-16.3-py3-none-any.whl", hash = "sha256:6bdfb8ffb46c46072e6c16bdedee38b6c13eac620d9415ed5b63152cbf283170", size = 15396, upload-time = "2026-05-22T06:51:20.547Z" }, ] [[package]] @@ -1191,45 +1191,45 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, - { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, - { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, - { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, - { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, - { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, - { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, - { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, - { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, - { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, - { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, - { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, +version = "0.15.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, ] [[package]] name = "snowballstemmer" -version = "3.0.1" +version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/ee/67eef9600338e245ad7838230969a34c823ddbdbccc5e1fc43cd75b55bc9/snowballstemmer-3.1.0.tar.gz", hash = "sha256:fd9e34526b23340cd23ffea6c9f9760974ecc2c2ac9e1d81401443ccdb2a801f", size = 122523, upload-time = "2026-05-24T19:04:19.691Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/83/ddbf4533c62dd32667ef1238952abef155f3d3391f5be69a352ad1638a42/snowballstemmer-3.1.0-py3-none-any.whl", hash = "sha256:17e6d1da216aa07db6dad37139ea70cf13c4b2e9a096f6e64a9648fc657d3154", size = 104550, upload-time = "2026-05-24T19:04:18.026Z" }, ] [[package]] name = "soupsieve" -version = "2.8.3" +version = "2.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, ] [[package]] @@ -1610,15 +1610,15 @@ wheels = [ [[package]] name = "starlette" -version = "1.0.0" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/69/17425771797c36cded50b7fe44e850315d039f28b15901ab44839e70b593/starlette-1.0.0.tar.gz", hash = "sha256:6a4beaf1f81bb472fd19ea9b918b50dc3a77a6f2e190a12954b25e6ed5eea149", size = 2655289, upload-time = "2026-03-22T18:29:46.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/66/4d20cdf39a8d6a51e663b7038e3b828ff211d3891a43a713fe7e4643f3a8/starlette-1.1.0.tar.gz", hash = "sha256:e83c7fe0ddecd8719c5b840080325aec0260acec86e9832899e377b91d65e90f", size = 2660060, upload-time = "2026-05-23T16:55:41.376Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, + { url = "https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl", hash = "sha256:7f0dfd38e428aad5cb6f9f667f0ca1d2d8ca3f3385dccac8305f79ec98458382", size = 72899, upload-time = "2026-05-23T16:55:39.201Z" }, ] [[package]] @@ -1853,16 +1853,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.47.0" +version = "0.48.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/b1/8e7077a8641086aea449e1b5752a570f1b5906c64e0a33cd6d93b63a066b/uvicorn-0.47.0.tar.gz", hash = "sha256:7c9a0ea1a9414106bbab7324609c162d8fa0cdcdcb703060987269d77c7bb533", size = 90582, upload-time = "2026-05-14T18:16:54.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/f6544ba992ddb9a6077343a576f9844f7f8f06ab819aefd00206e9255f18/uvicorn-0.48.0.tar.gz", hash = "sha256:a5504207195d08c2511bf9125ede5ac4a4b71725d519e758d01dcf0bc2d31c37", size = 91074, upload-time = "2026-05-24T12:08:41.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/41/ac2dfdbc1f60c7af4f994c7a335cfa7040c01642b605d65f611cecc2a1e4/uvicorn-0.47.0-py3-none-any.whl", hash = "sha256:2c5715bc12d1892d84752049f400cd1c3cb018514967fdfeb97640443a6a9432", size = 71301, upload-time = "2026-05-14T18:16:51.762Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl", hash = "sha256:48097851328b87ec36117d3d575234519eb58c2b22d79666e9bbc6c49a761dad", size = 71410, upload-time = "2026-05-24T12:08:40.258Z" }, ] [[package]] From 078325f911b0b4556443667c304fb49b407adbbf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 6 Jun 2026 04:46:29 -0500 Subject: [PATCH 2880/2998] .tool-versions(uv,python) uv 0.11.17 -> 0.11.19 See also: - https://github.com/astral-sh/uv/releases/tag/0.11.19 - https://github.com/astral-sh/uv/releases/tag/0.11.18 - https://github.com/astral-sh/uv/releases/tag/0.11.17 - https://github.com/astral-sh/uv/blob/0.11.19/CHANGELOG.md --- .tool-versions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.tool-versions b/.tool-versions index 854ad70b88..5569494be3 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ just 1.51 -uv 0.11.17 +uv 0.11.19 python 3.14 3.13 3.12 3.11 3.10 From 6edda376e8699bbec28b68d48ed4a4732d85d478 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 6 Jun 2026 04:49:53 -0500 Subject: [PATCH 2881/2998] py(deps[dev]) Bump dev packages --- uv.lock | 60 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/uv.lock b/uv.lock index c4fbff971c..e0dd5ebcbe 100644 --- a/uv.lock +++ b/uv.lock @@ -495,11 +495,11 @@ wheels = [ [[package]] name = "idna" -version = "3.16" +version = "3.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] @@ -1191,36 +1191,36 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, - { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, - { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, - { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, - { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, - { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, - { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, +version = "0.15.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, + { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, + { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, + { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, ] [[package]] name = "snowballstemmer" -version = "3.1.0" +version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/ee/67eef9600338e245ad7838230969a34c823ddbdbccc5e1fc43cd75b55bc9/snowballstemmer-3.1.0.tar.gz", hash = "sha256:fd9e34526b23340cd23ffea6c9f9760974ecc2c2ac9e1d81401443ccdb2a801f", size = 122523, upload-time = "2026-05-24T19:04:19.691Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/83/ddbf4533c62dd32667ef1238952abef155f3d3391f5be69a352ad1638a42/snowballstemmer-3.1.0-py3-none-any.whl", hash = "sha256:17e6d1da216aa07db6dad37139ea70cf13c4b2e9a096f6e64a9648fc657d3154", size = 104550, upload-time = "2026-05-24T19:04:18.026Z" }, + { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, ] [[package]] @@ -1610,15 +1610,15 @@ wheels = [ [[package]] name = "starlette" -version = "1.1.0" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/66/4d20cdf39a8d6a51e663b7038e3b828ff211d3891a43a713fe7e4643f3a8/starlette-1.1.0.tar.gz", hash = "sha256:e83c7fe0ddecd8719c5b840080325aec0260acec86e9832899e377b91d65e90f", size = 2660060, upload-time = "2026-05-23T16:55:41.376Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/79/920b8e0a8b20f793e8d64855095cb8febabf6175b8550b6f7a547d813891/starlette-1.1.0-py3-none-any.whl", hash = "sha256:7f0dfd38e428aad5cb6f9f667f0ca1d2d8ca3f3385dccac8305f79ec98458382", size = 72899, upload-time = "2026-05-23T16:55:39.201Z" }, + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, ] [[package]] From 367f82ecd2d928cb1cec487df14593900596df5e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 6 Jun 2026 19:14:43 -0500 Subject: [PATCH 2882/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a26?= =?UTF-8?q?=20=E2=86=92=200.0.1a27?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a27 fixes duplicate HTML IDs when a page heading slug matches a fastmcp tool's bare cross-reference alias — tool cards keep a single canonical fastmcp-tool- anchor and tool links land on the card instead of the page heading. what: - Bump gp-sphinx and sibling workspace pins 0.0.1a26 → 0.0.1a27 - Regenerate uv.lock --- pyproject.toml | 12 +++---- uv.lock | 86 +++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 317c2c85af..1afb90470e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a26", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a26", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a26", + "gp-sphinx==0.0.1a27", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a27", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a27", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a26", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a26", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a26", + "gp-sphinx==0.0.1a27", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a27", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a27", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index e0dd5ebcbe..e6050e9bd4 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -426,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/1a/cb8ca8e0109f0ccaf69b4f60de1dd776feaef6294713bc40b0f12a31655e/gp_furo_theme-0.0.1a26.tar.gz", hash = "sha256:d9c2ac058af8ac550d63fd21265c8f73210206d0da99921df256252a1112e747", size = 34171, upload-time = "2026-05-25T12:52:47.757Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/72/01129a78f46af396676df9c4e537571a3b7d33a3059607923d404fe7aa0b/gp_furo_theme-0.0.1a27.tar.gz", hash = "sha256:e5136f3d111c78e09d518bb52b2b92a042e47b8f48e22dee2796411d170e88e3", size = 34170, upload-time = "2026-06-07T00:09:23.041Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/c0/05e0d78211abc1036a1a5edf4da5d95a9a9a656954f5cb2ad749f291b7bb/gp_furo_theme-0.0.1a26-py3-none-any.whl", hash = "sha256:0f40eb0c2a9f83ded4488b99a7bb99ec7f484994f0158e6ae16572f0f4f38324", size = 43580, upload-time = "2026-05-25T12:52:24.215Z" }, + { url = "https://files.pythonhosted.org/packages/a3/68/2b7c405e534b41d3b91066e05f418dfd36e3a0c651454cd64a81908857d7/gp_furo_theme-0.0.1a27-py3-none-any.whl", hash = "sha256:c68d976d5203e89be869cc9320a6c057209fd480bc59ff158ce9322029c4e138", size = 43580, upload-time = "2026-06-07T00:08:59.692Z" }, ] [[package]] @@ -457,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -479,9 +479,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/d1/c95c68443d64ced8b7f00202ad712bf4ba0a05380b52a0af99eea51f6fc2/gp_sphinx-0.0.1a26.tar.gz", hash = "sha256:a9fc84ab677848f449519cb80ad91aff12eb2fb2ed817b25f2b9cf15432dad66", size = 19549, upload-time = "2026-05-25T12:52:48.729Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/56/cd1088763a7ba8b053a675ea165354caed942e43f2f9a65b9262337a6172/gp_sphinx-0.0.1a27.tar.gz", hash = "sha256:7c949e9074cb7624007b0826faa34f1edbfbbbd821a40f38244acd8dd24bc153", size = 19550, upload-time = "2026-06-07T00:09:24.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/65/80f93c3202eeff6332e19b1758e39e2cdc02986d7f9a78643cca0f6702af/gp_sphinx-0.0.1a26-py3-none-any.whl", hash = "sha256:f32243ca8638093727f9d9c27eeb1768b49a18227b3ba5168ab28cdd8c853fe0", size = 20044, upload-time = "2026-05-25T12:52:25.811Z" }, + { url = "https://files.pythonhosted.org/packages/70/1b/a8d7b5565138cc729b0436faf43e557a930cc0e397e2baf0d8e42db15b93/gp_sphinx-0.0.1a27-py3-none-any.whl", hash = "sha256:e3b6b1d7c9587e6f9bd978ff3e4a3449e8ed6183e0af53dddc696c768168068b", size = 20044, upload-time = "2026-06-07T00:09:01.174Z" }, ] [[package]] @@ -1338,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1346,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/ad/7a74189e33610a310cb08e968d390c94ee9168b84366af98c007ba4055ae/sphinx_autodoc_api_style-0.0.1a26.tar.gz", hash = "sha256:aeebb7961cd569c7ea9c51fe8854659ada446af2625d35923f70f874f142bebe", size = 8977, upload-time = "2026-05-25T12:52:49.676Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/5b850f7786c435242c054001805578f93c9ba0f16e706327b4d23b3ed3eb/sphinx_autodoc_api_style-0.0.1a27.tar.gz", hash = "sha256:79882be6b0a1a89b8ae39b16d07c81a6d8ace07e443935fe35d1f6412b0e0f80", size = 8976, upload-time = "2026-06-07T00:09:25.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/c5/d924b1e343cc7d8e6cdba766fd6d7942b62eab4b24f765de232561c946dd/sphinx_autodoc_api_style-0.0.1a26-py3-none-any.whl", hash = "sha256:69158e9518c6230de989f2a12177c550536c55067f6d1942f2b39b04acbc07bd", size = 9065, upload-time = "2026-05-25T12:52:27.386Z" }, + { url = "https://files.pythonhosted.org/packages/89/a5/b2eb3b26d04fbe9da616ab925de7f762f88cf831e4996fea48e4a98a3848/sphinx_autodoc_api_style-0.0.1a27-py3-none-any.whl", hash = "sha256:cf1052e2c2a60f29be06d80a60586995282e37c444bc01192f18d817fd7ece4a", size = 9064, upload-time = "2026-06-07T00:09:02.649Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1361,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/93/fb05be121852b01a186e41dcf84dd056b0ef3f2d2ebb0764bab3a2db70aa/sphinx_autodoc_argparse-0.0.1a26.tar.gz", hash = "sha256:336df04f4ec9f2551994af7d117af44c25a9f59c546a07df64f9c62c84b93737", size = 42459, upload-time = "2026-05-25T12:52:50.53Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/b0/be0aa664550426fd058c77a0e573d41470b9b34f706256aab4a305846399/sphinx_autodoc_argparse-0.0.1a27.tar.gz", hash = "sha256:05cf2650c9b0f60cbacea5eddcccbcd18f975f1974f05270fe5b0f3a8439b9c8", size = 42456, upload-time = "2026-06-07T00:09:26.316Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/25/6aa07bf9e493951e187dc4b75012d1bd0b3072d9f63e8c751ec6cefd2057/sphinx_autodoc_argparse-0.0.1a26-py3-none-any.whl", hash = "sha256:92052e37e61c02f64f44b49199b44d259a65616e5e0916343517134bbc8470a7", size = 47276, upload-time = "2026-05-25T12:52:28.849Z" }, + { url = "https://files.pythonhosted.org/packages/b0/80/ed1498cba2319ff26821f527a599df4f25d1dfd81665f224b2901b3e71cb/sphinx_autodoc_argparse-0.0.1a27-py3-none-any.whl", hash = "sha256:722765bcc677c8421a84b0949698189b09de055def89e3471bfd8cc82354159a", size = 47275, upload-time = "2026-06-07T00:09:03.947Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/07/41249cdab1d9bd2dd5e9d85400dbae86ec2ce3512655bbd33947238f9fff/sphinx_autodoc_typehints_gp-0.0.1a26.tar.gz", hash = "sha256:08c8c048ec466d4a0a99ac2aebac87f5c2c08719aa039d7f25a6e921eef3ff5c", size = 36361, upload-time = "2026-05-25T12:52:55.361Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/c4/a3ba085c36b0594a0a1412f17e5b3eda61516dbda5b962e7ebda764e4329/sphinx_autodoc_typehints_gp-0.0.1a27.tar.gz", hash = "sha256:d29d1f5e4ee1abcc01b859a6178b971b089cdf9756732889c10b30678e0725a3", size = 36363, upload-time = "2026-06-07T00:09:31.397Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/a7/b2fc8d3fa6c1cdb8235097ff9e7141415f6c663b97d6c0c79af0cdc0e2f1/sphinx_autodoc_typehints_gp-0.0.1a26-py3-none-any.whl", hash = "sha256:cd407876f561841ce49c9662e889c1ee2d8ae04b6fe27de75580956d33f49d11", size = 38509, upload-time = "2026-05-25T12:52:35.137Z" }, + { url = "https://files.pythonhosted.org/packages/12/00/6007fe05a4fb2cb56247527bc1cffccdf68e7f5c208028c365ec7549a6be/sphinx_autodoc_typehints_gp-0.0.1a27-py3-none-any.whl", hash = "sha256:8ceabba6eaa516ea8969ae27de1fb1378a9458426d3d7716b7fcac34ce25ec42", size = 38510, upload-time = "2026-06-07T00:09:11.379Z" }, ] [[package]] @@ -1438,68 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/74/b26c87dbc691ed1184c178ba93569b4cbde1824f974826934e5af9b32baa/sphinx_fonts-0.0.1a26.tar.gz", hash = "sha256:dfaf065886f9ce11cbae8e0bea92e6d52e3cd247a944a3cba8927d0982c39760", size = 5788, upload-time = "2026-05-25T12:52:56.541Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/a8/ccdc0777b231f03cc09b28780526b76016734cdb90ff7b32adafd7e9f138/sphinx_fonts-0.0.1a27.tar.gz", hash = "sha256:6b2184f086ef9f1c9efc747089276c88a6bb10f07b339af34ca10981aaea9816", size = 5789, upload-time = "2026-06-07T00:09:32.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/75/4c79a8913702fb0fa4a277ede26cfd08ae3b763e9408b23eba27cae3bb71/sphinx_fonts-0.0.1a26-py3-none-any.whl", hash = "sha256:0c74b0efe8953351cba60ec8a1448c42fc9bbe120ffaa898fcd085bb1fc60e5b", size = 4361, upload-time = "2026-05-25T12:52:36.304Z" }, + { url = "https://files.pythonhosted.org/packages/4b/db/56bb69574b751926e11f07cd5ef0f5944e47d1c1fa327d8029c3d49e60bd/sphinx_fonts-0.0.1a27-py3-none-any.whl", hash = "sha256:42bf98788c1fac382df762850d1c684061b3df59f67fa13bc67ffea06ba2079e", size = 4360, upload-time = "2026-06-07T00:09:12.852Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/94/678fa25ee7ca866fe3d438cdb246152e6cc3cddbf0a84963b16df2ebc349/sphinx_gp_llms-0.0.1a26.tar.gz", hash = "sha256:ba903955e6a961b35007a2ae033e4f55c8506e2096f1fedef4f3615a77ac7d85", size = 8662, upload-time = "2026-05-25T12:52:57.385Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/26/ec1e4ac480d3d295a88765b8c9ea2a797a145529d5b5eedaa311c2414fdc/sphinx_gp_llms-0.0.1a27.tar.gz", hash = "sha256:bf5f6ac1d5209b6e40091ff566243f5cda41707c5b9f8012fd28c209ba18d613", size = 9911, upload-time = "2026-06-07T00:09:33.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/8f/a642ea5091ff5b89e179a079b920f1586fc326f9e52fce206a44b2716abd/sphinx_gp_llms-0.0.1a26-py3-none-any.whl", hash = "sha256:f4dc1c3ae2abf2d385dae2831ae86e72c2aafb228ed7f995a0d5079a2a77d208", size = 11220, upload-time = "2026-05-25T12:52:37.673Z" }, + { url = "https://files.pythonhosted.org/packages/1a/53/525a7ccd3c758ae0ec26f22d78efba7a75b21a4976073d279e3473d0727c/sphinx_gp_llms-0.0.1a27-py3-none-any.whl", hash = "sha256:03859ec4227b087247e9f660c81092efa7c64d283df1fc5186630f7fe845a62c", size = 12639, upload-time = "2026-06-07T00:09:14.099Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/90/ebc97f235b3b78ab703a88b31c7227b774855dbc50c896706ae752722c76/sphinx_gp_opengraph-0.0.1a26.tar.gz", hash = "sha256:96a499203a8025d0adf93adcf900bde655a124273bbdd9ed5548fd47c8a8bc58", size = 11947, upload-time = "2026-05-25T12:52:58.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/69/8602d58de605d73b854750c85ee040ce310c81508003578d98161ac5f6e4/sphinx_gp_opengraph-0.0.1a27.tar.gz", hash = "sha256:56505e6983e1bf7a7f56097ea45ee6cca156d5b7d236cbd1a4eeb55efa169c07", size = 11945, upload-time = "2026-06-07T00:09:34.148Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/e5/ba878204e833af7465453349825d94359b57ece858a1f653d5ea3ea24bc5/sphinx_gp_opengraph-0.0.1a26-py3-none-any.whl", hash = "sha256:91c6ae4a3c0079f4b817968c4517553d18edf58bd84a4cf9e10299a5d1bfed63", size = 12188, upload-time = "2026-05-25T12:52:38.969Z" }, + { url = "https://files.pythonhosted.org/packages/50/61/0ac0859b248b49d7f98dd87e4206b481e544fdfe28285795822eccfa04f4/sphinx_gp_opengraph-0.0.1a27-py3-none-any.whl", hash = "sha256:9e08c1ab3d2197e967d737d869a6693aad393b8dd8494d2156c27d96e61e555b", size = 12186, upload-time = "2026-06-07T00:09:15.357Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/90/66/8d3f2f7e40a4b1b55f02ffb1514d0c71b4d049172bbc943f0bea66be6f58/sphinx_gp_sitemap-0.0.1a26.tar.gz", hash = "sha256:b65f84cd8eb067f197ad79b6d8d9b599643be455c2a4cadaea1a51f0184400e9", size = 9956, upload-time = "2026-05-25T12:52:59.53Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/39/ce5c55b0274a2420d8a8f0e226bd15b25df2a8f0c09950f3b791b2580c2a/sphinx_gp_sitemap-0.0.1a27.tar.gz", hash = "sha256:fe6d4d2b2e73af169f39970468cf13ea524c4db193f91daa968dd4d26129a458", size = 9957, upload-time = "2026-06-07T00:09:34.974Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/bc/2533f856ba164c67c0cea62cb6097d948159e5bd710502c19cd010f1e81a/sphinx_gp_sitemap-0.0.1a26-py3-none-any.whl", hash = "sha256:64e2919ac82b5bd02fea05b5fd4e607607caf488276372c607cfac303b8f4696", size = 8984, upload-time = "2026-05-25T12:52:40.366Z" }, + { url = "https://files.pythonhosted.org/packages/48/7e/9802e1b99aaa58c669ef8594a192a797b71ffd56f135098a50586077bcf5/sphinx_gp_sitemap-0.0.1a27-py3-none-any.whl", hash = "sha256:f861b1fca72057beddd4da3f83481d7a1655948113f56ee9042ca212dd7c46d4", size = 8985, upload-time = "2026-06-07T00:09:16.74Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/b5/471ab8a12ef339e54bdb3fb9db24fb5241c018c1495ee572697dfbeaf730/sphinx_gp_theme-0.0.1a26.tar.gz", hash = "sha256:fed829524da2a6cc5ff0ec522b75cfe5a4a46f1ef976f5d6f0b4c3a42c4f7066", size = 18284, upload-time = "2026-05-25T12:53:00.401Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/0a/e63a1a287d7154768bbf2f774247425bbc6ccf8af4420372f835c7458f41/sphinx_gp_theme-0.0.1a27.tar.gz", hash = "sha256:50f328b303b0201b3a72aed64831be195ae9fe26bdb0f63b8892c1b4ec778747", size = 18286, upload-time = "2026-06-07T00:09:35.831Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/aa/ddb8fea16c9351da882d5dd42b4f5c36a73f1f3cee22a604530d60168662/sphinx_gp_theme-0.0.1a26-py3-none-any.whl", hash = "sha256:cd1bb61bb9dc89daa4057a5c5986bc34f910220389360e1fe785c02529911cf9", size = 19891, upload-time = "2026-05-25T12:52:41.727Z" }, + { url = "https://files.pythonhosted.org/packages/14/13/34dcd08d414f699a2dc4fd8fe8c9070c8c5dca107abd2bb5fc8716337c36/sphinx_gp_theme-0.0.1a27-py3-none-any.whl", hash = "sha256:baf658ae4796c5284251c31a4f11cbd59af921180b80946006ff2bc475c3573f", size = 19887, upload-time = "2026-06-07T00:09:17.919Z" }, ] [[package]] @@ -1517,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/2e/cd1655334695d82d946764b9946266fc8c1179598b716b6b14c0147eb2c8/sphinx_ux_autodoc_layout-0.0.1a26.tar.gz", hash = "sha256:cf59158277ad7e5d74f00e6e514181e81380e319d56685dc8b39c87e3d320c2d", size = 29139, upload-time = "2026-05-25T12:53:01.295Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/2a/ebfa632b40ec7a6d3e5cba086fb038bdcbdba9a0a30ccc526168e7a33cea/sphinx_ux_autodoc_layout-0.0.1a27.tar.gz", hash = "sha256:a8bee23047fbec33d80549544121373663c98b20fc98aa38e95c06c0890eab82", size = 29134, upload-time = "2026-06-07T00:09:36.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/e6/6eafc3a2d47e9212f0717020ba121b7d0254fb36beda92a7b5c6976c2a6a/sphinx_ux_autodoc_layout-0.0.1a26-py3-none-any.whl", hash = "sha256:e154c5fa374fa184ffd3e91f346612c4e90f156542b78cf08c5cd445e59f2b09", size = 33108, upload-time = "2026-05-25T12:52:43.652Z" }, + { url = "https://files.pythonhosted.org/packages/74/b2/2490dd7d5fc265dd7a159661e7f631c95889a2df8f29be93c0a84468e033/sphinx_ux_autodoc_layout-0.0.1a27-py3-none-any.whl", hash = "sha256:a3eb75aec79b9fca80aa60af707654651727a1538515acf057d4359293f0b907", size = 33108, upload-time = "2026-06-07T00:09:19.147Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a26" +version = "0.0.1a27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/ac/e232a2cfb1e561bcb0e4ce426f7adae982ec2f7b99ced3ae703e92beb00a/sphinx_ux_badges-0.0.1a26.tar.gz", hash = "sha256:8dacab2ec0edf9fa9b026ae2ff619823efadc60ac5137cd3a6d54e4a2ca99d07", size = 15569, upload-time = "2026-05-25T12:53:02.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/04/3865e01b9dc1625e195c2f332a85e48e0b407f4224bc571c20bb4a828113/sphinx_ux_badges-0.0.1a27.tar.gz", hash = "sha256:6371a5ade85d8c56549f69734536e97ac4a27f34bfaba4e363d3950c6e61a812", size = 15570, upload-time = "2026-06-07T00:09:37.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/87/4d9ea8af6b2bec991f0f6b692f38fa75fbc24e17ef3ee4df22ef1cfa08ef/sphinx_ux_badges-0.0.1a26-py3-none-any.whl", hash = "sha256:d40a2829733b7bdf908975ad2b12e3be52b6b47f2df465fac9835da6dd255b81", size = 16447, upload-time = "2026-05-25T12:52:45.138Z" }, + { url = "https://files.pythonhosted.org/packages/43/32/9f07f8200148f153277523517a0d4d7993c106d01008761fd774886cb73f/sphinx_ux_badges-0.0.1a27-py3-none-any.whl", hash = "sha256:42681b274c5ab2e4524fa1e42372861a4a9668e347bfc6745f2f91904b8b5a24", size = 16448, upload-time = "2026-06-07T00:09:20.444Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a26" }, + { name = "gp-sphinx", specifier = "==0.0.1a27" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1710,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a26" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a26" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a27" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a27" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1719,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a26" }, + { name = "gp-sphinx", specifier = "==0.0.1a27" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a26" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a26" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a27" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a27" }, ] lint = [ { name = "mypy" }, From d9def70ead490fefdfe22b9ec27483faad6ca81b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 6 Jun 2026 20:15:55 -0500 Subject: [PATCH 2883/2998] py(deps[dev]) Bump dev packages --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index e6050e9bd4..fdbae12ea8 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1853,16 +1853,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.48.0" +version = "0.49.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/f6544ba992ddb9a6077343a576f9844f7f8f06ab819aefd00206e9255f18/uvicorn-0.48.0.tar.gz", hash = "sha256:a5504207195d08c2511bf9125ede5ac4a4b71725d519e758d01dcf0bc2d31c37", size = 91074, upload-time = "2026-05-24T12:08:41.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", size = 91284, upload-time = "2026-06-03T22:01:30.448Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl", hash = "sha256:48097851328b87ec36117d3d575234519eb58c2b22d79666e9bbc6c49a761dad", size = 71410, upload-time = "2026-05-24T12:08:40.258Z" }, + { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" }, ] [[package]] From 700a9b92b69f7abf203d57663ecd497772b5bad6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 7 Jun 2026 06:25:27 -0500 Subject: [PATCH 2884/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a27?= =?UTF-8?q?=20=E2=86=92=200.0.1a28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: gp-sphinx 0.0.1a28 rebuilds the bundled theme on the current JS toolchain majors (Zod 4, Vitest 4, TypeScript 6, Tailwind CSS 4.3, Vite 8) and documents the theme's Baseline Widely Available browser floor. what: - Bump gp-sphinx and sibling workspace pins ==0.0.1a27 → ==0.0.1a28 - Refresh uv.lock --- pyproject.toml | 12 +++---- uv.lock | 86 +++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1afb90470e..e4da21826f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a27", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a27", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a27", + "gp-sphinx==0.0.1a28", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a28", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a28", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a27", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a27", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a27", + "gp-sphinx==0.0.1a28", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a28", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a28", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index fdbae12ea8..67af24ea91 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -426,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/72/01129a78f46af396676df9c4e537571a3b7d33a3059607923d404fe7aa0b/gp_furo_theme-0.0.1a27.tar.gz", hash = "sha256:e5136f3d111c78e09d518bb52b2b92a042e47b8f48e22dee2796411d170e88e3", size = 34170, upload-time = "2026-06-07T00:09:23.041Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/ba/5c47c8b801783b71bb6bd2796a9309a354d99533a991a93a104c8ee5f190/gp_furo_theme-0.0.1a28.tar.gz", hash = "sha256:ef145ed1495e0c956d639a1a322774fbe7b9b7d1d1b710960157c1ba2cbad9fe", size = 34310, upload-time = "2026-06-07T11:17:32.753Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/68/2b7c405e534b41d3b91066e05f418dfd36e3a0c651454cd64a81908857d7/gp_furo_theme-0.0.1a27-py3-none-any.whl", hash = "sha256:c68d976d5203e89be869cc9320a6c057209fd480bc59ff158ce9322029c4e138", size = 43580, upload-time = "2026-06-07T00:08:59.692Z" }, + { url = "https://files.pythonhosted.org/packages/75/02/5980a70b5256bb0b2f7a8a57876899396235cd39587536b92e0dc9a85b7a/gp_furo_theme-0.0.1a28-py3-none-any.whl", hash = "sha256:eb3e0823e74deffcc1c55b4b0ccc915f017da61ef23ed4adb4c92d0d0841cab2", size = 43660, upload-time = "2026-06-07T11:17:12.857Z" }, ] [[package]] @@ -457,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -479,9 +479,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/56/cd1088763a7ba8b053a675ea165354caed942e43f2f9a65b9262337a6172/gp_sphinx-0.0.1a27.tar.gz", hash = "sha256:7c949e9074cb7624007b0826faa34f1edbfbbbd821a40f38244acd8dd24bc153", size = 19550, upload-time = "2026-06-07T00:09:24.01Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/97/674f999ddb064f88448c5d9123c2cfe1f25d173e07d3a8cceacf63796c40/gp_sphinx-0.0.1a28.tar.gz", hash = "sha256:8001666733ba6dad9f1a17fd78912e05afed856d45a9a64b5ba3b7f7b4bab864", size = 19550, upload-time = "2026-06-07T11:17:33.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/1b/a8d7b5565138cc729b0436faf43e557a930cc0e397e2baf0d8e42db15b93/gp_sphinx-0.0.1a27-py3-none-any.whl", hash = "sha256:e3b6b1d7c9587e6f9bd978ff3e4a3449e8ed6183e0af53dddc696c768168068b", size = 20044, upload-time = "2026-06-07T00:09:01.174Z" }, + { url = "https://files.pythonhosted.org/packages/61/58/3a97cc4b441b45f3d96801415a1eae8256e1ad1e0f902ca757ac60132d1c/gp_sphinx-0.0.1a28-py3-none-any.whl", hash = "sha256:13d38e6496b368d14568259b7e512f28f26e8c080b0cfd1520c1f13f0bb3d2ab", size = 20045, upload-time = "2026-06-07T11:17:14.229Z" }, ] [[package]] @@ -1338,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1346,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/5b850f7786c435242c054001805578f93c9ba0f16e706327b4d23b3ed3eb/sphinx_autodoc_api_style-0.0.1a27.tar.gz", hash = "sha256:79882be6b0a1a89b8ae39b16d07c81a6d8ace07e443935fe35d1f6412b0e0f80", size = 8976, upload-time = "2026-06-07T00:09:25.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/37/1166534666ac161b79926fa1c66b57176682621ea82dcd79bb0da7255afa/sphinx_autodoc_api_style-0.0.1a28.tar.gz", hash = "sha256:224b87153cdb739cf1ce0a61528579e0f71f65362313219f1750548d1b94ac81", size = 8978, upload-time = "2026-06-07T11:17:34.678Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/a5/b2eb3b26d04fbe9da616ab925de7f762f88cf831e4996fea48e4a98a3848/sphinx_autodoc_api_style-0.0.1a27-py3-none-any.whl", hash = "sha256:cf1052e2c2a60f29be06d80a60586995282e37c444bc01192f18d817fd7ece4a", size = 9064, upload-time = "2026-06-07T00:09:02.649Z" }, + { url = "https://files.pythonhosted.org/packages/46/f9/1bce678a957281c448c1169d61f6233010881d7f864b0a40558d9033b2e9/sphinx_autodoc_api_style-0.0.1a28-py3-none-any.whl", hash = "sha256:ccf624aefd97e9bb0b5d44b441c69611a032152044cbda5253ddae20cbf8b16b", size = 9064, upload-time = "2026-06-07T11:17:15.547Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1361,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/b0/be0aa664550426fd058c77a0e573d41470b9b34f706256aab4a305846399/sphinx_autodoc_argparse-0.0.1a27.tar.gz", hash = "sha256:05cf2650c9b0f60cbacea5eddcccbcd18f975f1974f05270fe5b0f3a8439b9c8", size = 42456, upload-time = "2026-06-07T00:09:26.316Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/56/f41b87403db61d75b7917a0c9bc9f7b6dd4760cb38eacc37171de2722fe0/sphinx_autodoc_argparse-0.0.1a28.tar.gz", hash = "sha256:53f9135c63c5cb24e3313e97fd46c75b61a3f60d9dc1aa1a3888e47810107ba6", size = 42461, upload-time = "2026-06-07T11:17:35.58Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/80/ed1498cba2319ff26821f527a599df4f25d1dfd81665f224b2901b3e71cb/sphinx_autodoc_argparse-0.0.1a27-py3-none-any.whl", hash = "sha256:722765bcc677c8421a84b0949698189b09de055def89e3471bfd8cc82354159a", size = 47275, upload-time = "2026-06-07T00:09:03.947Z" }, + { url = "https://files.pythonhosted.org/packages/48/bd/cc05720211d9afa832302d06ffda7e21c4fcbfcacfc3f8969facf7727327/sphinx_autodoc_argparse-0.0.1a28-py3-none-any.whl", hash = "sha256:1c814c740ebb769bb3d61aa9e890f919f2250d178e9c6db33fda26a5ac25c5e6", size = 47274, upload-time = "2026-06-07T11:17:16.799Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/c4/a3ba085c36b0594a0a1412f17e5b3eda61516dbda5b962e7ebda764e4329/sphinx_autodoc_typehints_gp-0.0.1a27.tar.gz", hash = "sha256:d29d1f5e4ee1abcc01b859a6178b971b089cdf9756732889c10b30678e0725a3", size = 36363, upload-time = "2026-06-07T00:09:31.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/c6/b3ff784aaa95cfca74a260e9759c12da725a2552cdea40ff07dd2299f7ce/sphinx_autodoc_typehints_gp-0.0.1a28.tar.gz", hash = "sha256:9c3bdc35d23fd888c81607fa6f00dac2210588e4779efa8be47739a252c1e9c3", size = 36362, upload-time = "2026-06-07T11:17:39.945Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/00/6007fe05a4fb2cb56247527bc1cffccdf68e7f5c208028c365ec7549a6be/sphinx_autodoc_typehints_gp-0.0.1a27-py3-none-any.whl", hash = "sha256:8ceabba6eaa516ea8969ae27de1fb1378a9458426d3d7716b7fcac34ce25ec42", size = 38510, upload-time = "2026-06-07T00:09:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/00/b8/5b6ecf30add7e9fc9af0a0f8325c51c0c27e9e1963d98dad063cc8ad5a34/sphinx_autodoc_typehints_gp-0.0.1a28-py3-none-any.whl", hash = "sha256:9c09b4960fc28afedd2be62ffc629084e1669be1a08ff2d24210a1b6980b5cbf", size = 38506, upload-time = "2026-06-07T11:17:22.856Z" }, ] [[package]] @@ -1438,68 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/a8/ccdc0777b231f03cc09b28780526b76016734cdb90ff7b32adafd7e9f138/sphinx_fonts-0.0.1a27.tar.gz", hash = "sha256:6b2184f086ef9f1c9efc747089276c88a6bb10f07b339af34ca10981aaea9816", size = 5789, upload-time = "2026-06-07T00:09:32.257Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/5e/b5a04214a6baa823079479b1bf1469f06840b57da752bcbca2233522c9bb/sphinx_fonts-0.0.1a28.tar.gz", hash = "sha256:7d83e84181c3ef76f3774deaf3113d130598921742a644cd357d6506ef13d727", size = 5790, upload-time = "2026-06-07T11:17:40.905Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/db/56bb69574b751926e11f07cd5ef0f5944e47d1c1fa327d8029c3d49e60bd/sphinx_fonts-0.0.1a27-py3-none-any.whl", hash = "sha256:42bf98788c1fac382df762850d1c684061b3df59f67fa13bc67ffea06ba2079e", size = 4360, upload-time = "2026-06-07T00:09:12.852Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1b/a2f495d24ccc0b81d7e7bb8f5bacb371535ecbba58df85fad721111587c7/sphinx_fonts-0.0.1a28-py3-none-any.whl", hash = "sha256:6d15bdabec8a689d7800bcfa974b9b3f9f5d12c322956fe36138c353a9b25103", size = 4361, upload-time = "2026-06-07T11:17:24.008Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/26/ec1e4ac480d3d295a88765b8c9ea2a797a145529d5b5eedaa311c2414fdc/sphinx_gp_llms-0.0.1a27.tar.gz", hash = "sha256:bf5f6ac1d5209b6e40091ff566243f5cda41707c5b9f8012fd28c209ba18d613", size = 9911, upload-time = "2026-06-07T00:09:33.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/42/a5eb10169048e21ee41a946bed0cf3f799d692ba68417a95d6faac4a93f1/sphinx_gp_llms-0.0.1a28.tar.gz", hash = "sha256:a528e3b31577cc4cf9e420145c0e10e05a0ad3e3b9edafaa368e6b78e95c5590", size = 9910, upload-time = "2026-06-07T11:17:41.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/53/525a7ccd3c758ae0ec26f22d78efba7a75b21a4976073d279e3473d0727c/sphinx_gp_llms-0.0.1a27-py3-none-any.whl", hash = "sha256:03859ec4227b087247e9f660c81092efa7c64d283df1fc5186630f7fe845a62c", size = 12639, upload-time = "2026-06-07T00:09:14.099Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1e/22e3f175d86789fcfa37a8463b7d8f9398c2cb32d5925889b4d19e89e416/sphinx_gp_llms-0.0.1a28-py3-none-any.whl", hash = "sha256:6054f0a7fb6576a3e36545735b112419ab4b0649fc7e1fc081edd9f29c6a7e06", size = 12637, upload-time = "2026-06-07T11:17:25.188Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/69/8602d58de605d73b854750c85ee040ce310c81508003578d98161ac5f6e4/sphinx_gp_opengraph-0.0.1a27.tar.gz", hash = "sha256:56505e6983e1bf7a7f56097ea45ee6cca156d5b7d236cbd1a4eeb55efa169c07", size = 11945, upload-time = "2026-06-07T00:09:34.148Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/8c/7a0d72303f4cc79ecb38f9d087e2c5c0da2fd19d92da40d532b7e7a3b7f5/sphinx_gp_opengraph-0.0.1a28.tar.gz", hash = "sha256:991f1aa3b4c76066ef4b44b8c5958988747385b914b14a0b82442d2ab1362b0a", size = 11947, upload-time = "2026-06-07T11:17:42.622Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/61/0ac0859b248b49d7f98dd87e4206b481e544fdfe28285795822eccfa04f4/sphinx_gp_opengraph-0.0.1a27-py3-none-any.whl", hash = "sha256:9e08c1ab3d2197e967d737d869a6693aad393b8dd8494d2156c27d96e61e555b", size = 12186, upload-time = "2026-06-07T00:09:15.357Z" }, + { url = "https://files.pythonhosted.org/packages/30/c8/7d6bacb67a9085cda3dfeae28545f0fe73ccee523d795cbbf030edf77f73/sphinx_gp_opengraph-0.0.1a28-py3-none-any.whl", hash = "sha256:95ad04308e1f47a63ceefeb37e4be2717f2efc16641f8c911575d214fbdaa510", size = 12183, upload-time = "2026-06-07T11:17:26.409Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/39/ce5c55b0274a2420d8a8f0e226bd15b25df2a8f0c09950f3b791b2580c2a/sphinx_gp_sitemap-0.0.1a27.tar.gz", hash = "sha256:fe6d4d2b2e73af169f39970468cf13ea524c4db193f91daa968dd4d26129a458", size = 9957, upload-time = "2026-06-07T00:09:34.974Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/e7/8499cf6859d40ad53c6e660cff5d6976cbb15e2ac0b7c0c901d0174758f8/sphinx_gp_sitemap-0.0.1a28.tar.gz", hash = "sha256:30851c93beab728287b75cc0676e2c5d2dd924bf939d430459b5ab7e630e6044", size = 9957, upload-time = "2026-06-07T11:17:43.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/7e/9802e1b99aaa58c669ef8594a192a797b71ffd56f135098a50586077bcf5/sphinx_gp_sitemap-0.0.1a27-py3-none-any.whl", hash = "sha256:f861b1fca72057beddd4da3f83481d7a1655948113f56ee9042ca212dd7c46d4", size = 8985, upload-time = "2026-06-07T00:09:16.74Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2f/8fec44f241ae0836dd4a82f88a7411b891cb636036e816b10b83603cc094/sphinx_gp_sitemap-0.0.1a28-py3-none-any.whl", hash = "sha256:31199e264f025d70871ac1d69a1ac5f16d5cf2438ee7b4ccb345a4c682f46688", size = 8982, upload-time = "2026-06-07T11:17:27.454Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/0a/e63a1a287d7154768bbf2f774247425bbc6ccf8af4420372f835c7458f41/sphinx_gp_theme-0.0.1a27.tar.gz", hash = "sha256:50f328b303b0201b3a72aed64831be195ae9fe26bdb0f63b8892c1b4ec778747", size = 18286, upload-time = "2026-06-07T00:09:35.831Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/5d/659b4665fa24ce70f99e464ee3cd7987deb801841d8bec38b8ed47482940/sphinx_gp_theme-0.0.1a28.tar.gz", hash = "sha256:a12ea7bf555208ee4a5b9e62b6b8cce9fcf3f9ecde49ef2194792a6af90ffbb8", size = 18287, upload-time = "2026-06-07T11:17:44.266Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/13/34dcd08d414f699a2dc4fd8fe8c9070c8c5dca107abd2bb5fc8716337c36/sphinx_gp_theme-0.0.1a27-py3-none-any.whl", hash = "sha256:baf658ae4796c5284251c31a4f11cbd59af921180b80946006ff2bc475c3573f", size = 19887, upload-time = "2026-06-07T00:09:17.919Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/54f77d7e356b2a29db4a40162066fabe0b6277930d685594179f4713a5ef/sphinx_gp_theme-0.0.1a28-py3-none-any.whl", hash = "sha256:51f087af4e1d0ae39baf6ef0e16b8435919c446789391e78eb1a280cbaa44b81", size = 19887, upload-time = "2026-06-07T11:17:28.469Z" }, ] [[package]] @@ -1517,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/2a/ebfa632b40ec7a6d3e5cba086fb038bdcbdba9a0a30ccc526168e7a33cea/sphinx_ux_autodoc_layout-0.0.1a27.tar.gz", hash = "sha256:a8bee23047fbec33d80549544121373663c98b20fc98aa38e95c06c0890eab82", size = 29134, upload-time = "2026-06-07T00:09:36.958Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/db/1ed9b68ca37e12f34f84b83fcd325e9a320ddfb3bbca1219bdc01a98ccbc/sphinx_ux_autodoc_layout-0.0.1a28.tar.gz", hash = "sha256:27a3089d53b9135445d3acc30b70b42eb4fbb95603379184df74bdd25e21973b", size = 29140, upload-time = "2026-06-07T11:17:45.12Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/b2/2490dd7d5fc265dd7a159661e7f631c95889a2df8f29be93c0a84468e033/sphinx_ux_autodoc_layout-0.0.1a27-py3-none-any.whl", hash = "sha256:a3eb75aec79b9fca80aa60af707654651727a1538515acf057d4359293f0b907", size = 33108, upload-time = "2026-06-07T00:09:19.147Z" }, + { url = "https://files.pythonhosted.org/packages/17/2c/30cc94f4fe79b9afd00d759cc180da11632a07901dde033c41851f8c1550/sphinx_ux_autodoc_layout-0.0.1a28-py3-none-any.whl", hash = "sha256:0bd6a1d3029d09c24938189b92ca58c0ff12c2552bcaf601b9be978790126a60", size = 33108, upload-time = "2026-06-07T11:17:29.642Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a27" +version = "0.0.1a28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/04/3865e01b9dc1625e195c2f332a85e48e0b407f4224bc571c20bb4a828113/sphinx_ux_badges-0.0.1a27.tar.gz", hash = "sha256:6371a5ade85d8c56549f69734536e97ac4a27f34bfaba4e363d3950c6e61a812", size = 15570, upload-time = "2026-06-07T00:09:37.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/9f/9b3b2d26b7a3ec527fbf2c9e5a706116f87d47ae0272debaacaaa28fbae2/sphinx_ux_badges-0.0.1a28.tar.gz", hash = "sha256:783015b1a5ace8ebc74c6a269eebb77ae9383744a76d61bc644bb1bd87d1fb94", size = 15570, upload-time = "2026-06-07T11:17:45.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/32/9f07f8200148f153277523517a0d4d7993c106d01008761fd774886cb73f/sphinx_ux_badges-0.0.1a27-py3-none-any.whl", hash = "sha256:42681b274c5ab2e4524fa1e42372861a4a9668e347bfc6745f2f91904b8b5a24", size = 16448, upload-time = "2026-06-07T00:09:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/42/94/bfb14654b0911a18628fcbcf68577ac3f0d437939e1a476ccdf74c0c5208/sphinx_ux_badges-0.0.1a28-py3-none-any.whl", hash = "sha256:b1abb54439c8b5a90219f6c3c43acdcd8157d092eff4ebcd161c331d835ee4f5", size = 16449, upload-time = "2026-06-07T11:17:30.661Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a27" }, + { name = "gp-sphinx", specifier = "==0.0.1a28" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1710,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a27" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a27" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a28" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a28" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1719,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a27" }, + { name = "gp-sphinx", specifier = "==0.0.1a28" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a27" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a27" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a28" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a28" }, ] lint = [ { name = "mypy" }, From eeb4ecdd6d7b4da7220c294781cba791a3d3c8ab Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 7 Jun 2026 15:20:14 -0500 Subject: [PATCH 2885/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a28?= =?UTF-8?q?=20=E2=86=92=200.0.1a29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up gp-sphinx 0.0.1a29 — component autodoc for the docutils and Sphinx extension family, cross-reference roles, and linked facts. what: - Bump gp-sphinx pin 0.0.1a28 → 0.0.1a29 (dev + docs groups) - Relock --- pyproject.toml | 12 ++++---- uv.lock | 84 +++++++++++++++++++++++++------------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e4da21826f..ad02cfcdb7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a28", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a28", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a28", + "gp-sphinx==0.0.1a29", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a29", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a29", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a28", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a28", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a28", + "gp-sphinx==0.0.1a29", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a29", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a29", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 67af24ea91..c2faeb3cf0 100644 --- a/uv.lock +++ b/uv.lock @@ -426,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/ba/5c47c8b801783b71bb6bd2796a9309a354d99533a991a93a104c8ee5f190/gp_furo_theme-0.0.1a28.tar.gz", hash = "sha256:ef145ed1495e0c956d639a1a322774fbe7b9b7d1d1b710960157c1ba2cbad9fe", size = 34310, upload-time = "2026-06-07T11:17:32.753Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/da/9828df6c74040fefd90f619dab151d17e9a042cd8cbc8fce64b3dd981854/gp_furo_theme-0.0.1a29.tar.gz", hash = "sha256:cd62f1504571c0a033cd8d0a8022f53c0b70ea4989831bd36c7d80e851babc0c", size = 34309, upload-time = "2026-06-07T20:01:04.019Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/02/5980a70b5256bb0b2f7a8a57876899396235cd39587536b92e0dc9a85b7a/gp_furo_theme-0.0.1a28-py3-none-any.whl", hash = "sha256:eb3e0823e74deffcc1c55b4b0ccc915f017da61ef23ed4adb4c92d0d0841cab2", size = 43660, upload-time = "2026-06-07T11:17:12.857Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f9/ed67889b5f57a4c055476552addbeaceda65d49ff10b198b8c773d240cb6/gp_furo_theme-0.0.1a29-py3-none-any.whl", hash = "sha256:6b55ff7fa2bba411cb90b0f13c19ae97f346169edd08562dda7377f7de56a405", size = 43660, upload-time = "2026-06-07T20:00:41.855Z" }, ] [[package]] @@ -457,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -479,9 +479,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/97/674f999ddb064f88448c5d9123c2cfe1f25d173e07d3a8cceacf63796c40/gp_sphinx-0.0.1a28.tar.gz", hash = "sha256:8001666733ba6dad9f1a17fd78912e05afed856d45a9a64b5ba3b7f7b4bab864", size = 19550, upload-time = "2026-06-07T11:17:33.64Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/e7/4aef4edcc8d45fbaf0a5832000dd839a80b9753ee490911b7b46debb2863/gp_sphinx-0.0.1a29.tar.gz", hash = "sha256:1f23edf3ae3602c058f10f11935341493de31e4e590b97a3f08180c71272b429", size = 19629, upload-time = "2026-06-07T20:01:04.906Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/58/3a97cc4b441b45f3d96801415a1eae8256e1ad1e0f902ca757ac60132d1c/gp_sphinx-0.0.1a28-py3-none-any.whl", hash = "sha256:13d38e6496b368d14568259b7e512f28f26e8c080b0cfd1520c1f13f0bb3d2ab", size = 20045, upload-time = "2026-06-07T11:17:14.229Z" }, + { url = "https://files.pythonhosted.org/packages/19/a5/62ba3012c465242163354a1d633f9dbecfac3a5c77f614062b7b875e0b05/gp_sphinx-0.0.1a29-py3-none-any.whl", hash = "sha256:e1599a56b01a47abd075fb4183110c7c07217dc02981685496fbc496a381e04c", size = 20135, upload-time = "2026-06-07T20:00:43.158Z" }, ] [[package]] @@ -1338,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1346,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/37/1166534666ac161b79926fa1c66b57176682621ea82dcd79bb0da7255afa/sphinx_autodoc_api_style-0.0.1a28.tar.gz", hash = "sha256:224b87153cdb739cf1ce0a61528579e0f71f65362313219f1750548d1b94ac81", size = 8978, upload-time = "2026-06-07T11:17:34.678Z" } +sdist = { url = "https://files.pythonhosted.org/packages/05/98/c8082be1e54a573f252f8fc82459069549e835b9f51da8d93c65de7d2e7b/sphinx_autodoc_api_style-0.0.1a29.tar.gz", hash = "sha256:eac2bf03461387638cb4306295e43fae7d79991b0067278b8d5b7a4728150529", size = 8978, upload-time = "2026-06-07T20:01:05.782Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/f9/1bce678a957281c448c1169d61f6233010881d7f864b0a40558d9033b2e9/sphinx_autodoc_api_style-0.0.1a28-py3-none-any.whl", hash = "sha256:ccf624aefd97e9bb0b5d44b441c69611a032152044cbda5253ddae20cbf8b16b", size = 9064, upload-time = "2026-06-07T11:17:15.547Z" }, + { url = "https://files.pythonhosted.org/packages/dc/03/61096826de59f41f1295b833f6b0790f1288d8e01eb7f55586fb4d3d5c03/sphinx_autodoc_api_style-0.0.1a29-py3-none-any.whl", hash = "sha256:de9e2918fddc0eb20607955c3d92759ba9b4fa942ff06c197dff1d5204396ecc", size = 9064, upload-time = "2026-06-07T20:00:44.389Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1361,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/56/f41b87403db61d75b7917a0c9bc9f7b6dd4760cb38eacc37171de2722fe0/sphinx_autodoc_argparse-0.0.1a28.tar.gz", hash = "sha256:53f9135c63c5cb24e3313e97fd46c75b61a3f60d9dc1aa1a3888e47810107ba6", size = 42461, upload-time = "2026-06-07T11:17:35.58Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/99/21fa6cb256b4183f830b6cc643f4b0f818d1afc182ab6fb38318e47b5bb2/sphinx_autodoc_argparse-0.0.1a29.tar.gz", hash = "sha256:a07842ff3197e03a208ec18a17b8a9329251a96dbb055a9cb8dd5e6120dbb6bf", size = 42459, upload-time = "2026-06-07T20:01:06.717Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/bd/cc05720211d9afa832302d06ffda7e21c4fcbfcacfc3f8969facf7727327/sphinx_autodoc_argparse-0.0.1a28-py3-none-any.whl", hash = "sha256:1c814c740ebb769bb3d61aa9e890f919f2250d178e9c6db33fda26a5ac25c5e6", size = 47274, upload-time = "2026-06-07T11:17:16.799Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9d/0620b79adaeeeb4a1565aa08d5041409aef2c9e206e4083dbc13c1027cd2/sphinx_autodoc_argparse-0.0.1a29-py3-none-any.whl", hash = "sha256:ee2790ccc89aaed3141d2d66dadc8b75b5fd50ea8cc113396bb05712836a5c5c", size = 47276, upload-time = "2026-06-07T20:00:45.668Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/c6/b3ff784aaa95cfca74a260e9759c12da725a2552cdea40ff07dd2299f7ce/sphinx_autodoc_typehints_gp-0.0.1a28.tar.gz", hash = "sha256:9c3bdc35d23fd888c81607fa6f00dac2210588e4779efa8be47739a252c1e9c3", size = 36362, upload-time = "2026-06-07T11:17:39.945Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/82/1eb3d5ac85a81f4605abad323c21baea79f15c418ed60cb0071df3878219/sphinx_autodoc_typehints_gp-0.0.1a29.tar.gz", hash = "sha256:bbeb27fb2f39fda98d9509edacfeb0a1a3d63a384a019cbf03365d7d3fa767fb", size = 36366, upload-time = "2026-06-07T20:01:11.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/b8/5b6ecf30add7e9fc9af0a0f8325c51c0c27e9e1963d98dad063cc8ad5a34/sphinx_autodoc_typehints_gp-0.0.1a28-py3-none-any.whl", hash = "sha256:9c09b4960fc28afedd2be62ffc629084e1669be1a08ff2d24210a1b6980b5cbf", size = 38506, upload-time = "2026-06-07T11:17:22.856Z" }, + { url = "https://files.pythonhosted.org/packages/3f/99/fd9866f9eee138f184b85739b578e4a7d5a5f84b8d1ee9a8234895ca06a3/sphinx_autodoc_typehints_gp-0.0.1a29-py3-none-any.whl", hash = "sha256:836887635729aa703a9146660276129a39eb4c61edd48bd544e94ed6402eb98c", size = 38509, upload-time = "2026-06-07T20:00:52.426Z" }, ] [[package]] @@ -1438,68 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/5e/b5a04214a6baa823079479b1bf1469f06840b57da752bcbca2233522c9bb/sphinx_fonts-0.0.1a28.tar.gz", hash = "sha256:7d83e84181c3ef76f3774deaf3113d130598921742a644cd357d6506ef13d727", size = 5790, upload-time = "2026-06-07T11:17:40.905Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/da/6c1d73c23ba5f8fef9008c768f0fe8381fc14021c3614682f13adb067aab/sphinx_fonts-0.0.1a29.tar.gz", hash = "sha256:43bbf64facbcaeb05b74876bd6099bdc416d6590b0797b6bbb666158b1631871", size = 5790, upload-time = "2026-06-07T20:01:12.619Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/1b/a2f495d24ccc0b81d7e7bb8f5bacb371535ecbba58df85fad721111587c7/sphinx_fonts-0.0.1a28-py3-none-any.whl", hash = "sha256:6d15bdabec8a689d7800bcfa974b9b3f9f5d12c322956fe36138c353a9b25103", size = 4361, upload-time = "2026-06-07T11:17:24.008Z" }, + { url = "https://files.pythonhosted.org/packages/f9/4b/bb34d3a37b52fdcf2e8715d4817fa524b77584aa27f3b1597cf3f6c36feb/sphinx_fonts-0.0.1a29-py3-none-any.whl", hash = "sha256:8091c329fb87d31d598e9c2c76332846ec46d8a7082a61e714b744f374e54b70", size = 4362, upload-time = "2026-06-07T20:00:53.618Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/42/a5eb10169048e21ee41a946bed0cf3f799d692ba68417a95d6faac4a93f1/sphinx_gp_llms-0.0.1a28.tar.gz", hash = "sha256:a528e3b31577cc4cf9e420145c0e10e05a0ad3e3b9edafaa368e6b78e95c5590", size = 9910, upload-time = "2026-06-07T11:17:41.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/92/b0f1e2700b7bc0d3a555921b629dc34a71e38e0dd909b2d988cb6722b051/sphinx_gp_llms-0.0.1a29.tar.gz", hash = "sha256:0cf4034bc81acfac42a149f75d77dfdd1f4d1e47143c102e08d2445ec4a27d1c", size = 9910, upload-time = "2026-06-07T20:01:13.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/1e/22e3f175d86789fcfa37a8463b7d8f9398c2cb32d5925889b4d19e89e416/sphinx_gp_llms-0.0.1a28-py3-none-any.whl", hash = "sha256:6054f0a7fb6576a3e36545735b112419ab4b0649fc7e1fc081edd9f29c6a7e06", size = 12637, upload-time = "2026-06-07T11:17:25.188Z" }, + { url = "https://files.pythonhosted.org/packages/82/8b/7b731c035cb627fb70ec2980ba075859b8bd70fcafbc0d35827828417917/sphinx_gp_llms-0.0.1a29-py3-none-any.whl", hash = "sha256:a1b7709afdac0c20acdeb793a6223545cf420b2e2a44f837da3e881b7e086d7f", size = 12637, upload-time = "2026-06-07T20:00:54.822Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/8c/7a0d72303f4cc79ecb38f9d087e2c5c0da2fd19d92da40d532b7e7a3b7f5/sphinx_gp_opengraph-0.0.1a28.tar.gz", hash = "sha256:991f1aa3b4c76066ef4b44b8c5958988747385b914b14a0b82442d2ab1362b0a", size = 11947, upload-time = "2026-06-07T11:17:42.622Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/14/50147d4efd4a0de51524be36d6ba7003d603db98db6c747d5afd4e7a7cce/sphinx_gp_opengraph-0.0.1a29.tar.gz", hash = "sha256:f7de30bab56aa5a8bcbc2fe0bd5fc501a9a78de88825118c412161304e70a098", size = 11947, upload-time = "2026-06-07T20:01:14.698Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/c8/7d6bacb67a9085cda3dfeae28545f0fe73ccee523d795cbbf030edf77f73/sphinx_gp_opengraph-0.0.1a28-py3-none-any.whl", hash = "sha256:95ad04308e1f47a63ceefeb37e4be2717f2efc16641f8c911575d214fbdaa510", size = 12183, upload-time = "2026-06-07T11:17:26.409Z" }, + { url = "https://files.pythonhosted.org/packages/f7/30/dcdc97a29dd9647fff33bae062d94aaae74f59af1a2b7d5d7f0324e3d091/sphinx_gp_opengraph-0.0.1a29-py3-none-any.whl", hash = "sha256:e427722a37913491ac2460a9173614c85ff730c1970577e78bd933b0c0d09752", size = 12185, upload-time = "2026-06-07T20:00:56.148Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/e7/8499cf6859d40ad53c6e660cff5d6976cbb15e2ac0b7c0c901d0174758f8/sphinx_gp_sitemap-0.0.1a28.tar.gz", hash = "sha256:30851c93beab728287b75cc0676e2c5d2dd924bf939d430459b5ab7e630e6044", size = 9957, upload-time = "2026-06-07T11:17:43.508Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/22/5b2e66549a132b904aba8123302742dec1e055b29ed9ea3377166caf3fa6/sphinx_gp_sitemap-0.0.1a29.tar.gz", hash = "sha256:954accd250c71b960b54369b75a46dd80bb6729a939926a8f0c06fca21e32720", size = 9956, upload-time = "2026-06-07T20:01:15.798Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/2f/8fec44f241ae0836dd4a82f88a7411b891cb636036e816b10b83603cc094/sphinx_gp_sitemap-0.0.1a28-py3-none-any.whl", hash = "sha256:31199e264f025d70871ac1d69a1ac5f16d5cf2438ee7b4ccb345a4c682f46688", size = 8982, upload-time = "2026-06-07T11:17:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bc/245024926b4061a7a5da0224c05583add542ce55f2da000af552848f5dc3/sphinx_gp_sitemap-0.0.1a29-py3-none-any.whl", hash = "sha256:c6df4685097fa007ae2f642680a27e72ff3ce07e2cb7df4cc72f6fe7ee339061", size = 8981, upload-time = "2026-06-07T20:00:57.43Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/5d/659b4665fa24ce70f99e464ee3cd7987deb801841d8bec38b8ed47482940/sphinx_gp_theme-0.0.1a28.tar.gz", hash = "sha256:a12ea7bf555208ee4a5b9e62b6b8cce9fcf3f9ecde49ef2194792a6af90ffbb8", size = 18287, upload-time = "2026-06-07T11:17:44.266Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/c0/2c5deab2a968f94b6e9d8b5fe9d24fb7f80968d6cc1703000d40628e5bcb/sphinx_gp_theme-0.0.1a29.tar.gz", hash = "sha256:edeaa3c53ba1ef1c520826261df54f764bac2809659ba94991b7ea93ba1a0bea", size = 18287, upload-time = "2026-06-07T20:01:16.811Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/d2/54f77d7e356b2a29db4a40162066fabe0b6277930d685594179f4713a5ef/sphinx_gp_theme-0.0.1a28-py3-none-any.whl", hash = "sha256:51f087af4e1d0ae39baf6ef0e16b8435919c446789391e78eb1a280cbaa44b81", size = 19887, upload-time = "2026-06-07T11:17:28.469Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1c/410698021382b99a950349332df06d5d20722f1b892c50bd9409e5dfabde/sphinx_gp_theme-0.0.1a29-py3-none-any.whl", hash = "sha256:a62c931c329e623f2c0b010b7f5bcedea6e147eadbca01245f9a3dfd0ccb409d", size = 19889, upload-time = "2026-06-07T20:00:58.968Z" }, ] [[package]] @@ -1517,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/db/1ed9b68ca37e12f34f84b83fcd325e9a320ddfb3bbca1219bdc01a98ccbc/sphinx_ux_autodoc_layout-0.0.1a28.tar.gz", hash = "sha256:27a3089d53b9135445d3acc30b70b42eb4fbb95603379184df74bdd25e21973b", size = 29140, upload-time = "2026-06-07T11:17:45.12Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/9c/e685c0f188c99513eb2204774812bde03d7279e075791b0c1db758842eb0/sphinx_ux_autodoc_layout-0.0.1a29.tar.gz", hash = "sha256:51b742ec2c368fd02bb3a75977d2bde20a6e8987524d176eb4e7040cfe685f0b", size = 30606, upload-time = "2026-06-07T20:01:17.821Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/2c/30cc94f4fe79b9afd00d759cc180da11632a07901dde033c41851f8c1550/sphinx_ux_autodoc_layout-0.0.1a28-py3-none-any.whl", hash = "sha256:0bd6a1d3029d09c24938189b92ca58c0ff12c2552bcaf601b9be978790126a60", size = 33108, upload-time = "2026-06-07T11:17:29.642Z" }, + { url = "https://files.pythonhosted.org/packages/b0/74/0635aaecef9ee0bcf8853090ce07fb964c24618f74af0abab53868a01b54/sphinx_ux_autodoc_layout-0.0.1a29-py3-none-any.whl", hash = "sha256:e2e777a3f40f049de2fca3706c9ff91dfba9ddc18528327499c70138d52d349f", size = 34999, upload-time = "2026-06-07T20:01:00.266Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a28" +version = "0.0.1a29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/9f/9b3b2d26b7a3ec527fbf2c9e5a706116f87d47ae0272debaacaaa28fbae2/sphinx_ux_badges-0.0.1a28.tar.gz", hash = "sha256:783015b1a5ace8ebc74c6a269eebb77ae9383744a76d61bc644bb1bd87d1fb94", size = 15570, upload-time = "2026-06-07T11:17:45.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/56/7b14f4c3b7fb378f14cb33485f4b71498f85056ebe7d4abca79f99ce3c10/sphinx_ux_badges-0.0.1a29.tar.gz", hash = "sha256:9f9112d2ba4d31dd0508992123ef5722b7a44adea3c0c56b3796aba3a43c1f52", size = 16722, upload-time = "2026-06-07T20:01:18.869Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/94/bfb14654b0911a18628fcbcf68577ac3f0d437939e1a476ccdf74c0c5208/sphinx_ux_badges-0.0.1a28-py3-none-any.whl", hash = "sha256:b1abb54439c8b5a90219f6c3c43acdcd8157d092eff4ebcd161c331d835ee4f5", size = 16449, upload-time = "2026-06-07T11:17:30.661Z" }, + { url = "https://files.pythonhosted.org/packages/77/d7/765bcfe96b842ebbef730e33db9530107558ac02e6d2a052edd389657b17/sphinx_ux_badges-0.0.1a29-py3-none-any.whl", hash = "sha256:ddc1e6ea96e49527d3e64fc3b47c16bdb19083ca9eaf4b99982f2b1351187d9c", size = 17490, upload-time = "2026-06-07T20:01:01.493Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a28" }, + { name = "gp-sphinx", specifier = "==0.0.1a29" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1710,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a28" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a28" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a29" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a29" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1719,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a28" }, + { name = "gp-sphinx", specifier = "==0.0.1a29" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a28" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a28" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a29" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a29" }, ] lint = [ { name = "mypy" }, From 573786778d0d68f79e9fd6a52d956f6f6eee494a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 7 Jun 2026 15:27:16 -0500 Subject: [PATCH 2886/2998] py(deps[dev]) Bump dev packages --- uv.lock | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/uv.lock b/uv.lock index c2faeb3cf0..9fec59bc27 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1191,27 +1191,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, - { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, - { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, - { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, - { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, - { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, - { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, - { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, - { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, - { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, +version = "0.15.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/5f7ec371001337d8fa61701c186ff8b613ecac1651848c5950f4c4d5f2e9/ruff-0.15.16.tar.gz", hash = "sha256:d05e78d38c78caf020b03789e25106c93017db5a0cb6e2819885018c61343b78", size = 4714267, upload-time = "2026-06-04T16:33:09.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/42/53ef1c3953f157956db9bf7861e3bc50b9b887ce93300aa48cdba8336fe6/ruff-0.15.16-py3-none-linux_armv6l.whl", hash = "sha256:6ac3c0b3969cc6cf6b158c4e2f8f682acb58e7d700d8a44b65ecdc72d66ab0b2", size = 10709025, upload-time = "2026-06-04T16:32:51.935Z" }, + { url = "https://files.pythonhosted.org/packages/93/9a/a79159346f19134a956607754e57d8d128f7a4c00f4ad2f7514d224c172c/ruff-0.15.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:197c207ed75ffba54a0dec23db4aa939a27a3053073e085e0042433cbdc58e4a", size = 11063550, upload-time = "2026-06-04T16:32:42.24Z" }, + { url = "https://files.pythonhosted.org/packages/bc/72/3ce2ac000a5299ec238e01f51397b3b653c93b077d9b1bfe8715bb895f20/ruff-0.15.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a39fec45ab316cc23e7558f23fea4a70403ddb5648ea9a4a3854a16973d0071", size = 10421345, upload-time = "2026-06-04T16:32:37.251Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c2/cc7fad3ec9169373f5b6a18f1917b91080feec40c3f9658334a1d28e2f03/ruff-0.15.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba93191d79003116b95128c9d306e045200fdbd0bccb782b110f3cd1d4abc5cf", size = 10757217, upload-time = "2026-06-04T16:32:54.722Z" }, + { url = "https://files.pythonhosted.org/packages/69/d2/3474009eaa0a65b31fa7152a2fad5e2f050c640ceb1e6b02ee6922e94c82/ruff-0.15.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6ee4b90520630120ef032aa5cc10db483852dff950e78b1d717e2993a61ac8d", size = 10507035, upload-time = "2026-06-04T16:33:05.343Z" }, + { url = "https://files.pythonhosted.org/packages/ca/81/b7ae6ccbd11f0c8dc3d5d67fc4be9b57ff57ca86ba56152021378e1277f2/ruff-0.15.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e4215bc938bc3c8215c1472c1aa437e310fee20cd427335fec9d7e609563628", size = 11255291, upload-time = "2026-06-04T16:32:49.49Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e1/46e526f1a7cc90857ce6ddf25fbb77eb6568651ac38d71b033af07076dd5/ruff-0.15.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c8d26be963b090f10e29abc8b3e74a2a321f6fa34e02424e30b5af89350ecbb", size = 12124922, upload-time = "2026-06-04T16:33:07.821Z" }, + { url = "https://files.pythonhosted.org/packages/1a/da/5c791b088b596b24d0deb967fa28ae02ad751a140c0b9ea81c5ab915d6c0/ruff-0.15.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f198cf4123602a2280ed46c307bcbafe41758d6fee5b456b6b6058ca1514b3b4", size = 11332186, upload-time = "2026-06-04T16:33:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/72/11/5da87abe20047c8962361473923ebb2f62b595250126aadfad8c20649c1e/ruff-0.15.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb27515fa6240fb586ae82b901a59e67d24acff86f2190b433dc542fe0435aeb", size = 11373541, upload-time = "2026-06-04T16:32:47.007Z" }, + { url = "https://files.pythonhosted.org/packages/fe/2a/8554754c23a854ae3fd6b507e36ad61ddb121e298c6d5d617dec94ed0f14/ruff-0.15.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a267c46ba1593fc26b8eecbea050b39d40c0b6bb7781ee11c90a02cd10032951", size = 11353014, upload-time = "2026-06-04T16:32:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/62/25/62ea41529ec89f742ea3fed9cb1059c72877ec7cf9b9e99ac9cf3294d1d9/ruff-0.15.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:528c68f39a91498a8d50e91ff5985df3d105782bab49cc378e73ac26bff083e8", size = 10737467, upload-time = "2026-06-04T16:32:26.348Z" }, + { url = "https://files.pythonhosted.org/packages/90/17/334d3ad9de4d40f9dd58fdd09e35ce64553bb501e2f19a839e2fb6be14fc/ruff-0.15.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ed55c58950df60589a9a7a5d2f8fa5f54ebd287163be805adfe6ee95a9de123", size = 10521910, upload-time = "2026-06-04T16:32:32.54Z" }, + { url = "https://files.pythonhosted.org/packages/4d/bd/3ac7c6ae77a885c1004b3dda2446ea401768d24f851c14b4ad4b24f6639c/ruff-0.15.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d482feaf51512b50f9790ceb417a56a61dd1e9d9bf967662b9ed27c01b34f53a", size = 10979190, upload-time = "2026-06-04T16:32:57.492Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/609546e6a413c3f216fbf2a50c928f97c80939154f6a0503114094a86191/ruff-0.15.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e15bc8c94513dae2a40cc9ef07c94fdd4ecc9e29dabebeebe170f952322c9e3", size = 11477014, upload-time = "2026-06-04T16:32:44.687Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/f2cd247ad32633a5c36e97141a2c21b11c6279f7957bc2ff360b1e08fddd/ruff-0.15.16-py3-none-win32.whl", hash = "sha256:580378f7bd4aa25f72e74aa54948a9622f142b1e509521dd10902e886681cc1e", size = 10735541, upload-time = "2026-06-04T16:32:30.145Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9e/02e845ef151b1dee585e55c4739f8e1734ae1d9f1221dff65761c162208b/ruff-0.15.16-py3-none-win_amd64.whl", hash = "sha256:408256017284eddf98fff77b29aa4fb30f586042d535b2d9befc6512f400aaec", size = 11843403, upload-time = "2026-06-04T16:32:39.76Z" }, + { url = "https://files.pythonhosted.org/packages/15/19/016553f86f207450aebebc2b2b5088d086b901cc8186c02ac4284db3bd88/ruff-0.15.16-py3-none-win_arm64.whl", hash = "sha256:8cd61783afb39638a7133ef0d2dfb1e91277593962f81b5a8423eb0b888a6121", size = 11134555, upload-time = "2026-06-04T16:33:00.136Z" }, ] [[package]] From d1a8771cd0861f59cd8e736da3fc6921193fe0e2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 7 Jun 2026 16:58:30 -0500 Subject: [PATCH 2887/2998] py(deps[docs]) gp-sphinx 0.0.1a30 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up gp-sphinx 0.0.1a30 — restores horizontal padding on standalone type chips in autodoc parameter/return lists while keeping compound annotations (list[str], dict[str, Any]) flush. what: - Bump gp-sphinx pin 0.0.1a29 -> 0.0.1a30 (dev + docs groups) - Bump gp-sphinx-family sibling pins to 0.0.1a30 where present - Relock --- pyproject.toml | 12 +++---- uv.lock | 86 +++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ad02cfcdb7..c11012469a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a29", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a29", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a29", + "gp-sphinx==0.0.1a30", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a30", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a30", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a29", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a29", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a29", + "gp-sphinx==0.0.1a30", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a30", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a30", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 9fec59bc27..89538e1f19 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -426,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/da/9828df6c74040fefd90f619dab151d17e9a042cd8cbc8fce64b3dd981854/gp_furo_theme-0.0.1a29.tar.gz", hash = "sha256:cd62f1504571c0a033cd8d0a8022f53c0b70ea4989831bd36c7d80e851babc0c", size = 34309, upload-time = "2026-06-07T20:01:04.019Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/fa/efb8e8f62cb5637396756c4e03bc15a781b2f77e1f7ce5bcaa6a58c4de63/gp_furo_theme-0.0.1a30.tar.gz", hash = "sha256:0624b284b0e2fc599e61248c1cf9832431eda45bda09ddfacfd4836cadc94e29", size = 34307, upload-time = "2026-06-07T21:49:05.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/f9/ed67889b5f57a4c055476552addbeaceda65d49ff10b198b8c773d240cb6/gp_furo_theme-0.0.1a29-py3-none-any.whl", hash = "sha256:6b55ff7fa2bba411cb90b0f13c19ae97f346169edd08562dda7377f7de56a405", size = 43660, upload-time = "2026-06-07T20:00:41.855Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0f/3b57d4b405b396ea1b6cce53efc8e7aa3ea12002cdcf43bb182df7027bba/gp_furo_theme-0.0.1a30-py3-none-any.whl", hash = "sha256:2b794ecdfc010582a02a786134fae49f2c5ac9ceae739f41504db1bc1796612b", size = 43660, upload-time = "2026-06-07T21:48:46.073Z" }, ] [[package]] @@ -457,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -479,9 +479,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/e7/4aef4edcc8d45fbaf0a5832000dd839a80b9753ee490911b7b46debb2863/gp_sphinx-0.0.1a29.tar.gz", hash = "sha256:1f23edf3ae3602c058f10f11935341493de31e4e590b97a3f08180c71272b429", size = 19629, upload-time = "2026-06-07T20:01:04.906Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/55/670e7511fe9ff16a4ea7506eaf4784c7176b58a2ee0d8c7f7841fdc3a692/gp_sphinx-0.0.1a30.tar.gz", hash = "sha256:ec1f35ad231800367c4805eb3cf06121d5354ee4fb13682856c7d621d9f5b3ae", size = 19628, upload-time = "2026-06-07T21:49:07.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/a5/62ba3012c465242163354a1d633f9dbecfac3a5c77f614062b7b875e0b05/gp_sphinx-0.0.1a29-py3-none-any.whl", hash = "sha256:e1599a56b01a47abd075fb4183110c7c07217dc02981685496fbc496a381e04c", size = 20135, upload-time = "2026-06-07T20:00:43.158Z" }, + { url = "https://files.pythonhosted.org/packages/f1/32/3a228b7e4a3af261fe5a01fe801ecdf3369a41c011109077a4a6aeff550b/gp_sphinx-0.0.1a30-py3-none-any.whl", hash = "sha256:b4b4c51cd11d86732379976df03c03edf4dc9c11d5180af301b1824d26796675", size = 20133, upload-time = "2026-06-07T21:48:47.336Z" }, ] [[package]] @@ -1338,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1346,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/98/c8082be1e54a573f252f8fc82459069549e835b9f51da8d93c65de7d2e7b/sphinx_autodoc_api_style-0.0.1a29.tar.gz", hash = "sha256:eac2bf03461387638cb4306295e43fae7d79991b0067278b8d5b7a4728150529", size = 8978, upload-time = "2026-06-07T20:01:05.782Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/fa/ebdc90c025fcbe4012d29eee334b557dbb9ade5e8fe524d3ac3242a58c2a/sphinx_autodoc_api_style-0.0.1a30.tar.gz", hash = "sha256:254ff050313b86de44e0d9b34f3f361946dadba22d446d644355655adef8e18d", size = 8978, upload-time = "2026-06-07T21:49:08.051Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/03/61096826de59f41f1295b833f6b0790f1288d8e01eb7f55586fb4d3d5c03/sphinx_autodoc_api_style-0.0.1a29-py3-none-any.whl", hash = "sha256:de9e2918fddc0eb20607955c3d92759ba9b4fa942ff06c197dff1d5204396ecc", size = 9064, upload-time = "2026-06-07T20:00:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ea/e80eb48eda1df4dd59b9bf08c5367969036ea931bf260f5696d53e7731b5/sphinx_autodoc_api_style-0.0.1a30-py3-none-any.whl", hash = "sha256:2e22a7a026b1341ebf5d0f0b975fb261b1dbf77bc1182d1741680886054c8070", size = 9065, upload-time = "2026-06-07T21:48:48.825Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1361,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/99/21fa6cb256b4183f830b6cc643f4b0f818d1afc182ab6fb38318e47b5bb2/sphinx_autodoc_argparse-0.0.1a29.tar.gz", hash = "sha256:a07842ff3197e03a208ec18a17b8a9329251a96dbb055a9cb8dd5e6120dbb6bf", size = 42459, upload-time = "2026-06-07T20:01:06.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/d3/93f42057bf6edb097115e68b4e47158aca986327a522a968393c370861cf/sphinx_autodoc_argparse-0.0.1a30.tar.gz", hash = "sha256:91c19b86b84e84a1be1446c834ef417d2e3cb242940998e351e2ea07d8655f48", size = 42460, upload-time = "2026-06-07T21:49:08.853Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/9d/0620b79adaeeeb4a1565aa08d5041409aef2c9e206e4083dbc13c1027cd2/sphinx_autodoc_argparse-0.0.1a29-py3-none-any.whl", hash = "sha256:ee2790ccc89aaed3141d2d66dadc8b75b5fd50ea8cc113396bb05712836a5c5c", size = 47276, upload-time = "2026-06-07T20:00:45.668Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8d/c325529a8a3adef1ba092c4f200e694e16aa6054c670e2ea2f9f1af5f3e6/sphinx_autodoc_argparse-0.0.1a30-py3-none-any.whl", hash = "sha256:e9c3d0350bca66d1110bd2945be0c7eb818318e411ad3acc9d501388512f4e79", size = 47275, upload-time = "2026-06-07T21:48:50.077Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/82/1eb3d5ac85a81f4605abad323c21baea79f15c418ed60cb0071df3878219/sphinx_autodoc_typehints_gp-0.0.1a29.tar.gz", hash = "sha256:bbeb27fb2f39fda98d9509edacfeb0a1a3d63a384a019cbf03365d7d3fa767fb", size = 36366, upload-time = "2026-06-07T20:01:11.709Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/64/aeba25128247ad6a622461baf6ff6033d2aa775833fb70af1f16148515f7/sphinx_autodoc_typehints_gp-0.0.1a30.tar.gz", hash = "sha256:df753789ef80717b93d133633f4bf13682979e9da1292f716cfb0c344659744c", size = 36501, upload-time = "2026-06-07T21:49:13.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/99/fd9866f9eee138f184b85739b578e4a7d5a5f84b8d1ee9a8234895ca06a3/sphinx_autodoc_typehints_gp-0.0.1a29-py3-none-any.whl", hash = "sha256:836887635729aa703a9146660276129a39eb4c61edd48bd544e94ed6402eb98c", size = 38509, upload-time = "2026-06-07T20:00:52.426Z" }, + { url = "https://files.pythonhosted.org/packages/00/97/a346af1a1a783fa23f271a7faf5ee2a4c7b15e7fc3254104b7e2601e0aca/sphinx_autodoc_typehints_gp-0.0.1a30-py3-none-any.whl", hash = "sha256:d8bf8b41c0a3de991fecad5f29df619bb6a8b116688b42db0f877a51af79fb8b", size = 38658, upload-time = "2026-06-07T21:48:55.813Z" }, ] [[package]] @@ -1438,68 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/da/6c1d73c23ba5f8fef9008c768f0fe8381fc14021c3614682f13adb067aab/sphinx_fonts-0.0.1a29.tar.gz", hash = "sha256:43bbf64facbcaeb05b74876bd6099bdc416d6590b0797b6bbb666158b1631871", size = 5790, upload-time = "2026-06-07T20:01:12.619Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/55/61da88e2fc41d04ceec9047e953f4b77b971145806ab3c3df1b74b4cbc81/sphinx_fonts-0.0.1a30.tar.gz", hash = "sha256:36c0e886e870f8ac07c8c3e5c09e5f4aa9b738c1ad4ac32c32ef8355a1164965", size = 5789, upload-time = "2026-06-07T21:49:14.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/4b/bb34d3a37b52fdcf2e8715d4817fa524b77584aa27f3b1597cf3f6c36feb/sphinx_fonts-0.0.1a29-py3-none-any.whl", hash = "sha256:8091c329fb87d31d598e9c2c76332846ec46d8a7082a61e714b744f374e54b70", size = 4362, upload-time = "2026-06-07T20:00:53.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a7/4044a939cfe42d02da678ee4bf07608d5ff97fc6bbe2a5a5959716e3f735/sphinx_fonts-0.0.1a30-py3-none-any.whl", hash = "sha256:6bb3f2bc45b82d10382e0cdd8ab7286b7b24b333a68d039aca1849b534939283", size = 4359, upload-time = "2026-06-07T21:48:57.053Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/92/b0f1e2700b7bc0d3a555921b629dc34a71e38e0dd909b2d988cb6722b051/sphinx_gp_llms-0.0.1a29.tar.gz", hash = "sha256:0cf4034bc81acfac42a149f75d77dfdd1f4d1e47143c102e08d2445ec4a27d1c", size = 9910, upload-time = "2026-06-07T20:01:13.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/55/e36118adbe2434a28689e5d3b44d1c74661296661c1a167bbf68cf9ace2d/sphinx_gp_llms-0.0.1a30.tar.gz", hash = "sha256:2876006a773958f382c853a23a2cc6ce2beecf1d328d2cf3c48e4d17c2a0eb97", size = 9911, upload-time = "2026-06-07T21:49:15.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/8b/7b731c035cb627fb70ec2980ba075859b8bd70fcafbc0d35827828417917/sphinx_gp_llms-0.0.1a29-py3-none-any.whl", hash = "sha256:a1b7709afdac0c20acdeb793a6223545cf420b2e2a44f837da3e881b7e086d7f", size = 12637, upload-time = "2026-06-07T20:00:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a8/16ac7227c5b861447822a5d876aa83542a0aa3b3813fe3da232479a21b05/sphinx_gp_llms-0.0.1a30-py3-none-any.whl", hash = "sha256:c6f63ecb4d911538bdf0bd26d7ebeb2c062d8e029fc12e7c8abc74c2b3072ff8", size = 12637, upload-time = "2026-06-07T21:48:58.332Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/14/50147d4efd4a0de51524be36d6ba7003d603db98db6c747d5afd4e7a7cce/sphinx_gp_opengraph-0.0.1a29.tar.gz", hash = "sha256:f7de30bab56aa5a8bcbc2fe0bd5fc501a9a78de88825118c412161304e70a098", size = 11947, upload-time = "2026-06-07T20:01:14.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/61/7ebbf17160d6776a1a67f60702556a2c31bca88400771f29da174fd0c07a/sphinx_gp_opengraph-0.0.1a30.tar.gz", hash = "sha256:d1b5ddecb205177b6ac641826d8c7260649e102873e97fcc7f89743fb62bf4ce", size = 11945, upload-time = "2026-06-07T21:49:16.053Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/30/dcdc97a29dd9647fff33bae062d94aaae74f59af1a2b7d5d7f0324e3d091/sphinx_gp_opengraph-0.0.1a29-py3-none-any.whl", hash = "sha256:e427722a37913491ac2460a9173614c85ff730c1970577e78bd933b0c0d09752", size = 12185, upload-time = "2026-06-07T20:00:56.148Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d6/c58a966c147c88463f33b6d3be420d7bedb251a37f5c91c6df15b9857f32/sphinx_gp_opengraph-0.0.1a30-py3-none-any.whl", hash = "sha256:a5cc0b947307694546d389282baac09a4c4193f12fca8540e1dfbba5c4492689", size = 12183, upload-time = "2026-06-07T21:48:59.436Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/22/5b2e66549a132b904aba8123302742dec1e055b29ed9ea3377166caf3fa6/sphinx_gp_sitemap-0.0.1a29.tar.gz", hash = "sha256:954accd250c71b960b54369b75a46dd80bb6729a939926a8f0c06fca21e32720", size = 9956, upload-time = "2026-06-07T20:01:15.798Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/58/e5068084c0ae7e60e206ea933f13f505141d781195498192212bd1964d41/sphinx_gp_sitemap-0.0.1a30.tar.gz", hash = "sha256:88791ebca58ca56969c4d2e675c43d5976436081a4bc61e21b2038a96e0a320a", size = 9957, upload-time = "2026-06-07T21:49:16.768Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/bc/245024926b4061a7a5da0224c05583add542ce55f2da000af552848f5dc3/sphinx_gp_sitemap-0.0.1a29-py3-none-any.whl", hash = "sha256:c6df4685097fa007ae2f642680a27e72ff3ce07e2cb7df4cc72f6fe7ee339061", size = 8981, upload-time = "2026-06-07T20:00:57.43Z" }, + { url = "https://files.pythonhosted.org/packages/ab/d2/321dbc4bd5846afbbabf865727750ccbcb5f5add3cc60b938e2298c616d9/sphinx_gp_sitemap-0.0.1a30-py3-none-any.whl", hash = "sha256:12bcc02f193b45034ce91c406f97a48cdfa4658406c52fcf044cf40841cb238f", size = 8980, upload-time = "2026-06-07T21:49:00.617Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/c0/2c5deab2a968f94b6e9d8b5fe9d24fb7f80968d6cc1703000d40628e5bcb/sphinx_gp_theme-0.0.1a29.tar.gz", hash = "sha256:edeaa3c53ba1ef1c520826261df54f764bac2809659ba94991b7ea93ba1a0bea", size = 18287, upload-time = "2026-06-07T20:01:16.811Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/0c/93d892c27bbf38f9202432e011f0b3dbfd1fc9fc9a8cb5cef61af1349694/sphinx_gp_theme-0.0.1a30.tar.gz", hash = "sha256:79b2d37b243a5c1f1e31404237684bd21a5424b12fc34d04b8983eb0d934b464", size = 18284, upload-time = "2026-06-07T21:49:17.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/1c/410698021382b99a950349332df06d5d20722f1b892c50bd9409e5dfabde/sphinx_gp_theme-0.0.1a29-py3-none-any.whl", hash = "sha256:a62c931c329e623f2c0b010b7f5bcedea6e147eadbca01245f9a3dfd0ccb409d", size = 19889, upload-time = "2026-06-07T20:00:58.968Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5a/4a3190291f795abd5ba4fbea93db376abbedc553ed79a49a53fb74031f99/sphinx_gp_theme-0.0.1a30-py3-none-any.whl", hash = "sha256:b31cf205d1dbc9f82a84a6fe7300d9b56193854108833baab32b5c107dcca415", size = 19887, upload-time = "2026-06-07T21:49:01.609Z" }, ] [[package]] @@ -1517,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/9c/e685c0f188c99513eb2204774812bde03d7279e075791b0c1db758842eb0/sphinx_ux_autodoc_layout-0.0.1a29.tar.gz", hash = "sha256:51b742ec2c368fd02bb3a75977d2bde20a6e8987524d176eb4e7040cfe685f0b", size = 30606, upload-time = "2026-06-07T20:01:17.821Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/80/d867076c30994c27dbed3101955488e739c99d6f1bb1706758e16a76ad10/sphinx_ux_autodoc_layout-0.0.1a30.tar.gz", hash = "sha256:1dbf8563a651e78c55f9b0cbc283dc4653ddeba82343195f1b245f764e33cd18", size = 30601, upload-time = "2026-06-07T21:49:18.627Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/74/0635aaecef9ee0bcf8853090ce07fb964c24618f74af0abab53868a01b54/sphinx_ux_autodoc_layout-0.0.1a29-py3-none-any.whl", hash = "sha256:e2e777a3f40f049de2fca3706c9ff91dfba9ddc18528327499c70138d52d349f", size = 34999, upload-time = "2026-06-07T20:01:00.266Z" }, + { url = "https://files.pythonhosted.org/packages/0b/75/dd8bbcdf1fe35d9b66b10dce1330a27613633b935dc05ff95b354df80a26/sphinx_ux_autodoc_layout-0.0.1a30-py3-none-any.whl", hash = "sha256:a9e6a135cd792dde5b297eff0db0a787a0e976f1dc982e0697d56fc5d463c8b7", size = 35000, upload-time = "2026-06-07T21:49:02.682Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a29" +version = "0.0.1a30" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/56/7b14f4c3b7fb378f14cb33485f4b71498f85056ebe7d4abca79f99ce3c10/sphinx_ux_badges-0.0.1a29.tar.gz", hash = "sha256:9f9112d2ba4d31dd0508992123ef5722b7a44adea3c0c56b3796aba3a43c1f52", size = 16722, upload-time = "2026-06-07T20:01:18.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/b9/ef79ec57e341fa1ee199c9a92af25af0abfa7315c940e5ec9059674a61c9/sphinx_ux_badges-0.0.1a30.tar.gz", hash = "sha256:0b1770203ec84f89937b27d5767bbe6bf5e739c340878a96fa5e65b1c01028d0", size = 16722, upload-time = "2026-06-07T21:49:19.6Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/d7/765bcfe96b842ebbef730e33db9530107558ac02e6d2a052edd389657b17/sphinx_ux_badges-0.0.1a29-py3-none-any.whl", hash = "sha256:ddc1e6ea96e49527d3e64fc3b47c16bdb19083ca9eaf4b99982f2b1351187d9c", size = 17490, upload-time = "2026-06-07T20:01:01.493Z" }, + { url = "https://files.pythonhosted.org/packages/11/39/05b4c60942cb3995f3acfaf456901df22af64e3bcd27a893ebe0b7b82c97/sphinx_ux_badges-0.0.1a30-py3-none-any.whl", hash = "sha256:b3856d545497eae9f9cf23e71248a615534ee339de421c90079b6f5f667fceec", size = 17488, upload-time = "2026-06-07T21:49:03.836Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a29" }, + { name = "gp-sphinx", specifier = "==0.0.1a30" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1710,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a29" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a29" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a30" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a30" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1719,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a29" }, + { name = "gp-sphinx", specifier = "==0.0.1a30" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a29" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a29" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a30" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a30" }, ] lint = [ { name = "mypy" }, From d0adf05e3444b9cf8a0f09a10118178d238537aa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 13 Jun 2026 04:36:44 -0500 Subject: [PATCH 2888/2998] .tool-versions(uv, just) uv 0.11.19 -> 0.11.21, just 1.51 -> 1.52 - just - https://github.com/casey/just/blob/1.52.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.52.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.21 - https://github.com/astral-sh/uv/blob/0.11.21/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index 5569494be3..ad5b21b029 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.51 -uv 0.11.19 +just 1.52 +uv 0.11.21 python 3.14 3.13 3.12 3.11 3.10 From 3e6da1b17fe566ca6ff071acaedce1835468798c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 13 Jun 2026 04:38:48 -0500 Subject: [PATCH 2889/2998] py(deps[dev]) Bump dev packages --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 89538e1f19..cf4444a43b 100644 --- a/uv.lock +++ b/uv.lock @@ -126,15 +126,15 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.14.3" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, ] [[package]] @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From 9a7ab007f64570cf10503264fa7ab0922a291365 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 15 Jun 2026 20:51:46 -0500 Subject: [PATCH 2890/2998] py(deps[docs]) gp-sphinx 0.0.1a31 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up gp-sphinx 0.0.1a31 — FastMCP resources and prompts gain {resource}/{prompt} cross-reference roles, and the prompt / resource / resource-template (plus argparse) directives gain :no-index: for components documented on more than one page. what: - Bump gp-sphinx pin 0.0.1a30 -> 0.0.1a31 (dev + docs groups) - Bump gp-sphinx-family sibling pins to 0.0.1a31 where present - Relock --- pyproject.toml | 12 +++---- uv.lock | 86 +++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c11012469a..eb16318a68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a30", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a30", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a30", + "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a31", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -83,9 +83,9 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a30", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a30", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a30", + "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a31", "gp-libs", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index cf4444a43b..0adf481afc 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -426,7 +426,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -436,9 +436,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/fa/efb8e8f62cb5637396756c4e03bc15a781b2f77e1f7ce5bcaa6a58c4de63/gp_furo_theme-0.0.1a30.tar.gz", hash = "sha256:0624b284b0e2fc599e61248c1cf9832431eda45bda09ddfacfd4836cadc94e29", size = 34307, upload-time = "2026-06-07T21:49:05.988Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b2/b44f19a537ff7cbe0a95d4da5bfb8904bf3152ffb5fa206d061427682543/gp_furo_theme-0.0.1a31.tar.gz", hash = "sha256:367f07f702eaf2aa0eb579144a0646a65dc68a084414729bddbc493e5c8c294f", size = 34306, upload-time = "2026-06-16T01:38:10.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/0f/3b57d4b405b396ea1b6cce53efc8e7aa3ea12002cdcf43bb182df7027bba/gp_furo_theme-0.0.1a30-py3-none-any.whl", hash = "sha256:2b794ecdfc010582a02a786134fae49f2c5ac9ceae739f41504db1bc1796612b", size = 43660, upload-time = "2026-06-07T21:48:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/80/3a/663e5fdc839ca81dd58f79d848d1c5397fe813bbfca97a6a7730bf324851/gp_furo_theme-0.0.1a31-py3-none-any.whl", hash = "sha256:153bba2a3566f66bba80d9d4a7ad39f599a8ba8215d51a4c46dcd581d5de53a2", size = 43659, upload-time = "2026-06-16T01:37:46.742Z" }, ] [[package]] @@ -457,7 +457,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -479,9 +479,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/55/670e7511fe9ff16a4ea7506eaf4784c7176b58a2ee0d8c7f7841fdc3a692/gp_sphinx-0.0.1a30.tar.gz", hash = "sha256:ec1f35ad231800367c4805eb3cf06121d5354ee4fb13682856c7d621d9f5b3ae", size = 19628, upload-time = "2026-06-07T21:49:07.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/40/bb18d84b0f11facb32977b7590ac89678b19a5621906337e4b48982eb151/gp_sphinx-0.0.1a31.tar.gz", hash = "sha256:52fad798e198f10e0460cec5b16535dedcb5d4ad118f471a45a773a74b7b7100", size = 19629, upload-time = "2026-06-16T01:38:11.297Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/32/3a228b7e4a3af261fe5a01fe801ecdf3369a41c011109077a4a6aeff550b/gp_sphinx-0.0.1a30-py3-none-any.whl", hash = "sha256:b4b4c51cd11d86732379976df03c03edf4dc9c11d5180af301b1824d26796675", size = 20133, upload-time = "2026-06-07T21:48:47.336Z" }, + { url = "https://files.pythonhosted.org/packages/87/79/45ddf1d696179839699e550a47c3908e0ad6889d0968d5b0cc0e3b79419c/gp_sphinx-0.0.1a31-py3-none-any.whl", hash = "sha256:3377ebe1834204d402ebb8b4789ef1a8c80e4e9a7863a2c7abe29bef4755f862", size = 20134, upload-time = "2026-06-16T01:37:48.055Z" }, ] [[package]] @@ -1338,7 +1338,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1346,14 +1346,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/fa/ebdc90c025fcbe4012d29eee334b557dbb9ade5e8fe524d3ac3242a58c2a/sphinx_autodoc_api_style-0.0.1a30.tar.gz", hash = "sha256:254ff050313b86de44e0d9b34f3f361946dadba22d446d644355655adef8e18d", size = 8978, upload-time = "2026-06-07T21:49:08.051Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/ce/2c91d418da951ce677372633abff8c6a991952074ec45446dcc844cde286/sphinx_autodoc_api_style-0.0.1a31.tar.gz", hash = "sha256:6abff9addb0fdd22e920cf4b3f2b06fa73bee9ef6d9650112749f291f2448b0f", size = 8977, upload-time = "2026-06-16T01:38:12.384Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ea/e80eb48eda1df4dd59b9bf08c5367969036ea931bf260f5696d53e7731b5/sphinx_autodoc_api_style-0.0.1a30-py3-none-any.whl", hash = "sha256:2e22a7a026b1341ebf5d0f0b975fb261b1dbf77bc1182d1741680886054c8070", size = 9065, upload-time = "2026-06-07T21:48:48.825Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/a3c5d0fe6643e67a299e2002609496120e38b275ab93162496a86a6f8623/sphinx_autodoc_api_style-0.0.1a31-py3-none-any.whl", hash = "sha256:ae7ca8032c3a26c8d70e84df8d095d424513270aac03e1ec6dc875f87b44d9fc", size = 9066, upload-time = "2026-06-16T01:37:49.62Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1361,22 +1361,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/d3/93f42057bf6edb097115e68b4e47158aca986327a522a968393c370861cf/sphinx_autodoc_argparse-0.0.1a30.tar.gz", hash = "sha256:91c19b86b84e84a1be1446c834ef417d2e3cb242940998e351e2ea07d8655f48", size = 42460, upload-time = "2026-06-07T21:49:08.853Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/cd/5bf51b23a41af75da19c6c9ffcafb7e954fded44bd2103a404dc8d8395a3/sphinx_autodoc_argparse-0.0.1a31.tar.gz", hash = "sha256:1ca3dfa92d4e53069e573cab936f727b04daa4b48b3c3a02da1ea2579024f569", size = 42804, upload-time = "2026-06-16T01:38:13.244Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/8d/c325529a8a3adef1ba092c4f200e694e16aa6054c670e2ea2f9f1af5f3e6/sphinx_autodoc_argparse-0.0.1a30-py3-none-any.whl", hash = "sha256:e9c3d0350bca66d1110bd2945be0c7eb818318e411ad3acc9d501388512f4e79", size = 47275, upload-time = "2026-06-07T21:48:50.077Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/64faac071dbf00142c2b67d35c54c4e720aa869ae1910b6606bbfa3ecc3e/sphinx_autodoc_argparse-0.0.1a31-py3-none-any.whl", hash = "sha256:db4546fc851740ad051d0072c8bcdbda6548a1662d3bdbfb2b0272b67fa1b881", size = 47654, upload-time = "2026-06-16T01:37:50.882Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/64/aeba25128247ad6a622461baf6ff6033d2aa775833fb70af1f16148515f7/sphinx_autodoc_typehints_gp-0.0.1a30.tar.gz", hash = "sha256:df753789ef80717b93d133633f4bf13682979e9da1292f716cfb0c344659744c", size = 36501, upload-time = "2026-06-07T21:49:13.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/6d/f509e55463159bfc4fff7196a7bac51116a0ecdc3b0e22f4102bab39be5c/sphinx_autodoc_typehints_gp-0.0.1a31.tar.gz", hash = "sha256:f269e2125c5de6bdeae159667bd8f92fadc81e1b2aa702ca8eb0cf55aee937f3", size = 36501, upload-time = "2026-06-16T01:38:18.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/97/a346af1a1a783fa23f271a7faf5ee2a4c7b15e7fc3254104b7e2601e0aca/sphinx_autodoc_typehints_gp-0.0.1a30-py3-none-any.whl", hash = "sha256:d8bf8b41c0a3de991fecad5f29df619bb6a8b116688b42db0f877a51af79fb8b", size = 38658, upload-time = "2026-06-07T21:48:55.813Z" }, + { url = "https://files.pythonhosted.org/packages/b0/07/eb1160f8c4e7adac433802f398cbe70c245c9d0ee5127209f880625bb2b9/sphinx_autodoc_typehints_gp-0.0.1a31-py3-none-any.whl", hash = "sha256:34140405eb5be548b034155f1424b8b9119be09470f102d7d4a1b7fc155cd16d", size = 38660, upload-time = "2026-06-16T01:37:58.325Z" }, ] [[package]] @@ -1438,68 +1438,68 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/55/61da88e2fc41d04ceec9047e953f4b77b971145806ab3c3df1b74b4cbc81/sphinx_fonts-0.0.1a30.tar.gz", hash = "sha256:36c0e886e870f8ac07c8c3e5c09e5f4aa9b738c1ad4ac32c32ef8355a1164965", size = 5789, upload-time = "2026-06-07T21:49:14.508Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/c1/dbce2c627aa219432b7495e96e5fef65de2930f5a58d570b31c88a1e33b8/sphinx_fonts-0.0.1a31.tar.gz", hash = "sha256:9264a7d511796302b27b7727d1553ffc69cfe3f5bfb8e32e0308880d7b9471f0", size = 5790, upload-time = "2026-06-16T01:38:18.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/a7/4044a939cfe42d02da678ee4bf07608d5ff97fc6bbe2a5a5959716e3f735/sphinx_fonts-0.0.1a30-py3-none-any.whl", hash = "sha256:6bb3f2bc45b82d10382e0cdd8ab7286b7b24b333a68d039aca1849b534939283", size = 4359, upload-time = "2026-06-07T21:48:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6a/e8bd1bec0334cf8ac07624a04c2a252d38474bf984567cd742aa5d3b250e/sphinx_fonts-0.0.1a31-py3-none-any.whl", hash = "sha256:7176f0c5092873d75a1904d477e6a6a1995b2fdab9d1aa1feaf38afa896fe501", size = 4363, upload-time = "2026-06-16T01:37:59.591Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/55/e36118adbe2434a28689e5d3b44d1c74661296661c1a167bbf68cf9ace2d/sphinx_gp_llms-0.0.1a30.tar.gz", hash = "sha256:2876006a773958f382c853a23a2cc6ce2beecf1d328d2cf3c48e4d17c2a0eb97", size = 9911, upload-time = "2026-06-07T21:49:15.314Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/d0/516ecda5dea91292bffd4cebb171b7c3a1ef5cf9dc4ef8b361123f49b422/sphinx_gp_llms-0.0.1a31.tar.gz", hash = "sha256:d5f79894cc017596858c929337c87fe8fb57852ad36541fcfa716d1220079201", size = 9911, upload-time = "2026-06-16T01:38:19.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/a8/16ac7227c5b861447822a5d876aa83542a0aa3b3813fe3da232479a21b05/sphinx_gp_llms-0.0.1a30-py3-none-any.whl", hash = "sha256:c6f63ecb4d911538bdf0bd26d7ebeb2c062d8e029fc12e7c8abc74c2b3072ff8", size = 12637, upload-time = "2026-06-07T21:48:58.332Z" }, + { url = "https://files.pythonhosted.org/packages/66/6c/44f85843c51a4ca2f40de16d380260d9e59cba6b5859d052052a37c9a6b3/sphinx_gp_llms-0.0.1a31-py3-none-any.whl", hash = "sha256:7c1639bc3c6a065125235977fc5b3783bdda236aa96f4f3bbfdffdfc6f94512f", size = 12637, upload-time = "2026-06-16T01:38:00.839Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/61/7ebbf17160d6776a1a67f60702556a2c31bca88400771f29da174fd0c07a/sphinx_gp_opengraph-0.0.1a30.tar.gz", hash = "sha256:d1b5ddecb205177b6ac641826d8c7260649e102873e97fcc7f89743fb62bf4ce", size = 11945, upload-time = "2026-06-07T21:49:16.053Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/f4/a520d59a00104be849b5af5a34ae05aef2b16d55768fcc7450b58ee8b110/sphinx_gp_opengraph-0.0.1a31.tar.gz", hash = "sha256:2a6bc17cc21fad51b56daa7ef874d971b7d7ac6eb99fc6d23fd20729bb1ef782", size = 11944, upload-time = "2026-06-16T01:38:20.516Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/d6/c58a966c147c88463f33b6d3be420d7bedb251a37f5c91c6df15b9857f32/sphinx_gp_opengraph-0.0.1a30-py3-none-any.whl", hash = "sha256:a5cc0b947307694546d389282baac09a4c4193f12fca8540e1dfbba5c4492689", size = 12183, upload-time = "2026-06-07T21:48:59.436Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/4620bc3506b2d732948770dcddea5d1b13aea807057a344dbe4301d2979e/sphinx_gp_opengraph-0.0.1a31-py3-none-any.whl", hash = "sha256:b9eaf5e2c434c1819ae144f3043b5dab4d28a0182d7b3931cd4752e1a3ff6e05", size = 12186, upload-time = "2026-06-16T01:38:02.094Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/58/e5068084c0ae7e60e206ea933f13f505141d781195498192212bd1964d41/sphinx_gp_sitemap-0.0.1a30.tar.gz", hash = "sha256:88791ebca58ca56969c4d2e675c43d5976436081a4bc61e21b2038a96e0a320a", size = 9957, upload-time = "2026-06-07T21:49:16.768Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/14/cc4cae7fde38ea9445fcc6eda121da358661119bae5de84933a0ed04c8e1/sphinx_gp_sitemap-0.0.1a31.tar.gz", hash = "sha256:8a142c3b8846954b3fca75ee1a5adefc773bfe0463ad554069a655f74320e346", size = 9957, upload-time = "2026-06-16T01:38:21.358Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/d2/321dbc4bd5846afbbabf865727750ccbcb5f5add3cc60b938e2298c616d9/sphinx_gp_sitemap-0.0.1a30-py3-none-any.whl", hash = "sha256:12bcc02f193b45034ce91c406f97a48cdfa4658406c52fcf044cf40841cb238f", size = 8980, upload-time = "2026-06-07T21:49:00.617Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ae/a1b054b95698964a7a234da9a787fbb3b21b65f706279022b0d1ec82309e/sphinx_gp_sitemap-0.0.1a31-py3-none-any.whl", hash = "sha256:1b4552dad75c39c63d062dc2559f91bb80b1d7c01c8a6fba048ab0cc474de405", size = 8981, upload-time = "2026-06-16T01:38:03.739Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/0c/93d892c27bbf38f9202432e011f0b3dbfd1fc9fc9a8cb5cef61af1349694/sphinx_gp_theme-0.0.1a30.tar.gz", hash = "sha256:79b2d37b243a5c1f1e31404237684bd21a5424b12fc34d04b8983eb0d934b464", size = 18284, upload-time = "2026-06-07T21:49:17.643Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/38/3a88c5db34eaf51f73a60bdaabfb9cacfa7efe29770961a2e5e0ca0440ea/sphinx_gp_theme-0.0.1a31.tar.gz", hash = "sha256:6d9161ef9d451eec42e5792f90358792e7e23a6e1de04d6e6a4d548af9b5651b", size = 18289, upload-time = "2026-06-16T01:38:22.185Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/5a/4a3190291f795abd5ba4fbea93db376abbedc553ed79a49a53fb74031f99/sphinx_gp_theme-0.0.1a30-py3-none-any.whl", hash = "sha256:b31cf205d1dbc9f82a84a6fe7300d9b56193854108833baab32b5c107dcca415", size = 19887, upload-time = "2026-06-07T21:49:01.609Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/0e7be302e82cffaad4de578d7997a2b41709aefbb4cda664da2126d0a3c0/sphinx_gp_theme-0.0.1a31-py3-none-any.whl", hash = "sha256:91cb217461554d436e34a99509de64b037e28b9ed479557b86566e49bc676b3c", size = 19889, upload-time = "2026-06-16T01:38:05.077Z" }, ] [[package]] @@ -1517,28 +1517,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/80/d867076c30994c27dbed3101955488e739c99d6f1bb1706758e16a76ad10/sphinx_ux_autodoc_layout-0.0.1a30.tar.gz", hash = "sha256:1dbf8563a651e78c55f9b0cbc283dc4653ddeba82343195f1b245f764e33cd18", size = 30601, upload-time = "2026-06-07T21:49:18.627Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/17/fd806bccf73d5a4a1ab5504cdd9253b54a58ac393c7ecd4a9e5a8c239928/sphinx_ux_autodoc_layout-0.0.1a31.tar.gz", hash = "sha256:debebc1f632af4a7a7ca9a00285cc68419c08f73740f77241fc7beb2f39fa611", size = 30604, upload-time = "2026-06-16T01:38:23.168Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/75/dd8bbcdf1fe35d9b66b10dce1330a27613633b935dc05ff95b354df80a26/sphinx_ux_autodoc_layout-0.0.1a30-py3-none-any.whl", hash = "sha256:a9e6a135cd792dde5b297eff0db0a787a0e976f1dc982e0697d56fc5d463c8b7", size = 35000, upload-time = "2026-06-07T21:49:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/da/d4/cc594472a755ced2702cf20d5e60db9c6714af6b362e3507445cd67a7763/sphinx_ux_autodoc_layout-0.0.1a31-py3-none-any.whl", hash = "sha256:06fbdaa8544118fac6a5c77e8fcf4309cae778fa1ace9b129e66d91731181fb7", size = 35000, upload-time = "2026-06-16T01:38:06.359Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a30" +version = "0.0.1a31" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/b9/ef79ec57e341fa1ee199c9a92af25af0abfa7315c940e5ec9059674a61c9/sphinx_ux_badges-0.0.1a30.tar.gz", hash = "sha256:0b1770203ec84f89937b27d5767bbe6bf5e739c340878a96fa5e65b1c01028d0", size = 16722, upload-time = "2026-06-07T21:49:19.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/16/a861f04c971fc4668c84accc4a5ecd35e56c8bdd0e8ebd1baef28221caac/sphinx_ux_badges-0.0.1a31.tar.gz", hash = "sha256:274c9cfe5dc47ea8b98f32e5d04d92dac949bac7a87d2320b08231a68d83d2d5", size = 16723, upload-time = "2026-06-16T01:38:24.086Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/39/05b4c60942cb3995f3acfaf456901df22af64e3bcd27a893ebe0b7b82c97/sphinx_ux_badges-0.0.1a30-py3-none-any.whl", hash = "sha256:b3856d545497eae9f9cf23e71248a615534ee339de421c90079b6f5f667fceec", size = 17488, upload-time = "2026-06-07T21:49:03.836Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/d5e95df77827691e1efd1411eea47c0ef75745040cb5247cbde47adb3440/sphinx_ux_badges-0.0.1a31-py3-none-any.whl", hash = "sha256:a757b65b3cef1d7ee0e2bf0f84ea1be32a8e063bd1620a4effc86478a594b2ee", size = 17487, upload-time = "2026-06-16T01:38:07.814Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a30" }, + { name = "gp-sphinx", specifier = "==0.0.1a31" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1710,8 +1710,8 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a30" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a30" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a31" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a31" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1719,11 +1719,11 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs" }, - { name = "gp-sphinx", specifier = "==0.0.1a30" }, + { name = "gp-sphinx", specifier = "==0.0.1a31" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a30" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a30" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a31" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a31" }, ] lint = [ { name = "mypy" }, From dac5722e66b6ffb082c267d22f7d1c1f470cbe78 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 16 Jun 2026 19:07:42 -0500 Subject: [PATCH 2891/2998] py(deps[libtmux]) Require 0.58.1 for the pytest 9.1 fix why: libtmux 0.58.1 ships the fix for the pytest plugin import failure under pytest 9.1. Requiring it ensures tmuxp's fixtures load for users on pytest 9.1+. what: - Bump libtmux ~=0.58.0 -> ~=0.58.1 - Update uv.lock to libtmux 0.58.1 from PyPI --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index eb16318a68..7fe5c09b0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.58.0", + "libtmux~=0.58.1", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index 0adf481afc..2ff0957cb7 100644 --- a/uv.lock +++ b/uv.lock @@ -619,11 +619,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.58.0" +version = "0.58.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/4e/daccd4fd72ad3f17b8fb97f69403774d6c510b5d513521b454fdaedb0561/libtmux-0.58.0.tar.gz", hash = "sha256:abbe330bec2c45687a4bf417ee436373b37046afe123ba547495ee0448e1145a", size = 522080, upload-time = "2026-05-23T16:03:38.566Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/58/346776e0491ede33e1554a4bff9b545dbe9f3164e45abac483195938a1cf/libtmux-0.58.1.tar.gz", hash = "sha256:a294dd585aa419d4ecce36f3e55df656693743c97a0b5b5bb1e5fea31ada2482", size = 519541, upload-time = "2026-06-17T00:03:31.81Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/d5/1cee7c13865d0d55ddb54709aaf85e0dc645e2998ce85ffce2c36d3bf08d/libtmux-0.58.0-py3-none-any.whl", hash = "sha256:1aec9875983a8eb121a8de7be7dffa6b97d9754c013ce960944d058764e47ec3", size = 113680, upload-time = "2026-05-23T16:03:37.049Z" }, + { url = "https://files.pythonhosted.org/packages/22/4d/e44ada32edfe947c40d4dfc596a6f5355400a16d08be06016bd754375e41/libtmux-0.58.1-py3-none-any.whl", hash = "sha256:ab0f47d03a59d674962bc23e36e188fcfa4a82b0f270d474afab519e3076839b", size = 113653, upload-time = "2026-06-17T00:03:30.48Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.58.0" }, + { name = "libtmux", specifier = "~=0.58.1" }, { name = "pyyaml", specifier = ">=6.0" }, ] From faa68d67f21ec112aea3963f2cf2768e913a78cd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 16 Jun 2026 19:12:09 -0500 Subject: [PATCH 2892/2998] py(deps[dev]) Bump dev packages --- uv.lock | 56 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/uv.lock b/uv.lock index 2ff0957cb7..fbdbababca 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1021,7 +1021,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.3" +version = "9.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1032,9 +1032,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/0e/b5858858d74958632c49b72cb25a3976ff9f632397626715be71c89d3971/pytest-9.1.0.tar.gz", hash = "sha256:41dd9148c08072446394cefd3d79701701335a9f4cae69ba92e39f6c7f5c061c", size = 1634181, upload-time = "2026-06-13T18:52:45.983Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5a/ba30a81239b909821b3153e303e7def45178bf353da4f72380e6c5e8793b/pytest-9.1.0-py3-none-any.whl", hash = "sha256:8ebb0e7888bdf2bdfc602ec51f8f62d50200af37356c74e503c79a94f5c81f32", size = 386453, upload-time = "2026-06-13T18:52:44.045Z" }, ] [[package]] @@ -1191,27 +1191,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/5f7ec371001337d8fa61701c186ff8b613ecac1651848c5950f4c4d5f2e9/ruff-0.15.16.tar.gz", hash = "sha256:d05e78d38c78caf020b03789e25106c93017db5a0cb6e2819885018c61343b78", size = 4714267, upload-time = "2026-06-04T16:33:09.974Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/42/53ef1c3953f157956db9bf7861e3bc50b9b887ce93300aa48cdba8336fe6/ruff-0.15.16-py3-none-linux_armv6l.whl", hash = "sha256:6ac3c0b3969cc6cf6b158c4e2f8f682acb58e7d700d8a44b65ecdc72d66ab0b2", size = 10709025, upload-time = "2026-06-04T16:32:51.935Z" }, - { url = "https://files.pythonhosted.org/packages/93/9a/a79159346f19134a956607754e57d8d128f7a4c00f4ad2f7514d224c172c/ruff-0.15.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:197c207ed75ffba54a0dec23db4aa939a27a3053073e085e0042433cbdc58e4a", size = 11063550, upload-time = "2026-06-04T16:32:42.24Z" }, - { url = "https://files.pythonhosted.org/packages/bc/72/3ce2ac000a5299ec238e01f51397b3b653c93b077d9b1bfe8715bb895f20/ruff-0.15.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a39fec45ab316cc23e7558f23fea4a70403ddb5648ea9a4a3854a16973d0071", size = 10421345, upload-time = "2026-06-04T16:32:37.251Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c2/cc7fad3ec9169373f5b6a18f1917b91080feec40c3f9658334a1d28e2f03/ruff-0.15.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba93191d79003116b95128c9d306e045200fdbd0bccb782b110f3cd1d4abc5cf", size = 10757217, upload-time = "2026-06-04T16:32:54.722Z" }, - { url = "https://files.pythonhosted.org/packages/69/d2/3474009eaa0a65b31fa7152a2fad5e2f050c640ceb1e6b02ee6922e94c82/ruff-0.15.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6ee4b90520630120ef032aa5cc10db483852dff950e78b1d717e2993a61ac8d", size = 10507035, upload-time = "2026-06-04T16:33:05.343Z" }, - { url = "https://files.pythonhosted.org/packages/ca/81/b7ae6ccbd11f0c8dc3d5d67fc4be9b57ff57ca86ba56152021378e1277f2/ruff-0.15.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e4215bc938bc3c8215c1472c1aa437e310fee20cd427335fec9d7e609563628", size = 11255291, upload-time = "2026-06-04T16:32:49.49Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e1/46e526f1a7cc90857ce6ddf25fbb77eb6568651ac38d71b033af07076dd5/ruff-0.15.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c8d26be963b090f10e29abc8b3e74a2a321f6fa34e02424e30b5af89350ecbb", size = 12124922, upload-time = "2026-06-04T16:33:07.821Z" }, - { url = "https://files.pythonhosted.org/packages/1a/da/5c791b088b596b24d0deb967fa28ae02ad751a140c0b9ea81c5ab915d6c0/ruff-0.15.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f198cf4123602a2280ed46c307bcbafe41758d6fee5b456b6b6058ca1514b3b4", size = 11332186, upload-time = "2026-06-04T16:33:02.971Z" }, - { url = "https://files.pythonhosted.org/packages/72/11/5da87abe20047c8962361473923ebb2f62b595250126aadfad8c20649c1e/ruff-0.15.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb27515fa6240fb586ae82b901a59e67d24acff86f2190b433dc542fe0435aeb", size = 11373541, upload-time = "2026-06-04T16:32:47.007Z" }, - { url = "https://files.pythonhosted.org/packages/fe/2a/8554754c23a854ae3fd6b507e36ad61ddb121e298c6d5d617dec94ed0f14/ruff-0.15.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a267c46ba1593fc26b8eecbea050b39d40c0b6bb7781ee11c90a02cd10032951", size = 11353014, upload-time = "2026-06-04T16:32:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/62/25/62ea41529ec89f742ea3fed9cb1059c72877ec7cf9b9e99ac9cf3294d1d9/ruff-0.15.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:528c68f39a91498a8d50e91ff5985df3d105782bab49cc378e73ac26bff083e8", size = 10737467, upload-time = "2026-06-04T16:32:26.348Z" }, - { url = "https://files.pythonhosted.org/packages/90/17/334d3ad9de4d40f9dd58fdd09e35ce64553bb501e2f19a839e2fb6be14fc/ruff-0.15.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ed55c58950df60589a9a7a5d2f8fa5f54ebd287163be805adfe6ee95a9de123", size = 10521910, upload-time = "2026-06-04T16:32:32.54Z" }, - { url = "https://files.pythonhosted.org/packages/4d/bd/3ac7c6ae77a885c1004b3dda2446ea401768d24f851c14b4ad4b24f6639c/ruff-0.15.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d482feaf51512b50f9790ceb417a56a61dd1e9d9bf967662b9ed27c01b34f53a", size = 10979190, upload-time = "2026-06-04T16:32:57.492Z" }, - { url = "https://files.pythonhosted.org/packages/33/d7/609546e6a413c3f216fbf2a50c928f97c80939154f6a0503114094a86191/ruff-0.15.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e15bc8c94513dae2a40cc9ef07c94fdd4ecc9e29dabebeebe170f952322c9e3", size = 11477014, upload-time = "2026-06-04T16:32:44.687Z" }, - { url = "https://files.pythonhosted.org/packages/74/0d/f2cd247ad32633a5c36e97141a2c21b11c6279f7957bc2ff360b1e08fddd/ruff-0.15.16-py3-none-win32.whl", hash = "sha256:580378f7bd4aa25f72e74aa54948a9622f142b1e509521dd10902e886681cc1e", size = 10735541, upload-time = "2026-06-04T16:32:30.145Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9e/02e845ef151b1dee585e55c4739f8e1734ae1d9f1221dff65761c162208b/ruff-0.15.16-py3-none-win_amd64.whl", hash = "sha256:408256017284eddf98fff77b29aa4fb30f586042d535b2d9befc6512f400aaec", size = 11843403, upload-time = "2026-06-04T16:32:39.76Z" }, - { url = "https://files.pythonhosted.org/packages/15/19/016553f86f207450aebebc2b2b5088d086b901cc8186c02ac4284db3bd88/ruff-0.15.16-py3-none-win_arm64.whl", hash = "sha256:8cd61783afb39638a7133ef0d2dfb1e91277593962f81b5a8423eb0b888a6121", size = 11134555, upload-time = "2026-06-04T16:33:00.136Z" }, +version = "0.15.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/a9/3abdf488f1bf3d24c699415e454ed554a6350d5d89ce183be1ee0a3361ac/ruff-0.15.17.tar.gz", hash = "sha256:2ec446937fd16c8c4de2674a209cc5af64d9c6f17d21fbf1151054fa0bcf5219", size = 4743346, upload-time = "2026-06-11T17:54:47.663Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/4d/e11259f5da07cb6afb2d074c31bf09da9671993f7329d4f15d2fdc458301/ruff-0.15.17-py3-none-linux_armv6l.whl", hash = "sha256:d9feddb927fc68bd295f5eebc587a7e42cfaf9b65f60ca4a2386febff575da8f", size = 10856677, upload-time = "2026-06-11T17:54:49.533Z" }, + { url = "https://files.pythonhosted.org/packages/29/3e/772d679e1a0dc058e58875bd2c0cb713a0530877b4a76fee3c7966df0d49/ruff-0.15.17-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:25805a226d741c47d274a35ad5c10a7dde175fcddfa511d7cf3da0a21eb3eab7", size = 11223443, upload-time = "2026-06-11T17:55:00.573Z" }, + { url = "https://files.pythonhosted.org/packages/68/58/bd41f7688b2fd5623012605130ed70e60aa7f2244baa3d5066bdd61530c8/ruff-0.15.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f6ad73b14c2d18a3bf8ad7cb6974294d7f613a7898604826058e6ac64918ef4d", size = 10566458, upload-time = "2026-06-11T17:55:07.52Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5b/733371013fcf1ec339e477ece6ab42bfe10bdd9bba8ee88a9516aa56bfc0/ruff-0.15.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ba0c1e4f95bcb3869d0d30cbd5917071ef2e28665abfec970cdab0492c713ed", size = 10914483, upload-time = "2026-06-11T17:55:05.501Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cc/6f24251cc0252f7239391ccb85833f320efad14ebe5b443943f37ced6332/ruff-0.15.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81647960f10bff57d2e51cadd0c3950fe598400c852863a038720ef5b8cca91e", size = 10647497, upload-time = "2026-06-11T17:54:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/68/dd/0d10c17ce1a1624d6fc3156309c3f834fdb5dfaad026ec90c85684f3990e/ruff-0.15.17-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e01a84ddbc8c16c23055ba3924476850f1bbc1917cebbb9376665a63e74260d", size = 11416967, upload-time = "2026-06-11T17:54:51.461Z" }, + { url = "https://files.pythonhosted.org/packages/2f/91/556bfb156f6144f355e831c23db00b2fc4120f86b3ce81cc5f7fd2df51f3/ruff-0.15.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fe9f653152f8f294f9f7e03bf3a453d8b4a27f7a59c78c8666167f2b17b96c", size = 12335770, upload-time = "2026-06-11T17:54:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/82/8b5999aa13355e926f06d9f42a32dcca862f623bf0363785ff89d607dffd/ruff-0.15.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c0fe88a7676e7a05b73174d4d4a59cb2ac21ff8263583f87a81a6018475a978", size = 11575441, upload-time = "2026-06-11T17:54:32.661Z" }, + { url = "https://files.pythonhosted.org/packages/11/93/f10377bb04109ca0e8cbc483ff1982c54b6d418210041776f93e8cdc7fa9/ruff-0.15.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecfc3c7878fff94633ab0348524e093f9ce3243080416dd7d14f8ba400174719", size = 11557614, upload-time = "2026-06-11T17:54:34.698Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a6/eeeae7f7d5493df41649ab3db92f086b2d0a30199e4efdf8e3dd7a033f24/ruff-0.15.17-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b8461180b22420b1bdc289909410930761629fddf2a5aaf60fae1ab26cedc4c4", size = 11544450, upload-time = "2026-06-11T17:54:39.042Z" }, + { url = "https://files.pythonhosted.org/packages/32/88/5991ce565129a24dd4a00db1254b3b5db2e53018cbe4018ea5a89738e727/ruff-0.15.17-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6eccbe50a038b503e7140b441aa9c7fc8c1f36edf23ebef9f4165c2f28f568b7", size = 10892524, upload-time = "2026-06-11T17:55:09.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/1d/0fdd248313425f55223968af04b0a42125466a8d88d21c1d99c6af0a51e8/ruff-0.15.17-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:382fc0521025f5a8ad447d8bdd523545d0d7646adb718eb1c2dac5065ec27c0f", size = 10659573, upload-time = "2026-06-11T17:54:36.824Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/072e8260deb9461062ce9311ced27a8e541229a6ffd483013dd37661e43e/ruff-0.15.17-py3-none-musllinux_1_2_i686.whl", hash = "sha256:456d41fcd1b2777ad63f09a6e7121d43f7b688bbc76a800c10f7f8fb1f912c3f", size = 11127818, upload-time = "2026-06-11T17:55:03.124Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b4/55060a34163121498014696b5f656db5b8c6963768f227dbf0d76b311073/ruff-0.15.17-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b1a04bcc94ae6194e9db05d16ad31f298a7194bfbcb08258bbe589cee1d587b8", size = 11655901, upload-time = "2026-06-11T17:54:53.562Z" }, + { url = "https://files.pythonhosted.org/packages/49/71/9b29d6b87cef468d697f43c6a91e3fae4a80185779d7d5a4ef27d173439f/ruff-0.15.17-py3-none-win32.whl", hash = "sha256:596065960ab1ff593f744220c9fe6580eda00a95003cffa9f4048bb5b1bf0392", size = 10925574, upload-time = "2026-06-11T17:54:55.723Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b2/8fc77f3723228836fa5d12497eb71c808f83782e10d058d2b15cfa14640b/ruff-0.15.17-py3-none-win_amd64.whl", hash = "sha256:6769e5fa1710b179b92e0bfa5a51735b35baea9013dadb06d5f44cbcf9547084", size = 12058788, upload-time = "2026-06-11T17:54:41.042Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c7/c53e8dbff9c9dc4b7928773421ae294a5d28fcb8dcda1a089579d3a7e510/ruff-0.15.17-py3-none-win_arm64.whl", hash = "sha256:f3be1fbb34bcdfd146240d8fb92a709d4c2c8191348580a3c044ec60fa0b4456", size = 11355275, upload-time = "2026-06-11T17:54:43.635Z" }, ] [[package]] @@ -1610,15 +1610,15 @@ wheels = [ [[package]] name = "starlette" -version = "1.2.1" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240, upload-time = "2026-06-12T09:23:11.602Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632, upload-time = "2026-06-12T09:23:10.017Z" }, ] [[package]] From 7d267fa1ee343712d6b8878dd8779fa6724b6cc2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 16 Jun 2026 19:15:16 -0500 Subject: [PATCH 2893/2998] docs(CHANGES): libtmux 0.58.1 floor bump Document the libtmux 0.58.1 requirement under the 1.71.0 unreleased block: a Dependencies floor bump and the pytest 9.1 plugin-import fix it pulls in. --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 35e90e910a..f2444bd1e8 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,16 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.58.1` (was `~=0.58.0`) (#1052) + +### Fixes + +#### pytest 9.1 plugin import compatibility (#1052) + +libtmux's pytest plugin aborted at import under pytest 9.1, breaking test collection for projects that use tmuxp's or libtmux's fixtures. Fixed by the libtmux 0.58.1 floor bump. + ## tmuxp 1.70.0 (2026-05-23) tmuxp 1.70.0 bumps libtmux to 0.58.0, fixing session and window listing on systems whose locale is not UTF-8. From 7e45c722ced84645d11dfa923c5d3146d5efe904 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 16 Jun 2026 19:31:05 -0500 Subject: [PATCH 2894/2998] Tag v1.70.1 Patch release raising the libtmux floor to 0.58.1, which fixes a pytest 9.1 plugin import failure that broke test collection for projects using tmuxp's or libtmux's fixtures (#1052). --- CHANGES | 4 ++++ pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index f2444bd1e8..0a0945cb71 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.70.1 (2026-06-16) + +tmuxp 1.70.1 bumps libtmux to 0.58.1, fixing a pytest 9.1 plugin import failure that broke test collection for projects using tmuxp's or libtmux's fixtures. + ### Dependencies #### Minimum `libtmux~=0.58.1` (was `~=0.58.0`) (#1052) diff --git a/pyproject.toml b/pyproject.toml index 7fe5c09b0f..646caf9397 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.70.0" +version = "1.70.1" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 06e39e62f3..2262f7d7b7 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.70.0" +__version__ = "1.70.1" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index fbdbababca..fbb5c81e8d 100644 --- a/uv.lock +++ b/uv.lock @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1623,7 +1623,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.70.0" +version = "1.70.1" source = { editable = "." } dependencies = [ { name = "libtmux" }, From 4f1e4d63f005967b5964bbac23e5cce2e3b9f84f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 20 Jun 2026 06:19:25 -0500 Subject: [PATCH 2895/2998] .tool-versions(uv, just) uv 0.11.21 -> 0.11.22, just 1.52 -> 1.53 - just - https://github.com/casey/just/blob/1.53.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.53.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.22 - https://github.com/astral-sh/uv/blob/0.11.22/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index ad5b21b029..bbebafefc0 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.52 -uv 0.11.21 +just 1.53 +uv 0.11.22 python 3.14 3.13 3.12 3.11 3.10 From b53527fb974a64829cca3bf5e4f930c28c93f3f9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 20 Jun 2026 06:25:29 -0500 Subject: [PATCH 2896/2998] py(deps[dev]) Bump dev packages --- uv.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/uv.lock b/uv.lock index fbb5c81e8d..f594b2c089 100644 --- a/uv.lock +++ b/uv.lock @@ -63,16 +63,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.13.0" +version = "4.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" }, ] [[package]] @@ -139,11 +139,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.5.20" +version = "2026.6.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, ] [[package]] @@ -417,7 +417,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From fc87d86b5fbf08089f5cf6b1e502ec3acb39a378 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 20 Jun 2026 09:58:07 -0500 Subject: [PATCH 2897/2998] ai(rules[AGENTS]) Cap title/body, space why/what why: Standardize commit guidance so titles stay scannable and bodies wrap predictably across repos. what: - Cap subject at 50 chars (excluding trailing (#NN) PR ref) - Wrap body lines at 72 chars - Require a blank line between the why: and what: blocks --- AGENTS.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index a11b5825c8..e8fe0fd1fe 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -123,11 +123,16 @@ Format commit messages as: Scope(type[detail]): concise description why: Explanation of necessity or impact. + what: - Specific technical changes made - Focused on a single topic ``` +Keep the subject ≤50 chars (excluding any trailing `(#NN)` PR ref); wrap +body lines at ≤72 chars. Separate the `why:` and `what:` blocks with a +blank line. + Common commit types: - **feat**: New features or enhancements - **fix**: Bug fixes @@ -147,6 +152,7 @@ Example: Pane(feat[send_keys]): Add support for literal flag why: Enable sending literal characters without tmux interpretation + what: - Add literal parameter to send_keys method - Update send_keys to pass -l flag when literal=True @@ -167,6 +173,7 @@ git commit -m "$(cat <<'EOF' feat(Component[method]) add feature description why: Explanation of the change. + what: - First change - Second change From 663c8d4beb6b1bad8743d1c00b66c43cb1e814b6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 05:21:43 -0500 Subject: [PATCH 2898/2998] .tool-versions(uv, just) uv 0.11.22 -> 0.11.25, just 1.53 -> 1.54 - just - https://github.com/casey/just/blob/1.54.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.54.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.25 - https://github.com/astral-sh/uv/blob/0.11.25/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index bbebafefc0..5bf1525d46 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.53 -uv 0.11.22 +just 1.54 +uv 0.11.25 python 3.14 3.13 3.12 3.11 3.10 From 466234d10cc36012c2f5e5a42af583282d8d6454 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 05:22:38 -0500 Subject: [PATCH 2899/2998] py(deps[dev]) Bump dev packages --- uv.lock | 251 ++++++++++++++++++++++++++------------------------------ 1 file changed, 118 insertions(+), 133 deletions(-) diff --git a/uv.lock b/uv.lock index f594b2c089..54ba87f6ad 100644 --- a/uv.lock +++ b/uv.lock @@ -287,115 +287,100 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, - { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, - { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, - { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, - { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, - { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, - { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, - { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, - { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, - { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, - { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, - { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, - { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, - { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, - { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, - { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, - { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, - { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, - { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, - { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, - { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, - { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, - { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, - { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, - { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, - { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, - { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, - { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, - { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, - { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, - { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, - { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, - { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, - { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, - { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, - { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, - { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, - { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, - { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, - { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, - { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, - { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, - { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, - { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, - { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, - { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, - { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, - { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, - { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, - { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, - { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, - { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, - { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, - { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, - { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, - { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, - { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, - { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, - { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +version = "7.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/91/0a7c28934e50d8ac9a7b117712d176f2953c3170bccced5eaacfa3e96175/coverage-7.14.3.tar.gz", hash = "sha256:1a7563a443f3d53fdeb040ec8c9f7466aed7ca3dc5891aa09d3ca3625fa4387f", size = 924398, upload-time = "2026-06-22T23:10:25.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/bd/b01188f0de73ee8b6597cf20c63fccd898ad31405772f15165cb61a62c00/coverage-7.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:360bec1f58e7243e3405d3bdf7a1a8115aa9b448d54dc7cd6f7b7e0e9406b62e", size = 220378, upload-time = "2026-06-22T23:07:38.925Z" }, + { url = "https://files.pythonhosted.org/packages/33/eb/f7aa3cb46500b709070c8d12335446971ec8b8c2ea155fea05d2000b4b1f/coverage-7.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed68faa5e85de2f3e400bc3f122e5c82735a58c8bb24b9f63a2215954ba17b2d", size = 220895, upload-time = "2026-06-22T23:07:41.536Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c0/b41b8499fc9060ca40ad2a197d301155be1ead398f0f0bfdb27b2b4a660f/coverage-7.14.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:830c1fca669c572dec37ce9c838224ee45aac5be0f6961edf871e82e49d6537c", size = 247631, upload-time = "2026-06-22T23:07:43.244Z" }, + { url = "https://files.pythonhosted.org/packages/da/bb/e9ecea1307c6a549c223842cccbd5d55193cc27b82f26338782d4355047c/coverage-7.14.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a64caee2193563601dbaaa55fe2dcf597debef04a2f8f1fa8a07aa4bb7ac7a1e", size = 249460, upload-time = "2026-06-22T23:07:45.147Z" }, + { url = "https://files.pythonhosted.org/packages/59/cb/3821542809b7b726296fd364ed1c23d10a5770f1469957010c3b4bc5d408/coverage-7.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0096fd7559178f0cc9cf088f2dbd2a02ef85bacaa69732c633517286b4494610", size = 251324, upload-time = "2026-06-22T23:07:46.875Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/f34f66f0ff152189ccc7b3f0582cf7909e239cb3b8c214362ed2149719b8/coverage-7.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6197e5a00183c11a8ce7c6abd18be1a9189fd8399084ffc95196f4f0db4f2137", size = 253237, upload-time = "2026-06-22T23:07:48.352Z" }, + { url = "https://files.pythonhosted.org/packages/22/81/aa363fa95d14fc892bd5de80edadc8d7cce584a0f6376f6336e492618e67/coverage-7.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7dfe427045520d6abca33687dfef767b4f635015893a1816c5decb12eb72ce18", size = 248344, upload-time = "2026-06-22T23:07:49.896Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/dc8a149441a3fea611cbbaf46bb12099adbe08f69903df1794581b0504b8/coverage-7.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9a3f142070eb7b82fc4085a55d887396f9c4e21250bccebe2ba22502c45b9647", size = 249365, upload-time = "2026-06-22T23:07:51.464Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a2/0004127deee122e020be24a4d86ce72fa14ae28198811b945aabf91293b5/coverage-7.14.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64b2055bb6e0dc945af35cdeceb3633e6ed9273475ef3af85592410fd6803803", size = 247369, upload-time = "2026-06-22T23:07:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/1e/72/3654c004f4df4f0c5a9643d9abaed5b26e5d3c1d0ecabe788786cb425efa/coverage-7.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1551b4caac3e3ec9f2bfcec6bf3776e01c0edbdd2e240431a50ca1a1aac72c27", size = 251182, upload-time = "2026-06-22T23:07:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2f/7bdcdf1e7c4d0632648852768063c25582a0a747bb5f8036a04e211e7eb7/coverage-7.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:583d50d59142f8549470bd6390471d0fe8b8c8d69d6a0f28ac71e05380cef640", size = 247639, upload-time = "2026-06-22T23:07:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/03/dc/0e01b071f69021d262a51ce39345dd6bc194465db0acfc7b34fd89e6b787/coverage-7.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0bb8a6bc7015efdf8a928753b25da1b9ca2d6f24ef04d2ee0688e486f32aae7", size = 248242, upload-time = "2026-06-22T23:07:57.692Z" }, + { url = "https://files.pythonhosted.org/packages/1c/51/08279e6ebe3479bf705db5fdc1a968e44ba1567e4cbc567f76b45f5e646e/coverage-7.14.3-cp310-cp310-win32.whl", hash = "sha256:d48400185564042287dc487c1f016a3397f18ab4f4c5d5ec36edc218f7ffa35b", size = 222431, upload-time = "2026-06-22T23:07:59.094Z" }, + { url = "https://files.pythonhosted.org/packages/40/2f/5c56670781fee5722ef0c415a74750c9a033bfacdb9d07b1493a0308108d/coverage-7.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:eadea7aba74e40adee867a8c0eec17b820b061d308a4b014f7a0e118c2b0aa61", size = 223059, upload-time = "2026-06-22T23:08:00.662Z" }, + { url = "https://files.pythonhosted.org/packages/f1/24/efb17eb94018dd3415d0e8a76a4786a866e8964aa9c50f033399d23939c2/coverage-7.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e574801e1d643561594aa021206c46d80b257e9853087090ba97bed8b0a509d3", size = 220501, upload-time = "2026-06-22T23:08:02.182Z" }, + { url = "https://files.pythonhosted.org/packages/76/93/32f1bfca6cdd34259c8af42820a034b7a28dfb44969a13ed38c17e0ba5b0/coverage-7.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f82b6bb7d75a2613e85d07cefa3a8c973d0544a8993337f6e2728e4a1e94c305", size = 221008, upload-time = "2026-06-22T23:08:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/eb/88/0d0f974855ff905d15a64f7873d00bdc4182e2736267486c6634f4af293c/coverage-7.14.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2335ea5fed26af2e831094964fa3f8fae60b45f7e37fcc2d3b615b2add3ad87", size = 251420, upload-time = "2026-06-22T23:08:05.211Z" }, + { url = "https://files.pythonhosted.org/packages/39/7f/117dd2ec65e4140576f8ef991d88220f9b806769f7a8c20e0550c0f924e2/coverage-7.14.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fbb8c3a98e779013786ae01d229662aeacbc77100efbd3f2f245219ace5af700", size = 253331, upload-time = "2026-06-22T23:08:06.672Z" }, + { url = "https://files.pythonhosted.org/packages/87/55/f0bd6d6538e3f16829fb8a44b6c0d2fe9da638bbfdd6a20f8b5da8f4fa81/coverage-7.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac082660de8f429ba0ea363595abb838998570b9a7546777c60f413ab902bbde", size = 255441, upload-time = "2026-06-22T23:08:08.208Z" }, + { url = "https://files.pythonhosted.org/packages/1e/98/aa71f7879019c846a8a9662579ea4484b0202cf1e252ffeed647075e7eca/coverage-7.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac012839ff7e396030f1e94e10553a431d14e4de2ab65cb3acb72bbd5628ca2", size = 257398, upload-time = "2026-06-22T23:08:09.749Z" }, + { url = "https://files.pythonhosted.org/packages/f3/4f/5fd367e59844190f5965015d7bee899e67a89d13eb2760118479bf836f2f/coverage-7.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5952f8c1bda2a5347154450379316e6dfa4d934d62ca35f6784451e6f55074fb", size = 251558, upload-time = "2026-06-22T23:08:11.37Z" }, + { url = "https://files.pythonhosted.org/packages/8f/de/5383a6ee5a6376701fe07d980fa8e4a66c0c377fead16712720340d701a3/coverage-7.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cf0f2509acb4619e2471a1951089054dd58ebea7a912066d2ea56dd4c24ca4a", size = 253134, upload-time = "2026-06-22T23:08:13.04Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/09542b1a99f788e3daec7f0fadc288821e71aca9ea298d51bfa1ba79fed5/coverage-7.14.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2e41fd3aab806770008279a93879b0924b16247e09ab537c043d08bbca53b4ab", size = 251195, upload-time = "2026-06-22T23:08:14.606Z" }, + { url = "https://files.pythonhosted.org/packages/02/9d/722fe8c13f0fbb064491b9e8656e56a606286792e5068c47ca1042e773e8/coverage-7.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f0a47095963cfe054e0df178daca95aec21e680d6076da807c3add28dfe920f7", size = 254959, upload-time = "2026-06-22T23:08:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/fb/58/943627179ff1d82da9e54d0a5b0bb907bb19cf19515599ccd921de50b469/coverage-7.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a090cbf9521e78ffdb2fcf448b72902afe9f5923ff6a12d5c0d0120200348af9", size = 250914, upload-time = "2026-06-22T23:08:18.03Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d4/803efcbf9ae5567454a0c71e983589529448e2704ee0da2dc0163d482f18/coverage-7.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d310baf69a4fbe8a098ce727e4808a34866ac718a6f759ae659cbd3221358bc", size = 251824, upload-time = "2026-06-22T23:08:19.704Z" }, + { url = "https://files.pythonhosted.org/packages/32/79/3f78ea9563132746eed5cecb75d2e576f9d8fec45a47242b5ae0950b82a3/coverage-7.14.3-cp311-cp311-win32.whl", hash = "sha256:74fdd718d88fe144f4579b8747873a07ec3f04cb837d5faec5a25d9e22fa31a8", size = 222594, upload-time = "2026-06-22T23:08:21.311Z" }, + { url = "https://files.pythonhosted.org/packages/85/22/9ebbc5a2ab42ac5d0eea1f48648629e1de9bbe41ec243ed6b93d55a5a53f/coverage-7.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:cc96aa922e21d4bc5d5ed3c915cef27dfcbc13686f47d5e378d647fbfba655a2", size = 223073, upload-time = "2026-06-22T23:08:23.318Z" }, + { url = "https://files.pythonhosted.org/packages/71/af/69d5fcc16cb555153f99cec5467922f226be0369f7335a9506856d2a7bd0/coverage-7.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:c66f9f9d4f1e9712eb9b1de5310f881d4e2188cfcba5065e1a8490f38687f2c4", size = 222617, upload-time = "2026-06-22T23:08:25.054Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b0/8a911f6ffe6974dac4df95b468ab9a2899d0e59f0f99a489afeec39f00bc/coverage-7.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d74ff26299c4879ce3a4d826f9d3d4d556fd285fde7bbce3c0ef5a8ab1cec24", size = 220672, upload-time = "2026-06-22T23:08:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/0fc0cb52538783dbbae0934b834f5a58fd5354380ee6cad4a07b15dc845d/coverage-7.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:96150a9cf3468ea20f0bc5d0e21b3df8972c31480ef90fa7614b773cc6429665", size = 221035, upload-time = "2026-06-22T23:08:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/77/e2/421ccfbb48335ac49e93301478cf5d623b0c2bf1c0cadd8e2b2fc6c0c710/coverage-7.14.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:27d07a46500ba23515b838dbcf52512026af04090755cf6cc64166d88c9b9a1a", size = 252540, upload-time = "2026-06-22T23:08:30.226Z" }, + { url = "https://files.pythonhosted.org/packages/06/c2/05b8c890097c61a7f4406b35396b997a635200ded0339eda83dfbe526c5f/coverage-7.14.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:621e13c6108234d7960aaf5762ab5c3c00f33c30c15af06dcbff0c73bf112727", size = 255274, upload-time = "2026-06-22T23:08:31.876Z" }, + { url = "https://files.pythonhosted.org/packages/dc/be/b6d9efe447f8ba3c3c854195f326bd64c54b907d936cd2fdebf8767ec72e/coverage-7.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b60ca6d8af70473491a15a343cbabab2e8f9ea66a4376e81c7aa24876a6f977", size = 256389, upload-time = "2026-06-22T23:08:33.843Z" }, + { url = "https://files.pythonhosted.org/packages/d4/3c/f26e50acc429e608bc534ac06f0a3c169019c798178ec5e9de3dbc0df9c9/coverage-7.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c90a7cdd5e380e1ce02f19792e2ac2fbfbf177e35a27e69fd3e873b30d895c0c", size = 258648, upload-time = "2026-06-22T23:08:35.481Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a2/01c1fabf816c8e1dae197e258edf878a3d3ddc86fbda34b76e5794277d8f/coverage-7.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d788e5fd55347eef06ca0732c77d04a264de67e8ff24631270cdff3767a60cf", size = 252949, upload-time = "2026-06-22T23:08:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/89/c6/941166dd79c31fd44a13063780ae8d552eee0089a0a0930b9bdb7df554ed/coverage-7.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62c7f79db2851c95ef020e5d28b97afde3daf9f7febcd35b53e05638f729063f", size = 254310, upload-time = "2026-06-22T23:08:39.174Z" }, + { url = "https://files.pythonhosted.org/packages/10/31/80b1fd028201a961033ce95be3cd1e39e521b3762e6b4a1ac1616cb291e7/coverage-7.14.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:90f7608aeb5d9b60b523b9fb2a4ee1973867cc4865a3f26fe6c7577073b70205", size = 252453, upload-time = "2026-06-22T23:08:40.84Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/c3d9addd94c4b524f3f4af0232075f5fe7170ce99a1386edff803e5934db/coverage-7.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1e3b91f9c4740aeb571ecf82e5e8d8e4ab62d34fcb5a5d4e5baa38c6f7d2857c", size = 256522, upload-time = "2026-06-22T23:08:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/14/e5a0575f73795af3a7a9ae13dadf812e17d32422896839987dc3f86947e1/coverage-7.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c946099774a7699de03cbd0ff0a64e21aed4525eed9d959adde4afe6d15758ef", size = 252023, upload-time = "2026-06-22T23:08:44.243Z" }, + { url = "https://files.pythonhosted.org/packages/38/9b/9652ee531937ce3b8a63a8896885b2b4a2d56adc30e53c9540c666286d88/coverage-7.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16b206e521feb8b7133a45754643dead0538489cf8b783b90cf5f4e3299625fd", size = 253893, upload-time = "2026-06-22T23:08:46.113Z" }, + { url = "https://files.pythonhosted.org/packages/b1/05/42678841c8c38e4b08bdfc48269f5a16dfbf5806000fe6a89b4cece3c691/coverage-7.14.3-cp312-cp312-win32.whl", hash = "sha256:ea3169c7116eb6cdf7608c6c7da9ecfcb3da40688e3a510fac2d1d2bafd6dc35", size = 222734, upload-time = "2026-06-22T23:08:47.858Z" }, + { url = "https://files.pythonhosted.org/packages/df/87/07a4fcee55177a25f1b52331a8e92cf4f2c53b1a9c75ce2981fd59c684ad/coverage-7.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:7ea52fc08f007bcc494d4bb3df3851e95843d881860ba38fe2c64dc100db5e7d", size = 223266, upload-time = "2026-06-22T23:08:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/aa/34/2b8b66a989282ea7b370beb49f50bab29470dc30bb0b03935b6b802782f7/coverage-7.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:8cec0ad652ec57790970d817490105bd917d783c2f7b38d6b58a0ca312e1a336", size = 222655, upload-time = "2026-06-22T23:08:51.766Z" }, + { url = "https://files.pythonhosted.org/packages/a9/83/7fefbf5df23ed2b7f489907564a7b34b9b07098128e12e0fdfa92626e456/coverage-7.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47968988b367990ae4ab17523790c38cd125e02c6bfd379b6022be2d40bdc38c", size = 220699, upload-time = "2026-06-22T23:08:53.522Z" }, + { url = "https://files.pythonhosted.org/packages/31/e6/38c3653ff6d56d704b29241362387ca824e38e15b76fdcb7096538195790/coverage-7.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0ee68f5c34812780f3a7063382c0a9fcbb99985b7ddcdcaa626e4f3fb2e0783a", size = 221068, upload-time = "2026-06-22T23:08:55.571Z" }, + { url = "https://files.pythonhosted.org/packages/20/86/4f5c45d51c5cd10a128933f0fd235393c9146abbfd2ce2dfa68b3267ead3/coverage-7.14.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fa9e5c6857a7e80fa22ace5cf3550ae392bbfc322f1d8dd2d2d5a8be38cec027", size = 252060, upload-time = "2026-06-22T23:08:57.464Z" }, + { url = "https://files.pythonhosted.org/packages/82/50/dfce42eff2cecabcd5a9bbad5489449c87db3415f408d23ffee417ce01f6/coverage-7.14.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98a0859b0e98e43e1178a9402e19c8127766b14f7109a374d976e5a62c0e5c73", size = 254657, upload-time = "2026-06-22T23:08:59.453Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d2/639ceb1bc8038fd0d66768278d5dc22df3391918b8278c2a21aa2602a531/coverage-7.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69918344541ed9c8368566c2adc03c0e33d4550d7faa87d1b35e49b6a3286ea9", size = 255892, upload-time = "2026-06-22T23:09:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/8b/96/002094a10e113512500dc1e10430a449417e17b0f90f7d496bcb820208b7/coverage-7.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f300ac92cd4b570724c8ffbbd0c130fee298d2447f41d5a3abf58976fae1de", size = 258026, upload-time = "2026-06-22T23:09:03.017Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ec/286a5d2fad9c4bee59bd724feeb7d5bf8303c6c9200b51d1dd945a9c72b0/coverage-7.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11a7ec9f97ab950f4c5af62229befc7faf208fdbc0116d3902d7e306cf2c5abd", size = 252285, upload-time = "2026-06-22T23:09:04.773Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/a17753a0b12dd48d0d50f5fab079ad99d3be1eac790494d89f3a417ca0b9/coverage-7.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a571bd889cd36c5922ce8e42e059f9d37d02301531d11374afa4c87a578625d5", size = 254023, upload-time = "2026-06-22T23:09:06.513Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/a76c6ceba6a2c313f905310abf2701d534cada22d372db11731831e9e209/coverage-7.14.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de76caefc8deabb0dd1678b6a980be97d14c8d87e213ac194dbf8b09e96d63fb", size = 251989, upload-time = "2026-06-22T23:09:08.382Z" }, + { url = "https://files.pythonhosted.org/packages/d9/39/353013a75fec0fb49f7553519f9d52b4441e902e5178c93f38eb6c07cedb/coverage-7.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d20a15c622194234161535459affa8f7905830391c9ccfa060d495dbfe3a1c7f", size = 256144, upload-time = "2026-06-22T23:09:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/29/0e/613878555d734def11c5b20a2701a15cb3781b9e9ea749da27c5f436e928/coverage-7.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b488bd4b23397db62e7a9459129d01ff06a846582a732efd24834b24a6ada498", size = 251808, upload-time = "2026-06-22T23:09:12.057Z" }, + { url = "https://files.pythonhosted.org/packages/af/76/359c058c9cfdcf1e8b107663881225b03b364a320017eda24a2a66e55102/coverage-7.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a3693b4153394d265f44fb855fdc80e72403024d4d6f91c4871b334d028e4e0", size = 253579, upload-time = "2026-06-22T23:09:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d9/4ba2f060933a30ebe363cef9f67a365b0a317e580c0d5d9169d56a73ef1c/coverage-7.14.3-cp313-cp313-win32.whl", hash = "sha256:338b19131ab1a6b767b462bfcbaa692e7ae22f24463e39d49b02a83410ff6b37", size = 222741, upload-time = "2026-06-22T23:09:15.636Z" }, + { url = "https://files.pythonhosted.org/packages/76/e8/196ebc25d8f34c06d43a6e9c8513c9266ef8dbf3b5672beb1a00cf5e29fa/coverage-7.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:b3d77f7f196abdef7e01415de1bce09f216189e83e58159cfeef2b92d0464994", size = 223283, upload-time = "2026-06-22T23:09:17.478Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/51d2aac6417523a286f10fb25f09eb9518a84df9f1151e93ff6871f34849/coverage-7.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:e6230e688c7c3e65cedd41a774eb4ec221adc6bfee13768231015b702d5e4150", size = 222678, upload-time = "2026-06-22T23:09:19.7Z" }, + { url = "https://files.pythonhosted.org/packages/61/56/14e3b97facbfa1304dd19e676e26599ad359f04714bed32f7f1c5a88efdc/coverage-7.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:605ab2b566a22bd94834529d66d295c364aba84afd3e5498285c7a524017b1fc", size = 220741, upload-time = "2026-06-22T23:09:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/12/1d/db378b5cca433b90b893f26dab728b280ddd89f272a1fdfed4aeaa05c686/coverage-7.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3c2134809e80fac091bfed18a6991b5a5eb5df5ae32b17ac4f4f99864b73dd7", size = 221068, upload-time = "2026-06-22T23:09:23.452Z" }, + { url = "https://files.pythonhosted.org/packages/47/f0/3f8421b20d9c4fcd39be9a8ca3c3fda8bc204b44efbd09fede153afd3e2f/coverage-7.14.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c02efd507227bde9969cab0db8f48890eb3b5dcad6afac57a4792df4133543ce", size = 252117, upload-time = "2026-06-22T23:09:25.458Z" }, + { url = "https://files.pythonhosted.org/packages/27/ca/59ea35fb99743549ec8b37eff141ece4431fea590c89e536ed8032ef45cf/coverage-7.14.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1bb93c2aa61d2a5b38f1526546d95cf4132cb681e541a337bf8dfd092be816e5", size = 254622, upload-time = "2026-06-22T23:09:27.523Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/ec6de51ae7493b92a1cf74d1b763121c29636759167e2a593ba4db5881e4/coverage-7.14.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f502e948e03e866538048bba081c075caaa62e5bda6ea5b7432e45f587eb462a", size = 255968, upload-time = "2026-06-22T23:09:29.43Z" }, + { url = "https://files.pythonhosted.org/packages/5d/05/c8bfc77823f42b4664fb25842f13b567022f6f84a4c83c8ecbb16734b7cb/coverage-7.14.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9973ef2463f8e6cfb61a6324126bb3e17d67a85f22f58d856e583ea2e3ca6501", size = 258284, upload-time = "2026-06-22T23:09:31.397Z" }, + { url = "https://files.pythonhosted.org/packages/f6/15/1d1b242027124a32b26ef01f82018b8c4ef34ef174aa6aeba7b1eeef48e8/coverage-7.14.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9be4e7d4c5ca0427889f8f9d614bd630c2be741b1de7699bca3b2b6c0e41003e", size = 252143, upload-time = "2026-06-22T23:09:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/74/b6/d2a9842fd2a5d7d27f1ac851c043a734a494ad75402c5331db3da79ed691/coverage-7.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a574912f3bde4b0619f6e97d01aa590b70998859244793769eb3a6df78ee56d3", size = 253976, upload-time = "2026-06-22T23:09:35.351Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/e1600ddf7e226db5558bb5323d2186fff00f505c4b764643ec89ce5d8175/coverage-7.14.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e343fb086c9cd780b38622fea7c369acd64c1a0724312149b5d769c387a2b1f5", size = 251942, upload-time = "2026-06-22T23:09:37.313Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2c/9159de64f9dd648e324328d588a44cfab1e331eb5259ce1141afe2a92dfb/coverage-7.14.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3c68df8e61f1e09633fefc7538297145623957a048534368c9d212782aa5e845", size = 256220, upload-time = "2026-06-22T23:09:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/91/67/b7f536cc2c124f48e91b22fbb741d2261f4e3d310faf6f76007f47566e5d/coverage-7.14.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3e5b550a128419373c2f6cec28a244207013ef15f5cbcff6a5ca09d1dfaaf027", size = 251756, upload-time = "2026-06-22T23:09:41.056Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ec/f3718038e2d4860c715a55428377ca7f6c75872caf98cabd982e1d76967d/coverage-7.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2bfc4dd0a912329eccc7484a7d0b2a38032b38c40663b1e1ac595f10c457954b", size = 253413, upload-time = "2026-06-22T23:09:43.306Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a5/91f11efeef89b3cc9b30461128db15b0511ef813ab889a7b7ab636b3a497/coverage-7.14.3-cp314-cp314-win32.whl", hash = "sha256:0423d64c013057a06e70f070f073cec4b0cbc7d2b27f3c7007292f2ff1d52965", size = 222946, upload-time = "2026-06-22T23:09:45.261Z" }, + { url = "https://files.pythonhosted.org/packages/58/fd/98ac9f524d9ec378de831c034dbdeb544ca7ef7d2d9c9996daf232a037fd/coverage-7.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:92c22e19ce64ca3f2ad751f16f14df1468b4c231bd6af97185063a9c292a0cb3", size = 223436, upload-time = "2026-06-22T23:09:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a0/7cd612d650a772a0ae80144443406bf61981c896c3d57c9e6e79fb2cdbd1/coverage-7.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:41de778bd41780586e2b04912079c73089ab5d839624e28db3bdb26de638da92", size = 222861, upload-time = "2026-06-22T23:09:49.384Z" }, + { url = "https://files.pythonhosted.org/packages/55/57/017353fab573779c0d00448e47d102edd36c792f7b6f233a4d89a7a08384/coverage-7.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8427f370ca67db4c975d2a26acfc0e5783ca0b52444dbc50278ace0f35445949", size = 221474, upload-time = "2026-06-22T23:09:51.417Z" }, + { url = "https://files.pythonhosted.org/packages/69/92/90cf1f1a5c468a9c1b7ba2716e0e205293ad9b02f5f573a6de4318b15ba1/coverage-7.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8e88f335544a47e22ae2e45b344772925ec65166555c958720d5ed971880891", size = 221738, upload-time = "2026-06-22T23:09:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c0/4df964fa539f8399fd7679c09c472d73744de334686fd3f01e3a2465ce4e/coverage-7.14.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:beaab199b9e5ceaf5a225e16a9d4df136f2a1eae0a5c20de1e277c8a5225f388", size = 263101, upload-time = "2026-06-22T23:09:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/06/76/e5d33b2576ae3bf2be2058cd1cae57774b61e400f2c3c58f3783dc2ffb4a/coverage-7.14.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3ff255799f5a1676c71c1c32ec01fd043aa09d57b3d95764b24992757184784", size = 265225, upload-time = "2026-06-22T23:09:57.904Z" }, + { url = "https://files.pythonhosted.org/packages/61/d2/e52419afe391a39ba27fdefaf0737d8e34bf03faef6ab3b3006545bbd0d0/coverage-7.14.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:878832eaac515b62decfa76965aed558775f86bf1fc8cca76993c0c84ae31aed", size = 267643, upload-time = "2026-06-22T23:09:59.938Z" }, + { url = "https://files.pythonhosted.org/packages/58/7a/f2625d8d5006b6b20fba5afaef00b24a763fe96476ea798a3076cbc1f84e/coverage-7.14.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:611e62cb9386096d81b63e0a05330750268617231e7bd598e1fe77482a2c58a5", size = 268762, upload-time = "2026-06-22T23:10:01.943Z" }, + { url = "https://files.pythonhosted.org/packages/7d/bf/908024006bba57127354d74e938954b9c3cd765cc2e0412dc9c37b415cda/coverage-7.14.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:02c41de2a88011b893050fc9830267d927a50a215f7ad5ec17349db7090ccf26", size = 262208, upload-time = "2026-06-22T23:10:03.954Z" }, + { url = "https://files.pythonhosted.org/packages/34/a0/d4f9296441b909817442fdb26bd77a698f08272ec683a7394b00eb2e47a0/coverage-7.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:526ce9721116af23b1065089f0b75046fe521e7772ab94b641cd66b7a0421889", size = 265096, upload-time = "2026-06-22T23:10:05.936Z" }, + { url = "https://files.pythonhosted.org/packages/e8/da/4ae4f3f4e477b56a4ce1e5c48a35eff38a94b50130ce5bdc897024741cfc/coverage-7.14.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e4ed44705ca4bead6fc977a8b741f2145608289b33c8a9b42a95d0f15aedbf4d", size = 262699, upload-time = "2026-06-22T23:10:07.973Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7a/6927148073ff32856d78baa77b4ddc07a9be7e90020f9db0661c4ca523a1/coverage-7.14.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2415902f385a23dcc4ccd26e0ba803249a169af6a930c003a4c715eeb9a5444e", size = 266433, upload-time = "2026-06-22T23:10:10.145Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a7/774f658dbe9c4c3f5daa86a87e0459ac3832e4e3cc67affe078547f727b9/coverage-7.14.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b75ee850fc2d7c831e883220c445b035f2224de2ba6103f1e56dbd237ab913f7", size = 261547, upload-time = "2026-06-22T23:10:12.191Z" }, + { url = "https://files.pythonhosted.org/packages/3d/14/a0c18c0376c43cbf973f43ef6ca20019c950597180e6396232f7b6a27102/coverage-7.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dc9b4e35e7c3920e925ba7f14886fd5fbe481232754624e832ddba66c7535635", size = 263859, upload-time = "2026-06-22T23:10:14.492Z" }, + { url = "https://files.pythonhosted.org/packages/10/ac/43a3d0f460af524b131a6191805bc5d18b806ab4e828fbf82e8c8c3af446/coverage-7.14.3-cp314-cp314t-win32.whl", hash = "sha256:7b27c822a8161afbe48e99f1adfb098d270ae7e0f7d7b0555ce110529bdb69cc", size = 223250, upload-time = "2026-06-22T23:10:16.758Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5f/d5e5c56b0712e96ce8f69fe7dbf229ff938b437bc50862743c8a0d2cea84/coverage-7.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:39e1dbbb6ff2c338e0196a482558a792a1de3aa64261196f5cdb3da016ad9cda", size = 224082, upload-time = "2026-06-22T23:10:19.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/35/947cbd5be1d3bcbbdc43d6791de8a56c6501903311d42915ae06a82815f0/coverage-7.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:68520c90babfa2d560eca6d497921ed3a4f469623bd709733124491b2aa8ef3f", size = 223400, upload-time = "2026-06-22T23:10:21.24Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e3/a0aa32bfa3a081951f60a23bc0e7b512891ef0eecda1153cf1d8ba36c6b1/coverage-7.14.3-py3-none-any.whl", hash = "sha256:fb7e18afb6e903c1a92401a2f0501ac277dca527bb9ca6fe1f691a8a0026a0e8", size = 212469, upload-time = "2026-06-22T23:10:23.405Z" }, ] [package.optional-dependencies] @@ -1021,7 +1006,7 @@ wheels = [ [[package]] name = "pytest" -version = "9.1.0" +version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1032,9 +1017,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/0e/b5858858d74958632c49b72cb25a3976ff9f632397626715be71c89d3971/pytest-9.1.0.tar.gz", hash = "sha256:41dd9148c08072446394cefd3d79701701335a9f4cae69ba92e39f6c7f5c061c", size = 1634181, upload-time = "2026-06-13T18:52:45.983Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/5a/ba30a81239b909821b3153e303e7def45178bf353da4f72380e6c5e8793b/pytest-9.1.0-py3-none-any.whl", hash = "sha256:8ebb0e7888bdf2bdfc602ec51f8f62d50200af37356c74e503c79a94f5c81f32", size = 386453, upload-time = "2026-06-13T18:52:44.045Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] @@ -1191,27 +1176,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.17" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/a9/3abdf488f1bf3d24c699415e454ed554a6350d5d89ce183be1ee0a3361ac/ruff-0.15.17.tar.gz", hash = "sha256:2ec446937fd16c8c4de2674a209cc5af64d9c6f17d21fbf1151054fa0bcf5219", size = 4743346, upload-time = "2026-06-11T17:54:47.663Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/4d/e11259f5da07cb6afb2d074c31bf09da9671993f7329d4f15d2fdc458301/ruff-0.15.17-py3-none-linux_armv6l.whl", hash = "sha256:d9feddb927fc68bd295f5eebc587a7e42cfaf9b65f60ca4a2386febff575da8f", size = 10856677, upload-time = "2026-06-11T17:54:49.533Z" }, - { url = "https://files.pythonhosted.org/packages/29/3e/772d679e1a0dc058e58875bd2c0cb713a0530877b4a76fee3c7966df0d49/ruff-0.15.17-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:25805a226d741c47d274a35ad5c10a7dde175fcddfa511d7cf3da0a21eb3eab7", size = 11223443, upload-time = "2026-06-11T17:55:00.573Z" }, - { url = "https://files.pythonhosted.org/packages/68/58/bd41f7688b2fd5623012605130ed70e60aa7f2244baa3d5066bdd61530c8/ruff-0.15.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f6ad73b14c2d18a3bf8ad7cb6974294d7f613a7898604826058e6ac64918ef4d", size = 10566458, upload-time = "2026-06-11T17:55:07.52Z" }, - { url = "https://files.pythonhosted.org/packages/d8/5b/733371013fcf1ec339e477ece6ab42bfe10bdd9bba8ee88a9516aa56bfc0/ruff-0.15.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ba0c1e4f95bcb3869d0d30cbd5917071ef2e28665abfec970cdab0492c713ed", size = 10914483, upload-time = "2026-06-11T17:55:05.501Z" }, - { url = "https://files.pythonhosted.org/packages/bd/cc/6f24251cc0252f7239391ccb85833f320efad14ebe5b443943f37ced6332/ruff-0.15.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81647960f10bff57d2e51cadd0c3950fe598400c852863a038720ef5b8cca91e", size = 10647497, upload-time = "2026-06-11T17:54:57.733Z" }, - { url = "https://files.pythonhosted.org/packages/68/dd/0d10c17ce1a1624d6fc3156309c3f834fdb5dfaad026ec90c85684f3990e/ruff-0.15.17-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e01a84ddbc8c16c23055ba3924476850f1bbc1917cebbb9376665a63e74260d", size = 11416967, upload-time = "2026-06-11T17:54:51.461Z" }, - { url = "https://files.pythonhosted.org/packages/2f/91/556bfb156f6144f355e831c23db00b2fc4120f86b3ce81cc5f7fd2df51f3/ruff-0.15.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fe9f653152f8f294f9f7e03bf3a453d8b4a27f7a59c78c8666167f2b17b96c", size = 12335770, upload-time = "2026-06-11T17:54:45.793Z" }, - { url = "https://files.pythonhosted.org/packages/88/82/8b5999aa13355e926f06d9f42a32dcca862f623bf0363785ff89d607dffd/ruff-0.15.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c0fe88a7676e7a05b73174d4d4a59cb2ac21ff8263583f87a81a6018475a978", size = 11575441, upload-time = "2026-06-11T17:54:32.661Z" }, - { url = "https://files.pythonhosted.org/packages/11/93/f10377bb04109ca0e8cbc483ff1982c54b6d418210041776f93e8cdc7fa9/ruff-0.15.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecfc3c7878fff94633ab0348524e093f9ce3243080416dd7d14f8ba400174719", size = 11557614, upload-time = "2026-06-11T17:54:34.698Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a6/eeeae7f7d5493df41649ab3db92f086b2d0a30199e4efdf8e3dd7a033f24/ruff-0.15.17-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:b8461180b22420b1bdc289909410930761629fddf2a5aaf60fae1ab26cedc4c4", size = 11544450, upload-time = "2026-06-11T17:54:39.042Z" }, - { url = "https://files.pythonhosted.org/packages/32/88/5991ce565129a24dd4a00db1254b3b5db2e53018cbe4018ea5a89738e727/ruff-0.15.17-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6eccbe50a038b503e7140b441aa9c7fc8c1f36edf23ebef9f4165c2f28f568b7", size = 10892524, upload-time = "2026-06-11T17:55:09.432Z" }, - { url = "https://files.pythonhosted.org/packages/f5/1d/0fdd248313425f55223968af04b0a42125466a8d88d21c1d99c6af0a51e8/ruff-0.15.17-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:382fc0521025f5a8ad447d8bdd523545d0d7646adb718eb1c2dac5065ec27c0f", size = 10659573, upload-time = "2026-06-11T17:54:36.824Z" }, - { url = "https://files.pythonhosted.org/packages/9e/0e/072e8260deb9461062ce9311ced27a8e541229a6ffd483013dd37661e43e/ruff-0.15.17-py3-none-musllinux_1_2_i686.whl", hash = "sha256:456d41fcd1b2777ad63f09a6e7121d43f7b688bbc76a800c10f7f8fb1f912c3f", size = 11127818, upload-time = "2026-06-11T17:55:03.124Z" }, - { url = "https://files.pythonhosted.org/packages/ab/b4/55060a34163121498014696b5f656db5b8c6963768f227dbf0d76b311073/ruff-0.15.17-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b1a04bcc94ae6194e9db05d16ad31f298a7194bfbcb08258bbe589cee1d587b8", size = 11655901, upload-time = "2026-06-11T17:54:53.562Z" }, - { url = "https://files.pythonhosted.org/packages/49/71/9b29d6b87cef468d697f43c6a91e3fae4a80185779d7d5a4ef27d173439f/ruff-0.15.17-py3-none-win32.whl", hash = "sha256:596065960ab1ff593f744220c9fe6580eda00a95003cffa9f4048bb5b1bf0392", size = 10925574, upload-time = "2026-06-11T17:54:55.723Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b2/8fc77f3723228836fa5d12497eb71c808f83782e10d058d2b15cfa14640b/ruff-0.15.17-py3-none-win_amd64.whl", hash = "sha256:6769e5fa1710b179b92e0bfa5a51735b35baea9013dadb06d5f44cbcf9547084", size = 12058788, upload-time = "2026-06-11T17:54:41.042Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c7/c53e8dbff9c9dc4b7928773421ae294a5d28fcb8dcda1a089579d3a7e510/ruff-0.15.17-py3-none-win_arm64.whl", hash = "sha256:f3be1fbb34bcdfd146240d8fb92a709d4c2c8191348580a3c044ec60fa0b4456", size = 11355275, upload-time = "2026-06-11T17:54:43.635Z" }, +version = "0.15.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/e6/15800dfde183a1a106594016c912b4c12d050a301989d1aca6cb63759fe8/ruff-0.15.19.tar.gz", hash = "sha256:edc27f7172a93b32b102687009d6a588508815072141543ae603a8b9b0823063", size = 4772071, upload-time = "2026-06-24T01:10:46.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/4c/9ded7626c39a0440c575bf69e2bf500d443388272c842662c59852ee7fcd/ruff-0.15.19-py3-none-linux_armv6l.whl", hash = "sha256:922d1eb283161564759bd49f507e91dc6112c15da8bd5b84ed714e086243cf86", size = 10950859, upload-time = "2026-06-24T01:10:38.491Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ef/c211505ece1d00ef493d58e54e3b6383c946a21e9874774eb531f2512cf3/ruff-0.15.19-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4d190d8f62a0b94aba8f721116538a9ee29b1e74d26650846ba9b99f0ae21c40", size = 11294529, upload-time = "2026-06-24T01:10:36.481Z" }, + { url = "https://files.pythonhosted.org/packages/fe/93/78d462e7d39968e58094dc57be7d09ffb14ce37da5b68ed70338a35a1f21/ruff-0.15.19-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5a2c86ba6870dd415a9d9eb8be94d7924ebec6a26ffc7958ec7ca29d4bff967d", size = 10641416, upload-time = "2026-06-24T01:10:48.923Z" }, + { url = "https://files.pythonhosted.org/packages/76/c4/5cb66cfd1f865d5cca908b86c93ac785e7f572193d3c7426079ca6643e24/ruff-0.15.19-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b432bc087264aea70fd25ac198918b70bd9e2aa0db4297b0bb91bbfbbc63ce", size = 11015582, upload-time = "2026-06-24T01:10:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/51/9f/8ecfaec10cf5eecd28fbc00ff4fb867db90a1be54bf3d39ebf93f893cd52/ruff-0.15.19-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8530a09d03b3a8c994f8b559a7dcdabc690bcd3f78ef276c38c83166798ebf56", size = 10744059, upload-time = "2026-06-24T01:10:32.48Z" }, + { url = "https://files.pythonhosted.org/packages/35/6b/983249d04562bc2d590edd75f32455cdb473affb3ba4bc8d883e939c697d/ruff-0.15.19-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87bf21fb3875fe69f0eacc825411657e2e85589cce633c35c0adf1113649c62b", size = 11568461, upload-time = "2026-06-24T01:10:17.435Z" }, + { url = "https://files.pythonhosted.org/packages/eb/39/bc7794f127b18f492a3b4ee82bba5a900c985ff13b72b46f46e3c171ba34/ruff-0.15.19-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b229cb3ef56ecc2c1c8ebeca64b7a7740ccaef40a9eb097e78dde5a8560b83", size = 12429690, upload-time = "2026-06-24T01:10:40.638Z" }, + { url = "https://files.pythonhosted.org/packages/0a/3b/0de6859e698ed11c8a49e765196c8d333599b6a546c0715df39b6ba1aa2e/ruff-0.15.19-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c754515be7b76afe6e7e62df7776709571bcfc1631183828afcf3bafa869e3", size = 11693067, upload-time = "2026-06-24T01:10:25.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/3d/0b1f30f84bee9ae6ae8d349c2ba8b6f4b040966744efdd3acc804ae7c024/ruff-0.15.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a498f82e0f4d8904c4e0aea5139cdfac1f39d19a3c51d491292f63a36e83b2e", size = 11616911, upload-time = "2026-06-24T01:10:44.809Z" }, + { url = "https://files.pythonhosted.org/packages/4d/eb/c90bd3dfc12eed9032c2c1bfe05105b93a1b2c8bce555db6308315b853ce/ruff-0.15.19-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:d48caa34488fb521fd0ef4aea2b0e8fe758298df044138f0d67b687a6a0d07ed", size = 11649343, upload-time = "2026-06-24T01:10:23.472Z" }, + { url = "https://files.pythonhosted.org/packages/82/91/01caa13602a2f12fae5edbe8caf78b3c1e6db1293132aee6959eecce095c/ruff-0.15.19-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4171b6613effa9363cd46dd4f75bd1827b6d1b946b5e278ed0c600d305379445", size = 10977610, upload-time = "2026-06-24T01:10:50.892Z" }, + { url = "https://files.pythonhosted.org/packages/3c/51/acb817922feab9ecbb3201377d4dbe7a25f1395e46545820061973f03468/ruff-0.15.19-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:27c15b2a241dd4d995557949a094fe78b8ad99122a38ccae1595849bcc947b3f", size = 10744900, upload-time = "2026-06-24T01:10:42.726Z" }, + { url = "https://files.pythonhosted.org/packages/84/bc/5c8ca46b8a7a3f2b16cfbec88721d772b1c93912904e8f8c2e49470fea63/ruff-0.15.19-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ed03b7862d68f0a8771d50ee129980cbf1b113f96e250b73954bc292f689e0bb", size = 11293560, upload-time = "2026-06-24T01:10:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/81/e0/4a888cbe4d5523b3f77a2b1fa043f46cfeba1b32eac35dcfadee0578fa8a/ruff-0.15.19-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:08143f0685ae278b30727ea72e90c61e5bd9c31b91aac4f5bb989538f73d24b8", size = 11696533, upload-time = "2026-06-24T01:10:53.046Z" }, + { url = "https://files.pythonhosted.org/packages/98/43/c34b2fcd79262a85161764a97aaca89c3e4f574340ab61430cefa2bdd2c1/ruff-0.15.19-py3-none-win32.whl", hash = "sha256:8f47f0f92952af2557212bb10cf3e695cd4cf28b2c6e42cdb18ec6c9ebfa19da", size = 10986299, upload-time = "2026-06-24T01:10:55.185Z" }, + { url = "https://files.pythonhosted.org/packages/22/e8/15fd23e02b2442b56b2026b455977bc3057aa34b26e6323d1e99e8531a9f/ruff-0.15.19-py3-none-win_amd64.whl", hash = "sha256:efeca47ee3f9d4a7162655a3b8e6ee4a878646044233978d4d2c1ff8cdd914f0", size = 12123473, upload-time = "2026-06-24T01:10:27.74Z" }, + { url = "https://files.pythonhosted.org/packages/30/66/9a73695e31eaee04f35d8475998bf8ab354465f9c638936d76111603dcc5/ruff-0.15.19-py3-none-win_arm64.whl", hash = "sha256:6c6b607466e47349332eb1d9be52fb1467423fc07c217341af41cd0f3f0573be", size = 11376779, upload-time = "2026-06-24T01:10:34.465Z" }, ] [[package]] From fd60dfcdfafd7697a576ad3f673258c5d8acce53 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 12:06:31 -0500 Subject: [PATCH 2900/2998] py(deps[dev]) Bump gp-libs v0.0.17 -> v0.0.18 why: Require gp-libs 0.0.18 (Sphinx _build/ doctest-collection fix). what: - Add gp-libs>=0.0.18 floor across dev/docs/testing groups - Relock --- pyproject.toml | 8 +-- uv.lock | 140 ++++++++++++++++++++++++------------------------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 646caf9397..2f558a9bc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,10 +60,10 @@ dev = [ "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ "sphinx-autodoc-api-style==0.0.1a31", - "gp-libs", # https://gp-libs.git-pull.com/ + "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing - "gp-libs", + "gp-libs>=0.0.18", "pytest", "pytest-rerunfailures", "pytest-mock", @@ -86,11 +86,11 @@ docs = [ "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ "sphinx-autodoc-api-style==0.0.1a31", - "gp-libs", # https://gp-libs.git-pull.com/ + "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] testing = [ - "gp-libs", + "gp-libs>=0.0.18", "pytest", "pytest-rerunfailures", "pytest-mock", diff --git a/uv.lock b/uv.lock index 54ba87f6ad..18352800f7 100644 --- a/uv.lock +++ b/uv.lock @@ -402,7 +402,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -428,16 +428,16 @@ wheels = [ [[package]] name = "gp-libs" -version = "0.0.17" +version = "0.0.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/38/00b2d342ee47102225054c0a3e9507e99a988bd6a89da3948f21bad4ddb0/gp_libs-0.0.17.tar.gz", hash = "sha256:e7f0fa2913f79d0403ae9c38468d02d28d8348edccba949de40dba8e72c419ce", size = 15159, upload-time = "2025-12-07T22:44:49.618Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/10/155b50d9aefeef98c590e605334864b069cfb14453a3d3d7395e05129c54/gp_libs-0.0.18.tar.gz", hash = "sha256:cd718110e156eee0efd0ec1c4016332d5839b077bc4fa9a56ca233a5dc232d5e", size = 15743, upload-time = "2026-06-27T16:35:18.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/f9/5d78d1dda9cb0f27d6f2305e95a58edbff935a62d53ec3227a3518cb4f72/gp_libs-0.0.17-py3-none-any.whl", hash = "sha256:7ce96d5e09980c0dc82062ab3e3b911600bd44da97a64fb78379f1af9a79d4d3", size = 16157, upload-time = "2025-12-07T22:44:48.036Z" }, + { url = "https://files.pythonhosted.org/packages/10/02/b5b58549a9f48740359260dc74dec6e8d506dfb70c0a91e641293ab70c39/gp_libs-0.0.18-py3-none-any.whl", hash = "sha256:7e59ef4644366f33517a580e827b9f7837e3c02ce470af8bb9995ba87c86a20f", size = 16371, upload-time = "2026-06-27T16:35:17.003Z" }, ] [[package]] @@ -631,7 +631,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version < '3.11'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ @@ -647,7 +647,7 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.11'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ @@ -837,12 +837,12 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "docutils", marker = "python_full_version < '3.11'" }, - { name = "jinja2", marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "mdit-py-plugins", marker = "python_full_version < '3.11'" }, - { name = "pyyaml", marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ @@ -858,12 +858,12 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ - { name = "docutils", marker = "python_full_version >= '3.11'" }, - { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "mdit-py-plugins", marker = "python_full_version >= '3.11'" }, - { name = "pyyaml", marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } wheels = [ @@ -1167,7 +1167,7 @@ name = "roman-numerals-py" version = "4.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "roman-numerals", marker = "python_full_version >= '3.11'" }, + { name = "roman-numerals" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/de96fca640f4f656eb79bbee0e79aeec52e3e0e359f8a3e6a0d366378b64/roman_numerals_py-4.1.0.tar.gz", hash = "sha256:f5d7b2b4ca52dd855ef7ab8eb3590f428c0b1ea480736ce32b01fef2a5f8daf9", size = 4274, upload-time = "2025-12-17T18:25:41.153Z" } wheels = [ @@ -1225,23 +1225,23 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version < '3.11'" }, - { name = "babel", marker = "python_full_version < '3.11'" }, - { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version < '3.11'" }, - { name = "imagesize", marker = "python_full_version < '3.11'" }, - { name = "jinja2", marker = "python_full_version < '3.11'" }, - { name = "packaging", marker = "python_full_version < '3.11'" }, - { name = "pygments", marker = "python_full_version < '3.11'" }, - { name = "requests", marker = "python_full_version < '3.11'" }, - { name = "snowballstemmer", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.11'" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ @@ -1257,23 +1257,23 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version >= '3.11'" }, - { name = "babel", marker = "python_full_version >= '3.11'" }, - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version >= '3.11'" }, - { name = "imagesize", marker = "python_full_version >= '3.11'" }, - { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "requests", marker = "python_full_version >= '3.11'" }, - { name = "roman-numerals-py", marker = "python_full_version >= '3.11'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals-py" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } wheels = [ @@ -1288,12 +1288,12 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "colorama", marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "starlette", marker = "python_full_version < '3.11'" }, - { name = "uvicorn", marker = "python_full_version < '3.11'" }, - { name = "watchfiles", marker = "python_full_version < '3.11'" }, - { name = "websockets", marker = "python_full_version < '3.11'" }, + { name = "colorama" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload-time = "2024-10-02T23:15:30.172Z" } wheels = [ @@ -1309,12 +1309,12 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "starlette", marker = "python_full_version >= '3.11'" }, - { name = "uvicorn", marker = "python_full_version >= '3.11'" }, - { name = "watchfiles", marker = "python_full_version >= '3.11'" }, - { name = "websockets", marker = "python_full_version >= '3.11'" }, + { name = "colorama" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" } }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e0/3c/a59a3a453d4133777f7ed2e83c80b7dc817d43c74b74298ca0af869662ad/sphinx_autobuild-2025.8.25.tar.gz", hash = "sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213", size = 15200, upload-time = "2025-08-25T18:44:55.436Z" } wheels = [ @@ -1398,7 +1398,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } wheels = [ @@ -1414,7 +1414,7 @@ resolution-markers = [ "python_full_version >= '3.11' and python_full_version < '3.15'", ] dependencies = [ - { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/7b/804f311da4663a4aecc6cf7abd83443f3d4ded970826d0c958edc77d4527/sphinx_design-0.7.0.tar.gz", hash = "sha256:d2a3f5b19c24b916adb52f97c5f00efab4009ca337812001109084a740ec9b7a", size = 2203582, upload-time = "2026-01-19T13:12:53.297Z" } wheels = [ @@ -1684,7 +1684,7 @@ dev = [ { name = "aafigure" }, { name = "codecov" }, { name = "coverage" }, - { name = "gp-libs" }, + { name = "gp-libs", specifier = ">=0.0.18" }, { name = "gp-sphinx", specifier = "==0.0.1a31" }, { name = "mypy" }, { name = "pillow" }, @@ -1703,7 +1703,7 @@ dev = [ ] docs = [ { name = "aafigure" }, - { name = "gp-libs" }, + { name = "gp-libs", specifier = ">=0.0.18" }, { name = "gp-sphinx", specifier = "==0.0.1a31" }, { name = "pillow" }, { name = "sphinx-autobuild" }, @@ -1718,7 +1718,7 @@ lint = [ { name = "types-pyyaml" }, ] testing = [ - { name = "gp-libs" }, + { name = "gp-libs", specifier = ">=0.0.18" }, { name = "pytest" }, { name = "pytest-mock" }, { name = "pytest-rerunfailures" }, From a6989fcbc4cd5849e330d79f4b62cf2a61402431 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 13:46:07 -0500 Subject: [PATCH 2901/2998] py(deps[libtmux]) Bump 0.58.1 -> 0.59.0 why: libtmux 0.59.0 adds tmux 3.7 support and works around an upstream tmux 3.7 regression where break-pane crashed the server with a NULL-pointer dereference. Picking it up lets tmuxp run on tmux 3.7. what: - Bump libtmux ~=0.58.1 -> ~=0.59.0 in pyproject.toml - Update uv.lock to libtmux 0.59.0 from PyPI libtmux 0.59.0 (2026-06-27): - Add tmux 3.7 to the tested version matrix (3.2a-3.7) - Fix: Pane.break_pane no longer crashes the tmux 3.7 server (#693) Release: https://github.com/tmux-python/libtmux/releases/tag/v0.59.0 Changelog: https://libtmux.git-pull.com/history.html#libtmux-0-59-0-2026-06-27 --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2f558a9bc0..15c64dcf09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.58.1", + "libtmux~=0.59.0", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index 18352800f7..4ccb34180c 100644 --- a/uv.lock +++ b/uv.lock @@ -604,11 +604,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.58.1" +version = "0.59.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/58/346776e0491ede33e1554a4bff9b545dbe9f3164e45abac483195938a1cf/libtmux-0.58.1.tar.gz", hash = "sha256:a294dd585aa419d4ecce36f3e55df656693743c97a0b5b5bb1e5fea31ada2482", size = 519541, upload-time = "2026-06-17T00:03:31.81Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/a3/4112c3e30f7620eaaef9e7445dc1c040a006ad83a071697136652014ea5a/libtmux-0.59.0.tar.gz", hash = "sha256:bc279de9626408a5460c752ef1cc1884fc93ad00f5cc43a6170f619bc1617cf1", size = 518313, upload-time = "2026-06-27T17:26:04.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/4d/e44ada32edfe947c40d4dfc596a6f5355400a16d08be06016bd754375e41/libtmux-0.58.1-py3-none-any.whl", hash = "sha256:ab0f47d03a59d674962bc23e36e188fcfa4a82b0f270d474afab519e3076839b", size = 113653, upload-time = "2026-06-17T00:03:30.48Z" }, + { url = "https://files.pythonhosted.org/packages/52/37/76d812918faaff95ec28c8f4c5cfacacb125a3ece4f33bd09357da3093c8/libtmux-0.59.0-py3-none-any.whl", hash = "sha256:c2525cbd4243a7d8ff0228f48696097b2cb53b2ee34267d9f9a88330d6f05c21", size = 113864, upload-time = "2026-06-27T17:26:03.171Z" }, ] [[package]] @@ -1670,7 +1670,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.58.1" }, + { name = "libtmux", specifier = "~=0.59.0" }, { name = "pyyaml", specifier = ">=6.0" }, ] From 5a7fd5401011ed9df598b0a2d574615b66ba54d1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 13:46:28 -0500 Subject: [PATCH 2902/2998] tests(builder): Match tmux 3.7 pane error wording why: tmux 3.7 reworded the pane-overflow error from "no space for new pane" to "size or position no space for a new pane". The issue-800 regression test pinned the old text and failed on tmux 3.7. what: - Widen the pytest.raises match to r"no space for (a )?new pane" so it matches both the pre-3.7 and 3.7 phrasings - Add a comment documenting the tmux 3.7 wording change --- tests/workspace/test_builder.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/workspace/test_builder.py b/tests/workspace/test_builder.py index da95168f46..007a489c16 100644 --- a/tests/workspace/test_builder.py +++ b/tests/workspace/test_builder.py @@ -1517,7 +1517,13 @@ def test_issue_800_default_size_many_windows( assert callable(builder.session.kill) builder.session.kill() - with pytest.raises(libtmux.exc.LibTmuxException, match="no space for new pane"): + # tmux 3.7 reworded this error from "no space for new pane" to + # "size or position no space for a new pane"; the optional "a " + # matches both wordings. + with pytest.raises( + libtmux.exc.LibTmuxException, + match=r"no space for (a )?new pane", + ): builder.build() return From b0bce620260bc507e4e201a11f1f9afda1f86c6b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 13:46:35 -0500 Subject: [PATCH 2903/2998] ci(tests[matrix]): Add tmux 3.7 to version grid why: libtmux 0.59.0 adds tmux 3.7 support, so tmuxp should verify it builds and tests cleanly against the new release. what: - Add '3.7' to the tmux-version build matrix alongside 3.2a-3.6 and master in .github/workflows/tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ac83d5b923..0e937801f9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: python-version: ['3.14'] - tmux-version: ['3.2a', '3.3a', '3.4', '3.5', '3.6', 'master'] + tmux-version: ['3.2a', '3.3a', '3.4', '3.5', '3.6', '3.7', 'master'] steps: - uses: actions/checkout@v6 From 03b6ee8be4d039582bbe1f67f993545d5b68fc10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 13:46:43 -0500 Subject: [PATCH 2904/2998] docs(CHANGES): libtmux 0.59.0 floor bump, tmux 3.7 why: Record the libtmux floor bump and tmux 3.7 support under the 1.71.0 unreleased block. The release lead paragraph and version header are added by the maintainer at tag time, not by this PR. what: - Record the libtmux ~=0.58.1 -> ~=0.59.0 floor bump under Dependencies - Note tmux 3.7 support under What's new, scoped to the user-visible change (supported version range) without CI, break-pane, or test mechanics --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 0a0945cb71..2d1fc0083b 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,16 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.59.0` (was `~=0.58.1`) (#1057) + +### What's new + +#### tmux 3.7 support (#1057) + +tmuxp now supports tmux 3.7, which joins 3.2a through 3.6 in the tested version range. There are no behavior changes for users on earlier tmux releases. + ## tmuxp 1.70.1 (2026-06-16) tmuxp 1.70.1 bumps libtmux to 0.58.1, fixing a pytest 9.1 plugin import failure that broke test collection for projects using tmuxp's or libtmux's fixtures. From c09372a30cf190f54334fc2c5d808a54d0f450dd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 14:12:36 -0500 Subject: [PATCH 2905/2998] Tag v1.71.0 Minor release bumping the libtmux floor to 0.59.0 and adding tmux 3.7 to the supported and tested version range (#1057). --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 2d1fc0083b..b198181ac6 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.71.0 (Yet to be released) +## tmuxp 1.72.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.71.0 (2026-06-27) + +tmuxp 1.71.0 bumps libtmux to 0.59.0, adding support for tmux 3.7. + ### Dependencies #### Minimum `libtmux~=0.59.0` (was `~=0.58.1`) (#1057) diff --git a/pyproject.toml b/pyproject.toml index 15c64dcf09..2c7ed93b32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.70.1" +version = "1.71.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 2262f7d7b7..9d3f60144f 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.70.1" +__version__ = "1.71.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index 4ccb34180c..3c73ad0934 100644 --- a/uv.lock +++ b/uv.lock @@ -1608,7 +1608,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.70.1" +version = "1.71.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From c706e5d82028264459f05357d2e7d33e406bdc47 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 27 Jun 2026 16:14:44 -0500 Subject: [PATCH 2906/2998] py(deps[dev]) Bump dev packages --- uv.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/uv.lock b/uv.lock index 3c73ad0934..71bb1214c4 100644 --- a/uv.lock +++ b/uv.lock @@ -63,16 +63,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.14.0" +version = "4.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/b5/001890774a9552aff22502b8da382593109ce0c95314abaebbb116567545/anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89", size = 253586, upload-time = "2026-06-15T22:00:49.021Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/16/9826f089383c593cdfc4a6e5aca94d9e91ae1692c57af82c3b2aa5e810f7/anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9", size = 123506, upload-time = "2026-06-15T22:00:47.595Z" }, + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, ] [[package]] @@ -253,14 +253,14 @@ wheels = [ [[package]] name = "click" -version = "8.4.1" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, ] [[package]] From 1a17e17d1b85838bf27fefb0221ecd814731a9b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:18:48 -0500 Subject: [PATCH 2907/2998] py(deps[dev]) Bump dev packages --- uv.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/uv.lock b/uv.lock index 71bb1214c4..22a2d8b86d 100644 --- a/uv.lock +++ b/uv.lock @@ -1176,27 +1176,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.19" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d5/e6/15800dfde183a1a106594016c912b4c12d050a301989d1aca6cb63759fe8/ruff-0.15.19.tar.gz", hash = "sha256:edc27f7172a93b32b102687009d6a588508815072141543ae603a8b9b0823063", size = 4772071, upload-time = "2026-06-24T01:10:46.942Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/4c/9ded7626c39a0440c575bf69e2bf500d443388272c842662c59852ee7fcd/ruff-0.15.19-py3-none-linux_armv6l.whl", hash = "sha256:922d1eb283161564759bd49f507e91dc6112c15da8bd5b84ed714e086243cf86", size = 10950859, upload-time = "2026-06-24T01:10:38.491Z" }, - { url = "https://files.pythonhosted.org/packages/fb/ef/c211505ece1d00ef493d58e54e3b6383c946a21e9874774eb531f2512cf3/ruff-0.15.19-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4d190d8f62a0b94aba8f721116538a9ee29b1e74d26650846ba9b99f0ae21c40", size = 11294529, upload-time = "2026-06-24T01:10:36.481Z" }, - { url = "https://files.pythonhosted.org/packages/fe/93/78d462e7d39968e58094dc57be7d09ffb14ce37da5b68ed70338a35a1f21/ruff-0.15.19-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5a2c86ba6870dd415a9d9eb8be94d7924ebec6a26ffc7958ec7ca29d4bff967d", size = 10641416, upload-time = "2026-06-24T01:10:48.923Z" }, - { url = "https://files.pythonhosted.org/packages/76/c4/5cb66cfd1f865d5cca908b86c93ac785e7f572193d3c7426079ca6643e24/ruff-0.15.19-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b432bc087264aea70fd25ac198918b70bd9e2aa0db4297b0bb91bbfbbc63ce", size = 11015582, upload-time = "2026-06-24T01:10:30.089Z" }, - { url = "https://files.pythonhosted.org/packages/51/9f/8ecfaec10cf5eecd28fbc00ff4fb867db90a1be54bf3d39ebf93f893cd52/ruff-0.15.19-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8530a09d03b3a8c994f8b559a7dcdabc690bcd3f78ef276c38c83166798ebf56", size = 10744059, upload-time = "2026-06-24T01:10:32.48Z" }, - { url = "https://files.pythonhosted.org/packages/35/6b/983249d04562bc2d590edd75f32455cdb473affb3ba4bc8d883e939c697d/ruff-0.15.19-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87bf21fb3875fe69f0eacc825411657e2e85589cce633c35c0adf1113649c62b", size = 11568461, upload-time = "2026-06-24T01:10:17.435Z" }, - { url = "https://files.pythonhosted.org/packages/eb/39/bc7794f127b18f492a3b4ee82bba5a900c985ff13b72b46f46e3c171ba34/ruff-0.15.19-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b229cb3ef56ecc2c1c8ebeca64b7a7740ccaef40a9eb097e78dde5a8560b83", size = 12429690, upload-time = "2026-06-24T01:10:40.638Z" }, - { url = "https://files.pythonhosted.org/packages/0a/3b/0de6859e698ed11c8a49e765196c8d333599b6a546c0715df39b6ba1aa2e/ruff-0.15.19-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c754515be7b76afe6e7e62df7776709571bcfc1631183828afcf3bafa869e3", size = 11693067, upload-time = "2026-06-24T01:10:25.681Z" }, - { url = "https://files.pythonhosted.org/packages/89/3d/0b1f30f84bee9ae6ae8d349c2ba8b6f4b040966744efdd3acc804ae7c024/ruff-0.15.19-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a498f82e0f4d8904c4e0aea5139cdfac1f39d19a3c51d491292f63a36e83b2e", size = 11616911, upload-time = "2026-06-24T01:10:44.809Z" }, - { url = "https://files.pythonhosted.org/packages/4d/eb/c90bd3dfc12eed9032c2c1bfe05105b93a1b2c8bce555db6308315b853ce/ruff-0.15.19-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:d48caa34488fb521fd0ef4aea2b0e8fe758298df044138f0d67b687a6a0d07ed", size = 11649343, upload-time = "2026-06-24T01:10:23.472Z" }, - { url = "https://files.pythonhosted.org/packages/82/91/01caa13602a2f12fae5edbe8caf78b3c1e6db1293132aee6959eecce095c/ruff-0.15.19-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4171b6613effa9363cd46dd4f75bd1827b6d1b946b5e278ed0c600d305379445", size = 10977610, upload-time = "2026-06-24T01:10:50.892Z" }, - { url = "https://files.pythonhosted.org/packages/3c/51/acb817922feab9ecbb3201377d4dbe7a25f1395e46545820061973f03468/ruff-0.15.19-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:27c15b2a241dd4d995557949a094fe78b8ad99122a38ccae1595849bcc947b3f", size = 10744900, upload-time = "2026-06-24T01:10:42.726Z" }, - { url = "https://files.pythonhosted.org/packages/84/bc/5c8ca46b8a7a3f2b16cfbec88721d772b1c93912904e8f8c2e49470fea63/ruff-0.15.19-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ed03b7862d68f0a8771d50ee129980cbf1b113f96e250b73954bc292f689e0bb", size = 11293560, upload-time = "2026-06-24T01:10:21.262Z" }, - { url = "https://files.pythonhosted.org/packages/81/e0/4a888cbe4d5523b3f77a2b1fa043f46cfeba1b32eac35dcfadee0578fa8a/ruff-0.15.19-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:08143f0685ae278b30727ea72e90c61e5bd9c31b91aac4f5bb989538f73d24b8", size = 11696533, upload-time = "2026-06-24T01:10:53.046Z" }, - { url = "https://files.pythonhosted.org/packages/98/43/c34b2fcd79262a85161764a97aaca89c3e4f574340ab61430cefa2bdd2c1/ruff-0.15.19-py3-none-win32.whl", hash = "sha256:8f47f0f92952af2557212bb10cf3e695cd4cf28b2c6e42cdb18ec6c9ebfa19da", size = 10986299, upload-time = "2026-06-24T01:10:55.185Z" }, - { url = "https://files.pythonhosted.org/packages/22/e8/15fd23e02b2442b56b2026b455977bc3057aa34b26e6323d1e99e8531a9f/ruff-0.15.19-py3-none-win_amd64.whl", hash = "sha256:efeca47ee3f9d4a7162655a3b8e6ee4a878646044233978d4d2c1ff8cdd914f0", size = 12123473, upload-time = "2026-06-24T01:10:27.74Z" }, - { url = "https://files.pythonhosted.org/packages/30/66/9a73695e31eaee04f35d8475998bf8ab354465f9c638936d76111603dcc5/ruff-0.15.19-py3-none-win_arm64.whl", hash = "sha256:6c6b607466e47349332eb1d9be52fb1467423fc07c217341af41cd0f3f0573be", size = 11376779, upload-time = "2026-06-24T01:10:34.465Z" }, +version = "0.15.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, + { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, + { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, + { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, + { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, + { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, ] [[package]] From 845bf67778fef94a45b8bf80a12931e7824568f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:25:21 -0500 Subject: [PATCH 2908/2998] py(deps[libtmux]) Bump 0.59.0 -> 0.60.0 why: libtmux 0.60.0 completes tmux 3.7 feature parity, adding floating panes, typed 3.7 options, new pane format variables, and new command flags. Every 3.7-only surface is version-gated, so tmux 3.2a-3.6 keep working unchanged. The bump is purely additive for tmuxp, requiring no code or test migration. what: - Bump libtmux ~=0.59.0 -> ~=0.60.0 in pyproject.toml - Update uv.lock to libtmux 0.60.0 from PyPI libtmux 0.60.0 (2026-06-28): - Floating panes via Window.new_pane()/Pane.new_pane() (#694) - Typed tmux 3.7 server/session/window/pane options (#694) - New tmux 3.7 pane format variables on Pane (#694) - New tmux 3.7 command flags on capture_pane/split/kill and more (#694) Release: https://github.com/tmux-python/libtmux/releases/tag/v0.60.0 Changelog: https://libtmux.git-pull.com/history.html#libtmux-0-60-0-2026-06-28 --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2c7ed93b32..729b18e03d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.59.0", + "libtmux~=0.60.0", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index 22a2d8b86d..00c043e21d 100644 --- a/uv.lock +++ b/uv.lock @@ -604,11 +604,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.59.0" +version = "0.60.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/a3/4112c3e30f7620eaaef9e7445dc1c040a006ad83a071697136652014ea5a/libtmux-0.59.0.tar.gz", hash = "sha256:bc279de9626408a5460c752ef1cc1884fc93ad00f5cc43a6170f619bc1617cf1", size = 518313, upload-time = "2026-06-27T17:26:04.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/e2/c2fc23e871855cb3feb5119ab3426656b2caa83f220fb6f1b7a770cb887e/libtmux-0.60.0.tar.gz", hash = "sha256:03d9740fd18090378a1f1a763403b127808b327b1466a1d3812c562f595ce06f", size = 527549, upload-time = "2026-06-28T21:19:35.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/37/76d812918faaff95ec28c8f4c5cfacacb125a3ece4f33bd09357da3093c8/libtmux-0.59.0-py3-none-any.whl", hash = "sha256:c2525cbd4243a7d8ff0228f48696097b2cb53b2ee34267d9f9a88330d6f05c21", size = 113864, upload-time = "2026-06-27T17:26:03.171Z" }, + { url = "https://files.pythonhosted.org/packages/63/c3/e524f498fe5dfc26c975ec8b52332fdd0b50e020f3ecc09423ba5d4ebc61/libtmux-0.60.0-py3-none-any.whl", hash = "sha256:a085e5653709d9e1c809c68f7daf1cd55c8af1ca938eb1e866388b9b13905ed3", size = 117368, upload-time = "2026-06-28T21:19:33.635Z" }, ] [[package]] @@ -1670,7 +1670,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.59.0" }, + { name = "libtmux", specifier = "~=0.60.0" }, { name = "pyyaml", specifier = ">=6.0" }, ] From b2d843bb268ae386982a42175fdf2660f1ac92b9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:28:13 -0500 Subject: [PATCH 2909/2998] docs(CHANGES): libtmux 0.60.0 floor bump why: Record the libtmux ~=0.59.0 -> ~=0.60.0 floor bump under the 1.72.0 unreleased block. The release lead paragraph and version header are added by the maintainer at tag time, not by this PR. what: - Record the libtmux ~=0.59.0 -> ~=0.60.0 floor bump under Dependencies - Note tmux 3.7 feature parity (floating panes, typed options, new pane format vars and command flags) under What's new, scoped to the user-visible libtmux surface without internal mechanics --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index b198181ac6..5bbba5c1f6 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,16 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.60.0` (was `~=0.59.0`) (#1065) + +### What's new + +#### libtmux 0.60.0 completes tmux 3.7 feature parity (#1065) + +The libtmux floor bump brings tmux 3.7 feature parity to the library layer tmuxp builds on: floating panes ({meth}`~libtmux.Window.new_pane`), typed tmux 3.7 server, session, window, and pane options, new pane format variables, and new tmux 3.7 command flags. Every 3.7-only surface is version-gated, so tmux 3.2a-3.6 are unaffected. These APIs are reachable through tmuxp's Python API and `tmuxp shell`; the YAML workspace format is unchanged. + ## tmuxp 1.71.0 (2026-06-27) tmuxp 1.71.0 bumps libtmux to 0.59.0, adding support for tmux 3.7. From 4b28ce1c02e4a4e98793fa0d18e7f019a48e83a1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:53:50 -0500 Subject: [PATCH 2910/2998] Tag v1.72.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minor release bumping the libtmux floor to 0.60.0, which completes tmux 3.7 feature parity at the library layer tmuxp builds on (#1065). The new libtmux capabilities — floating panes, typed tmux 3.7 options, new pane format variables, and new command flags — are reachable through tmuxp's Python API and tmux shell; the YAML workspace format and tmux 3.2a-3.6 support are unchanged. --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 5bbba5c1f6..8c1a395d00 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.72.0 (Yet to be released) +## tmuxp 1.73.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.72.0 (2026-06-28) + +tmuxp 1.72.0 bumps libtmux to 0.60.0, completing tmux 3.7 feature parity at the library layer tmuxp builds on. The new libtmux capabilities — floating panes, typed tmux 3.7 options, new pane format variables, and new command flags — are reachable through tmuxp's Python API and `tmuxp shell`, while the YAML workspace format and tmux 3.2a-3.6 support stay unchanged. + ### Dependencies #### Minimum `libtmux~=0.60.0` (was `~=0.59.0`) (#1065) diff --git a/pyproject.toml b/pyproject.toml index 729b18e03d..e3360098f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.71.0" +version = "1.72.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 9d3f60144f..2aa569d6cf 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.71.0" +__version__ = "1.72.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index 00c043e21d..d366553884 100644 --- a/uv.lock +++ b/uv.lock @@ -1608,7 +1608,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.71.0" +version = "1.72.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From 443006873a2975f3351a5ff6967d0416e0da4fca Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 12:30:23 -0500 Subject: [PATCH 2911/2998] exc(feat): add builder resolution errors why: Resolving a workspace builder by dotted path, entry point, or trusted import path needs actionable errors that do not leak machine-specific paths. what: - Add WorkspaceBuilderError base plus WorkspaceBuilderNotFound, WorkspaceBuilderImportError, InvalidWorkspaceBuilder, and WorkspaceBuilderPathError under WorkspaceError --- src/tmuxp/exc.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/tmuxp/exc.py b/src/tmuxp/exc.py index 545038d7ca..59b69cbb7d 100644 --- a/src/tmuxp/exc.py +++ b/src/tmuxp/exc.py @@ -94,6 +94,85 @@ def __init__(self, *args: object, **kwargs: object) -> None: return super().__init__("No session active.", *args, **kwargs) +class WorkspaceBuilderError(WorkspaceError): + """Base error for resolving and validating a workspace builder.""" + + +class WorkspaceBuilderNotFound(WorkspaceBuilderError): + """Configured ``workspace_builder`` could not be resolved.""" + + def __init__( + self, + target: str, + available: list[str] | None = None, + *args: object, + **kwargs: object, + ) -> None: + msg = f"Workspace builder {target!r} could not be found." + if available: + names = ", ".join(sorted(available)) + msg += f" Available entry point builders: {names}." + else: + msg += ( + " Provide a Python dotted path (e.g. 'package.module:Builder') " + "or register an entry point in the 'tmuxp.workspace_builders' group." + ) + return super().__init__(msg, *args, **kwargs) + + +class WorkspaceBuilderImportError(WorkspaceBuilderError): + """Configured ``workspace_builder`` failed to import.""" + + def __init__( + self, + target: str, + reason: str | None = None, + paths: list[str] | None = None, + *args: object, + **kwargs: object, + ) -> None: + msg = f"Could not import workspace builder {target!r}." + if reason: + msg += f" {reason}" + if paths: + msg += f" Searched trusted paths: {', '.join(paths)}." + msg += ( + " Confirm the builder is importable, or add its directory to " + "'workspace_builder_paths'." + ) + return super().__init__(msg, *args, **kwargs) + + +class InvalidWorkspaceBuilder(WorkspaceBuilderError): + """Resolved ``workspace_builder`` object is not a usable builder.""" + + def __init__( + self, + target: str, + reason: str | None = None, + *args: object, + **kwargs: object, + ) -> None: + msg = f"{target!r} is not a valid workspace builder" + msg += f": {reason}" if reason else "." + return super().__init__(msg, *args, **kwargs) + + +class WorkspaceBuilderPathError(WorkspaceBuilderError): + """A ``workspace_builder_paths`` entry is not a usable directory.""" + + def __init__( + self, + path: str, + reason: str | None = None, + *args: object, + **kwargs: object, + ) -> None: + msg = f"workspace_builder_paths entry is invalid: {path}." + msg += f" {reason}" if reason else " Each entry must be an existing directory." + return super().__init__(msg, *args, **kwargs) + + class TmuxpPluginException(TmuxpException): """Base Exception for Tmuxp Errors.""" From 8503fc9e5965ee3720b48bd77c2c552f82a44c92 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 12:30:29 -0500 Subject: [PATCH 2912/2998] workspace(feat): add builder options catalog why: Builder behavior (starting with pane readiness) needs a config home separate from tmux's options/global_options/environment catalogs, and extensible for future builders. what: - Add workspace/options.py with the PaneReadiness policy (auto/always/never plus truthy/falsy aliases), WorkspaceBuilderOptions, and zsh-aware shell detection helpers - Add unit tests for parsing and shell resolution --- src/tmuxp/workspace/options.py | 225 ++++++++++++++++++++++++++++++++ tests/workspace/test_options.py | 115 ++++++++++++++++ 2 files changed, 340 insertions(+) create mode 100644 src/tmuxp/workspace/options.py create mode 100644 tests/workspace/test_options.py diff --git a/src/tmuxp/workspace/options.py b/src/tmuxp/workspace/options.py new file mode 100644 index 0000000000..0719b4dc09 --- /dev/null +++ b/src/tmuxp/workspace/options.py @@ -0,0 +1,225 @@ +"""Behavior options for tmuxp workspace builders. + +The ``workspace_builder_options`` config catalog holds settings that tune how a +workspace builder runs, independent of *which* builder is selected. It is a +sibling to the tmux ``options`` / ``global_options`` / ``environment`` catalogs +and is the home for builder-behavior knobs (today: pane readiness; later: +parallel/async builder settings). + +Example +------- +.. code-block:: yaml + + workspace_builder_options: + pane_readiness: auto # auto | always | never (+ truthy/falsy aliases) +""" + +from __future__ import annotations + +import dataclasses +import enum +import os +import typing as t + +_AUTO_ALIASES = frozenset({"auto"}) +_ALWAYS_ALIASES = frozenset({"always", "true", "on", "yes", "1"}) +_NEVER_ALIASES = frozenset({"never", "false", "off", "no", "0"}) + + +class PaneReadiness(enum.Enum): + """Policy for whether the builder waits for a pane's shell prompt. + + tmuxp waits for each default-shell pane to draw its prompt before + dispatching layout and commands, which avoids a zsh prompt-redraw artifact + (see :func:`tmuxp.workspace.builder.classic._wait_for_pane_ready`). The wait + is only needed for zsh, so the default :attr:`AUTO` policy waits only when + the session's interactive shell is zsh. + """ + + AUTO = "auto" + ALWAYS = "always" + NEVER = "never" + + @classmethod + def from_config(cls, value: t.Any) -> PaneReadiness: + """Parse a ``pane_readiness`` config value into a policy. + + Accepts the canonical ``auto`` / ``always`` / ``never`` strings, plus + the truthy/falsy aliases users expect from boolean-like config keys. + + Parameters + ---------- + value : Any + value from ``workspace_builder_options.pane_readiness``; ``None`` + (key absent) resolves to :attr:`AUTO` + + Returns + ------- + PaneReadiness + + Examples + -------- + >>> PaneReadiness.from_config(None) is PaneReadiness.AUTO + True + >>> PaneReadiness.from_config("auto") is PaneReadiness.AUTO + True + >>> PaneReadiness.from_config(True) is PaneReadiness.ALWAYS + True + >>> PaneReadiness.from_config("on") is PaneReadiness.ALWAYS + True + >>> PaneReadiness.from_config(1) is PaneReadiness.ALWAYS + True + >>> PaneReadiness.from_config(False) is PaneReadiness.NEVER + True + >>> PaneReadiness.from_config("never") is PaneReadiness.NEVER + True + + Unknown values raise an actionable error: + + >>> PaneReadiness.from_config("sometimes") + Traceback (most recent call last): + ... + ValueError: invalid pane_readiness value: 'sometimes'; expected one of: + auto, always/true/on/yes/1, never/false/off/no/0 + """ + if value is None: + return cls.AUTO + if isinstance(value, cls): + return value + if isinstance(value, bool): + return cls.ALWAYS if value else cls.NEVER + normalized = str(value).strip().lower() + if normalized in _AUTO_ALIASES: + return cls.AUTO + if normalized in _ALWAYS_ALIASES: + return cls.ALWAYS + if normalized in _NEVER_ALIASES: + return cls.NEVER + msg = ( + f"invalid pane_readiness value: {value!r}; expected one of: " + "auto, always/true/on/yes/1, never/false/off/no/0" + ) + raise ValueError(msg) + + +@dataclasses.dataclass(frozen=True) +class WorkspaceBuilderOptions: + """Parsed ``workspace_builder_options`` catalog. + + An absent ``workspace_builder_options`` catalog uses the defaults, whose + :attr:`PaneReadiness.AUTO` policy waits for a pane's prompt only when the + session shell is zsh: zsh workspaces build as before, while bash, sh, and + other shells skip the wait. Set ``pane_readiness: always`` to restore the + previous wait-everywhere behavior. + """ + + pane_readiness: PaneReadiness = PaneReadiness.AUTO + """pane-prompt wait policy; defaults to :attr:`PaneReadiness.AUTO`""" + + @classmethod + def from_config(cls, session_config: dict[str, t.Any]) -> WorkspaceBuilderOptions: + """Build options from a full workspace ``session_config`` dict. + + Reads the optional ``workspace_builder_options`` catalog; an absent or + empty catalog yields the defaults (see the class docstring for how the + default :attr:`PaneReadiness.AUTO` policy affects non-zsh shells). + + Parameters + ---------- + session_config : dict + the expanded workspace configuration + + Returns + ------- + WorkspaceBuilderOptions + + Examples + -------- + >>> WorkspaceBuilderOptions.from_config({}).pane_readiness + + + >>> cfg = {"workspace_builder_options": {"pane_readiness": "always"}} + >>> WorkspaceBuilderOptions.from_config(cfg).pane_readiness + + """ + catalog = session_config.get("workspace_builder_options") or {} + if not isinstance(catalog, dict): + msg = ( + "workspace_builder_options must be a mapping, got " + f"{type(catalog).__name__}" + ) + raise TypeError(msg) + return cls( + pane_readiness=PaneReadiness.from_config(catalog.get("pane_readiness")), + ) + + +def shell_is_zsh(shell: str | None) -> bool: + """Return ``True`` when ``shell`` names the zsh shell. + + Parameters + ---------- + shell : str or None + a shell path or name (e.g. ``/usr/bin/zsh``) + + Returns + ------- + bool + + Examples + -------- + >>> shell_is_zsh("/usr/bin/zsh") + True + >>> shell_is_zsh("/bin/bash") + False + >>> shell_is_zsh(None) + False + """ + return "zsh" in (shell or "") + + +def resolve_session_shell( + session: t.Any, + env: t.Mapping[str, str] | None = None, +) -> str: + """Resolve the effective interactive shell for a tmux session. + + Prefers tmux's ``default-shell`` option (which reflects a workspace's + ``options.default-shell`` once applied, otherwise tmux's global default), + and falls back to the ``SHELL`` environment variable. + + Parameters + ---------- + session : :class:`libtmux.Session` + live session exposing ``show_option("default-shell")`` + env : Mapping, optional + environment mapping for the ``SHELL`` fallback; defaults to + :data:`os.environ` + + Returns + ------- + str + resolved shell path/name, or ``""`` when undeterminable + + Examples + -------- + >>> class FakeSession: + ... def __init__(self, shell): + ... self._shell = shell + ... def show_option(self, name, **kwargs): + ... return self._shell + + The tmux ``default-shell`` wins when set: + + >>> resolve_session_shell(FakeSession("/usr/bin/zsh"), env={}) + '/usr/bin/zsh' + + The ``SHELL`` env var is the fallback: + + >>> resolve_session_shell(FakeSession(None), env={"SHELL": "/bin/bash"}) + '/bin/bash' + """ + default_shell = session.show_option("default-shell") + environ = os.environ if env is None else env + env_shell = environ.get("SHELL", "") + return str(default_shell or env_shell or "") diff --git a/tests/workspace/test_options.py b/tests/workspace/test_options.py new file mode 100644 index 0000000000..c6eaecf39f --- /dev/null +++ b/tests/workspace/test_options.py @@ -0,0 +1,115 @@ +"""Tests for workspace builder options (:mod:`tmuxp.workspace.options`).""" + +from __future__ import annotations + +import typing as t + +import pytest + +from tmuxp.workspace.options import ( + PaneReadiness, + WorkspaceBuilderOptions, + resolve_session_shell, + shell_is_zsh, +) + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + (None, PaneReadiness.AUTO), + ("auto", PaneReadiness.AUTO), + ("AUTO", PaneReadiness.AUTO), + (True, PaneReadiness.ALWAYS), + ("always", PaneReadiness.ALWAYS), + ("on", PaneReadiness.ALWAYS), + ("yes", PaneReadiness.ALWAYS), + ("1", PaneReadiness.ALWAYS), + (1, PaneReadiness.ALWAYS), + (False, PaneReadiness.NEVER), + ("never", PaneReadiness.NEVER), + ("off", PaneReadiness.NEVER), + ("no", PaneReadiness.NEVER), + ("0", PaneReadiness.NEVER), + (0, PaneReadiness.NEVER), + (PaneReadiness.ALWAYS, PaneReadiness.ALWAYS), + ], +) +def test_pane_readiness_from_config(value: t.Any, expected: PaneReadiness) -> None: + """from_config maps canonical values and truthy/falsy aliases.""" + assert PaneReadiness.from_config(value) is expected + + +@pytest.mark.parametrize("value", ["sometimes", "maybe", "2", ""]) +def test_pane_readiness_from_config_invalid(value: str) -> None: + """from_config rejects unknown values with an actionable error.""" + with pytest.raises(ValueError, match="pane_readiness"): + PaneReadiness.from_config(value) + + +def test_workspace_builder_options_defaults() -> None: + """An absent catalog yields AUTO readiness.""" + assert WorkspaceBuilderOptions.from_config({}).pane_readiness is PaneReadiness.AUTO + cfg = {"session_name": "x", "windows": []} + assert WorkspaceBuilderOptions.from_config(cfg).pane_readiness is PaneReadiness.AUTO + + +def test_workspace_builder_options_reads_catalog() -> None: + """from_config reads pane_readiness from the catalog.""" + cfg = {"workspace_builder_options": {"pane_readiness": "never"}} + options = WorkspaceBuilderOptions.from_config(cfg) + assert options.pane_readiness is PaneReadiness.NEVER + + +def test_workspace_builder_options_invalid_catalog_type() -> None: + """A non-mapping catalog is rejected.""" + with pytest.raises(TypeError, match="must be a mapping"): + WorkspaceBuilderOptions.from_config({"workspace_builder_options": ["nope"]}) + + +@pytest.mark.parametrize( + ("shell", "expected"), + [ + ("/usr/bin/zsh", True), + ("/bin/zsh", True), + ("zsh", True), + ("/bin/bash", False), + ("/bin/sh", False), + ("", False), + (None, False), + ], +) +def test_shell_is_zsh(shell: str | None, expected: bool) -> None: + """shell_is_zsh detects zsh by name.""" + assert shell_is_zsh(shell) is expected + + +class _FakeSession: + """Minimal stand-in exposing ``show_option`` for shell resolution.""" + + def __init__(self, shell: str | None) -> None: + self._shell = shell + + def show_option(self, name: str, **kwargs: t.Any) -> str | None: + """Return the canned default-shell value.""" + return self._shell + + +def test_resolve_session_shell_prefers_default_shell() -> None: + """The tmux default-shell wins over $SHELL.""" + shell = resolve_session_shell( + _FakeSession("/usr/bin/zsh"), + env={"SHELL": "/bin/bash"}, + ) + assert shell == "/usr/bin/zsh" + + +def test_resolve_session_shell_falls_back_to_env() -> None: + """$SHELL is the fallback when default-shell is empty.""" + shell = resolve_session_shell(_FakeSession(None), env={"SHELL": "/bin/bash"}) + assert shell == "/bin/bash" + + +def test_resolve_session_shell_empty_when_unknown() -> None: + """Returns an empty string when neither source resolves.""" + assert resolve_session_shell(_FakeSession(None), env={}) == "" From 0afcbb93682de55bbc97da607e719d60656b5123 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:10:51 -0500 Subject: [PATCH 2913/2998] workspace(feat): builder package + protocol why: Separate builder selection from build behavior. Make the classic builder explicit so a workspace can later choose a different builder, and define a public contract third-party builders implement. what: - Convert workspace/builder.py into a package; rename WorkspaceBuilder to ClassicWorkspaceBuilder in builder/classic.py, keeping a backwards-compatible WorkspaceBuilder alias - Add builder/protocol.py (WorkspaceBuilderProtocol, async-extensible) - Gate pane readiness on WorkspaceBuilderOptions: auto waits only for zsh, always/never force the choice - Point doctest tmux fixtures at builder.classic --- conftest.py | 2 +- src/tmuxp/workspace/builder/__init__.py | 31 +++++ .../{builder.py => builder/classic.py} | 63 ++++++++-- src/tmuxp/workspace/builder/protocol.py | 108 ++++++++++++++++++ 4 files changed, 192 insertions(+), 12 deletions(-) create mode 100644 src/tmuxp/workspace/builder/__init__.py rename src/tmuxp/workspace/{builder.py => builder/classic.py} (92%) create mode 100644 src/tmuxp/workspace/builder/protocol.py diff --git a/conftest.py b/conftest.py index 1f0583439e..ad606b5342 100644 --- a/conftest.py +++ b/conftest.py @@ -114,7 +114,7 @@ def socket_name(request: pytest.FixtureRequest) -> str: # Modules that actually need tmux fixtures in their doctests DOCTEST_NEEDS_TMUX = { - "tmuxp.workspace.builder", + "tmuxp.workspace.builder.classic", } diff --git a/src/tmuxp/workspace/builder/__init__.py b/src/tmuxp/workspace/builder/__init__.py new file mode 100644 index 0000000000..d7158e978c --- /dev/null +++ b/src/tmuxp/workspace/builder/__init__.py @@ -0,0 +1,31 @@ +"""Workspace builders: turn an expanded workspace ``dict`` into a tmux session. + +:class:`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` is the default +implementation. A workspace may select a different builder with the +``workspace_builder`` config key, resolved by +:mod:`tmuxp.workspace.builder.registry`. + +``WorkspaceBuilder`` remains importable here as a backwards-compatible alias of +:class:`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. +""" + +from __future__ import annotations + +from tmuxp.workspace.builder.classic import ( + ClassicWorkspaceBuilder, + get_default_columns, + get_default_rows, +) +from tmuxp.workspace.builder.protocol import WorkspaceBuilderProtocol + +# Backwards-compatible alias: the classic builder was historically named +# ``WorkspaceBuilder`` and imported from ``tmuxp.workspace.builder``. +WorkspaceBuilder = ClassicWorkspaceBuilder + +__all__ = [ + "ClassicWorkspaceBuilder", + "WorkspaceBuilder", + "WorkspaceBuilderProtocol", + "get_default_columns", + "get_default_rows", +] diff --git a/src/tmuxp/workspace/builder.py b/src/tmuxp/workspace/builder/classic.py similarity index 92% rename from src/tmuxp/workspace/builder.py rename to src/tmuxp/workspace/builder/classic.py index 728b477963..f4d209bfd3 100644 --- a/src/tmuxp/workspace/builder.py +++ b/src/tmuxp/workspace/builder/classic.py @@ -17,6 +17,12 @@ from tmuxp import exc from tmuxp.log import TmuxpLoggerAdapter from tmuxp.util import get_current_pane, run_before_script +from tmuxp.workspace.options import ( + PaneReadiness, + WorkspaceBuilderOptions, + resolve_session_shell, + shell_is_zsh, +) if t.TYPE_CHECKING: from collections.abc import Iterator @@ -101,7 +107,7 @@ def get_default_rows() -> int: return int(os.getenv("TMUXP_DEFAULT_ROWS", os.getenv("ROWS", ROWS_FALLBACK))) -class WorkspaceBuilder: +class ClassicWorkspaceBuilder: """Load workspace from workspace :py:obj:`dict` object. Build tmux workspace from a configuration. Creates and names windows, sets options, @@ -134,7 +140,7 @@ class WorkspaceBuilder: ... - cmd: htop ... ''', Loader=yaml.Loader) - >>> builder = WorkspaceBuilder(session_config=session_config, server=server) + >>> builder = ClassicWorkspaceBuilder(session_config=session_config, server=server) **New session:** @@ -176,7 +182,7 @@ class WorkspaceBuilder: ... "session_name": "progress-demo", ... "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], ... } - >>> builder = WorkspaceBuilder( + >>> builder = ClassicWorkspaceBuilder( ... session_config=progress_cfg, ... server=server, ... on_progress=calls.append, @@ -192,7 +198,7 @@ class WorkspaceBuilder: ... "session_name": "hook-demo", ... "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], ... } - >>> builder = WorkspaceBuilder( + >>> builder = ClassicWorkspaceBuilder( ... session_config=no_script_cfg, ... server=server, ... on_before_script=lambda: hook_calls.append(True), @@ -208,7 +214,7 @@ class WorkspaceBuilder: ... "session_name": "script-output-demo", ... "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], ... } - >>> builder = WorkspaceBuilder( + >>> builder = ClassicWorkspaceBuilder( ... session_config=no_script_cfg2, ... server=server, ... on_script_output=script_lines.append, @@ -224,7 +230,7 @@ class WorkspaceBuilder: ... "session_name": "events-demo", ... "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], ... } - >>> builder = WorkspaceBuilder( + >>> builder = ClassicWorkspaceBuilder( ... session_config=event_cfg, ... server=server, ... on_build_event=events.append, @@ -247,7 +253,7 @@ class WorkspaceBuilder: ... "before_script": "echo hello", ... "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], ... } - >>> builder = WorkspaceBuilder( + >>> builder = ClassicWorkspaceBuilder( ... session_config=script_event_cfg, ... server=server, ... on_build_event=script_events.append, @@ -297,7 +303,9 @@ class WorkspaceBuilder: their panes, returning full :class:`libtmux.Window` and :class:`libtmux.Pane` objects each step of the way:: - workspace = WorkspaceBuilder(session_config=session_config, server=server) + workspace = ClassicWorkspaceBuilder( + session_config=session_config, server=server + ) It handles the magic of cases where the user may want to start a session inside tmux (when `$TMUX` is in the env variables). @@ -310,6 +318,8 @@ class WorkspaceBuilder: on_before_script: t.Callable[[], None] | None on_script_output: t.Callable[[str], None] | None on_build_event: t.Callable[[dict[str, t.Any]], None] | None + _builder_options: WorkspaceBuilderOptions + _pane_readiness_wait: bool def __init__( self, @@ -373,6 +383,14 @@ def __init__( self.on_script_output = on_script_output self.on_build_event = on_build_event + # Builder-behavior catalog (e.g. pane readiness). Parsed eagerly so an + # invalid value fails fast; the readiness decision itself needs a live + # session and is resolved in build(). + self._builder_options = WorkspaceBuilderOptions.from_config(session_config) + # Safe default for direct iter_create_panes() use that bypasses build(); + # build() replaces this with the policy-resolved value. + self._pane_readiness_wait = True + if self.server is not None and self.session_exists( session_name=self.session_config["session_name"], ): @@ -425,7 +443,7 @@ def build(self, session: Session | None = None, append: bool = False) -> None: if not session: if not self.server: msg = ( - "WorkspaceBuilder.build requires server to be passed " + "ClassicWorkspaceBuilder.build requires server to be passed " "on initialization, or pass in session object to here." ) raise exc.TmuxpException( @@ -538,6 +556,27 @@ def build(self, session: Session | None = None, append: bool = False) -> None: for option, value in self.session_config["environment"].items(): self.session.set_environment(option, value) + # Resolve the pane-readiness decision once, now that the session exists + # and any config `options.default-shell` has been applied above. AUTO + # waits only for zsh (the shell the prompt-redraw wait was added for); + # ALWAYS/NEVER force the choice. + readiness = self._builder_options.pane_readiness + if readiness is PaneReadiness.ALWAYS: + self._pane_readiness_wait = True + elif readiness is PaneReadiness.NEVER: + self._pane_readiness_wait = False + else: # PaneReadiness.AUTO + self._pane_readiness_wait = shell_is_zsh( + resolve_session_shell(self.session), + ) + _log.debug( + "pane readiness resolved", + extra={ + "pane_readiness": readiness.value, + "pane_readiness_wait": self._pane_readiness_wait, + }, + ) + for window, window_config in self.iter_create_windows(session, append): assert isinstance(window, Window) @@ -781,9 +820,11 @@ def get_pane_shell( # Skip readiness wait when a custom shell/command launcher is set. # The shell/window_shell key runs a command (e.g. "top", "sleep 999") # that replaces the default shell — the pane exits when the command - # exits, so there is no interactive prompt to wait for. + # exits, so there is no interactive prompt to wait for. The + # pane_readiness policy (resolved in build()) further gates whether + # default-shell panes wait at all. pane_shell = pane_config.get("shell", window_config.get("window_shell")) - if pane_shell is None: + if pane_shell is None and self._pane_readiness_wait: _wait_for_pane_ready(pane) if "layout" in window_config: diff --git a/src/tmuxp/workspace/builder/protocol.py b/src/tmuxp/workspace/builder/protocol.py new file mode 100644 index 0000000000..0557bf7849 --- /dev/null +++ b/src/tmuxp/workspace/builder/protocol.py @@ -0,0 +1,108 @@ +"""Public contract for tmuxp workspace builders. + +A workspace builder turns an expanded workspace ``dict`` into a live tmux +session. :class:`tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` is the +default implementation; third parties may ship their own and select them with +the ``workspace_builder`` config key (see +:mod:`tmuxp.workspace.builder.registry`). + +This module is intentionally dependency-light (typing only) so builder authors +can import the contract without pulling in tmuxp's resolution machinery. + +The contract is synchronous today. Async builders are an *additive* future +extension: a subclass protocol can declare an ``async`` build entry point and a +capability flag, discovered through the same entry-point group, without +changing this sync surface. +""" + +from __future__ import annotations + +import typing as t + +if t.TYPE_CHECKING: + from libtmux.server import Server + from libtmux.session import Session + + +@t.runtime_checkable +class WorkspaceBuilderProtocol(t.Protocol): + """Contract a builder must satisfy to be driven by ``tmuxp load``. + + A conforming builder is constructed with at least ``session_config`` and + ``server`` (plus the optional ``plugins`` and ``on_*`` callbacks the classic + builder accepts). It exposes :meth:`build`, surfaces the populated tmux + session via :attr:`session`, and honors the plugin/progress integration + points the CLI drives. + + Because the protocol carries data members (``session``, ``plugins``, the + ``on_*`` callbacks), validate *instances* with :func:`isinstance`; + class-level ``issubclass`` checks are not supported for runtime-checkable + protocols with non-method members. + + Examples + -------- + A builder implementing the full contract satisfies the protocol: + + >>> from tmuxp.workspace.builder.protocol import WorkspaceBuilderProtocol + >>> class MiniBuilder: + ... plugins: list = [] + ... on_progress = None + ... on_before_script = None + ... on_script_output = None + ... on_build_event = None + ... def __init__(self, session_config, server, **kwargs): + ... self._session_config = session_config + ... def build(self, session=None, append=False): + ... ... + ... def session_exists(self, session_name): + ... ... + ... def find_current_attached_session(self): + ... ... + ... @property + ... def session(self): + ... ... + >>> builder = MiniBuilder(session_config={}, server=None) + >>> isinstance(builder, WorkspaceBuilderProtocol) + True + + An object missing the contract does not: + + >>> isinstance(object(), WorkspaceBuilderProtocol) + False + """ + + plugins: list[t.Any] + on_progress: t.Callable[[str], None] | None + on_before_script: t.Callable[[], None] | None + on_script_output: t.Callable[[str], None] | None + on_build_event: t.Callable[[dict[str, t.Any]], None] | None + + def __init__( + self, + session_config: dict[str, t.Any], + server: Server, + plugins: list[t.Any] | None = None, + on_progress: t.Callable[[str], None] | None = None, + on_before_script: t.Callable[[], None] | None = None, + on_script_output: t.Callable[[str], None] | None = None, + on_build_event: t.Callable[[dict[str, t.Any]], None] | None = None, + ) -> None: + """Construct a builder from an expanded workspace and a tmux server.""" + ... + + @property + def session(self) -> Session: + """Return the tmux session the builder created or populated.""" + ... + + def build(self, session: Session | None = None, append: bool = False) -> None: + """Build the workspace, creating or populating a tmux session.""" + ... + + def session_exists(self, session_name: str) -> bool: + """Return ``True`` if a session with ``session_name`` already exists.""" + ... + + def find_current_attached_session(self) -> Session: + """Return the session currently attached within ``$TMUX``.""" + ... From 33eb1b698a702deb6cb2a1e73ec945e87ba8a8a4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:11:13 -0500 Subject: [PATCH 2914/2998] workspace(feat): builder registry + sys.path sandbox why: A workspace selects a builder by name or import path, and a builder may live outside tmuxp's environment. Resolution and trusted imports belong in one place, separate from the builder itself. what: - Add builder/registry.py: resolve_builder_class (module:attr, dotted path, or tmuxp.workspace_builders entry point), resolve_builder_paths, available_builders, and a prepended_sys_path sandbox (no site.addsitedir) - Export the registry surface from the builder package --- src/tmuxp/workspace/builder/__init__.py | 12 + src/tmuxp/workspace/builder/registry.py | 325 ++++++++++++++++++++++++ 2 files changed, 337 insertions(+) create mode 100644 src/tmuxp/workspace/builder/registry.py diff --git a/src/tmuxp/workspace/builder/__init__.py b/src/tmuxp/workspace/builder/__init__.py index d7158e978c..469a5308e9 100644 --- a/src/tmuxp/workspace/builder/__init__.py +++ b/src/tmuxp/workspace/builder/__init__.py @@ -17,15 +17,27 @@ get_default_rows, ) from tmuxp.workspace.builder.protocol import WorkspaceBuilderProtocol +from tmuxp.workspace.builder.registry import ( + WORKSPACE_BUILDERS_GROUP, + available_builders, + prepended_sys_path, + resolve_builder_class, + resolve_builder_paths, +) # Backwards-compatible alias: the classic builder was historically named # ``WorkspaceBuilder`` and imported from ``tmuxp.workspace.builder``. WorkspaceBuilder = ClassicWorkspaceBuilder __all__ = [ + "WORKSPACE_BUILDERS_GROUP", "ClassicWorkspaceBuilder", "WorkspaceBuilder", "WorkspaceBuilderProtocol", + "available_builders", "get_default_columns", "get_default_rows", + "prepended_sys_path", + "resolve_builder_class", + "resolve_builder_paths", ] diff --git a/src/tmuxp/workspace/builder/registry.py b/src/tmuxp/workspace/builder/registry.py new file mode 100644 index 0000000000..595f134d13 --- /dev/null +++ b/src/tmuxp/workspace/builder/registry.py @@ -0,0 +1,325 @@ +"""Resolve and sandbox workspace builders selected by a workspace config. + +A workspace may point tmuxp at a builder other than the classic +:class:`tmuxp.workspace.builder.WorkspaceBuilder` via the ``workspace_builder`` +key (a Python dotted path, ``module:attr`` reference, or an entry-point name in +the ``tmuxp.workspace_builders`` group). When the builder lives outside the +active environment, ``workspace_builder_paths`` lists trusted directories that +are temporarily added to ``sys.path`` for the import and build. + +Security note: only literal directories are prepended to ``sys.path``. This +deliberately avoids :func:`site.addsitedir`, which executes ``.pth`` startup +files and is broader than making a module importable. The trust boundary is the +author of the workspace file. +""" + +from __future__ import annotations + +import contextlib +import importlib +import inspect +import os +import pathlib +import sys +import typing as t +from importlib import metadata + +from tmuxp import exc +from tmuxp._internal.private_path import PrivatePath +from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder +from tmuxp.workspace.loader import expandshell + +if t.TYPE_CHECKING: + from collections.abc import Iterator + + from tmuxp.workspace.builder.protocol import WorkspaceBuilderProtocol + +WORKSPACE_BUILDERS_GROUP = "tmuxp.workspace_builders" +"""Entry-point group packaged builders register under.""" + + +def resolve_builder_paths( + session_config: dict[str, t.Any], + workspace_file: str | os.PathLike[str] | None = None, +) -> list[pathlib.Path]: + """Resolve and validate trusted ``workspace_builder_paths`` import roots. + + Each entry is shell-expanded (``~`` and ``$VARS``), resolved relative to the + workspace file's directory when not absolute, and required to be an existing + directory. Returns ``[]`` when the key is absent, so existing workspaces add + nothing to ``sys.path``. + + Parameters + ---------- + session_config : dict + the expanded workspace configuration + workspace_file : str or os.PathLike, optional + path to the workspace file; its parent anchors relative entries + + Returns + ------- + list of pathlib.Path + + Examples + -------- + Absent key resolves to an empty list (no-op for existing workspaces): + + >>> resolve_builder_paths({}, None) + [] + + An existing directory is resolved: + + >>> root = tmp_path / "roots" + >>> root.mkdir() + >>> resolve_builder_paths({"workspace_builder_paths": [str(root)]}, None) == [ + ... root.resolve() + ... ] + True + + A missing directory is rejected: + + >>> resolve_builder_paths( + ... {"workspace_builder_paths": [str(tmp_path / "missing")]}, None + ... ) + Traceback (most recent call last): + ... + tmuxp.exc.WorkspaceBuilderPathError: ... + """ + raw = session_config.get("workspace_builder_paths") or [] + if isinstance(raw, (str, os.PathLike)): + raw = [raw] + + base = ( + pathlib.Path(workspace_file).parent + if workspace_file is not None + else pathlib.Path.cwd() + ) + + resolved: list[pathlib.Path] = [] + for entry in raw: + if not isinstance(entry, (str, os.PathLike)): + raise exc.WorkspaceBuilderPathError( + str(entry), + reason="entries must be path strings", + ) + candidate = pathlib.Path(expandshell(str(entry))) + if not candidate.is_absolute(): + candidate = base / candidate + candidate = candidate.resolve() + if not candidate.is_dir(): + raise exc.WorkspaceBuilderPathError(str(PrivatePath(candidate))) + resolved.append(candidate) + return resolved + + +@contextlib.contextmanager +def prepended_sys_path( + paths: list[pathlib.Path] | None, +) -> Iterator[None]: + """Temporarily prepend directories to ``sys.path``, restoring it on exit. + + Paths are prepended in order (first entry ends up at ``sys.path[0]``). An + empty or falsy ``paths`` is a no-op. Uses only literal directory entries; it + avoids :func:`site.addsitedir` (which runs ``.pth`` startup code). + + Parameters + ---------- + paths : list of pathlib.Path or None + directories to prepend + + Examples + -------- + >>> import sys + >>> ext = tmp_path / "ext" + >>> ext.mkdir() + >>> before = list(sys.path) + >>> with prepended_sys_path([ext]): + ... sys.path[0] == str(ext) + True + >>> sys.path == before + True + """ + if not paths: + yield + return + saved = list(sys.path) + for path in reversed(paths): + sys.path.insert(0, str(path)) + try: + yield + finally: + sys.path[:] = saved + + +def available_builders() -> list[str]: + """Return the names of builders registered via entry points. + + Examples + -------- + >>> isinstance(available_builders(), list) + True + """ + return [ep.name for ep in metadata.entry_points(group=WORKSPACE_BUILDERS_GROUP)] + + +def _load_entry_point(name: str) -> t.Any | None: + """Load a builder registered under entry-point ``name``, else ``None``. + + Examples + -------- + >>> _load_entry_point("definitely-not-a-registered-builder") is None + True + """ + for ep in metadata.entry_points(group=WORKSPACE_BUILDERS_GROUP): + if ep.name == name: + try: + return ep.load() + except (ImportError, AttributeError) as e: + raise exc.WorkspaceBuilderImportError(name, reason=str(e)) from e + return None + + +def _import_target(target: str) -> t.Any: + """Import an object from a ``module:attr`` or dotted ``module.attr`` path. + + Examples + -------- + >>> _import_target( + ... "tmuxp.workspace.builder.classic:ClassicWorkspaceBuilder" + ... ).__name__ + 'ClassicWorkspaceBuilder' + + The historical ``tmuxp.workspace.builder:WorkspaceBuilder`` alias resolves + to the same class: + + >>> _import_target("tmuxp.workspace.builder:WorkspaceBuilder").__name__ + 'ClassicWorkspaceBuilder' + """ + if ":" in target: + module_name, _, attr = target.partition(":") + else: + module_name, _, attr = target.rpartition(".") + if not module_name or not attr: + raise exc.WorkspaceBuilderNotFound(target) + try: + module = importlib.import_module(module_name) + except ImportError as e: + raise exc.WorkspaceBuilderImportError(target, reason=str(e)) from e + obj: t.Any = module + try: + for part in attr.split("."): + obj = getattr(obj, part) + except AttributeError as e: + raise exc.WorkspaceBuilderImportError(target, reason=str(e)) from e + return obj + + +def _validate_builder(obj: t.Any, target: str) -> None: + """Validate that ``obj`` is a usable workspace builder. + + A class must expose a callable ``build`` method and a constructor accepting + ``session_config`` and ``server`` (or ``**kwargs``). Non-class callables + (factories) are trusted and validated at instantiation. + + Examples + -------- + >>> from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + >>> _validate_builder(ClassicWorkspaceBuilder, "classic") + + >>> _validate_builder(object, "object") + Traceback (most recent call last): + ... + tmuxp.exc.InvalidWorkspaceBuilder: 'object' is not a valid workspace builder: ... + """ + if inspect.isclass(obj): + if not callable(getattr(obj, "build", None)): + raise exc.InvalidWorkspaceBuilder( + target, + reason="class has no callable 'build' method", + ) + try: + params = inspect.signature(obj).parameters + except (TypeError, ValueError): + return + has_var_kw = any( + p.kind is inspect.Parameter.VAR_KEYWORD for p in params.values() + ) + missing = {"session_config", "server"} - set(params) + if not has_var_kw and missing: + joined = ", ".join(sorted(missing)) + raise exc.InvalidWorkspaceBuilder( + target, + reason=f"constructor missing parameter(s): {joined}", + ) + elif not callable(obj): + raise exc.InvalidWorkspaceBuilder(target, reason="not a class or callable") + + +def resolve_builder_class( + session_config: dict[str, t.Any], +) -> type[WorkspaceBuilderProtocol]: + """Resolve the workspace builder class selected by ``session_config``. + + Resolution of the ``workspace_builder`` value: + + 1. absent/empty → the classic + :class:`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` (no + import, no entry-point scan); + 2. contains ``:`` → a ``module:attr`` object reference; + 3. no ``.`` and no ``:`` → an entry-point name in the + ``tmuxp.workspace_builders`` group; + 4. dotted, no ``:`` → an entry-point name if registered, otherwise a + ``module.attr`` dotted path. + + Parameters + ---------- + session_config : dict + the expanded workspace configuration + + Returns + ------- + type + a workspace builder class (or builder factory) satisfying + :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` + + Examples + -------- + The default resolves to the classic builder without importing anything: + + >>> from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + >>> resolve_builder_class({}) is ClassicWorkspaceBuilder + True + + A dotted ``module:attr`` reference is imported and validated: + + >>> resolve_builder_class( + ... { + ... "workspace_builder": ( + ... "tmuxp.workspace.builder.classic:ClassicWorkspaceBuilder" + ... ) + ... } + ... ) is ClassicWorkspaceBuilder + True + """ + target = session_config.get("workspace_builder") + if not target: + return ClassicWorkspaceBuilder + target_str = str(target).strip() + + obj: t.Any + if ":" in target_str: + obj = _import_target(target_str) + elif "." not in target_str: + obj = _load_entry_point(target_str) + if obj is None: + raise exc.WorkspaceBuilderNotFound( + target_str, + available=available_builders(), + ) + else: + obj = _load_entry_point(target_str) + if obj is None: + obj = _import_target(target_str) + + _validate_builder(obj, target_str) + return t.cast("type[WorkspaceBuilderProtocol]", obj) From 12762d56cff1821a619b6d86693a99911bb6ad85 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:11:23 -0500 Subject: [PATCH 2915/2998] build(deps): register classic builder entry point why: Let the classic builder be selected by the short name `classic`, and seed the tmuxp.workspace_builders entry-point group that third-party builders register under. what: - Register classic = ClassicWorkspaceBuilder under the tmuxp.workspace_builders entry points --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index e3360098f0..b5f88abe5e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,6 +52,9 @@ Changes = "https://github.com/tmux-python/tmuxp/blob/master/CHANGES" [project.scripts] tmuxp = 'tmuxp:cli.cli' +[project.entry-points."tmuxp.workspace_builders"] +classic = "tmuxp.workspace.builder.classic:ClassicWorkspaceBuilder" + [dependency-groups] dev = [ # Docs From e406e34ca8035461dc4e88119e226a740c9be06a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 16:11:33 -0500 Subject: [PATCH 2916/2998] test(builder): registry and readiness coverage why: Cover builder resolution and the pane-readiness policy, including custom builders resolved by entry-point name, module:attr, and import path. what: - Add tests/workspace/test_builder_registry.py and readiness cases in test_builder.py - Add tests/fixtures/workspace_builders (valid and invalid custom builders) --- tests/fixtures/workspace_builders/__init__.py | 3 + tests/fixtures/workspace_builders/invalid.py | 7 + tests/fixtures/workspace_builders/valid.py | 9 + tests/workspace/test_builder.py | 162 +++++++++++++++- tests/workspace/test_builder_registry.py | 176 ++++++++++++++++++ 5 files changed, 353 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/workspace_builders/__init__.py create mode 100644 tests/fixtures/workspace_builders/invalid.py create mode 100644 tests/fixtures/workspace_builders/valid.py create mode 100644 tests/workspace/test_builder_registry.py diff --git a/tests/fixtures/workspace_builders/__init__.py b/tests/fixtures/workspace_builders/__init__.py new file mode 100644 index 0000000000..4599a8613e --- /dev/null +++ b/tests/fixtures/workspace_builders/__init__.py @@ -0,0 +1,3 @@ +"""Custom workspace builder fixtures for resolution tests.""" + +from __future__ import annotations diff --git a/tests/fixtures/workspace_builders/invalid.py b/tests/fixtures/workspace_builders/invalid.py new file mode 100644 index 0000000000..af668c751a --- /dev/null +++ b/tests/fixtures/workspace_builders/invalid.py @@ -0,0 +1,7 @@ +"""Objects that are not valid workspace builders, used by resolution tests.""" + +from __future__ import annotations + + +class NotABuilder: + """A class missing the required ``build`` method.""" diff --git a/tests/fixtures/workspace_builders/valid.py b/tests/fixtures/workspace_builders/valid.py new file mode 100644 index 0000000000..bb3fb154f9 --- /dev/null +++ b/tests/fixtures/workspace_builders/valid.py @@ -0,0 +1,9 @@ +"""A minimal valid custom workspace builder used by resolution tests.""" + +from __future__ import annotations + +from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + + +class CustomBuilder(ClassicWorkspaceBuilder): + """Trivial subclass that satisfies the workspace builder contract.""" diff --git a/tests/workspace/test_builder.py b/tests/workspace/test_builder.py index 007a489c16..32cbdffcf4 100644 --- a/tests/workspace/test_builder.py +++ b/tests/workspace/test_builder.py @@ -25,8 +25,9 @@ from tmuxp import exc from tmuxp._internal.config_reader import ConfigReader from tmuxp.cli.load import load_plugins -from tmuxp.workspace import builder as builder_module, loader -from tmuxp.workspace.builder import WorkspaceBuilder, _wait_for_pane_ready +from tmuxp.workspace import loader +from tmuxp.workspace.builder import WorkspaceBuilder, classic as builder_classic +from tmuxp.workspace.builder.classic import _wait_for_pane_ready if t.TYPE_CHECKING: from libtmux.server import Server @@ -1563,6 +1564,8 @@ class PaneReadinessFixture(t.NamedTuple): yaml=textwrap.dedent( """\ session_name: readiness-test +workspace_builder_options: + pane_readiness: always windows: - panes: - shell_command: @@ -1578,6 +1581,8 @@ class PaneReadinessFixture(t.NamedTuple): yaml=textwrap.dedent( """\ session_name: readiness-test +workspace_builder_options: + pane_readiness: always windows: - panes: - shell_command: @@ -1592,6 +1597,8 @@ class PaneReadinessFixture(t.NamedTuple): yaml=textwrap.dedent( """\ session_name: readiness-test +workspace_builder_options: + pane_readiness: always windows: - panes: - shell_command: @@ -1608,6 +1615,8 @@ class PaneReadinessFixture(t.NamedTuple): yaml=textwrap.dedent( """\ session_name: readiness-test +workspace_builder_options: + pane_readiness: always windows: - window_shell: top panes: @@ -1635,7 +1644,7 @@ def test_pane_readiness_call_count( ) -> None: """Verify _wait_for_pane_ready is called only for appropriate panes.""" call_count = 0 - original = builder_module._wait_for_pane_ready + original = builder_classic._wait_for_pane_ready def counting_wait( pane: Pane, @@ -1646,7 +1655,7 @@ def counting_wait( call_count += 1 return original(pane, timeout=timeout, interval=interval) - monkeypatch.setattr(builder_module, "_wait_for_pane_ready", counting_wait) + monkeypatch.setattr(builder_classic, "_wait_for_pane_ready", counting_wait) yaml_workspace = tmp_path / "readiness.yaml" yaml_workspace.write_text(yaml, encoding="utf-8") @@ -1659,6 +1668,151 @@ def counting_wait( assert call_count == expected_wait_count +def _count_readiness_waits( + *, + server: Server, + monkeypatch: pytest.MonkeyPatch, + tmp_path: pathlib.Path, + yaml: str, + shell: str | None = None, +) -> int: + """Build a workspace from ``yaml`` and count ``_wait_for_pane_ready`` calls. + + When ``shell`` is given, the resolved session shell is forced so ``auto`` + detection is deterministic regardless of the shell the suite runs under. + """ + call_count = 0 + original = builder_classic._wait_for_pane_ready + + def counting_wait( + pane: Pane, + timeout: float = 2.0, + interval: float = 0.05, + ) -> bool: + nonlocal call_count + call_count += 1 + return original(pane, timeout=timeout, interval=interval) + + monkeypatch.setattr(builder_classic, "_wait_for_pane_ready", counting_wait) + if shell is not None: + monkeypatch.setattr( + builder_classic, + "resolve_session_shell", + lambda session, env=None: shell, + ) + + yaml_workspace = tmp_path / "readiness.yaml" + yaml_workspace.write_text(yaml, encoding="utf-8") + workspace = loader.trickle(loader.expand(ConfigReader._from_file(yaml_workspace))) + builder = WorkspaceBuilder(session_config=workspace, server=server) + builder.build() + return call_count + + +_TWO_DEFAULT_PANES = """\ +- panes: + - shell_command: + - cmd: echo hello + - shell_command: + - cmd: echo world +""" + + +def _readiness_yaml(windows: str, policy: str | None = None) -> str: + """Compose a readiness workspace with an optional pane_readiness policy.""" + catalog = ( + f"workspace_builder_options:\n pane_readiness: {policy}\n" if policy else "" + ) + return f"session_name: readiness-test\n{catalog}windows:\n{windows}" + + +def test_pane_readiness_auto_waits_for_zsh( + tmp_path: pathlib.Path, + server: Server, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Wait for default-shell panes under auto when the session shell is zsh.""" + count = _count_readiness_waits( + server=server, + monkeypatch=monkeypatch, + tmp_path=tmp_path, + yaml=_readiness_yaml(_TWO_DEFAULT_PANES), + shell="/usr/bin/zsh", + ) + assert count == 2 + + +def test_pane_readiness_auto_skips_non_zsh( + tmp_path: pathlib.Path, + server: Server, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Skip the wait under auto for non-zsh shells (the intended speedup).""" + count = _count_readiness_waits( + server=server, + monkeypatch=monkeypatch, + tmp_path=tmp_path, + yaml=_readiness_yaml(_TWO_DEFAULT_PANES), + shell="/bin/bash", + ) + assert count == 0 + + +def test_pane_readiness_always_waits_non_zsh( + tmp_path: pathlib.Path, + server: Server, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Wait for default-shell panes under always even for non-zsh shells.""" + count = _count_readiness_waits( + server=server, + monkeypatch=monkeypatch, + tmp_path=tmp_path, + yaml=_readiness_yaml(_TWO_DEFAULT_PANES, policy="always"), + shell="/bin/bash", + ) + assert count == 2 + + +def test_pane_readiness_never_skips_zsh( + tmp_path: pathlib.Path, + server: Server, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Skip the wait under never even for zsh.""" + count = _count_readiness_waits( + server=server, + monkeypatch=monkeypatch, + tmp_path=tmp_path, + yaml=_readiness_yaml(_TWO_DEFAULT_PANES, policy="never"), + shell="/usr/bin/zsh", + ) + assert count == 0 + + +def test_pane_readiness_custom_shell_skips_under_always( + tmp_path: pathlib.Path, + server: Server, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """A window_shell pane skips the wait even when policy is always.""" + windows = textwrap.dedent( + """\ +- window_shell: top + panes: + - shell_command: [] + - shell_command: [] +""", + ) + count = _count_readiness_waits( + server=server, + monkeypatch=monkeypatch, + tmp_path=tmp_path, + yaml=_readiness_yaml(windows, policy="always"), + ) + assert count == 0 + + def test_select_layout_not_called_after_yield( tmp_path: pathlib.Path, server: Server, diff --git a/tests/workspace/test_builder_registry.py b/tests/workspace/test_builder_registry.py new file mode 100644 index 0000000000..ad7dd949fb --- /dev/null +++ b/tests/workspace/test_builder_registry.py @@ -0,0 +1,176 @@ +"""Tests for workspace builder resolution (:mod:`tmuxp.workspace.builder.registry`).""" + +from __future__ import annotations + +import sys +import textwrap +import typing as t + +import pytest + +from tmuxp import exc +from tmuxp.workspace import loader +from tmuxp.workspace.builder import registry +from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + +if t.TYPE_CHECKING: + import pathlib + + from libtmux.server import Server + +VALID = "tests.fixtures.workspace_builders.valid" +INVALID = "tests.fixtures.workspace_builders.invalid" + + +def test_resolve_default_returns_classic() -> None: + """An absent workspace_builder resolves to the classic builder.""" + assert registry.resolve_builder_class({}) is ClassicWorkspaceBuilder + + +def test_resolve_entry_point_classic() -> None: + """The 'classic' entry point resolves to the classic builder.""" + resolved = registry.resolve_builder_class({"workspace_builder": "classic"}) + assert resolved is ClassicWorkspaceBuilder + + +def test_resolve_dotted_object_reference() -> None: + """A ``module:attr`` reference resolves and validates.""" + from tests.fixtures.workspace_builders.valid import CustomBuilder + + resolved = registry.resolve_builder_class( + {"workspace_builder": f"{VALID}:CustomBuilder"}, + ) + assert resolved is CustomBuilder + + +def test_resolve_dotted_path_reference() -> None: + """A dotted ``module.attr`` path resolves and validates.""" + from tests.fixtures.workspace_builders.valid import CustomBuilder + + resolved = registry.resolve_builder_class( + {"workspace_builder": f"{VALID}.CustomBuilder"}, + ) + assert resolved is CustomBuilder + + +def test_resolve_compat_alias_path() -> None: + """The historical ``tmuxp.workspace.builder:WorkspaceBuilder`` still resolves.""" + resolved = registry.resolve_builder_class( + {"workspace_builder": "tmuxp.workspace.builder:WorkspaceBuilder"}, + ) + assert resolved is ClassicWorkspaceBuilder + + +def test_resolve_not_found_bare_name() -> None: + """An unknown bare name raises WorkspaceBuilderNotFound.""" + with pytest.raises(exc.WorkspaceBuilderNotFound): + registry.resolve_builder_class({"workspace_builder": "nonexistent-builder"}) + + +def test_resolve_import_error() -> None: + """An unimportable dotted path raises WorkspaceBuilderImportError.""" + with pytest.raises(exc.WorkspaceBuilderImportError): + registry.resolve_builder_class( + {"workspace_builder": "tmuxp.does_not_exist:Thing"}, + ) + + +def test_resolve_invalid_builder() -> None: + """A class without a build method raises InvalidWorkspaceBuilder.""" + with pytest.raises(exc.InvalidWorkspaceBuilder): + registry.resolve_builder_class( + {"workspace_builder": f"{INVALID}:NotABuilder"}, + ) + + +def test_available_builders_includes_classic() -> None: + """The classic entry point is discoverable.""" + assert "classic" in registry.available_builders() + + +def test_resolve_builder_paths_absent() -> None: + """No workspace_builder_paths resolves to an empty list.""" + assert registry.resolve_builder_paths({}, None) == [] + + +def test_resolve_builder_paths_requires_directory(tmp_path: pathlib.Path) -> None: + """A missing directory raises WorkspaceBuilderPathError.""" + with pytest.raises(exc.WorkspaceBuilderPathError): + registry.resolve_builder_paths( + {"workspace_builder_paths": [str(tmp_path / "missing")]}, + None, + ) + + +def test_resolve_builder_paths_relative_to_workspace_file( + tmp_path: pathlib.Path, +) -> None: + """Relative entries resolve against the workspace file's directory.""" + builders_dir = tmp_path / "builders" + builders_dir.mkdir() + workspace_file = tmp_path / "workspace.yaml" + workspace_file.write_text("session_name: x\n", encoding="utf-8") + + resolved = registry.resolve_builder_paths( + {"workspace_builder_paths": ["builders"]}, + workspace_file, + ) + assert resolved == [builders_dir.resolve()] + + +def test_prepended_sys_path_restores(tmp_path: pathlib.Path) -> None: + """The sandbox restores sys.path exactly on exit.""" + before = list(sys.path) + with registry.prepended_sys_path([tmp_path]): + assert sys.path[0] == str(tmp_path) + assert sys.path == before + + +def test_trusted_path_enables_import(tmp_path: pathlib.Path) -> None: + """A builder in a trusted path imports only while the path is active.""" + sys.modules.pop("ext_builder_trusted", None) + module = tmp_path / "ext_builder_trusted.py" + module.write_text( + textwrap.dedent( + '''\ +"""External builder for trusted-path tests.""" + +from __future__ import annotations + +from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + + +class ExternalBuilder(ClassicWorkspaceBuilder): + """External custom builder.""" +''', + ), + encoding="utf-8", + ) + config = {"workspace_builder": "ext_builder_trusted:ExternalBuilder"} + + with pytest.raises(exc.WorkspaceBuilderImportError): + registry.resolve_builder_class(config) + + paths = registry.resolve_builder_paths( + {"workspace_builder_paths": [str(tmp_path)]}, + None, + ) + with registry.prepended_sys_path(paths): + resolved = registry.resolve_builder_class(config) + assert resolved.__name__ == "ExternalBuilder" + + +def test_resolve_and_build_selected_builder(server: Server) -> None: + """A config selecting a builder builds through the resolved class.""" + config = loader.expand( + { + "session_name": "registry-build", + "workspace_builder": "classic", + "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], + }, + ) + builder_cls = registry.resolve_builder_class(config) + builder = builder_cls(session_config=config, server=server) + builder.build() + assert builder.session.name == "registry-build" + builder.session.kill() From 684aba9c4dfac85ab078998dc549e75dc7857f3a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 12:30:58 -0500 Subject: [PATCH 2917/2998] cli(feat): route load through builder resolver why: tmuxp load must honor the workspace_builder selection and trusted import paths instead of always constructing the classic builder. what: - Resolve the builder class via resolve_builder_class and construct it inside a prepended_sys_path sandbox built from resolve_builder_paths, keeping trusted paths active for both import and build - Type the CLI build helpers against WorkspaceBuilderProtocol --- src/tmuxp/cli/load.py | 77 ++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/src/tmuxp/cli/load.py b/src/tmuxp/cli/load.py index 375cdb1b22..f60e7477ec 100644 --- a/src/tmuxp/cli/load.py +++ b/src/tmuxp/cli/load.py @@ -18,7 +18,12 @@ from tmuxp._internal import config_reader from tmuxp._internal.private_path import PrivatePath from tmuxp.workspace import loader -from tmuxp.workspace.builder import WorkspaceBuilder +from tmuxp.workspace.builder import ( + WorkspaceBuilderProtocol, + prepended_sys_path, + resolve_builder_class, + resolve_builder_paths, +) from tmuxp.workspace.finders import find_workspace_file, get_workspace_dir from ._colors import ColorMode, Colors, build_description, get_color_mode @@ -195,7 +200,7 @@ def load_plugins( return plugins -def _reattach(builder: WorkspaceBuilder, colors: Colors | None = None) -> None: +def _reattach(builder: WorkspaceBuilderProtocol, colors: Colors | None = None) -> None: """ Reattach session (depending on env being inside tmux already or not). @@ -232,7 +237,7 @@ def _reattach(builder: WorkspaceBuilder, colors: Colors | None = None) -> None: def _load_attached( - builder: WorkspaceBuilder, + builder: WorkspaceBuilderProtocol, detached: bool, pre_attach_hook: t.Callable[[], None] | None = None, ) -> None: @@ -265,7 +270,7 @@ def _load_attached( def _load_detached( - builder: WorkspaceBuilder, + builder: WorkspaceBuilderProtocol, colors: Colors | None = None, pre_output_hook: t.Callable[[], None] | None = None, ) -> None: @@ -292,7 +297,9 @@ def _load_detached( logger.info("session created in detached state") -def _load_append_windows_to_current_session(builder: WorkspaceBuilder) -> None: +def _load_append_windows_to_current_session( + builder: WorkspaceBuilderProtocol, +) -> None: """ Load workspace as new windows in current session. @@ -305,7 +312,7 @@ def _load_append_windows_to_current_session(builder: WorkspaceBuilder) -> None: assert builder.session is not None -def _setup_plugins(builder: WorkspaceBuilder) -> Session: +def _setup_plugins(builder: WorkspaceBuilderProtocol) -> Session: """Execute hooks for plugins running after ``before_script``. Parameters @@ -320,7 +327,7 @@ def _setup_plugins(builder: WorkspaceBuilder) -> Session: def _dispatch_build( - builder: WorkspaceBuilder, + builder: WorkspaceBuilderProtocol, detached: bool, append: bool, answer_yes: bool, @@ -577,13 +584,21 @@ def load_workspace( shutil.which("tmux") # raise exception if tmux not found - # WorkspaceBuilder creation — outside spinner so plugin prompts are safe + # Resolve any trusted import roots for the builder. Absent config -> [] -> + # a no-op sandbox, so existing workspaces add nothing to sys.path. + builder_paths = resolve_builder_paths(expanded_workspace, workspace_file) + + # Builder resolution + creation — outside spinner so plugin prompts are safe. + # Trusted paths stay on sys.path for the import and instantiation; each + # build dispatch re-enters the sandbox so build-time lazy imports resolve. try: - builder = WorkspaceBuilder( - session_config=expanded_workspace, - plugins=load_plugins(expanded_workspace, colors=cli_colors), - server=t, - ) + with prepended_sys_path(builder_paths): + builder_cls = resolve_builder_class(expanded_workspace) + builder = builder_cls( + session_config=expanded_workspace, + plugins=load_plugins(expanded_workspace, colors=cli_colors), + server=t, + ) except exc.EmptyWorkspaceException: logger.warning( "workspace file is empty", @@ -612,13 +627,14 @@ def load_workspace( if _progress_disabled: _private_path = str(PrivatePath(workspace_file)) - result = _dispatch_build( - builder, - detached, - append, - answer_yes, - cli_colors, - ) + with prepended_sys_path(builder_paths): + result = _dispatch_build( + builder, + detached, + append, + answer_yes, + cli_colors, + ) if result is not None: summary = "" try: @@ -687,16 +703,17 @@ def _emit_success() -> None: ) if _resolved_panel != 0: builder.on_script_output = spinner.add_output_line - result = _dispatch_build( - builder, - detached, - append, - answer_yes, - cli_colors, - pre_attach_hook=_emit_success, - on_error_hook=spinner.stop, - pre_prompt_hook=spinner.stop, - ) + with prepended_sys_path(builder_paths): + result = _dispatch_build( + builder, + detached, + append, + answer_yes, + cli_colors, + pre_attach_hook=_emit_success, + on_error_hook=spinner.stop, + pre_prompt_hook=spinner.stop, + ) if result is not None: _emit_success() return result From c06763c01d47bbe42cd1dca6c35edf302f643a41 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 12:32:50 -0500 Subject: [PATCH 2918/2998] docs(builder): document custom workspace builders why: The pluggable builder, readiness policy, and new modules need a user guide and API reference entries. what: - Add topics/custom-workspace-builders.md covering selection, trusted paths, the builder contract, and readiness tuning - Add options autodoc; document the builder package (classic, protocol, registry) and refresh workspace API toctrees - Update the stale WorkspaceBuilder cross-reference --- docs/configuration/examples.md | 2 +- docs/internals/api/workspace/builder.md | 30 +++- docs/internals/api/workspace/index.md | 1 + docs/internals/api/workspace/options.md | 8 + docs/topics/custom-workspace-builders.md | 186 +++++++++++++++++++++++ docs/topics/index.md | 7 + 6 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 docs/internals/api/workspace/options.md create mode 100644 docs/topics/custom-workspace-builders.md diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 9651341309..2d463e4ba5 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -791,7 +791,7 @@ windows: tmuxp sessions can be scripted in python. The first way is to use the ORM in the {ref}`API`. The second is to pass a {py:obj}`dict` into -{class}`~tmuxp.workspace.builder.WorkspaceBuilder` with a correct schema. +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` with a correct schema. See: {meth}`tmuxp.validation.validate_schema`. ::: diff --git a/docs/internals/api/workspace/builder.md b/docs/internals/api/workspace/builder.md index 24525e1efb..012ed26eea 100644 --- a/docs/internals/api/workspace/builder.md +++ b/docs/internals/api/workspace/builder.md @@ -1,7 +1,35 @@ # Builder - `tmuxp.workspace.builder` +`tmuxp.workspace.builder` is a package. The classic, default builder lives in +{mod}`tmuxp.workspace.builder.classic`; the public contract and the selection +machinery live alongside it. + +`WorkspaceBuilder` remains importable from `tmuxp.workspace.builder` as a +backwards-compatible alias of +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. + +## Classic builder - `tmuxp.workspace.builder.classic` + +```{eval-rst} +.. automodule:: tmuxp.workspace.builder.classic + :members: + :show-inheritance: + :undoc-members: +``` + +## Builder protocol - `tmuxp.workspace.builder.protocol` + +```{eval-rst} +.. automodule:: tmuxp.workspace.builder.protocol + :members: + :show-inheritance: + :undoc-members: +``` + +## Builder registry - `tmuxp.workspace.builder.registry` + ```{eval-rst} -.. automodule:: tmuxp.workspace.builder +.. automodule:: tmuxp.workspace.builder.registry :members: :show-inheritance: :undoc-members: diff --git a/docs/internals/api/workspace/index.md b/docs/internals/api/workspace/index.md index 4c2d6241ad..373aadc72e 100644 --- a/docs/internals/api/workspace/index.md +++ b/docs/internals/api/workspace/index.md @@ -15,5 +15,6 @@ finders freezer importers loader +options validation ``` diff --git a/docs/internals/api/workspace/options.md b/docs/internals/api/workspace/options.md new file mode 100644 index 0000000000..e492ce6728 --- /dev/null +++ b/docs/internals/api/workspace/options.md @@ -0,0 +1,8 @@ +# Options - `tmuxp.workspace.options` + +```{eval-rst} +.. automodule:: tmuxp.workspace.options + :members: + :show-inheritance: + :undoc-members: +``` diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md new file mode 100644 index 0000000000..598ba2a532 --- /dev/null +++ b/docs/topics/custom-workspace-builders.md @@ -0,0 +1,186 @@ +(custom-workspace-builders)= + +# Custom workspace builders + +A *workspace builder* turns an expanded workspace ``dict`` into a live tmux +session. tmuxp ships one builder, +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`, and uses it +by default. Advanced users can point tmuxp at a different builder, and packagers +can distribute builders that users select by name. + +This is an advanced, opt-in feature. Existing workspace files keep using the +classic builder with no changes. + +## How a workspace is built + +1. `tmuxp load` reads the YAML/JSON file and expands it (shorthand, environment + variables, trickle-down defaults). +2. tmuxp resolves which builder to use from the `workspace_builder` config key + (default: the classic builder). +3. tmuxp constructs the builder with the expanded workspace and a + {class}`libtmux.Server`, then calls `.build()`. +4. The builder creates the session, windows, and panes, honoring plugin hooks + and progress callbacks. + +## Selecting a builder + +### By dotted path + +Point `workspace_builder` at an importable class. Both a +`module:attr` object reference and a dotted `module.attr` path are accepted: + +```yaml +session_name: my-session +workspace_builder: my_tmuxp_builders.builders:CustomBuilder +windows: + - window_name: editor + panes: + - vim +``` + +### By entry-point name + +Packaged builders register under the `tmuxp.workspace_builders` entry-point +group, letting users select them by a short name instead of an internal module +path: + +```yaml +workspace_builder: classic +``` + +The built-in classic builder is registered this way. A distribution registers +its own builder in `pyproject.toml`: + +```toml +[project.entry-points."tmuxp.workspace_builders"] +mybuilder = "my_tmuxp_builders.builders:CustomBuilder" +``` + +### Trusted import paths + +When a builder lives outside tmuxp's runtime environment (for example, a script +in your config directory), list trusted directories in +`workspace_builder_paths`. tmuxp expands `~` and environment variables, +resolves relative entries against the workspace file's directory, requires each +entry to be an existing directory, and temporarily prepends them to `sys.path` +for the import and build: + +```yaml +workspace_builder: my_local_builder:CustomBuilder +workspace_builder_paths: + - ~/.config/tmuxp/builders +``` + +:::{warning} +A workspace file that names a builder runs that builder's Python code. Only load +workspace files you trust. tmuxp deliberately does **not** use +`site.addsitedir()` for these paths — that would execute `.pth` startup files +and is broader than making a module importable. +::: + +## Writing a builder + +The simplest custom builder subclasses the classic builder and overrides what it +needs: + +```python +from tmuxp.workspace.builder.classic import ClassicWorkspaceBuilder + + +class CustomBuilder(ClassicWorkspaceBuilder): + """A builder that renames the session after building.""" + + def build(self, session=None, append=False): + super().build(session=session, append=append) + self.session.rename_session(f"{self.session.name}-custom") +``` + +A builder written from scratch must satisfy +{class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol`. The contract +covers what `tmuxp load` drives: + +- **Constructor** accepting `session_config`, `server`, and the optional + `plugins` list and `on_progress` / `on_before_script` / `on_script_output` / + `on_build_event` callbacks. +- **`build(session=None, append=False)`** — create or populate the session; the + `append` path adds windows to an existing session. +- **`session`** — the populated {class}`libtmux.Session`. +- **`session_exists()`** and **`find_current_attached_session()`** — used by the + CLI for attach/append decisions. +- **`plugins`** — the list of plugin instances; honor the plugin lifecycle hooks + (`before_workspace_builder`, `on_window_create`, `after_window_finished`). +- The **`on_*` callbacks** — call them at the documented milestones so the CLI's + progress display and `before_script` output stay accurate. + +The contract is synchronous today. It is shaped so an async builder can be added +later as an additive extension without changing this surface. + +## Pane readiness + +tmuxp waits for a pane's shell prompt before dispatching layout and commands, +which avoids a zsh prompt-redraw artifact. That wait is only needed for zsh, so +it is configurable independently of which builder you use, through the +`workspace_builder_options` catalog: + +```yaml +workspace_builder_options: + pane_readiness: auto # auto | always | never (+ truthy/falsy aliases) +``` + +- **`auto`** (default) — wait only when the session's interactive shell is zsh. +- **`always`** (or `true`/`on`/`yes`/`1`) — always wait for default-shell panes. +- **`never`** (or `false`/`off`/`no`/`0`) — never wait; fastest, but accepts the + prompt/layout race for shells that need it. + +Panes with a custom `shell` or `window_shell` never wait, regardless of policy — +those run a command in place of an interactive shell, so there is no prompt to +wait for. + +See {class}`~tmuxp.workspace.options.PaneReadiness` and +{class}`~tmuxp.workspace.options.WorkspaceBuilderOptions` for the parsing rules. + +## Testing a builder + +Resolve, construct, and build against a real tmux server fixture: + +```python +from tmuxp.workspace import loader +from tmuxp.workspace.builder import registry + + +def test_custom_builder(server): + config = loader.expand( + { + "session_name": "demo", + "workspace_builder": "my_tmuxp_builders.builders:CustomBuilder", + "windows": [{"window_name": "main", "panes": [{"shell_command": []}]}], + }, + ) + builder_cls = registry.resolve_builder_class(config) + builder = builder_cls(session_config=config, server=server) + builder.build() + assert builder.session.name == "demo" + builder.session.kill() +``` + +For builders that live in a trusted directory, build the `sys.path` sandbox with +{func}`~tmuxp.workspace.builder.registry.resolve_builder_paths` and +{func}`~tmuxp.workspace.builder.registry.prepended_sys_path`. + +## Choosing an approach + +- **Classic builder** — the default. Use it for any workspace that depends on + strict, pane-by-pane side effects (`start_directory`, `shell`, `window_shell`, + pane environment). +- **Readiness tuning** — set `pane_readiness` to trade prompt-safety for speed + without swapping builders. +- **A custom builder** — when you need behavior the classic builder doesn't + provide. Keep dependency-sensitive setup in `before_script` or + `shell_command_before` if your builder relaxes ordering guarantees. + +## Reference + +- {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` +- {class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` +- {func}`~tmuxp.workspace.builder.registry.resolve_builder_class` +- {class}`~tmuxp.workspace.options.PaneReadiness` diff --git a/docs/topics/index.md b/docs/topics/index.md index 050ddb9d58..8dd1d70866 100644 --- a/docs/topics/index.md +++ b/docs/topics/index.md @@ -19,6 +19,12 @@ CI integration, scripting, and automation patterns. Plugin system for custom behavior. ::: +:::{grid-item-card} Custom workspace builders +:link: custom-workspace-builders +:link-type: doc +Select or ship a custom builder; tune pane readiness. +::: + :::{grid-item-card} Library vs CLI :link: library-vs-cli :link-type: doc @@ -47,6 +53,7 @@ instead of raw shell commands, supports JSON and YAML, and can workflows plugins +custom-workspace-builders library-vs-cli troubleshooting ``` From b7f5eabfcd146bebbb416f49d560bcb0ca33dd3e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 12:32:57 -0500 Subject: [PATCH 2919/2998] docs(CHANGES): pluggable builders, pane readiness why: Record the user-facing 1.72.0 changes for the upcoming release notes. what: - Document pluggable workspace builders: dotted-path / entry-point selection, trusted import paths, and the builder protocol - Document the configurable pane_readiness policy and its zsh-only auto default - Note the custom workspace builder guide --- CHANGES | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGES b/CHANGES index 8c1a395d00..7378276623 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,52 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### What's new + +#### Pluggable workspace builders (#1065) + +tmuxp can now load a workspace with a builder other than the built-in one. Set +`workspace_builder` in a workspace file to a Python dotted path +(`package.module:Builder`), a `module.attr` path, or the name of a builder +registered under the `tmuxp.workspace_builders` entry-point group. When a builder +lives outside tmuxp's environment, `workspace_builder_paths` lists trusted +directories that are temporarily added to `sys.path` for the import and build — +without the broader, code-executing behavior of site-directory processing. + +The built-in builder is now the explicit classic builder, available as the +`classic` entry point and as +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. A public +contract, {class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol`, +documents what a builder must provide and is shaped to allow async builders as a +future additive extension. `WorkspaceBuilder` remains importable from +`tmuxp.workspace.builder` as a backwards-compatible alias. See +{ref}`custom-workspace-builders` for details. + +#### Configurable pane readiness (#1065) + +Whether tmuxp waits for a pane's shell prompt before sending layout and commands +is now configurable through a new `workspace_builder_options` catalog: + +```yaml +workspace_builder_options: + pane_readiness: auto # auto | always | never (+ truthy/falsy aliases) +``` + +The prompt wait exists to avoid a zsh prompt-redraw artifact, so the new default, +`auto`, waits only when the session's interactive shell is zsh. zsh users see no +change. Sessions on other shells (bash, sh, …) skip a wait they did not need and +load slightly faster. To restore the previous always-wait behavior set +`pane_readiness: always`; to skip the wait entirely set `never`. See +{class}`~tmuxp.workspace.options.PaneReadiness`. + +### Documentation + +#### Custom workspace builder guide (#1065) + +A new {ref}`custom-workspace-builders` topic explains how tmuxp hands a workspace +to a builder, how to select or package a builder, the trust boundary for +importing builder code, how to tune pane readiness, and how to test a builder. + ## tmuxp 1.72.0 (2026-06-28) tmuxp 1.72.0 bumps libtmux to 0.60.0, completing tmux 3.7 feature parity at the library layer tmuxp builds on. The new libtmux capabilities — floating panes, typed tmux 3.7 options, new pane format variables, and new command flags — are reachable through tmuxp's Python API and `tmuxp shell`, while the YAML workspace format and tmux 3.2a-3.6 support stay unchanged. From 64fe5658c3b20357b2278654e1a5d88473d0fb10 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:11:34 -0500 Subject: [PATCH 2920/2998] cli(fix[load]): friendly builder errors why: An invalid workspace_builder key raised a builder-resolution exception that propagated as a raw traceback, leaking the local stack and diverging from the styled handling load_plugins already gives an unimportable plugin. what: - Catch exc.WorkspaceBuilderError in load_workspace and emit a styled [Builder Error] message + sys.exit(1), mirroring the plugin path - Move resolve_builder_paths into the try so a bad workspace_builder_paths entry is handled too - Add a parametrized test covering unknown name, import error, invalid object, and missing trusted-path cases --- src/tmuxp/cli/load.py | 14 ++++---- tests/cli/test_load.py | 82 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/src/tmuxp/cli/load.py b/src/tmuxp/cli/load.py index f60e7477ec..ed85f67d32 100644 --- a/src/tmuxp/cli/load.py +++ b/src/tmuxp/cli/load.py @@ -584,14 +584,12 @@ def load_workspace( shutil.which("tmux") # raise exception if tmux not found - # Resolve any trusted import roots for the builder. Absent config -> [] -> - # a no-op sandbox, so existing workspaces add nothing to sys.path. - builder_paths = resolve_builder_paths(expanded_workspace, workspace_file) - # Builder resolution + creation — outside spinner so plugin prompts are safe. - # Trusted paths stay on sys.path for the import and instantiation; each - # build dispatch re-enters the sandbox so build-time lazy imports resolve. + # Trusted import roots (absent config -> [] -> a no-op sandbox) stay on + # sys.path for the import and instantiation; each build dispatch re-enters + # the sandbox so build-time lazy imports resolve. try: + builder_paths = resolve_builder_paths(expanded_workspace, workspace_file) with prepended_sys_path(builder_paths): builder_cls = resolve_builder_class(expanded_workspace) builder = builder_cls( @@ -609,6 +607,10 @@ def load_workspace( + f" {PrivatePath(workspace_file)} is empty or parsed no workspace data", ) return None + except exc.WorkspaceBuilderError as e: + logger.debug("workspace builder resolution failed", exc_info=True) + tmuxp_echo(cli_colors.error("[Builder Error]") + f" {e}") + sys.exit(1) session_name = expanded_workspace["session_name"] diff --git a/tests/cli/test_load.py b/tests/cli/test_load.py index ec045dcf3c..4588a526cb 100644 --- a/tests/cli/test_load.py +++ b/tests/cli/test_load.py @@ -653,6 +653,88 @@ def test_load_plugins_plugin_missing( assert "[Plugin Error]" in result.out +class WorkspaceBuilderErrorFixture(t.NamedTuple): + """Test fixture for invalid ``workspace_builder`` selections.""" + + test_id: str + yaml: str + expected_substring: str + + +WORKSPACE_BUILDER_ERROR_FIXTURES: list[WorkspaceBuilderErrorFixture] = [ + WorkspaceBuilderErrorFixture( + test_id="unknown_entry_point_name", + yaml="""\ +session_name: builder-error +workspace_builder: nonexistent-builder +windows: +- panes: + - echo hi +""", + expected_substring="could not be found", + ), + WorkspaceBuilderErrorFixture( + test_id="dotted_import_error", + yaml="""\ +session_name: builder-error +workspace_builder: tmuxp.does_not_exist:Thing +windows: +- panes: + - echo hi +""", + expected_substring="Could not import", + ), + WorkspaceBuilderErrorFixture( + test_id="invalid_object", + yaml="""\ +session_name: builder-error +workspace_builder: tests.fixtures.workspace_builders.invalid:NotABuilder +windows: +- panes: + - echo hi +""", + expected_substring="not a valid workspace builder", + ), + WorkspaceBuilderErrorFixture( + test_id="missing_builder_path", + yaml="""\ +session_name: builder-error +workspace_builder: any:Builder +workspace_builder_paths: +- /nonexistent/tmuxp/builder/dir +windows: +- panes: + - echo hi +""", + expected_substring="workspace_builder_paths entry is invalid", + ), +] + + +@pytest.mark.parametrize( + list(WorkspaceBuilderErrorFixture._fields), + WORKSPACE_BUILDER_ERROR_FIXTURES, + ids=[test.test_id for test in WORKSPACE_BUILDER_ERROR_FIXTURES], +) +def test_load_workspace_builder_error_exits( + tmp_path: pathlib.Path, + server: Server, + capsys: pytest.CaptureFixture[str], + test_id: str, + yaml: str, + expected_substring: str, +) -> None: + """Invalid workspace_builder exits with a styled error, not a traceback.""" + config_file = tmp_path / ".tmuxp.yaml" + config_file.write_text(yaml, encoding="utf-8") + + with pytest.raises(SystemExit) as excinfo: + load_workspace(config_file, socket_name=server.socket_name, detached=True) + + assert excinfo.value.code == 1 + assert expected_substring in capsys.readouterr().out + + def test_plugin_system_before_script( monkeypatch_plugin_test_packages: None, server: Server, From eb44ed5b83b60b2854f82a3cfe7bc595ffec8f45 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:13:05 -0500 Subject: [PATCH 2921/2998] builder(fix[logging]): prefix readiness extra keys why: Structured log extra keys must carry the tmux_ prefix per the project logging standards so downstream aggregators can filter them consistently. what: - Rename the pane-readiness debug extra keys to tmux_pane_readiness and tmux_pane_readiness_wait --- src/tmuxp/workspace/builder/classic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tmuxp/workspace/builder/classic.py b/src/tmuxp/workspace/builder/classic.py index f4d209bfd3..324dfdd69d 100644 --- a/src/tmuxp/workspace/builder/classic.py +++ b/src/tmuxp/workspace/builder/classic.py @@ -572,8 +572,8 @@ def build(self, session: Session | None = None, append: bool = False) -> None: _log.debug( "pane readiness resolved", extra={ - "pane_readiness": readiness.value, - "pane_readiness_wait": self._pane_readiness_wait, + "tmux_pane_readiness": readiness.value, + "tmux_pane_readiness_wait": self._pane_readiness_wait, }, ) From 49039bbb8cffae905274f4ae43393875ec8cdcd6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:15:33 -0500 Subject: [PATCH 2922/2998] docs(builder): correct readiness/registry comments why: Two comments introduced on this branch were imprecise: the readiness comment named only options.default-shell (global_options can set it too), and the registry module docstring referenced the backwards-compat alias rather than the canonical class. what: - Reword the readiness comment to "its options (including default-shell)" - Point the registry docstring at ClassicWorkspaceBuilder --- src/tmuxp/workspace/builder/classic.py | 6 +++--- src/tmuxp/workspace/builder/registry.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tmuxp/workspace/builder/classic.py b/src/tmuxp/workspace/builder/classic.py index 324dfdd69d..03d2fba87c 100644 --- a/src/tmuxp/workspace/builder/classic.py +++ b/src/tmuxp/workspace/builder/classic.py @@ -557,9 +557,9 @@ def build(self, session: Session | None = None, append: bool = False) -> None: self.session.set_environment(option, value) # Resolve the pane-readiness decision once, now that the session exists - # and any config `options.default-shell` has been applied above. AUTO - # waits only for zsh (the shell the prompt-redraw wait was added for); - # ALWAYS/NEVER force the choice. + # and its options (including `default-shell`) have been applied above. + # AUTO waits only for zsh (the shell the prompt-redraw wait was added + # for); ALWAYS/NEVER force the choice. readiness = self._builder_options.pane_readiness if readiness is PaneReadiness.ALWAYS: self._pane_readiness_wait = True diff --git a/src/tmuxp/workspace/builder/registry.py b/src/tmuxp/workspace/builder/registry.py index 595f134d13..b1744fdcbe 100644 --- a/src/tmuxp/workspace/builder/registry.py +++ b/src/tmuxp/workspace/builder/registry.py @@ -1,11 +1,11 @@ """Resolve and sandbox workspace builders selected by a workspace config. A workspace may point tmuxp at a builder other than the classic -:class:`tmuxp.workspace.builder.WorkspaceBuilder` via the ``workspace_builder`` -key (a Python dotted path, ``module:attr`` reference, or an entry-point name in -the ``tmuxp.workspace_builders`` group). When the builder lives outside the -active environment, ``workspace_builder_paths`` lists trusted directories that -are temporarily added to ``sys.path`` for the import and build. +:class:`tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` via the +``workspace_builder`` key (a Python dotted path, ``module:attr`` reference, or +an entry-point name in the ``tmuxp.workspace_builders`` group). When the builder +lives outside the active environment, ``workspace_builder_paths`` lists trusted +directories that are temporarily added to ``sys.path`` for the import and build. Security note: only literal directories are prepended to ``sys.path``. This deliberately avoids :func:`site.addsitedir`, which executes ``.pth`` startup From 45802a4446c3323f6c30b551a8661d8c222c6eee Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:24:32 -0500 Subject: [PATCH 2923/2998] options(fix): detect inherited default-shell why: Auto pane-readiness mis-detected the shell when default-shell was set globally (e.g. `set -g default-shell` in tmux.conf) rather than at the session level: tmux returned None for the session-level lookup and resolution fell back to $SHELL, so a global zsh default could be read as a non-zsh shell and skip the prompt wait. what: - Pass include_inherited=True to show_option so an inherited default-shell is resolved before the $SHELL fallback - Add a regression test with a session that exposes default-shell only via include_inherited --- src/tmuxp/workspace/options.py | 5 ++++- tests/workspace/test_options.py | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/tmuxp/workspace/options.py b/src/tmuxp/workspace/options.py index 0719b4dc09..32ad20d1d9 100644 --- a/src/tmuxp/workspace/options.py +++ b/src/tmuxp/workspace/options.py @@ -219,7 +219,10 @@ def resolve_session_shell( >>> resolve_session_shell(FakeSession(None), env={"SHELL": "/bin/bash"}) '/bin/bash' """ - default_shell = session.show_option("default-shell") + # include_inherited resolves a globally-set default-shell (e.g. + # ``set -g default-shell`` in tmux.conf) that the session inherits rather + # than overrides; without it tmux returns None and we'd fall back to $SHELL. + default_shell = session.show_option("default-shell", include_inherited=True) environ = os.environ if env is None else env env_shell = environ.get("SHELL", "") return str(default_shell or env_shell or "") diff --git a/tests/workspace/test_options.py b/tests/workspace/test_options.py index c6eaecf39f..cfd266a212 100644 --- a/tests/workspace/test_options.py +++ b/tests/workspace/test_options.py @@ -113,3 +113,29 @@ def test_resolve_session_shell_falls_back_to_env() -> None: def test_resolve_session_shell_empty_when_unknown() -> None: """Returns an empty string when neither source resolves.""" assert resolve_session_shell(_FakeSession(None), env={}) == "" + + +class _InheritedShellSession: + """Session whose default-shell is only visible with include_inherited.""" + + def __init__(self, shell: str) -> None: + self._shell = shell + + def show_option( + self, + name: str, + *, + include_inherited: bool = False, + **kwargs: t.Any, + ) -> str | None: + """Return the shell only when inherited options are requested.""" + return self._shell if include_inherited else None + + +def test_resolve_session_shell_reads_inherited_default_shell() -> None: + """A globally-inherited default-shell wins over the $SHELL fallback.""" + shell = resolve_session_shell( + _InheritedShellSession("/usr/bin/zsh"), + env={"SHELL": "/bin/bash"}, + ) + assert shell == "/usr/bin/zsh" From 3a2f8866b659291d5b07ea11c3e19f2f58f86505 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:43:05 -0500 Subject: [PATCH 2924/2998] registry(fix): require plugins in builder validation why: load_workspace always constructs the builder with plugins=..., so a custom builder whose __init__ accepts only session_config and server passed validation and then raised a raw TypeError at instantiation, bypassing the styled [Builder Error] path. what: - Require plugins (alongside session_config and server, or **kwargs) in _validate_builder so an incompatible constructor is rejected as InvalidWorkspaceBuilder before instantiation - Add a MissingPluginsBuilder fixture and a test --- src/tmuxp/workspace/builder/registry.py | 7 ++++--- tests/fixtures/workspace_builders/invalid.py | 12 ++++++++++++ tests/workspace/test_builder_registry.py | 12 ++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/tmuxp/workspace/builder/registry.py b/src/tmuxp/workspace/builder/registry.py index b1744fdcbe..e29a58ec70 100644 --- a/src/tmuxp/workspace/builder/registry.py +++ b/src/tmuxp/workspace/builder/registry.py @@ -218,8 +218,9 @@ def _validate_builder(obj: t.Any, target: str) -> None: """Validate that ``obj`` is a usable workspace builder. A class must expose a callable ``build`` method and a constructor accepting - ``session_config`` and ``server`` (or ``**kwargs``). Non-class callables - (factories) are trusted and validated at instantiation. + ``session_config``, ``server``, and ``plugins`` (or ``**kwargs``) — the + arguments ``tmuxp load`` always passes. Non-class callables (factories) are + trusted and validated at instantiation. Examples -------- @@ -244,7 +245,7 @@ def _validate_builder(obj: t.Any, target: str) -> None: has_var_kw = any( p.kind is inspect.Parameter.VAR_KEYWORD for p in params.values() ) - missing = {"session_config", "server"} - set(params) + missing = {"session_config", "server", "plugins"} - set(params) if not has_var_kw and missing: joined = ", ".join(sorted(missing)) raise exc.InvalidWorkspaceBuilder( diff --git a/tests/fixtures/workspace_builders/invalid.py b/tests/fixtures/workspace_builders/invalid.py index af668c751a..020839315f 100644 --- a/tests/fixtures/workspace_builders/invalid.py +++ b/tests/fixtures/workspace_builders/invalid.py @@ -2,6 +2,18 @@ from __future__ import annotations +import typing as t + class NotABuilder: """A class missing the required ``build`` method.""" + + +class MissingPluginsBuilder: + """A builder whose constructor omits the ``plugins`` parameter.""" + + def __init__(self, session_config: t.Any, server: t.Any) -> None: + self.session_config = session_config + + def build(self, session: t.Any = None, append: bool = False) -> None: + """No-op build for validation tests.""" diff --git a/tests/workspace/test_builder_registry.py b/tests/workspace/test_builder_registry.py index ad7dd949fb..09dce0b143 100644 --- a/tests/workspace/test_builder_registry.py +++ b/tests/workspace/test_builder_registry.py @@ -83,6 +83,18 @@ def test_resolve_invalid_builder() -> None: ) +def test_resolve_rejects_constructor_without_plugins() -> None: + """A builder whose __init__ lacks plugins is rejected before instantiation. + + The CLI always calls the builder with ``plugins=...``, so such a constructor + would otherwise raise a raw TypeError instead of a styled error. + """ + with pytest.raises(exc.InvalidWorkspaceBuilder): + registry.resolve_builder_class( + {"workspace_builder": f"{INVALID}:MissingPluginsBuilder"}, + ) + + def test_available_builders_includes_classic() -> None: """The classic entry point is discoverable.""" assert "classic" in registry.available_builders() From 8de4227e57f0dcd07aea4978874670bf40680b49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 13:48:24 -0500 Subject: [PATCH 2925/2998] options(fix): styled error for bad readiness config why: An invalid workspace_builder_options value (e.g. a typo'd pane_readiness: sometimes, or a non-mapping catalog) raised a bare ValueError/TypeError while constructing the default builder, which escaped load_workspace's WorkspaceBuilderError handler and surfaced as a raw traceback. what: - Add exc.InvalidWorkspaceBuilderOption (a WorkspaceBuilderError) and raise it from WorkspaceBuilderOptions.from_config for a non-mapping catalog or an invalid pane_readiness, so the error exits through the styled [Builder Error] path; PaneReadiness.from_config keeps its plain ValueError for the pure-parser unit/doctest - Add unit tests plus a load case covering the typo'd pane_readiness --- src/tmuxp/exc.py | 11 +++++++++++ src/tmuxp/workspace/options.py | 17 +++++++++-------- tests/cli/test_load.py | 12 ++++++++++++ tests/workspace/test_options.py | 13 +++++++++++-- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/tmuxp/exc.py b/src/tmuxp/exc.py index 59b69cbb7d..5908d48c5e 100644 --- a/src/tmuxp/exc.py +++ b/src/tmuxp/exc.py @@ -173,6 +173,17 @@ def __init__( return super().__init__(msg, *args, **kwargs) +class InvalidWorkspaceBuilderOption(WorkspaceBuilderError): + """A ``workspace_builder_options`` value is invalid.""" + + def __init__(self, reason: str, *args: object, **kwargs: object) -> None: + return super().__init__( + f"Invalid workspace_builder_options: {reason}", + *args, + **kwargs, + ) + + class TmuxpPluginException(TmuxpException): """Base Exception for Tmuxp Errors.""" diff --git a/src/tmuxp/workspace/options.py b/src/tmuxp/workspace/options.py index 32ad20d1d9..cc2fad0401 100644 --- a/src/tmuxp/workspace/options.py +++ b/src/tmuxp/workspace/options.py @@ -21,6 +21,8 @@ import os import typing as t +from tmuxp import exc + _AUTO_ALIASES = frozenset({"auto"}) _ALWAYS_ALIASES = frozenset({"always", "true", "on", "yes", "1"}) _NEVER_ALIASES = frozenset({"never", "false", "off", "no", "0"}) @@ -144,14 +146,13 @@ def from_config(cls, session_config: dict[str, t.Any]) -> WorkspaceBuilderOption """ catalog = session_config.get("workspace_builder_options") or {} if not isinstance(catalog, dict): - msg = ( - "workspace_builder_options must be a mapping, got " - f"{type(catalog).__name__}" - ) - raise TypeError(msg) - return cls( - pane_readiness=PaneReadiness.from_config(catalog.get("pane_readiness")), - ) + msg = f"must be a mapping, got {type(catalog).__name__}" + raise exc.InvalidWorkspaceBuilderOption(msg) + try: + pane_readiness = PaneReadiness.from_config(catalog.get("pane_readiness")) + except ValueError as e: + raise exc.InvalidWorkspaceBuilderOption(str(e)) from e + return cls(pane_readiness=pane_readiness) def shell_is_zsh(shell: str | None) -> bool: diff --git a/tests/cli/test_load.py b/tests/cli/test_load.py index 4588a526cb..275e798d68 100644 --- a/tests/cli/test_load.py +++ b/tests/cli/test_load.py @@ -708,6 +708,18 @@ class WorkspaceBuilderErrorFixture(t.NamedTuple): """, expected_substring="workspace_builder_paths entry is invalid", ), + WorkspaceBuilderErrorFixture( + test_id="invalid_pane_readiness", + yaml="""\ +session_name: builder-error +workspace_builder_options: + pane_readiness: sometimes +windows: +- panes: + - echo hi +""", + expected_substring="pane_readiness", + ), ] diff --git a/tests/workspace/test_options.py b/tests/workspace/test_options.py index cfd266a212..c7c9aa369b 100644 --- a/tests/workspace/test_options.py +++ b/tests/workspace/test_options.py @@ -6,6 +6,7 @@ import pytest +from tmuxp import exc from tmuxp.workspace.options import ( PaneReadiness, WorkspaceBuilderOptions, @@ -62,11 +63,19 @@ def test_workspace_builder_options_reads_catalog() -> None: def test_workspace_builder_options_invalid_catalog_type() -> None: - """A non-mapping catalog is rejected.""" - with pytest.raises(TypeError, match="must be a mapping"): + """A non-mapping catalog is rejected as a builder-option error.""" + with pytest.raises(exc.InvalidWorkspaceBuilderOption, match="must be a mapping"): WorkspaceBuilderOptions.from_config({"workspace_builder_options": ["nope"]}) +def test_workspace_builder_options_invalid_pane_readiness() -> None: + """An invalid pane_readiness is wrapped as a builder-option error.""" + with pytest.raises(exc.InvalidWorkspaceBuilderOption, match="pane_readiness"): + WorkspaceBuilderOptions.from_config( + {"workspace_builder_options": {"pane_readiness": "sometimes"}}, + ) + + @pytest.mark.parametrize( ("shell", "expected"), [ From bd8da8141701cda95bf22360b886ce1c34c1a351 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 14:19:11 -0500 Subject: [PATCH 2926/2998] docs(CHANGES) split builder notes into user and dev why: The 1.72.0 entry mixed user-facing capability with the builder API surface in What's new. Separate the two so the release lead reads as an upgrade decision and builder authors get one linked API entry. what: - Trim the What's new entries to high-level user prose (selection, trusted paths, the pane_readiness policy and its zsh-only default) - Add a Development entry linking the builder package, protocol, registry resolvers, options/PaneReadiness, and error hierarchy - Fold the guide cross-reference into both sections --- CHANGES | 69 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/CHANGES b/CHANGES index 7378276623..e7cf731dd8 100644 --- a/CHANGES +++ b/CHANGES @@ -46,49 +46,48 @@ _Notes on the upcoming release will go here._ ### What's new -#### Pluggable workspace builders (#1065) - -tmuxp can now load a workspace with a builder other than the built-in one. Set -`workspace_builder` in a workspace file to a Python dotted path -(`package.module:Builder`), a `module.attr` path, or the name of a builder -registered under the `tmuxp.workspace_builders` entry-point group. When a builder -lives outside tmuxp's environment, `workspace_builder_paths` lists trusted -directories that are temporarily added to `sys.path` for the import and build — -without the broader, code-executing behavior of site-directory processing. - -The built-in builder is now the explicit classic builder, available as the -`classic` entry point and as -{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. A public -contract, {class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol`, -documents what a builder must provide and is shaped to allow async builders as a -future additive extension. `WorkspaceBuilder` remains importable from -`tmuxp.workspace.builder` as a backwards-compatible alias. See -{ref}`custom-workspace-builders` for details. - -#### Configurable pane readiness (#1065) - -Whether tmuxp waits for a pane's shell prompt before sending layout and commands -is now configurable through a new `workspace_builder_options` catalog: +#### Pluggable workspace builders (#1066) + +tmuxp can now build a workspace with a builder other than its built-in one. Point +a workspace file's `workspace_builder` key at an installed builder — by registered +name or by Python import path — and tmuxp loads the session through it. Builders +that ship outside tmuxp's environment can be imported from directories listed in +`workspace_builder_paths`, which tmuxp trusts only for that load. The built-in +builder stays the default, so existing workspaces are unaffected. See +{ref}`custom-workspace-builders`. + +#### Configurable pane readiness (#1066) + +Before sending a pane's layout and commands, tmuxp can wait for the shell to draw +its prompt — a guard against a zsh prompt-redraw artifact. That wait is now a +policy you set per workspace: ```yaml workspace_builder_options: - pane_readiness: auto # auto | always | never (+ truthy/falsy aliases) + pane_readiness: auto # auto | always | never (also true/false) ``` -The prompt wait exists to avoid a zsh prompt-redraw artifact, so the new default, -`auto`, waits only when the session's interactive shell is zsh. zsh users see no -change. Sessions on other shells (bash, sh, …) skip a wait they did not need and -load slightly faster. To restore the previous always-wait behavior set -`pane_readiness: always`; to skip the wait entirely set `never`. See -{class}`~tmuxp.workspace.options.PaneReadiness`. +The new default, `auto`, waits only when the session's shell is zsh, so zsh users +see no change while bash, sh, and other shells skip a wait they never needed. Set +`always` to keep the previous wait-everywhere behavior, or `never` to skip it +entirely. See {ref}`custom-workspace-builders`. -### Documentation +### Development -#### Custom workspace builder guide (#1065) +#### Workspace builder API (#1066) -A new {ref}`custom-workspace-builders` topic explains how tmuxp hands a workspace -to a builder, how to select or package a builder, the trust boundary for -importing builder code, how to tune pane readiness, and how to test a builder. +`tmuxp.workspace.builder` is now a package. The default builder is +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`, with +`WorkspaceBuilder` kept as a backwards-compatible alias. Third-party builders +implement {class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` +(shaped to allow async builders later) and are resolved by +{func}`~tmuxp.workspace.builder.registry.resolve_builder_class` from an entry +point or import path, with trusted import directories handled by +{func}`~tmuxp.workspace.builder.registry.resolve_builder_paths`. Builder behavior +is configured through {class}`~tmuxp.workspace.options.WorkspaceBuilderOptions` +and {class}`~tmuxp.workspace.options.PaneReadiness`, and resolution failures raise +{exc}`~tmuxp.exc.WorkspaceBuilderError` and its subclasses. See +{ref}`custom-workspace-builders` for the guide. ## tmuxp 1.72.0 (2026-06-28) From 7437d1f386ed912ed762c491314b6c8f5325fbdf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 15:26:11 -0500 Subject: [PATCH 2927/2998] docs(config) workspace builder keys reference why: The workspace_builder, workspace_builder_paths, and workspace_builder_options keys were documented only in the Topics guide. A reader browsing the Configuration section could not discover them, and top-level.md was a stub that dead-ended the "Top-level Options" card. what: - Add configuration/workspace-builders.md: a config-section reference with a summary table, per-key sections, the pane_readiness values, and a minimal YAML/JSON example; volatile detail (full alias list, trust-boundary rationale) stays single-sourced in the topics guide - Surface it via a "Workspace builders" card in both index grids and the configuration toctree - Bridge the top-level.md stub and add a reverse seealso from the topics guide --- docs/configuration/index.md | 13 +++ docs/configuration/top-level.md | 9 ++ docs/configuration/workspace-builders.md | 142 +++++++++++++++++++++++ docs/topics/custom-workspace-builders.md | 5 + 4 files changed, 169 insertions(+) create mode 100644 docs/configuration/workspace-builders.md diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 619cb62710..a3e82e39c8 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -27,6 +27,12 @@ TMUXP_CONFIGDIR and other env vars. Sample workspace configurations. ::: +:::{grid-item-card} Workspace builders +:link: workspace-builders +:link-type: doc +Select a builder and tune pane readiness. +::: + :::: tmuxp loads your terminal workspace into tmux using workspace files. @@ -211,6 +217,12 @@ TMUXP_CONFIGDIR and other env vars. Sample workspace configurations. ::: +:::{grid-item-card} Workspace builders +:link: workspace-builders +:link-type: doc +Select a builder and tune pane readiness. +::: + :::: ```{toctree} @@ -219,4 +231,5 @@ Sample workspace configurations. top-level environmental-variables examples +workspace-builders ``` diff --git a/docs/configuration/top-level.md b/docs/configuration/top-level.md index 72eb24f32f..b8e480522e 100644 --- a/docs/configuration/top-level.md +++ b/docs/configuration/top-level.md @@ -40,3 +40,12 @@ Notes: ``` Above: Use `tmux` directly to attach _banana_. + +## Workspace builder keys + +A workspace file can also select a custom builder and tune builder behavior with +`workspace_builder`, `workspace_builder_paths`, and `workspace_builder_options`. + +```{seealso} +{ref}`workspace-builders` +``` diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md new file mode 100644 index 0000000000..5354d66900 --- /dev/null +++ b/docs/configuration/workspace-builders.md @@ -0,0 +1,142 @@ +(workspace-builders)= + +# Workspace builders + +```{versionadded} 1.72.0 +``` + +Most workspaces never need these keys. By default tmuxp builds your session with +its built-in *classic* builder and waits for a pane's shell prompt only when that +shell is zsh — existing workspace files keep working unchanged. Set the keys below +to swap in a different builder or to tune the prompt wait. **Omit a key (or remove +it) to restore the default.** + +| Key | Type | Default | Purpose | +| --- | --- | --- | --- | +| `workspace_builder` | string | `classic` | Which builder turns the workspace into a session. | +| `workspace_builder_paths` | string or list of strings | _(none)_ | Trusted directories to import a builder from. | +| `workspace_builder_options` | mapping | _(all defaults)_ | Builder-behavior knobs, such as `pane_readiness`. | + +For the narrative — writing a builder, packaging one, the trust boundary, and +testing — see {ref}`custom-workspace-builders`. + +(workspace-builder-key)= + +## `workspace_builder` + +Selects the builder. The default, `classic`, is tmuxp's built-in builder. A value +is resolved in this order: + +1. absent or empty → the built-in classic builder (nothing is imported); +2. contains `:` → a `module:attr` object reference; +3. no `.` and no `:` → a builder registered under the `tmuxp.workspace_builders` + entry-point group, selected by name; +4. dotted with no `:` → an entry-point name if one is registered, otherwise a + `module.attr` import path. + +```yaml +session_name: my-session +workspace_builder: classic +windows: + - panes: + - vim +``` + +See {ref}`custom-workspace-builders` for selecting and packaging builders, and +{func}`~tmuxp.workspace.builder.registry.resolve_builder_class` for the resolver. + +(workspace-builder-paths-key)= + +## `workspace_builder_paths` + +Directories to import a builder from when it lives outside tmuxp's environment — +for example, a script in your config directory. Accepts a single string or a list +of strings. tmuxp expands `~` and environment variables, resolves relative entries +against the workspace file's directory, and requires each entry to be an existing +directory; the paths are added to `sys.path` only for the import and build. + +```yaml +workspace_builder: my_local_builder:CustomBuilder +workspace_builder_paths: + - ~/.config/tmuxp/builders +``` + +```{warning} +A workspace file that names a builder runs that builder's Python code. Only load +workspace files you trust. See the security note in {ref}`custom-workspace-builders`. +``` + +(workspace-builder-options-key)= + +## `workspace_builder_options` + +A catalog of builder-behavior settings, independent of which builder you use. +Today it holds a single key, `pane_readiness`, which controls whether tmuxp waits +for a pane's shell prompt before sending its layout and commands — a guard against +a zsh prompt-redraw artifact: + +```yaml +workspace_builder_options: + pane_readiness: auto +``` + +| Value | Behavior | +| --- | --- | +| `auto` _(default)_ | Wait only when the session's shell is zsh. | +| `always` | Always wait for default-shell panes. | +| `never` | Never wait; fastest, but accepts the prompt/layout race for shells that need it. | + +`pane_readiness` also accepts truthy/falsy aliases — `true`/`on`/`yes`/`1` map to +`always`, and `false`/`off`/`no`/`0` map to `never` (full list in +{ref}`custom-workspace-builders`). An unrecognized value fails the load with: + +```text +invalid pane_readiness value: 'sometimes'; expected one of: auto, always/true/on/yes/1, never/false/off/no/0 +``` + +Panes that run a custom `shell` or `window_shell` never wait, regardless of policy. +See {class}`~tmuxp.workspace.options.PaneReadiness` and +{class}`~tmuxp.workspace.options.WorkspaceBuilderOptions` for the parsing rules. + +## Minimal complete example + +````{tab} YAML +```yaml +session_name: my-session +workspace_builder: classic +workspace_builder_paths: + - ~/.config/tmuxp/builders +workspace_builder_options: + pane_readiness: auto +windows: + - window_name: editor + panes: + - vim +``` +```` + +````{tab} JSON +```json +{ + "session_name": "my-session", + "workspace_builder": "classic", + "workspace_builder_paths": ["~/.config/tmuxp/builders"], + "workspace_builder_options": { + "pane_readiness": "auto" + }, + "windows": [ + { + "window_name": "editor", + "panes": ["vim"] + } + ] +} +``` +```` + +```{seealso} +{ref}`custom-workspace-builders` — narrative guide to selecting, packaging, +writing, and testing builders · +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` · +{class}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` +``` diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md index 598ba2a532..26f6f38ff7 100644 --- a/docs/topics/custom-workspace-builders.md +++ b/docs/topics/custom-workspace-builders.md @@ -11,6 +11,11 @@ can distribute builders that users select by name. This is an advanced, opt-in feature. Existing workspace files keep using the classic builder with no changes. +```{seealso} +If you only want to set these keys in a workspace file, see +{ref}`workspace-builders` in the configuration reference. +``` + ## How a workspace is built 1. `tmuxp load` reads the YAML/JSON file and expands it (shorthand, environment From 4d58e4896715acc32696ede20076a73fbae41866 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 15:46:19 -0500 Subject: [PATCH 2928/2998] docs(api) split builder reference into a grid of pages why: The builder API page stacked the classic, protocol, and registry modules on one long page. As a package, builder reads better as its own section with a landing grid, matching the cli/ and workspace/ package layout. what: - Split internals/api/workspace/builder.md into a builder/ package doc: an index.md landing with a card grid + toctree over classic, protocol, and registry sub-pages, one automodule each - Point the workspace toctree at builder/index - Repoint the legacy api/workspace/builder redirect at builder/index --- docs/internals/api/workspace/builder.md | 36 ----------------- .../api/workspace/builder/classic.md | 8 ++++ docs/internals/api/workspace/builder/index.md | 40 +++++++++++++++++++ .../api/workspace/builder/protocol.md | 8 ++++ .../api/workspace/builder/registry.md | 8 ++++ docs/internals/api/workspace/index.md | 2 +- docs/redirects.txt | 2 +- 7 files changed, 66 insertions(+), 38 deletions(-) delete mode 100644 docs/internals/api/workspace/builder.md create mode 100644 docs/internals/api/workspace/builder/classic.md create mode 100644 docs/internals/api/workspace/builder/index.md create mode 100644 docs/internals/api/workspace/builder/protocol.md create mode 100644 docs/internals/api/workspace/builder/registry.md diff --git a/docs/internals/api/workspace/builder.md b/docs/internals/api/workspace/builder.md deleted file mode 100644 index 012ed26eea..0000000000 --- a/docs/internals/api/workspace/builder.md +++ /dev/null @@ -1,36 +0,0 @@ -# Builder - `tmuxp.workspace.builder` - -`tmuxp.workspace.builder` is a package. The classic, default builder lives in -{mod}`tmuxp.workspace.builder.classic`; the public contract and the selection -machinery live alongside it. - -`WorkspaceBuilder` remains importable from `tmuxp.workspace.builder` as a -backwards-compatible alias of -{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. - -## Classic builder - `tmuxp.workspace.builder.classic` - -```{eval-rst} -.. automodule:: tmuxp.workspace.builder.classic - :members: - :show-inheritance: - :undoc-members: -``` - -## Builder protocol - `tmuxp.workspace.builder.protocol` - -```{eval-rst} -.. automodule:: tmuxp.workspace.builder.protocol - :members: - :show-inheritance: - :undoc-members: -``` - -## Builder registry - `tmuxp.workspace.builder.registry` - -```{eval-rst} -.. automodule:: tmuxp.workspace.builder.registry - :members: - :show-inheritance: - :undoc-members: -``` diff --git a/docs/internals/api/workspace/builder/classic.md b/docs/internals/api/workspace/builder/classic.md new file mode 100644 index 0000000000..856ebc63d4 --- /dev/null +++ b/docs/internals/api/workspace/builder/classic.md @@ -0,0 +1,8 @@ +# Classic builder - `tmuxp.workspace.builder.classic` + +```{eval-rst} +.. automodule:: tmuxp.workspace.builder.classic + :members: + :show-inheritance: + :undoc-members: +``` diff --git a/docs/internals/api/workspace/builder/index.md b/docs/internals/api/workspace/builder/index.md new file mode 100644 index 0000000000..0b3ddbfabe --- /dev/null +++ b/docs/internals/api/workspace/builder/index.md @@ -0,0 +1,40 @@ +# Builder - `tmuxp.workspace.builder` + +`tmuxp.workspace.builder` is a package. The classic, default builder lives in +{mod}`tmuxp.workspace.builder.classic`; the public contract and the selection +machinery live alongside it. + +`WorkspaceBuilder` remains importable from `tmuxp.workspace.builder` as a +backwards-compatible alias of +{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. + +::::{grid} 1 1 2 2 +:gutter: 2 2 3 3 + +:::{grid-item-card} Classic builder +:link: classic +:link-type: doc +The built-in, default builder — `tmuxp.workspace.builder.classic`. +::: + +:::{grid-item-card} Builder protocol +:link: protocol +:link-type: doc +The contract a builder must satisfy — `tmuxp.workspace.builder.protocol`. +::: + +:::{grid-item-card} Builder registry +:link: registry +:link-type: doc +Builder selection and trusted import paths — `tmuxp.workspace.builder.registry`. +::: + +:::: + +```{toctree} +:hidden: + +classic +protocol +registry +``` diff --git a/docs/internals/api/workspace/builder/protocol.md b/docs/internals/api/workspace/builder/protocol.md new file mode 100644 index 0000000000..1c980b33b3 --- /dev/null +++ b/docs/internals/api/workspace/builder/protocol.md @@ -0,0 +1,8 @@ +# Builder protocol - `tmuxp.workspace.builder.protocol` + +```{eval-rst} +.. automodule:: tmuxp.workspace.builder.protocol + :members: + :show-inheritance: + :undoc-members: +``` diff --git a/docs/internals/api/workspace/builder/registry.md b/docs/internals/api/workspace/builder/registry.md new file mode 100644 index 0000000000..3a9fa4f7f3 --- /dev/null +++ b/docs/internals/api/workspace/builder/registry.md @@ -0,0 +1,8 @@ +# Builder registry - `tmuxp.workspace.builder.registry` + +```{eval-rst} +.. automodule:: tmuxp.workspace.builder.registry + :members: + :show-inheritance: + :undoc-members: +``` diff --git a/docs/internals/api/workspace/index.md b/docs/internals/api/workspace/index.md index 373aadc72e..73c844cf27 100644 --- a/docs/internals/api/workspace/index.md +++ b/docs/internals/api/workspace/index.md @@ -9,7 +9,7 @@ If you need an internal API stabilized please [file an issue](https://github.com ::: ```{toctree} -builder +builder/index constants finders freezer diff --git a/docs/redirects.txt b/docs/redirects.txt index be9e1bdd10..53b041de9d 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -23,7 +23,7 @@ "api/cli/shell.md" "internals/api/cli/shell.md" "api/cli/utils.md" "internals/api/cli/utils.md" "api/workspace/index.md" "internals/api/workspace/index.md" -"api/workspace/builder.md" "internals/api/workspace/builder.md" +"api/workspace/builder.md" "internals/api/workspace/builder/index.md" "api/workspace/constants.md" "internals/api/workspace/constants.md" "api/workspace/finders.md" "internals/api/workspace/finders.md" "api/workspace/freezer.md" "internals/api/workspace/freezer.md" From b0f4144e436822d61b448f57afa4486dd1a192bd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 18:32:14 -0500 Subject: [PATCH 2929/2998] docs(CHANGES): place builder API under What's new why: AGENTS.md reserves ### Development for dev tooling (helper scripts, internal automation). The workspace builder API is a public extension surface for builder authors, so it belongs under ### What's new. what: - Drop the ### Development heading so "Workspace builder API" sits as a third deliverable under ### What's new --- CHANGES | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGES b/CHANGES index e7cf731dd8..2c271d91e3 100644 --- a/CHANGES +++ b/CHANGES @@ -72,8 +72,6 @@ see no change while bash, sh, and other shells skip a wait they never needed. Se `always` to keep the previous wait-everywhere behavior, or `never` to skip it entirely. See {ref}`custom-workspace-builders`. -### Development - #### Workspace builder API (#1066) `tmuxp.workspace.builder` is now a package. The default builder is From 389a178db2cdc5db8e1578b2e9df4894ecdf2dbd Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 18:34:30 -0500 Subject: [PATCH 2930/2998] exc(test): doctest new workspace-builder errors why: CLAUDE.md requires working doctests on all functions and methods; the new workspace-builder exception classes added in this branch had none. what: - Add a concise print()-based doctest to each new builder exception (WorkspaceBuilderNotFound, WorkspaceBuilderImportError, InvalidWorkspaceBuilder, WorkspaceBuilderPathError, InvalidWorkspaceBuilderOption) covering message construction --- src/tmuxp/exc.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/tmuxp/exc.py b/src/tmuxp/exc.py index 5908d48c5e..8e76e531d5 100644 --- a/src/tmuxp/exc.py +++ b/src/tmuxp/exc.py @@ -99,7 +99,11 @@ class WorkspaceBuilderError(WorkspaceError): class WorkspaceBuilderNotFound(WorkspaceBuilderError): - """Configured ``workspace_builder`` could not be resolved.""" + """Configured ``workspace_builder`` could not be resolved. + + >>> print(WorkspaceBuilderNotFound("nope")) + Workspace builder 'nope' could not be found.... + """ def __init__( self, @@ -121,7 +125,11 @@ def __init__( class WorkspaceBuilderImportError(WorkspaceBuilderError): - """Configured ``workspace_builder`` failed to import.""" + """Configured ``workspace_builder`` failed to import. + + >>> print(WorkspaceBuilderImportError("pkg:B")) + Could not import workspace builder 'pkg:B'.... + """ def __init__( self, @@ -144,7 +152,11 @@ def __init__( class InvalidWorkspaceBuilder(WorkspaceBuilderError): - """Resolved ``workspace_builder`` object is not a usable builder.""" + """Resolved ``workspace_builder`` object is not a usable builder. + + >>> print(InvalidWorkspaceBuilder("pkg:B")) + 'pkg:B' is not a valid workspace builder. + """ def __init__( self, @@ -159,7 +171,11 @@ def __init__( class WorkspaceBuilderPathError(WorkspaceBuilderError): - """A ``workspace_builder_paths`` entry is not a usable directory.""" + """A ``workspace_builder_paths`` entry is not a usable directory. + + >>> print(WorkspaceBuilderPathError("/x")) + workspace_builder_paths entry is invalid: /x.... + """ def __init__( self, @@ -174,7 +190,11 @@ def __init__( class InvalidWorkspaceBuilderOption(WorkspaceBuilderError): - """A ``workspace_builder_options`` value is invalid.""" + """A ``workspace_builder_options`` value is invalid. + + >>> print(InvalidWorkspaceBuilderOption("bad")) + Invalid workspace_builder_options: bad + """ def __init__(self, reason: str, *args: object, **kwargs: object) -> None: return super().__init__( From 812dcca01a04c8612c33c30cb46ef5c97449011d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 28 Jun 2026 18:50:40 -0500 Subject: [PATCH 2931/2998] Tag v1.73.0 Minor release making the workspace build step pluggable and tunable. A workspace can build through a third-party builder selected by entry-point name or import path, and a new workspace_builder_options catalog controls the pane-readiness wait per workspace (#1066). Behavior change: the new pane_readiness=auto default skips the pane prompt wait on non-zsh shells; set pane_readiness: always to restore the previous wait-everywhere behavior. --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 2c271d91e3..1c006c2e5d 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.73.0 (Yet to be released) +## tmuxp 1.74.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.73.0 (2026-06-28) + +tmuxp 1.73.0 makes the workspace build step pluggable and tunable. A workspace can now build through a third-party builder selected by registered entry-point name or Python import path, and a new `workspace_builder_options` catalog controls the pane-readiness wait per workspace. The built-in builder stays the default, so existing workspaces keep working — though the new `pane_readiness: auto` default skips the prompt wait on non-zsh shells. See {ref}`custom-workspace-builders` for the guide. + ### What's new #### Pluggable workspace builders (#1066) diff --git a/pyproject.toml b/pyproject.toml index b5f88abe5e..7abefdeaf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.72.0" +version = "1.73.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 2aa569d6cf..4bfc1730c9 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.72.0" +__version__ = "1.73.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index d366553884..11ede46c19 100644 --- a/uv.lock +++ b/uv.lock @@ -1608,7 +1608,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.72.0" +version = "1.73.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From 8fc3a16df2cc1da11b46af88d576a18c7536b23b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:08:43 -0500 Subject: [PATCH 2932/2998] docs(workspace-builders): lead with the concept, not the keys why: The intro framed the feature as a set of config "keys" to set, which is the implementation surface, not what a workspace builder means to the reader. Users meet the YAML knobs last, not first. what: - Open by defining what a workspace builder is and that it works out of the box, so most readers can stop after the first paragraph - Use progressive disclosure: default -> builder options (pane_readiness) -> swap builders -> write your own in Python - Name the cost/benefit of the prompt wait explicitly - Fold the narrative cross-reference onto "write your own" and drop the redundant standalone pointer below the table --- docs/configuration/workspace-builders.md | 28 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 5354d66900..aa24e68a6e 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -5,20 +5,30 @@ ```{versionadded} 1.72.0 ``` -Most workspaces never need these keys. By default tmuxp builds your session with -its built-in *classic* builder and waits for a pane's shell prompt only when that -shell is zsh — existing workspace files keep working unchanged. Set the keys below -to swap in a different builder or to tune the prompt wait. **Omit a key (or remove -it) to restore the default.** +A *workspace builder* is the part of tmuxp that turns a workspace configuration into a +live tmux session — it creates the session, lays out its windows and panes, and runs +their commands. You usually never have to think about it: tmuxp ships with a built-in +*classic* builder, and your YAML or JSON workspace files load through it out of the +box, just as they always have. **Everything on this page is optional; leave a setting +out to fall back to the default.** + +Workspaces with special needs can reach for a builder's options to fine-tune how a +session loads. The classic builder, for instance, can wait for a pane's shell prompt +before sending its layout and commands — by default only when that shell is zsh (the +`pane_readiness` option). Waiting makes a session a little slower to load, but +guarantees the workspace is fully prepped before you attach. + +You can also send a workspace through a different or custom builder instead of the +classic one, and tune its options the same way. For the braver cases, you can subclass +the classic builder or write your own in Python on top of libtmux — see +{ref}`custom-workspace-builders` for writing, packaging, testing, and the trust +boundary that comes with running builder code. | Key | Type | Default | Purpose | | --- | --- | --- | --- | | `workspace_builder` | string | `classic` | Which builder turns the workspace into a session. | | `workspace_builder_paths` | string or list of strings | _(none)_ | Trusted directories to import a builder from. | -| `workspace_builder_options` | mapping | _(all defaults)_ | Builder-behavior knobs, such as `pane_readiness`. | - -For the narrative — writing a builder, packaging one, the trust boundary, and -testing — see {ref}`custom-workspace-builders`. +| `workspace_builder_options` | mapping | _(all defaults)_ | Builder-behavior settings, such as `pane_readiness`. | (workspace-builder-key)= From 4f225e634bc236daf4e90f999a3d324e02c0aeec Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:10:44 -0500 Subject: [PATCH 2933/2998] docs(workspace-builders): link libtmux to its homepage why: The intro now points advanced readers at libtmux as the layer a custom builder drives, but left it as bare text with no way to get there. what: - Link the first libtmux mention to https://libtmux.git-pull.com/, matching the plain-link style used in topics/library-vs-cli.md --- docs/configuration/workspace-builders.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index aa24e68a6e..5b4349f335 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -20,7 +20,8 @@ guarantees the workspace is fully prepped before you attach. You can also send a workspace through a different or custom builder instead of the classic one, and tune its options the same way. For the braver cases, you can subclass -the classic builder or write your own in Python on top of libtmux — see +the classic builder or write your own in Python on top of +[libtmux](https://libtmux.git-pull.com/) — see {ref}`custom-workspace-builders` for writing, packaging, testing, and the trust boundary that comes with running builder code. From 58be2b97896471251848496290b91098e76520d9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:13:44 -0500 Subject: [PATCH 2934/2998] docs(workspace-builders): warm the section prose to match the intro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: After the intro was rewritten to address the reader directly and lead with the concept, the per-setting sections still read as terse reference blurbs ("Selects the builder", "A catalog of..."), and one still framed pane_readiness as a "key". what: - Rewrite the workspace_builder, workspace_builder_paths, and workspace_builder_options leads in second person, present tense - Drop the remaining "key" framing in favor of naming the setting - Leave the resolver order list, value table, alias list, and error text untouched — reference precision stays as-is --- docs/configuration/workspace-builders.md | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 5b4349f335..47311bc9c0 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -35,8 +35,9 @@ boundary that comes with running builder code. ## `workspace_builder` -Selects the builder. The default, `classic`, is tmuxp's built-in builder. A value -is resolved in this order: +This is where you name the builder. Leave it out — or set `classic` — and you get +tmuxp's built-in builder, with nothing imported. When you name something else, tmuxp +works out what you mean from the shape of the value, in this order: 1. absent or empty → the built-in classic builder (nothing is imported); 2. contains `:` → a `module:attr` object reference; @@ -60,11 +61,12 @@ See {ref}`custom-workspace-builders` for selecting and packaging builders, and ## `workspace_builder_paths` -Directories to import a builder from when it lives outside tmuxp's environment — -for example, a script in your config directory. Accepts a single string or a list -of strings. tmuxp expands `~` and environment variables, resolves relative entries -against the workspace file's directory, and requires each entry to be an existing -directory; the paths are added to `sys.path` only for the import and build. +When your builder lives outside tmuxp's environment — say, a script sitting in your +config directory — this tells tmuxp where to find it. Give it a single directory or a +list of them. tmuxp expands `~` and environment variables, reads relative entries +against the workspace file's own directory, and expects each one to be a directory +that already exists. The paths join `sys.path` only for the import and build, not for +the rest of your session. ```yaml workspace_builder: my_local_builder:CustomBuilder @@ -81,10 +83,10 @@ workspace files you trust. See the security note in {ref}`custom-workspace-build ## `workspace_builder_options` -A catalog of builder-behavior settings, independent of which builder you use. -Today it holds a single key, `pane_readiness`, which controls whether tmuxp waits -for a pane's shell prompt before sending its layout and commands — a guard against -a zsh prompt-redraw artifact: +This holds builder-behavior settings, whichever builder you use. For now there's just +one, `pane_readiness`, which decides whether tmuxp waits for a pane's shell prompt +before it sends that pane's layout and commands — a guard against a zsh prompt-redraw +artifact: ```yaml workspace_builder_options: @@ -105,7 +107,7 @@ workspace_builder_options: invalid pane_readiness value: 'sometimes'; expected one of: auto, always/true/on/yes/1, never/false/off/no/0 ``` -Panes that run a custom `shell` or `window_shell` never wait, regardless of policy. +A pane that runs a custom `shell` or `window_shell` never waits, whatever you set here. See {class}`~tmuxp.workspace.options.PaneReadiness` and {class}`~tmuxp.workspace.options.WorkspaceBuilderOptions` for the parsing rules. From 25826074a662ca54696482368c8b39ad04ffbdbb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:18:20 -0500 Subject: [PATCH 2935/2998] ai(rules) Add docs/AGENTS.md documentation voice guide why: The docs/ prose voice (concept before configuration, reader addressed directly, advanced parts marked opt-in) lived only in one page's git history. what: - Add docs/AGENTS.md describing the docs/ prose voice and audience, scoped as a complement to the root AGENTS.md - Exclude AGENTS.md from the Sphinx build so it is not an orphan doc --- docs/AGENTS.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ docs/conf.py | 3 ++ 2 files changed, 83 insertions(+) create mode 100644 docs/AGENTS.md diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000000..16961d0df4 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,80 @@ +# Documentation voice + +This file covers the *voice* of prose under `docs/` — how to frame a +feature page so a reader meets the idea before its configuration. It +complements the repository-root `AGENTS.md`, which already governs code +blocks, shell-command formatting, changelog conventions, and MyST +roles. When the two overlap, the root file wins; this one only answers +the question it leaves open: how should the prose sound? + +## Who you are writing for + +The default reader runs tmuxp and writes workspace files in YAML or +JSON. They are fluent in tmux itself — servers, sessions, windows, +panes, layouts, the shell and its prompt — but you cannot assume they +read Python, know tmuxp's internals, or have heard of its builder +architecture, entry points, or `sys.path`. + +A second, smaller reader writes Python: custom builders, plugins, code +against libtmux. Serve them too, but mark their material as opt-in +("for the braver cases", "advanced") so the default reader knows they +can stop. Never make the common case pay a comprehension tax for the +advanced one. + +## Voice + +- **Second person, present tense, active.** "You name the builder", not + "The builder is selected". Address the reader who is doing the thing. +- **Concept before configuration.** Open by saying what the thing *is* + and what it does for the reader. The YAML surface — the keys, the + flags — is the last detail they need, not the first. A page that + opens with "set these keys" has buried the idea under its mechanics. +- **Say when they can stop.** Lead with the default and the + reassurance: most readers never touch this, it works out of the box, + everything here is optional. Let a skimmer leave after one sentence. +- **Progressive disclosure.** Order by how many readers need it: + default → the one option a few will tune → swapping the whole thing + → writing your own. Each step is for a smaller audience than the last. +- **Name the trade-off.** If an option costs something — load time, a + slower attach — say so, and say what it buys ("a little slower, but + the workspace is fully prepped before you attach"). State it; don't + sell it. +- **Frame by concept, not by mechanism.** Don't call a feature "the + keys" or "the flags" in prose; that names the implementation surface, + which is the reader's last concern. Name the concept. The mechanics + vocabulary — a `Key` / `Type` / `Default` table — is correct in a + reference table, and only there. + +## What stays precise + +Warm the framing, never the facts. Resolution-order lists, value +tables, exact error strings, and class or function cross-references +carry meaning in their exact form — leave them alone. The friendly +voice belongs in the sentences *around* a precise block, introducing +it, not inside it paraphrasing it into vagueness. + +## Cross-references + +Point the advanced reader at the deep-dive rather than inlining it, and +put the link where their interest peaks — on the phrase that made them +curious ("write your own") — not as a standalone footnote the eye +skips. Use the MyST roles listed in the root `AGENTS.md`. + +## A page that does this + +`docs/configuration/workspace-builders.md` is the worked example: +a concept-first intro, an out-of-the-box reassurance, sections ordered +by shrinking audience, an honest trade-off on the prompt wait, and +precise reference tables left precise. Read it before reshaping another +page. + +## Before you commit + +- Does the page open with what the feature *is*, or with how to + configure it? +- Can a reader who needs only the default stop after the first + paragraph? +- Is anything framed as "the keys/flags" that should be named by + concept instead? +- Are the advanced and Python-only parts clearly marked opt-in? +- Did you leave every table, error string, and cross-reference exact? diff --git a/docs/conf.py b/docs/conf.py index 4afd921ad2..8584c036c7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,5 +48,8 @@ aafig_format={"latex": "pdf", "html": "gif"}, aafig_default_options={"scale": 0.75, "aspect": 0.5, "proportional": True}, rediraffe_redirects="redirects.txt", + # AGENTS.md is agent guidance, not a site page; keep Sphinx from + # treating it as an orphan document. + exclude_patterns=["_build", "AGENTS.md"], ) globals().update(conf) From e536244b613d53f608840caa367d8c2162fd6fb9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:20:58 -0500 Subject: [PATCH 2936/2998] ai(rules[claude]) Link docs/`CLAUDE.md` -> `AGENTS.md` why: Claude Code reads CLAUDE.md; the symlink lets it pick up the same docs/ voice guidance without a second copy to keep in sync. what: - Symlink docs/CLAUDE.md -> AGENTS.md, mirroring the repository root - Exclude CLAUDE.md from the Sphinx build alongside AGENTS.md --- docs/CLAUDE.md | 1 + docs/conf.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 120000 docs/CLAUDE.md diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md new file mode 120000 index 0000000000..47dc3e3d86 --- /dev/null +++ b/docs/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 8584c036c7..5be4d35a38 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -48,8 +48,8 @@ aafig_format={"latex": "pdf", "html": "gif"}, aafig_default_options={"scale": 0.75, "aspect": 0.5, "proportional": True}, rediraffe_redirects="redirects.txt", - # AGENTS.md is agent guidance, not a site page; keep Sphinx from - # treating it as an orphan document. - exclude_patterns=["_build", "AGENTS.md"], + # AGENTS.md (+ its CLAUDE.md symlink) is agent guidance, not a site + # page; keep Sphinx from treating it as an orphan document. + exclude_patterns=["_build", "AGENTS.md", "CLAUDE.md"], ) globals().update(conf) From 59ed40befcdb54d341241e49157d736debf6573e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:50:23 -0500 Subject: [PATCH 2937/2998] docs(ext): inline mermaid diagrams at build time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: Diagrams must paint with the page — instant, no layout shift, no staggered pop-in — and must survive gp-sphinx SPA swaps. Client-side mermaid.run() loses on every count: async render means CLS and a flash of source, and spa-nav.js takes its View-Transition snapshot before the SVG exists. Rendering to inline SVG at build time satisfies all of it with zero per-page JavaScript, and the swapped .article-container then carries finished SVG through SPA navigation with no re-render. what: - Add docs/_ext/mermaid_inline.py: a `mermaid` directive that defers to an HTML write-phase visitor, which shells to mmdc, content-hash-caches per theme, normalizes the SVG (unique id replacing mermaid's fixed "my-svg", explicit width/height from the viewBox, stripped max-width), and inlines light+dark variants; degrades to a text fallback with a one-time warning when the renderer is absent - Add docs/_static/css/gp-diagram.css: dual-SVG light/dark toggle on body[data-theme], intrinsic sizing, wide-diagram scroll wrapper - Wire docs/conf.py: register the extension, route plain mermaid fences via myst_fence_as_directive, exclude node_modules and the render cache from the Sphinx source tree - Pin the renderer locally (docs/package.json + pnpm lock/workspace); gitignore docs/node_modules and docs/_mermaid_cache - Add tests/test_docs_mermaid.py: NamedTuple-parametrized, test_id-first coverage of the normalizer, digest determinism, dual-theme emission, cache idempotency, missing-renderer fallback, and the setup() contract --- .gitignore | 4 + docs/_ext/mermaid_inline.py | 364 +++++ docs/_static/css/gp-diagram.css | 72 + docs/conf.py | 17 +- docs/package.json | 8 + docs/pnpm-lock.yaml | 2281 +++++++++++++++++++++++++++++++ docs/pnpm-workspace.yaml | 4 + tests/test_docs_mermaid.py | 295 ++++ 8 files changed, 3042 insertions(+), 3 deletions(-) create mode 100644 docs/_ext/mermaid_inline.py create mode 100644 docs/_static/css/gp-diagram.css create mode 100644 docs/package.json create mode 100644 docs/pnpm-lock.yaml create mode 100644 docs/pnpm-workspace.yaml create mode 100644 tests/test_docs_mermaid.py diff --git a/.gitignore b/.gitignore index 9dadb843bd..192e58cfc8 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,10 @@ coverage.xml # Sphinx documentation docs/_build/ +# Mermaid diagram tooling (docs/_ext/mermaid_inline.py) +docs/node_modules/ +docs/_mermaid_cache/ + # PyBuilder target/ diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py new file mode 100644 index 0000000000..33a6df540a --- /dev/null +++ b/docs/_ext/mermaid_inline.py @@ -0,0 +1,364 @@ +"""Build-time mermaid rendering for Sphinx, producing inline SVG. + +Renders fenced ``mermaid`` blocks to inline ```` at build time via +``mmdc`` (`@mermaid-js/mermaid-cli`_), so diagrams paint with the page: there is +no client-side mermaid runtime, no asynchronous pop-in, and no layout shift. The +finished SVG ships inside ``.article-container``, so it also rides through +gp-sphinx's SPA navigation as live DOM with zero re-initialisation. + +Each diagram is rendered twice — a light and a dark variant — and both are +inlined, toggled by CSS on ``body[data-theme]`` (see ``gp-diagram.css``). Mermaid +bakes literal colours into an id-scoped, ``!important`` ``
    ' + html.escape(source) + "
    ", + ) + raise nodes.SkipNode from None + + digest = _diagram_digest(source, "") + light = _normalize_svg(light, svg_id=_svg_element_id(digest, _THEME_LIGHT)) + dark = _normalize_svg(dark, svg_id=_svg_element_id(digest, _THEME_DARK)) + + caption: str = node.get("caption", "") + alt = node.get("alt", "") or caption + aria = f' aria-label="{html.escape(alt, quote=True)}"' if alt else "" + ids: list[str] = node.get("ids", []) + fig_id = f' id="{ids[0]}"' if ids else "" + + parts = [ + f'
    ', + f'', + ( + '' + ), + ] + if caption: + parts.append(f"
    {html.escape(caption)}
    ") + parts.append("
    ") + self.body.append("".join(parts)) + raise nodes.SkipNode + + +def _depart_mermaid_inline(self: HTML5Translator, node: mermaid_inline) -> None: + """No-op; :func:`html_visit_mermaid_inline` raises ``SkipNode``.""" + + +def setup(app: Sphinx) -> dict[str, t.Any]: + """Register the directive, node, config values, and stylesheet.""" + app.add_node( + mermaid_inline, + html=(html_visit_mermaid_inline, _depart_mermaid_inline), + ) + app.add_directive("mermaid", MermaidDirective) + app.add_config_value("mermaid_inline_cmd", "", "env") + app.add_config_value("mermaid_inline_puppeteer_config", "", "env") + app.add_css_file("css/gp-diagram.css") + return { + "version": "0.1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/docs/_static/css/gp-diagram.css b/docs/_static/css/gp-diagram.css new file mode 100644 index 0000000000..c032e4332a --- /dev/null +++ b/docs/_static/css/gp-diagram.css @@ -0,0 +1,72 @@ +/* + * Build-time mermaid diagrams (docs/_ext/mermaid_inline.py). + * + * Each diagram is inlined twice — a light and a dark SVG — and this stylesheet + * shows exactly one. Mermaid bakes literal colours into an id-scoped, + * !important " + 'a' + '' + "" +) + + +class NormalizeCase(t.NamedTuple): + """A ``_normalize_svg`` scenario and its expected substrings.""" + + test_id: str + raw_svg: str + svg_id: str + expect_contains: tuple[str, ...] + expect_absent: tuple[str, ...] + + +_NORMALIZE_CASES: list[NormalizeCase] = [ + NormalizeCase( + test_id="width-and-height-from-viewbox", + raw_svg=( + '' + ), + svg_id="mermaid-deadbeef-light", + expect_contains=( + 'width="200"', + 'height="80"', + 'id="mermaid-deadbeef-light"', + "#mermaid-deadbeef-light{", + ), + expect_absent=("my-svg", "max-width", 'width="100%"'), + ), + NormalizeCase( + test_id="marker-references-rewritten", + raw_svg=( + '' + '' + ), + svg_id="mermaid-abc-dark", + expect_contains=("url(#mermaid-abc-dark_end)", 'width="10"', 'height="10"'), + expect_absent=("my-svg",), + ), + NormalizeCase( + test_id="decimal-viewbox-dimensions", + raw_svg=( + '' + ), + svg_id="mermaid-x-light", + expect_contains=('width="1141.25"', 'height="94"'), + expect_absent=("max-width",), + ), +] + + +@pytest.mark.parametrize( + "case", + _NORMALIZE_CASES, + ids=[c.test_id for c in _NORMALIZE_CASES], +) +def test_normalize_svg(case: NormalizeCase) -> None: + """``_normalize_svg`` rewrites the id, sets size, and drops ``max-width``.""" + out = mi._normalize_svg(case.raw_svg, svg_id=case.svg_id) + for needle in case.expect_contains: + assert needle in out, f"{case.test_id}: expected {needle!r}" + for needle in case.expect_absent: + assert needle not in out, f"{case.test_id}: unexpected {needle!r}" + + +class DigestCase(t.NamedTuple): + """Two ``_diagram_digest`` inputs and whether their hashes should match.""" + + test_id: str + a_source: str + a_theme: str + b_source: str + b_theme: str + expect_equal: bool + + +_DIGEST_CASES: list[DigestCase] = [ + DigestCase( + "identical-inputs-match", + "flowchart LR a-->b", + "default", + "flowchart LR a-->b", + "default", + True, + ), + DigestCase( + "theme-differs", + "flowchart LR a-->b", + "default", + "flowchart LR a-->b", + "dark", + False, + ), + DigestCase( + "source-differs", + "flowchart LR a-->b", + "default", + "flowchart LR a-->c", + "default", + False, + ), +] + + +@pytest.mark.parametrize( + "case", + _DIGEST_CASES, + ids=[c.test_id for c in _DIGEST_CASES], +) +def test_diagram_digest(case: DigestCase) -> None: + """``_diagram_digest`` is stable per input and varies by theme and source.""" + a = mi._diagram_digest(case.a_source, case.a_theme) + b = mi._diagram_digest(case.b_source, case.b_theme) + assert (a == b) is case.expect_equal + assert len(a) == 40 + + +def test_svg_element_id_is_themed_and_unique() -> None: + """``_svg_element_id`` yields distinct, theme-suffixed ids per variant.""" + digest = mi._diagram_digest("flowchart LR a-->b", "") + light = mi._svg_element_id(digest, "light") + dark = mi._svg_element_id(digest, "dark") + assert light != dark + assert light.startswith("mermaid-") + assert light.endswith("-light") + + +def _make_translator(tmp_path: Path) -> types.SimpleNamespace: + """Return a minimal stand-in for the HTML translator the visitor needs.""" + config = types.SimpleNamespace( + mermaid_inline_cmd="", + mermaid_inline_puppeteer_config="", + ) + app = types.SimpleNamespace(confdir=str(tmp_path), config=config) + builder = types.SimpleNamespace(app=app) + return types.SimpleNamespace(builder=builder, body=[]) + + +def test_visitor_emits_dual_themed_svg( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + """The visitor inlines one light and one dark SVG with shared geometry.""" + seen: list[str] = [] + + def fake_render_cached(app: object, source: str, theme: str) -> str: + seen.append(theme) + return _FAKE_MMDC_SVG + + monkeypatch.setattr(mi, "_render_cached", fake_render_cached) + translator = _make_translator(tmp_path) + node = mi.mermaid_inline() + node["mermaid_source"] = "flowchart LR a-->b" + node["caption"] = "How it flows" + node["alt"] = "" + + with pytest.raises(nodes.SkipNode): + mi.html_visit_mermaid_inline(t.cast("t.Any", translator), node) + + html = "".join(translator.body) + assert seen == [mi._THEME_LIGHT, mi._THEME_DARK] + assert html.count("gp-diagram--light") == 1 + assert html.count("gp-diagram--dark") == 1 + assert "
    How it flows
    " in html + assert "my-svg" not in html + # Both variants normalized to identical geometry -> shift-free toggle. + assert html.count('viewBox="0 0 200 80"') == 2 + + +def test_visitor_falls_back_when_renderer_missing( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + caplog: pytest.LogCaptureFixture, +) -> None: + """A missing renderer degrades to a text fallback and warns once.""" + monkeypatch.setattr(mi, "_render_warned", False) + + def boom(app: object, source: str, theme: str) -> str: + msg = "no mmdc" + raise mi.MermaidRendererMissing(msg) + + monkeypatch.setattr(mi, "_render_cached", boom) + translator = _make_translator(tmp_path) + node = mi.mermaid_inline() + node["mermaid_source"] = "flowchart LR a-->b" + node["caption"] = "" + node["alt"] = "" + + with caplog.at_level(logging.WARNING), pytest.raises(nodes.SkipNode): + mi.html_visit_mermaid_inline(t.cast("t.Any", translator), node) + + html = "".join(translator.body) + assert 'class="gp-diagram-fallback"' in html + assert "flowchart LR a-->b" in html + warnings = [r for r in caplog.records if r.levelno == logging.WARNING] + assert any("mermaid render unavailable" in r.getMessage() for r in warnings) + + +def test_render_cache_is_idempotent( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + """``_render_cached`` invokes mmdc once, then serves from the disk cache.""" + calls = {"n": 0} + + def fake_render(app: object, source: str, theme: str) -> str: + calls["n"] += 1 + return _FAKE_MMDC_SVG + + monkeypatch.setattr(mi, "_render", fake_render) + config = types.SimpleNamespace( + mermaid_inline_cmd="", + mermaid_inline_puppeteer_config="", + ) + app = types.SimpleNamespace(confdir=str(tmp_path), config=config) + + first = mi._render_cached(t.cast("t.Any", app), "flowchart LR a-->b", "default") + second = mi._render_cached(t.cast("t.Any", app), "flowchart LR a-->b", "default") + + assert first == second == _FAKE_MMDC_SVG + assert calls["n"] == 1 + assert list((tmp_path / "_mermaid_cache").glob("*.svg")) + + +def test_setup_registers_components() -> None: + """``setup`` registers the node, directive, config values, css, and is safe.""" + recorded: dict[str, list[t.Any]] = { + "nodes": [], + "directives": [], + "config": [], + "css": [], + } + + def add_node(node: object, **kwargs: object) -> None: + recorded["nodes"].append(node) + + def add_directive(name: str, cls: object) -> None: + recorded["directives"].append((name, cls)) + + def add_config_value(name: str, default: object, rebuild: object) -> None: + recorded["config"].append(name) + + def add_css_file(name: str, **kwargs: object) -> None: + recorded["css"].append(name) + + app = types.SimpleNamespace( + add_node=add_node, + add_directive=add_directive, + add_config_value=add_config_value, + add_css_file=add_css_file, + ) + meta = mi.setup(t.cast("t.Any", app)) + + assert meta["parallel_read_safe"] is True + assert meta["parallel_write_safe"] is True + assert mi.mermaid_inline in recorded["nodes"] + assert ("mermaid", mi.MermaidDirective) in recorded["directives"] + assert "mermaid_inline_cmd" in recorded["config"] + assert "mermaid_inline_puppeteer_config" in recorded["config"] + assert "css/gp-diagram.css" in recorded["css"] From 16dcd34d180bcbe7de64f2bc0c05715c686b95ee Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:52:34 -0500 Subject: [PATCH 2938/2998] docs(workspace-builders): add flow diagram why: The concept-first intro tells the reader a workspace builder "turns a workspace configuration into a live tmux session". A small pipeline diagram makes that sentence visual right where it is stated, before the reader reaches the reference table. what: - Add a left-to-right mermaid flowchart after the opening paragraph: `tmuxp load ` -> Workspace Builder -> Attach tmux session, with edge labels echoing the intro vocabulary --- docs/configuration/workspace-builders.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 47311bc9c0..ce7349e21e 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -12,6 +12,14 @@ their commands. You usually never have to think about it: tmuxp ships with a bui box, just as they always have. **Everything on this page is optional; leave a setting out to fall back to the default.** +:::{mermaid} +:caption: How a workspace file becomes a live tmux session. + +flowchart LR + load["tmuxp load <workspace-file>"] -->|reads workspace config| builder["Workspace Builder"] + builder -->|"creates session, windows, panes"| attach["Attach tmux session"] +::: + Workspaces with special needs can reach for a builder's options to fine-tune how a session loads. The classic builder, for instance, can wait for a pane's shell prompt before sending its layout and commands — by default only when that shell is zsh (the From ec9151402c5dc244cf7b8554b471bc209b30c79b Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:54:30 -0500 Subject: [PATCH 2939/2998] docs(workspace-builders): make diagram vertical why: The left-to-right flowchart rendered ~1141px wide and scaled down hard in the content column, shrinking its labels. A top-down layout is ~276px wide, fits the column at full size, and reads as a vertical load -> build -> attach pipeline. what: - Switch the mermaid flowchart from LR to TD --- docs/configuration/workspace-builders.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index ce7349e21e..094f6df5c0 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -15,7 +15,7 @@ out to fall back to the default.** :::{mermaid} :caption: How a workspace file becomes a live tmux session. -flowchart LR +flowchart TD load["tmuxp load <workspace-file>"] -->|reads workspace config| builder["Workspace Builder"] builder -->|"creates session, windows, panes"| attach["Attach tmux session"] ::: From 66f3064c749d1c2f806e810a93a2c0a40b145c34 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:56:41 -0500 Subject: [PATCH 2940/2998] docs(workspace-builders): widen diagram nodes why: At mermaid's default wrappingWidth (200px) the "tmuxp load " node wrapped onto two lines. Raising it keeps node labels on a single line so each box sizes to its own text. what: - Set flowchart.wrappingWidth=500 via in-source mermaid frontmatter on the workspace-builders fence --- docs/configuration/workspace-builders.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 094f6df5c0..2a599efe16 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -15,6 +15,11 @@ out to fall back to the default.** :::{mermaid} :caption: How a workspace file becomes a live tmux session. +--- +config: + flowchart: + wrappingWidth: 500 +--- flowchart TD load["tmuxp load <workspace-file>"] -->|reads workspace config| builder["Workspace Builder"] builder -->|"creates session, windows, panes"| attach["Attach tmux session"] From 16ebd9678de40939578ed14224774ec696de5ea1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 05:59:29 -0500 Subject: [PATCH 2941/2998] ci(docs): provision the mermaid diagram toolchain why: Diagrams render at build time via mmdc + a headless Chrome (docs/_ext/mermaid_inline.py). The docs publish job had only uv and just, so it would silently degrade every diagram to a text fallback and ship docs without them. what: - Set up Node.js and pnpm in the docs build job - Cache ~/.cache/puppeteer keyed on docs/pnpm-lock.yaml - Install the docs JS deps and provision the version-matched Chrome via `pnpm -C docs rebuild puppeteer` before building --- .github/workflows/docs.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4ccd9a8621..c589d98ef8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,6 +56,38 @@ jobs: if: env.PUBLISH == 'true' uses: extractions/setup-just@v4 + - name: Set up Node.js + if: env.PUBLISH == 'true' + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Set up pnpm + if: env.PUBLISH == 'true' + uses: pnpm/action-setup@v4 + with: + version: 10 + run_install: false + + - name: Cache Puppeteer browser + if: env.PUBLISH == 'true' + uses: actions/cache@v5 + with: + path: ~/.cache/puppeteer + key: puppeteer-${{ runner.os }}-${{ hashFiles('docs/pnpm-lock.yaml') }} + restore-keys: | + puppeteer-${{ runner.os }}- + + # Diagrams (docs/_ext/mermaid_inline.py) are rendered at build time by + # mmdc, which drives a headless Chrome. Without it the build still + # succeeds but degrades diagrams to a text fallback, so provision both. + - name: Install diagram toolchain (mermaid-cli + Chrome) + if: env.PUBLISH == 'true' + run: | + pnpm -C docs install --frozen-lockfile + pnpm -C docs rebuild puppeteer + pnpm -C docs exec mmdc --version + - name: Print python versions if: env.PUBLISH == 'true' run: | From d73661bc4a13819285052ea85c2d5800dd68d441 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:03:53 -0500 Subject: [PATCH 2942/2998] docs(ext): theme diagrams with the gp-furo palette why: Diagrams rendered with mermaid's stock default/dark presets, whose purple boxes clashed with the site brand. Mapping mermaid's base-theme variables to gp-furo's tokens makes diagrams match the docs in both light and dark mode, with no extra page weight. what: - Add light/dark _PALETTES from gp-furo-tokens: brand-blue borders, near-background fills, foreground text, and the furo system font stack - Render via `mmdc -c` (theme=base + themeVariables) instead of the -t default/dark presets; bump the cache version to re-render - Test that each palette defines the required flowchart colour variables --- docs/_ext/mermaid_inline.py | 51 +++++++++++++++++++++++++++++++++---- tests/test_docs_mermaid.py | 34 +++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index 33a6df540a..2e06566d51 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -47,12 +47,47 @@ logger = logging.getLogger(__name__) #: Bump to invalidate the on-disk render cache when render arguments change. -_RENDER_VERSION = "mmdc11-svg-v1" +_RENDER_VERSION = "mmdc11-furo-svg-v1" -#: mermaid theme presets used for the two inlined variants. -_THEME_LIGHT = "default" +#: Logical names for the two inlined variants (cache key, SVG id, CSS class). +_THEME_LIGHT = "light" _THEME_DARK = "dark" +#: System font stack matching gp-furo's body font (gp-furo-tokens --font-stack). +_FONT_STACK = ( + "-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif" +) + +#: mermaid ``base``-theme variables mapped to gp-furo's light/dark colour tokens +#: (gp-furo-tokens: light.ts / dark.ts) so diagrams match the site palette. +#: Colour does not affect layout, so both variants share geometry. +_PALETTES: dict[str, dict[str, str]] = { + _THEME_LIGHT: { + "primaryColor": "#f8f9fb", + "primaryBorderColor": "#0a4bff", + "primaryTextColor": "#000000", + "lineColor": "#6b6f76", + "textColor": "#000000", + "background": "#ffffff", + "edgeLabelBackground": "#f8f9fb", + "secondaryColor": "#ffffff", + "tertiaryColor": "#f8f9fb", + "fontFamily": _FONT_STACK, + }, + _THEME_DARK: { + "primaryColor": "#1a1c1e", + "primaryBorderColor": "#3d94ff", + "primaryTextColor": "#cfd0d0", + "lineColor": "#81868d", + "textColor": "#cfd0d0", + "background": "#131416", + "edgeLabelBackground": "#1a1c1e", + "secondaryColor": "#131416", + "tertiaryColor": "#1a1c1e", + "fontFamily": _FONT_STACK, + }, +} + #: mermaid hardcodes this id on every rendered SVG and scopes its CSS and #: arrowhead markers to it; it is rewritten per diagram+theme to avoid #: duplicate-id collisions when both variants are inlined on one page. @@ -240,7 +275,13 @@ def _render(app: Sphinx, source: str, theme: str) -> str: tmpdir = pathlib.Path(td) in_file = tmpdir / "diagram.mmd" out_file = tmpdir / "diagram.svg" + config_file = tmpdir / "config.json" in_file.write_text(source, encoding="utf-8") + config: dict[str, t.Any] = { + "theme": "base", + "themeVariables": _PALETTES[theme], + } + config_file.write_text(json.dumps(config), encoding="utf-8") argv = [ *mmdc, "-i", @@ -249,8 +290,8 @@ def _render(app: Sphinx, source: str, theme: str) -> str: str(out_file), "-b", "transparent", - "-t", - theme, + "-c", + str(config_file), "-p", str(_puppeteer_config_file(app, tmpdir)), ] diff --git a/tests/test_docs_mermaid.py b/tests/test_docs_mermaid.py index 076cf89a69..db92683a97 100644 --- a/tests/test_docs_mermaid.py +++ b/tests/test_docs_mermaid.py @@ -160,6 +160,40 @@ def test_svg_element_id_is_themed_and_unique() -> None: assert light.endswith("-light") +class PaletteCase(t.NamedTuple): + """A theme name whose furo palette must define the flowchart variables.""" + + test_id: str + theme: str + + +_PALETTE_CASES: list[PaletteCase] = [ + PaletteCase(test_id=f"{theme}-palette", theme=theme) + for theme in (mi._THEME_LIGHT, mi._THEME_DARK) +] + +_REQUIRED_PALETTE_KEYS = ( + "primaryColor", + "primaryBorderColor", + "primaryTextColor", + "lineColor", + "textColor", +) + + +@pytest.mark.parametrize( + "case", + _PALETTE_CASES, + ids=[c.test_id for c in _PALETTE_CASES], +) +def test_palette_defines_flowchart_colors(case: PaletteCase) -> None: + """Each theme palette defines the mermaid colour variables as hex values.""" + palette = mi._PALETTES[case.theme] + for key in _REQUIRED_PALETTE_KEYS: + assert key in palette, f"{case.test_id}: missing {key}" + assert palette[key].startswith("#"), f"{case.test_id}: {key} not hex" + + def _make_translator(tmp_path: Path) -> types.SimpleNamespace: """Return a minimal stand-in for the HTML translator the visitor needs.""" config = types.SimpleNamespace( From 7664c3bd5a89510de2cb1d1720688aeb830e6e23 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:06:51 -0500 Subject: [PATCH 2943/2998] docs(ext): discover Chrome cross-platform why: _discover_chrome matched only puppeteer's Linux cache layout (chrome-linux64), so on macOS or Windows the build could not find an installed Chrome and would degrade diagrams to a text fallback. what: - Add _chrome_glob(platform): the puppeteer-cache glob per OS (linux, macOS .app bundle, win64), doctested - Resolve via _chrome_glob(sys.platform) in _discover_chrome --- docs/_ext/mermaid_inline.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index 2e06566d51..c61e5678ce 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -32,6 +32,7 @@ import re import shutil import subprocess +import sys import tempfile import typing as t @@ -210,17 +211,39 @@ def run(self) -> list[nodes.Node]: return [node] +def _chrome_glob(platform: str) -> str: + """Return the puppeteer-cache glob for Chrome on the given ``sys.platform``. + + Puppeteer lays the binary out per platform under ``chrome//``. + + >>> _chrome_glob("linux") + '*/chrome-linux64/chrome' + >>> _chrome_glob("win32") + '*/chrome-win64/chrome.exe' + >>> _chrome_glob("darwin").startswith("*/chrome-mac-") + True + """ + if platform.startswith("win"): + return "*/chrome-win64/chrome.exe" + if platform == "darwin": + return ( + "*/chrome-mac-*/Google Chrome for Testing.app" + "/Contents/MacOS/Google Chrome for Testing" + ) + return "*/chrome-linux64/chrome" + + def _discover_chrome() -> str | None: """Return a Chrome installed by ``puppeteer browsers install``, if any. Puppeteer's automatic resolution can miss the cached browser (its cache dir is computed relative to the install location); pointing ``executablePath`` at - the discovered binary sidesteps that. Linux/WSL layout only. + the discovered binary sidesteps that. """ cache = pathlib.Path.home() / ".cache" / "puppeteer" / "chrome" if not cache.is_dir(): return None - candidates = sorted(cache.glob("*/chrome-linux64/chrome")) + candidates = sorted(cache.glob(_chrome_glob(sys.platform))) return str(candidates[-1]) if candidates else None From 3af464e9ba217490ac22fdb190eae8813a0659c8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:10:24 -0500 Subject: [PATCH 2944/2998] docs(ext): style code nodes and pad edge labels why: The diagram read uniformly: the literal command `tmuxp load ` looked like the prose concept nodes, and the edge-label background boxes hugged their text with no breathing room. what: - Inject theme-agnostic themeCSS into every rendered diagram: nodes tagged `:::cmd` render in the furo monospace stack so commands read as code (over the existing code-like fill), and edge labels gain padding; white-space:normal keeps a padded label wrapping instead of overflowing the box mermaid measured for it - Tag the `tmuxp load` node with `:::cmd` on the workspace-builders page - Bump the render cache version to re-render --- docs/_ext/mermaid_inline.py | 17 ++++++++++++++++- docs/configuration/workspace-builders.md | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index c61e5678ce..559d680abc 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -48,7 +48,7 @@ logger = logging.getLogger(__name__) #: Bump to invalidate the on-disk render cache when render arguments change. -_RENDER_VERSION = "mmdc11-furo-svg-v1" +_RENDER_VERSION = "mmdc11-furo-svg-v2" #: Logical names for the two inlined variants (cache key, SVG id, CSS class). _THEME_LIGHT = "light" @@ -89,6 +89,20 @@ }, } +#: Extra CSS injected into every rendered SVG (theme-agnostic). Nodes tagged +#: ``:::cmd`` render in a monospace font so commands read as code; edge labels +#: get padding. ``white-space: normal`` lets a padded label keep wrapping +#: instead of overflowing the box mermaid measured for it. +_MONO_STACK = "'SFMono-Regular', Menlo, Consolas, Monaco, 'Liberation Mono', monospace" +_THEME_CSS = ( + ".cmd .nodeLabel { font-family: " + _MONO_STACK + " !important; }" + " .edgeLabels .labelBkg {" + " padding: 3px 10px !important;" + " white-space: normal !important;" + " border-radius: 4px;" + " }" +) + #: mermaid hardcodes this id on every rendered SVG and scopes its CSS and #: arrowhead markers to it; it is rewritten per diagram+theme to avoid #: duplicate-id collisions when both variants are inlined on one page. @@ -303,6 +317,7 @@ def _render(app: Sphinx, source: str, theme: str) -> str: config: dict[str, t.Any] = { "theme": "base", "themeVariables": _PALETTES[theme], + "themeCSS": _THEME_CSS, } config_file.write_text(json.dumps(config), encoding="utf-8") argv = [ diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 2a599efe16..b1b5576bf5 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -21,7 +21,7 @@ config: wrappingWidth: 500 --- flowchart TD - load["tmuxp load <workspace-file>"] -->|reads workspace config| builder["Workspace Builder"] + load["tmuxp load <workspace-file>"]:::cmd -->|reads workspace config| builder["Workspace Builder"] builder -->|"creates session, windows, panes"| attach["Attach tmux session"] ::: From 64cf22d7d167fa13b371068de5121cae997c4dd4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:14:17 -0500 Subject: [PATCH 2945/2998] docs(ext): fix label centering and double bg why: On the rendered page (not in standalone mmdc output) the :::cmd label fell left because the build's headless Chrome lacks the exact monospace face, so the measured box is wider than the on-page text; and each edge label showed two stacked boxes once padded, because mermaid backs every edge label with three nested coloured elements. what: - Replace the themeCSS constant with _theme_css(theme): center node labels, and collapse mermaid's .labelBkg / .edgeLabel / rect backgrounds into a single padded chip on .edgeLabel p in the theme's label colour - Bump the render cache version to re-render --- docs/_ext/mermaid_inline.py | 49 ++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index 559d680abc..a4ca7607c4 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -48,7 +48,7 @@ logger = logging.getLogger(__name__) #: Bump to invalidate the on-disk render cache when render arguments change. -_RENDER_VERSION = "mmdc11-furo-svg-v2" +_RENDER_VERSION = "mmdc11-furo-svg-v3" #: Logical names for the two inlined variants (cache key, SVG id, CSS class). _THEME_LIGHT = "light" @@ -89,19 +89,40 @@ }, } -#: Extra CSS injected into every rendered SVG (theme-agnostic). Nodes tagged -#: ``:::cmd`` render in a monospace font so commands read as code; edge labels -#: get padding. ``white-space: normal`` lets a padded label keep wrapping -#: instead of overflowing the box mermaid measured for it. +#: Monospace stack matching gp-furo's ``--font-stack--monospace``. _MONO_STACK = "'SFMono-Regular', Menlo, Consolas, Monaco, 'Liberation Mono', monospace" -_THEME_CSS = ( - ".cmd .nodeLabel { font-family: " + _MONO_STACK + " !important; }" - " .edgeLabels .labelBkg {" - " padding: 3px 10px !important;" - " white-space: normal !important;" - " border-radius: 4px;" - " }" -) + + +def _theme_css(theme: str) -> str: + """Return the CSS injected into a rendered SVG for the given theme. + + Renders ``:::cmd`` nodes in a monospace font so commands read as code; + centres node labels (the build's headless Chrome may lack the exact mono + face, so the measured box can be wider than the on-page text, which would + otherwise fall left); and collapses mermaid's three stacked edge-label + backgrounds into one padded chip in the theme's label colour. ``white-space: + normal`` lets a padded label wrap instead of overflowing its measured box. + + >>> "monospace" in _theme_css("light") + True + >>> "#f8f9fb" in _theme_css("light") + True + """ + bg = _PALETTES[theme]["edgeLabelBackground"] + return ( + ".cmd .nodeLabel { font-family: " + _MONO_STACK + " !important; }" + " .nodeLabel, .nodeLabel p { text-align: center !important; }" + " .edgeLabel rect { opacity: 0 !important; }" + " .labelBkg { background: transparent !important; }" + " .edgeLabel { background: transparent !important; }" + " .edgeLabel p {" + " background: " + bg + " !important;" + " padding: 3px 10px !important;" + " border-radius: 4px !important;" + " white-space: normal !important;" + " }" + ) + #: mermaid hardcodes this id on every rendered SVG and scopes its CSS and #: arrowhead markers to it; it is rewritten per diagram+theme to avoid @@ -317,7 +338,7 @@ def _render(app: Sphinx, source: str, theme: str) -> str: config: dict[str, t.Any] = { "theme": "base", "themeVariables": _PALETTES[theme], - "themeCSS": _THEME_CSS, + "themeCSS": _theme_css(theme), } config_file.write_text(json.dumps(config), encoding="utf-8") argv = [ From f6eb318ddc30c0bc95992e959b6986a0932df486 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:18:57 -0500 Subject: [PATCH 2946/2998] docs(ext): center code labels, robust cache key why: The :::cmd label rendered left-of-centre on browsers whose monospace face is narrower than the build's headless Chrome (e.g. macOS SF Mono): the shrink-to-fit table-cell sits at the left of the wider box mermaid measured. CSS that resizes the label to compensate (width/flex) corrupts mermaid's build-time measurement pass and ballooned the diagram to ~15000px tall. Separately, the render cache keyed only on source+theme, so a themeCSS/palette change served a stale SVG from docs/_mermaid_cache (which rm -rf docs/_build does not clear). what: - Center node labels with `display: table` + `margin: 0 auto`: shrink-to-fit positioning that re-centres without changing the measured size; verified centered even when the label renders far narrower than its box - Fold the full mermaid config (themeVariables + themeCSS) into the cache digest via a new `extra` arg so any styling change busts the cache; extract _mermaid_config(); _render now takes the config JSON - Update the cache-idempotency test for the new _render signature/theme --- docs/_ext/mermaid_inline.py | 70 ++++++++++++++++++++++++++----------- tests/test_docs_mermaid.py | 10 ++++-- 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index a4ca7607c4..033b4aa7e4 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -48,7 +48,7 @@ logger = logging.getLogger(__name__) #: Bump to invalidate the on-disk render cache when render arguments change. -_RENDER_VERSION = "mmdc11-furo-svg-v3" +_RENDER_VERSION = "mmdc11-furo-svg-v4" #: Logical names for the two inlined variants (cache key, SVG id, CSS class). _THEME_LIGHT = "light" @@ -97,11 +97,17 @@ def _theme_css(theme: str) -> str: """Return the CSS injected into a rendered SVG for the given theme. Renders ``:::cmd`` nodes in a monospace font so commands read as code; - centres node labels (the build's headless Chrome may lack the exact mono - face, so the measured box can be wider than the on-page text, which would - otherwise fall left); and collapses mermaid's three stacked edge-label - backgrounds into one padded chip in the theme's label colour. ``white-space: - normal`` lets a padded label wrap instead of overflowing its measured box. + centres each node label in its box; and collapses mermaid's three stacked + edge-label backgrounds into one padded chip in the theme's label colour. + + Centering uses ``display: table`` + ``margin: 0 auto`` rather than a width + or flex rule: the build's headless Chrome may render the font at a different + width than the visitor's browser, leaving the shrink-to-fit ``table-cell`` + narrower than the measured box (so it falls left), but anything that + *resizes* the label corrupts mermaid's build-time measurement pass. A table + with auto margins re-centres without changing the measured size. + ``white-space: normal`` lets a padded edge label wrap instead of + overflowing its measured box. >>> "monospace" in _theme_css("light") True @@ -112,6 +118,10 @@ def _theme_css(theme: str) -> str: return ( ".cmd .nodeLabel { font-family: " + _MONO_STACK + " !important; }" " .nodeLabel, .nodeLabel p { text-align: center !important; }" + " .node foreignObject > div {" + " display: table !important;" + " margin: 0 auto !important;" + " }" " .edgeLabel rect { opacity: 0 !important; }" " .labelBkg { background: transparent !important; }" " .edgeLabel { background: transparent !important; }" @@ -151,21 +161,31 @@ class mermaid_inline(nodes.General, nodes.Element): """Doctree node carrying mermaid source until the HTML write phase.""" -def _diagram_digest(source: str, theme: str, *, version: str = _RENDER_VERSION) -> str: +def _diagram_digest( + source: str, + theme: str, + *, + version: str = _RENDER_VERSION, + extra: str = "", +) -> str: """Return a stable content hash that keys the render cache. - The hash covers the render version, the theme, and the source, so light and - dark variants cache separately and a render-argument change busts the cache. + The hash covers the render version, the theme, the source, and ``extra`` + (the full mermaid config JSON) — so light and dark variants cache + separately and any styling change, not just a source change, busts the + cache. >>> a = _diagram_digest("flowchart LR a-->b", "default") >>> a == _diagram_digest("flowchart LR a-->b", "default") True >>> a != _diagram_digest("flowchart LR a-->b", "dark") True + >>> a != _diagram_digest("flowchart LR a-->b", "default", extra="{}") + True >>> len(a) 40 """ - payload = f"{version}\x00{theme}\x00{source}" + payload = f"{version}\x00{theme}\x00{extra}\x00{source}" return hashlib.sha1(payload.encode("utf-8")).hexdigest() @@ -320,8 +340,22 @@ def _puppeteer_config_file(app: Sphinx, tmpdir: pathlib.Path) -> pathlib.Path: return out -def _render(app: Sphinx, source: str, theme: str) -> str: - """Render ``source`` to an SVG string via ``mmdc`` for the given theme.""" +def _mermaid_config(theme: str) -> dict[str, t.Any]: + """Return the mermaid ``-c`` config: base theme + furo palette + themeCSS. + + >>> cfg = _mermaid_config("light") + >>> cfg["theme"], "themeVariables" in cfg, "themeCSS" in cfg + ('base', True, True) + """ + return { + "theme": "base", + "themeVariables": _PALETTES[theme], + "themeCSS": _theme_css(theme), + } + + +def _render(app: Sphinx, source: str, config_json: str) -> str: + """Render ``source`` to an SVG string via ``mmdc`` using ``config_json``.""" mmdc = _resolve_mmdc(app) if mmdc is None: msg = ( @@ -335,12 +369,7 @@ def _render(app: Sphinx, source: str, theme: str) -> str: out_file = tmpdir / "diagram.svg" config_file = tmpdir / "config.json" in_file.write_text(source, encoding="utf-8") - config: dict[str, t.Any] = { - "theme": "base", - "themeVariables": _PALETTES[theme], - "themeCSS": _theme_css(theme), - } - config_file.write_text(json.dumps(config), encoding="utf-8") + config_file.write_text(config_json, encoding="utf-8") argv = [ *mmdc, "-i", @@ -380,12 +409,13 @@ def _render_cached(app: Sphinx, source: str, theme: str) -> str: The cache lives outside ``_build`` (under the confdir) so it survives the ``rm -rf docs/_build`` that precedes a full build. """ - digest = _diagram_digest(source, theme) + config_json = json.dumps(_mermaid_config(theme), sort_keys=True) + digest = _diagram_digest(source, theme, extra=config_json) cache_dir = pathlib.Path(app.confdir) / "_mermaid_cache" cache_file = cache_dir / f"{digest}.svg" if cache_file.is_file(): return cache_file.read_text(encoding="utf-8") - svg = _render(app, source, theme) + svg = _render(app, source, config_json) cache_dir.mkdir(parents=True, exist_ok=True) cache_file.write_text(svg, encoding="utf-8") return svg diff --git a/tests/test_docs_mermaid.py b/tests/test_docs_mermaid.py index db92683a97..930f34e177 100644 --- a/tests/test_docs_mermaid.py +++ b/tests/test_docs_mermaid.py @@ -272,7 +272,7 @@ def test_render_cache_is_idempotent( """``_render_cached`` invokes mmdc once, then serves from the disk cache.""" calls = {"n": 0} - def fake_render(app: object, source: str, theme: str) -> str: + def fake_render(app: object, source: str, config_json: str) -> str: calls["n"] += 1 return _FAKE_MMDC_SVG @@ -283,8 +283,12 @@ def fake_render(app: object, source: str, theme: str) -> str: ) app = types.SimpleNamespace(confdir=str(tmp_path), config=config) - first = mi._render_cached(t.cast("t.Any", app), "flowchart LR a-->b", "default") - second = mi._render_cached(t.cast("t.Any", app), "flowchart LR a-->b", "default") + first = mi._render_cached( + t.cast("t.Any", app), "flowchart LR a-->b", mi._THEME_LIGHT + ) + second = mi._render_cached( + t.cast("t.Any", app), "flowchart LR a-->b", mi._THEME_LIGHT + ) assert first == second == _FAKE_MMDC_SVG assert calls["n"] == 1 From 5f26fc7bf173fbb7837e9899ee9c62daacc49725 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:23:32 -0500 Subject: [PATCH 2947/2998] docs(examples): convert pane diagrams to mermaid why: The example pane layouts used aafig ASCII art, which renders outside the build-time mermaid pipeline and ignores the site theme. mermaid's block-beta diagrams map directly onto tmux pane grids and inherit the furo palette, light/dark variants, and SPA handling. what: - Replace the four `.. aafig::` blocks (short-hand, 2/3/4 panes) with ```mermaid block-beta diagrams reproducing each layout - aafig is still used by docs/about_tmux.md, so the extension stays --- docs/configuration/examples.md | 71 ++++++++++------------------------ 1 file changed, 21 insertions(+), 50 deletions(-) diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 2d463e4ba5..2c5aa6835c 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -9,20 +9,12 @@ punctual. ::::{sidebar} short hand -```{eval-rst} -.. aafig:: - :textual: - - +-------------------+ - | 'did you know' | - | 'you can inline' | - +-------------------+ - | 'single commands' | - | | - +-------------------+ - | 'for panes' | - | | - +-------------------+ +```mermaid +block-beta + columns 1 + p1["'did you know'
    'you can inline'"] + p2["'single commands'"] + p3["'for panes'"] ``` :::: @@ -75,18 +67,11 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 2 pane -```{eval-rst} -.. aafig:: - - +-----------------+ - | $ pwd | - | | - | | - +-----------------+ - | $ pwd | - | | - | | - +-----------------+ +```mermaid +block-beta + columns 1 + a["$ pwd"] + b["$ pwd"] ``` :::: @@ -113,18 +98,11 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 3 panes -```{eval-rst} -.. aafig:: - - +-----------------+ - | $ pwd | - | | - | | - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ +```mermaid +block-beta + columns 2 + top["$ pwd"]:2 + bl["$ pwd"] br["$ pwd"] ``` :::: @@ -151,18 +129,11 @@ Note `''` counts as an empty carriage return. ::::{sidebar} 4 panes -```{eval-rst} -.. aafig:: - - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ - | $ pwd | $ pwd | - | | | - | | | - +--------+--------+ +```mermaid +block-beta + columns 2 + a["$ pwd"] b["$ pwd"] + c["$ pwd"] d["$ pwd"] ``` :::: From 16fec0c2b6af460d4493c9c388915eab2db53d1a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:26:27 -0500 Subject: [PATCH 2948/2998] docs(ext): size block diagrams from root viewBox why: block-beta diagrams render with a negative viewBox origin (e.g. `viewBox="-5 -97 148 194"`) and carry inner-element viewBoxes. The size regex assumed `viewBox="0 0 ..."` and matched an inner `0 0 10 10`, so the root SVG was sized 10x10 and the diagram rendered as a tiny icon. what: - Anchor the viewBox regex to the root `` tag and accept a negative min-x/min-y, taking width/height from the 3rd/4th numbers - Add a normalizer test case + doctest for the block-diagram viewBox --- docs/_ext/mermaid_inline.py | 17 ++++++++++++++++- tests/test_docs_mermaid.py | 10 ++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index 033b4aa7e4..190f9e16da 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -139,7 +139,11 @@ def _theme_css(theme: str) -> str: #: duplicate-id collisions when both variants are inlined on one page. _MERMAID_DEFAULT_ID = "my-svg" -_VIEWBOX_RE = re.compile(r'viewBox="0 0 ([\d.]+) ([\d.]+)"') +# Width/height are the 3rd/4th viewBox numbers of the ROOT tag. Anchoring +# to ```` (no ``>`` in between) avoids matching an inner element's +# viewBox, and the min-x/min-y may be negative (block diagrams use e.g. +# ``viewBox="-5 -97 148 194"``). +_VIEWBOX_RE = re.compile(r']*?\bviewBox="-?[\d.]+ -?[\d.]+ ([\d.]+) ([\d.]+)"') #: Guards the "renderer missing/failed" warning so it fires once, not per node. _render_warned = False @@ -227,6 +231,17 @@ def _normalize_svg(svg: str, *, svg_id: str) -> str: False >>> 'id="mermaid-abc-light"' in out and "url(#mermaid-abc-light_end)" in out True + + Block diagrams use a negative viewBox origin and carry inner viewBoxes; + the root's width/height (3rd/4th numbers) win, not an inner ``0 0 10 10``: + + >>> block = ( + ... '' + ... '' + ... ) + >>> out = _normalize_svg(block, svg_id="x") + >>> 'width="148"' in out and 'height="194"' in out + True """ svg = svg.replace(_MERMAID_DEFAULT_ID, svg_id) match = _VIEWBOX_RE.search(svg) diff --git a/tests/test_docs_mermaid.py b/tests/test_docs_mermaid.py index 930f34e177..b0c0c86738 100644 --- a/tests/test_docs_mermaid.py +++ b/tests/test_docs_mermaid.py @@ -81,6 +81,16 @@ class NormalizeCase(t.NamedTuple): expect_contains=('width="1141.25"', 'height="94"'), expect_absent=("max-width",), ), + NormalizeCase( + test_id="block-negative-viewbox-origin", + raw_svg=( + '' + '' + ), + svg_id="mermaid-blk-light", + expect_contains=('width="148"', 'height="194"'), + expect_absent=('width="100%"', 'width="10"'), + ), ] From 1dc51ed5bad6a1c401ae95fe2f9475c6c40c06b8 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:28:51 -0500 Subject: [PATCH 2949/2998] docs(ext): tile block diagrams contiguously why: block-beta panes rendered with gaps, so a tmux pane layout read as separate boxes rather than a single tiled window. what: - Set block.padding=0 in the mermaid config so block panes share dividers and fill a contiguous rectangle, like a tmux window - Other diagram types ignore the block key --- docs/_ext/mermaid_inline.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py index 190f9e16da..6a1f86e736 100644 --- a/docs/_ext/mermaid_inline.py +++ b/docs/_ext/mermaid_inline.py @@ -358,12 +358,16 @@ def _puppeteer_config_file(app: Sphinx, tmpdir: pathlib.Path) -> pathlib.Path: def _mermaid_config(theme: str) -> dict[str, t.Any]: """Return the mermaid ``-c`` config: base theme + furo palette + themeCSS. + ``block.padding: 0`` tiles block-beta panes contiguously, like a tmux + window; other diagram types ignore the ``block`` key. + >>> cfg = _mermaid_config("light") - >>> cfg["theme"], "themeVariables" in cfg, "themeCSS" in cfg - ('base', True, True) + >>> cfg["theme"], "themeVariables" in cfg, cfg["block"]["padding"] + ('base', True, 0) """ return { "theme": "base", + "block": {"padding": 0}, "themeVariables": _PALETTES[theme], "themeCSS": _theme_css(theme), } From 7df69dad868997a7eb561c18b628ac227b5ba826 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 06:41:02 -0500 Subject: [PATCH 2950/2998] docs(ext): add tmux-layout directive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: The example pane layouts used aafig ASCII art, then block-beta — neither shows real tmux geometry or matches the site's code styling. A purpose-built renderer draws faithful tmux layouts that read like the terminal, with no headless-browser dependency. what: - Add docs/_ext/tmux_layout.py: a `tmux-layout` directive taking a screen size and a named layout (even-vertical/horizontal, main-vertical/ horizontal, tiled) plus per-pane shell commands. It computes filling pane geometry and emits one inline SVG: panes tile with single dividers, text top-left, pygments-highlighted in the site's code font and colours (light/dark) via furo's own .highlight rules and `fill: currentColor`. Command builtins stay default-coloured; a gp prompt leads each line. Pure Python, theme-adaptive, no JS, SPA-safe - Add docs/_static/css/gp-tmux-layout.css: pane background = the pygments code background, code font-size, kerning/letter-spacing matching `pre` - Convert the examples (short-hand, 2/3/4 panes) from block-beta to tmux-layout; register the extension in conf.py - Add tests/test_docs_tmux_layout.py: NamedTuple-parametrized coverage of the geometry (fills the screen), highlighting, pane splitting, size parsing, SVG structure, and the setup() contract --- docs/_ext/tmux_layout.py | 366 ++++++++++++++++++++++++++++ docs/_static/css/gp-tmux-layout.css | 74 ++++++ docs/conf.py | 1 + docs/configuration/examples.md | 78 +++--- tests/test_docs_tmux_layout.py | 202 +++++++++++++++ 5 files changed, 682 insertions(+), 39 deletions(-) create mode 100644 docs/_ext/tmux_layout.py create mode 100644 docs/_static/css/gp-tmux-layout.css create mode 100644 tests/test_docs_tmux_layout.py diff --git a/docs/_ext/tmux_layout.py b/docs/_ext/tmux_layout.py new file mode 100644 index 0000000000..4ae13c7bba --- /dev/null +++ b/docs/_ext/tmux_layout.py @@ -0,0 +1,366 @@ +"""Render tmux window layouts as inline SVG that looks like a terminal. + +A ``tmux-layout`` directive declares a screen size and a tmux layout; the panes +tile the screen with no gaps, exactly the way tmux splits a window. Each pane's +shell commands are drawn top-left in a fixed-width font and syntax-highlighted +with Pygments, so the diagram reads like the real terminal. This is the +spiritual successor to the old ``aafig`` ASCII-art boxes, but tmux-aware. + +Authoring — panes are separated by a ``---`` line, each holding that pane's +commands:: + + :::{tmux-layout} + :size: 64x18 + :layout: even-vertical + + echo 'did you know' + echo 'you can inline' + --- + echo 'single commands' + --- + echo 'for panes' + ::: + +``:layout:`` is one of tmux's arrangements: ``even-vertical`` (default), +``even-horizontal``, ``main-vertical``, ``main-horizontal``, ``tiled``. + +Output is a single inline ```` whose colours are CSS custom properties +(``gp-tmux-layout.css``), so it paints with the page, adapts to light/dark via +``body[data-theme]`` with no JavaScript and no second render, and rides +gp-sphinx SPA swaps as live DOM — without the headless-browser dependency the +mermaid pipeline needs. +""" + +from __future__ import annotations + +import html +import typing as t + +from docutils import nodes +from pygments.lexers.shell import BashLexer +from pygments.token import STANDARD_TYPES +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective + +if t.TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.writers.html5 import HTML5Translator + +logger = logging.getLogger(__name__) + +#: Pixels per tmux character cell (column width, row height). The viewBox is in +#: these pixels, so at the SVG's intrinsic size one unit is one CSS pixel and +#: the text renders at the page's code font size, like a real code block. +_CW = 8.0 +_CH = 17.0 +#: Padding (px) between a pane edge and its text. +_PAD = 6.0 +#: Approx. font ascent (px) for placing the first baseline below the padding. +_FONT = 12.0 +#: Baseline-to-baseline distance (px) for stacked command lines. +_LINE_H = 17.0 +#: A simple shell prompt prefixed to each command line. The ``gp`` class is +#: Pygments' Generic.Prompt, so it takes the theme's prompt colour (like the +#: ``$`` in the site's console blocks). +_PROMPT = '' # noqa: RUF001 + +_LAYOUTS = ( + "even-vertical", + "even-horizontal", + "main-vertical", + "main-horizontal", + "tiled", +) +_LEXER = BashLexer() + + +class TmuxLayoutError(ValueError): + """A tmux-layout directive could not be rendered.""" + + +class Rect(t.NamedTuple): + """A pane rectangle in character-cell coordinates.""" + + x: float + y: float + w: float + h: float + + +def _even(n: int, w: float, h: float, *, vertical: bool) -> list[Rect]: + """Split the screen into ``n`` equal panes, filling it completely. + + >>> [round(r.h, 2) for r in _even(2, 80, 24, vertical=True)] + [12.0, 12.0] + >>> [round(r.w, 2) for r in _even(2, 80, 24, vertical=False)] + [40.0, 40.0] + """ + rects = [] + for i in range(n): + if vertical: + y0, y1 = i * h / n, (i + 1) * h / n + rects.append(Rect(0.0, y0, w, y1 - y0)) + else: + x0, x1 = i * w / n, (i + 1) * w / n + rects.append(Rect(x0, 0.0, x1 - x0, h)) + return rects + + +def _main( + n: int, w: float, h: float, *, vertical: bool, ratio: float = 0.5 +) -> list[Rect]: + """One main pane plus the rest split evenly beside/below it. + + >>> r = _main(3, 80, 24, vertical=True) + >>> (round(r[0].w), round(r[1].x), len(r)) + (40, 40, 3) + """ + if n == 1: + return [Rect(0.0, 0.0, w, h)] + if vertical: + mw = w * ratio + rects = [Rect(0.0, 0.0, mw, h)] + rects += [ + Rect(mw + r.x, r.y, r.w, r.h) + for r in _even(n - 1, w - mw, h, vertical=True) + ] + else: + mh = h * ratio + rects = [Rect(0.0, 0.0, w, mh)] + rects += [ + Rect(r.x, mh + r.y, r.w, r.h) + for r in _even(n - 1, w, h - mh, vertical=False) + ] + return rects + + +def _tiled(n: int, w: float, h: float) -> list[Rect]: + """Tile ``n`` panes into a grid that fills the screen (tmux ``tiled``). + + >>> len(_tiled(4, 80, 24)), round(_tiled(4, 80, 24)[0].w) + (4, 40) + """ + rows = cols = 1 + while rows * cols < n: + rows += 1 + if rows * cols < n: + cols += 1 + rects = [] + for i in range(n): + r, c = divmod(i, cols) + in_row = cols if r < rows - 1 else n - cols * (rows - 1) + x0, x1 = c * w / in_row, (c + 1) * w / in_row + y0, y1 = r * h / rows, (r + 1) * h / rows + rects.append(Rect(x0, y0, x1 - x0, y1 - y0)) + return rects + + +def arrange(layout: str, n: int, w: int, h: int) -> list[Rect]: + """Return ``n`` pane rectangles filling a ``w`` x ``h`` screen. + + >>> [round(r.h) for r in arrange("even-vertical", 3, 80, 24)] + [8, 8, 8] + >>> len(arrange("tiled", 4, 80, 24)) + 4 + """ + if n < 1: + msg = "a tmux layout needs at least one pane" + raise TmuxLayoutError(msg) + if n == 1: + return [Rect(0.0, 0.0, float(w), float(h))] + if layout == "even-vertical": + return _even(n, w, h, vertical=True) + if layout == "even-horizontal": + return _even(n, w, h, vertical=False) + if layout == "main-vertical": + return _main(n, w, h, vertical=True) + if layout == "main-horizontal": + return _main(n, w, h, vertical=False) + if layout == "tiled": + return _tiled(n, w, h) + msg = f"unknown layout {layout!r}; expected one of {', '.join(_LAYOUTS)}" + raise TmuxLayoutError(msg) + + +def _highlight(line: str) -> str: + """Return a shell command as Pygments-classed ````s. + + The command name (a shell builtin like ``echo``/``pwd``) is left in the + default text colour, like a freshly typed command; strings, comments, and + the like keep their Pygments classes. + + >>> 'class="nb"' in _highlight("echo hello") + False + >>> 'class="s1"' in _highlight("echo 'hi'") + True + >>> "'hi'" in _highlight("echo 'hi'") + True + """ + spans = [] + for token, value in _LEXER.get_tokens(line): + text = value.rstrip("\n") + if not text: + continue + css = STANDARD_TYPES.get(token, "") + if css == "nb": # command builtins (echo, pwd) keep the default colour + css = "" + escaped = html.escape(text) + spans.append(f'{escaped}' if css else escaped) + return "".join(spans) + + +def _parse_size(size: str) -> tuple[int, int]: + """Parse a ``WxH`` screen size. + + >>> _parse_size("64x18") + (64, 18) + """ + try: + w_str, h_str = size.lower().split("x", 1) + return int(w_str), int(h_str) + except ValueError as exc: + msg = f"invalid size {size!r}; expected WxH (e.g. 80x24)" + raise TmuxLayoutError(msg) from exc + + +def render_layout(panes: list[list[str]], layout: str, size: tuple[int, int]) -> str: + """Render panes (each a list of command lines) to an inline ````. + + >>> svg = render_layout([["echo a"], ["echo b"]], "even-vertical", (40, 12)) + >>> svg.startswith("', + ] + # Pane fills first; the window border and single dividers go on top so a + # shared edge is one line, not two abutting pane strokes. + parts.extend( + f'' + for rect in rects + ) + for rect in rects: + right, bottom = rect.x + rect.w, rect.y + rect.h + if right < w: # internal vertical divider + parts.append( + f'', + ) + if bottom < h: # internal horizontal divider + parts.append( + f'', + ) + parts.append( + f'', + ) + # Pygments colours come from furo's own `.highlight` rules (theme-matched, + # light/dark) via `fill: currentColor`; a ignores its background. + parts.append('') + for rect, commands in zip(rects, panes, strict=True): + tx = rect.x * _CW + _PAD + baseline = rect.y * _CH + _PAD + _FONT + for i, line in enumerate(commands): + body = _highlight(line) + if not body: + continue + ty = baseline + i * _LINE_H + parts.append( + f'{_PROMPT}{body}', + ) + parts.append("") + return "".join(parts) + + +def _split_panes(content: list[str]) -> list[list[str]]: + """Split directive content on ``---`` lines into per-pane command lists. + + >>> _split_panes(["echo a", "echo b", "---", "echo c"]) + [['echo a', 'echo b'], ['echo c']] + """ + panes: list[list[str]] = [[]] + for line in content: + if line.strip() == "---": + panes.append([]) + else: + panes[-1].append(line.rstrip()) + return [ + [line for line in pane if line.strip()] + for pane in panes + if any(p.strip() for p in pane) + ] + + +class tmux_layout(nodes.General, nodes.Element): + """Doctree node carrying a rendered tmux-layout SVG.""" + + +class TmuxLayoutDirective(SphinxDirective): + """Render a declared tmux layout as an inline, terminal-styled SVG.""" + + has_content = True + required_arguments = 0 + optional_arguments = 0 + option_spec: t.ClassVar[dict[str, t.Callable[[str], t.Any]]] = { + "size": lambda x: x, + "layout": lambda x: x, + "caption": lambda x: x, + } + + def run(self) -> list[nodes.Node]: + """Return a :class:`tmux_layout` node with the rendered SVG.""" + panes = _split_panes(list(self.content)) + if not panes: + warning = self.state.document.reporter.warning( + "tmux-layout directive has no panes", + line=self.lineno, + ) + return [warning] + layout = self.options.get("layout", "even-vertical") + try: + svg = render_layout( + panes, layout, _parse_size(self.options.get("size", "80x24")) + ) + except TmuxLayoutError as exc: + logger.warning("invalid tmux layout: %s", exc, location=self.get_location()) + return [ + nodes.literal_block("\n".join(self.content), "\n".join(self.content)) + ] + node = tmux_layout() + node["svg"] = svg + node["caption"] = self.options.get("caption", "") + return [node] + + +def html_visit_tmux_layout(self: HTML5Translator, node: tmux_layout) -> None: + """Append the inline SVG (wrapped in a figure) and skip the node.""" + caption = node.get("caption", "") + parts = [f'
    {node["svg"]}'] + if caption: + parts.append(f"
    {html.escape(caption)}
    ") + parts.append("
    ") + self.body.append("".join(parts)) + raise nodes.SkipNode + + +def _depart_tmux_layout(self: HTML5Translator, node: tmux_layout) -> None: + """No-op; :func:`html_visit_tmux_layout` raises ``SkipNode``.""" + + +def setup(app: Sphinx) -> dict[str, t.Any]: + """Register the directive, node, and stylesheet.""" + app.add_node(tmux_layout, html=(html_visit_tmux_layout, _depart_tmux_layout)) + app.add_directive("tmux-layout", TmuxLayoutDirective) + app.add_css_file("css/gp-tmux-layout.css") + return { + "version": "0.1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/docs/_static/css/gp-tmux-layout.css b/docs/_static/css/gp-tmux-layout.css new file mode 100644 index 0000000000..8718724809 --- /dev/null +++ b/docs/_static/css/gp-tmux-layout.css @@ -0,0 +1,74 @@ +/* + * tmux window layouts (docs/_ext/tmux_layout.py). + * + * Plain inline SVG: it inherits furo's CSS custom properties and adapts to + * light/dark via body[data-theme] with no JavaScript and no second render. + * + * Shell highlighting reuses furo's own Pygments rules: the command text is + * wrapped in , so `.highlight .nb`, `.highlight .gp` + * (the prompt), etc. apply, and SVG takes its colour from `color` via + * `fill: currentColor` — so the panes match the site's console blocks exactly, + * font and colours, in both light and dark. The viewBox is in pixels (one tmux + * cell = _CW x _CH), so at intrinsic size the text renders at the code font + * size. + */ + +.gp-tmux-layout-wrapper { + margin: 1.5rem 0; + text-align: center; +} + +.gp-tmux-layout { + max-width: min(100%, 480px); + height: auto; + display: block; + margin: 0 auto; +} + +/* + * Pane background mirrors the Pygments code-block background, with the same + * light/dark switching furo uses for `.highlight` (pygments_style and + * pygments_dark_style backgrounds). + */ +.gp-tmux-layout .pane { + fill: #f8fafc; +} + +body[data-theme="dark"] .gp-tmux-layout .pane { + fill: #272822; +} + +@media (prefers-color-scheme: dark) { + body:not([data-theme="light"]) .gp-tmux-layout .pane { + fill: #272822; + } +} + +/* Single-stroke window border and pane dividers. */ +.gp-tmux-layout .window { + fill: none; + stroke: var(--color-background-border, #cccccc); + stroke-width: 1; +} + +.gp-tmux-layout .divider { + stroke: var(--color-background-border, #cccccc); + stroke-width: 1; +} + +.gp-tmux-layout text { + font-family: var(--font-stack--monospace, "SFMono-Regular", Menlo, monospace); + font-size: var(--code-font-size, 0.8125rem); + /* Match the site's code blocks (pre): even monospace advance, no kerning. */ + font-kerning: none; + text-rendering: optimizeSpeed; + letter-spacing: normal; + /* Colour comes from furo's .highlight / .highlight .nb / .gp rules. */ + fill: currentColor; +} + +.gp-tmux-layout-wrapper > figcaption { + text-align: center; + font-size: 0.9em; + margin-top: 0.5rem; +} diff --git a/docs/conf.py b/docs/conf.py index 95f4ecfeb2..9217bea552 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -35,6 +35,7 @@ "sphinx_autodoc_api_style", "aafig", "mermaid_inline", + "tmux_layout", "sphinx_autodoc_argparse.exemplar", ], # Route a plain ```mermaid fence to the mermaid_inline directive (the colon diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 2c5aa6835c..9ab5777308 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -7,17 +7,17 @@ tmuxp has a short-hand syntax for those who wish to keep their workspace punctual. -::::{sidebar} short hand - -```mermaid -block-beta - columns 1 - p1["'did you know'

    'you can inline'"] - p2["'single commands'"] - p3["'for panes'"] -``` - -:::: +:::{tmux-layout} +:size: 36x12 +:layout: even-vertical + +echo 'did you know' +echo 'you can inline' +--- +echo 'single commands' +--- +echo 'for panes' +::: ````{tab} YAML @@ -65,16 +65,14 @@ Note `''` counts as an empty carriage return. ## 2 panes -::::{sidebar} 2 pane +:::{tmux-layout} +:size: 30x10 +:layout: even-vertical -```mermaid -block-beta - columns 1 - a["$ pwd"] - b["$ pwd"] -``` - -:::: +pwd +--- +pwd +::: ````{tab} YAML @@ -96,16 +94,16 @@ block-beta ## 3 panes -::::{sidebar} 3 panes +:::{tmux-layout} +:size: 30x12 +:layout: main-horizontal -```mermaid -block-beta - columns 2 - top["$ pwd"]:2 - bl["$ pwd"] br["$ pwd"] -``` - -:::: +pwd +--- +pwd +--- +pwd +::: ````{tab} YAML @@ -127,16 +125,18 @@ block-beta ## 4 panes -::::{sidebar} 4 panes - -```mermaid -block-beta - columns 2 - a["$ pwd"] b["$ pwd"] - c["$ pwd"] d["$ pwd"] -``` - -:::: +:::{tmux-layout} +:size: 30x12 +:layout: tiled + +pwd +--- +pwd +--- +pwd +--- +pwd +::: ````{tab} YAML diff --git a/tests/test_docs_tmux_layout.py b/tests/test_docs_tmux_layout.py new file mode 100644 index 0000000000..d787eae874 --- /dev/null +++ b/tests/test_docs_tmux_layout.py @@ -0,0 +1,202 @@ +"""Tests for the tmux-layout directive (``docs/_ext/tmux_layout.py``).""" + +from __future__ import annotations + +import importlib.util +import types +import typing as t +from pathlib import Path + +import pytest + +_EXT_PATH = Path(__file__).resolve().parent.parent / "docs" / "_ext" / "tmux_layout.py" +_spec = importlib.util.spec_from_file_location("tmux_layout", _EXT_PATH) +assert _spec is not None +assert _spec.loader is not None +tl = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(tl) + + +class ArrangeCase(t.NamedTuple): + """A named layout with a pane count and the geometry it should produce.""" + + test_id: str + layout: str + n: int + expect_count: int + + +_ARRANGE_CASES: list[ArrangeCase] = [ + ArrangeCase("even-vertical-3", "even-vertical", 3, 3), + ArrangeCase("even-horizontal-2", "even-horizontal", 2, 2), + ArrangeCase("main-vertical-3", "main-vertical", 3, 3), + ArrangeCase("main-horizontal-3", "main-horizontal", 3, 3), + ArrangeCase("tiled-4", "tiled", 4, 4), + ArrangeCase("tiled-3-spans-last-row", "tiled", 3, 3), + ArrangeCase("single-pane", "even-vertical", 1, 1), +] + + +@pytest.mark.parametrize( + "case", + _ARRANGE_CASES, + ids=[c.test_id for c in _ARRANGE_CASES], +) +def test_arrange_fills_screen(case: ArrangeCase) -> None: + """Each arrangement returns the right panes and tiles the screen exactly.""" + width, height = 80, 24 + rects = tl.arrange(case.layout, case.n, width, height) + assert len(rects) == case.expect_count + # Non-overlapping panes that fill the screen sum to its area. + area = sum(r.w * r.h for r in rects) + assert area == pytest.approx(width * height) + # Every pane stays within the screen. + for r in rects: + assert r.x >= -1e-6 + assert r.y >= -1e-6 + assert r.x + r.w <= width + 1e-6 + assert r.y + r.h <= height + 1e-6 + + +def test_arrange_unknown_layout_raises() -> None: + """An unknown layout name is a clear error.""" + with pytest.raises(tl.TmuxLayoutError, match="unknown layout"): + tl.arrange("spiral", 2, 80, 24) + + +class HighlightCase(t.NamedTuple): + """A shell command and the Pygments class its first token should carry.""" + + test_id: str + command: str + expect_class: str + + +_HIGHLIGHT_CASES: list[HighlightCase] = [ + HighlightCase("single-quoted-string", "echo 'hi there'", 'class="s1"'), + HighlightCase("comment", "# a note", 'class="c1"'), +] + + +@pytest.mark.parametrize( + "case", + _HIGHLIGHT_CASES, + ids=[c.test_id for c in _HIGHLIGHT_CASES], +) +def test_highlight_emits_pygments_classes(case: HighlightCase) -> None: + """``_highlight`` wraps shell tokens in Pygments-classed tspans.""" + out = tl._highlight(case.command) + assert case.expect_class in out + assert " None: + """A command builtin (echo/pwd) is left in the default colour, no nb class.""" + assert 'class="nb"' not in tl._highlight("echo hello") + assert 'class="nb"' not in tl._highlight("pwd") + + +def test_highlight_escapes_markup() -> None: + """Angle brackets in a command are HTML-escaped, not emitted as tags.""" + out = tl._highlight("echo ") + assert "" not in out + assert "<a>" in out + + +class SplitCase(t.NamedTuple): + """Directive content lines and the per-pane command lists they yield.""" + + test_id: str + content: list[str] + expect: list[list[str]] + + +_SPLIT_CASES: list[SplitCase] = [ + SplitCase("two-panes", ["echo a", "---", "echo b"], [["echo a"], ["echo b"]]), + SplitCase( + "multiline-pane", + ["echo a", "echo b", "---", "echo c"], + [["echo a", "echo b"], ["echo c"]], + ), + SplitCase( + "blank-lines-dropped", ["echo a", "", "---", "echo b"], [["echo a"], ["echo b"]] + ), +] + + +@pytest.mark.parametrize( + "case", + _SPLIT_CASES, + ids=[c.test_id for c in _SPLIT_CASES], +) +def test_split_panes(case: SplitCase) -> None: + """``_split_panes`` splits on ``---`` and keeps each pane's commands.""" + assert tl._split_panes(case.content) == case.expect + + +class SizeCase(t.NamedTuple): + """A ``:size:`` string and the (cols, rows) it parses to.""" + + test_id: str + size: str + expect: tuple[int, int] + + +_SIZE_CASES: list[SizeCase] = [ + SizeCase("plain", "64x18", (64, 18)), + SizeCase("uppercase-x", "80X24", (80, 24)), +] + + +@pytest.mark.parametrize( + "case", + _SIZE_CASES, + ids=[c.test_id for c in _SIZE_CASES], +) +def test_parse_size(case: SizeCase) -> None: + """``_parse_size`` reads a ``WxH`` screen size.""" + assert tl._parse_size(case.size) == case.expect + + +def test_parse_size_invalid_raises() -> None: + """A malformed size is a clear error.""" + with pytest.raises(tl.TmuxLayoutError, match="invalid size"): + tl._parse_size("not-a-size") + + +def test_render_layout_structure() -> None: + """The rendered SVG has one window, one rect per pane, and highlighting.""" + svg = tl.render_layout([["echo a"], ["echo b"]], "even-vertical", (40, 12)) + assert svg.startswith("") + + +def test_setup_registers_components() -> None: + """``setup`` registers the node, directive, css, and is parallel-safe.""" + recorded: dict[str, list[t.Any]] = {"nodes": [], "directives": [], "css": []} + + def add_node(node: object, **kwargs: object) -> None: + recorded["nodes"].append(node) + + def add_directive(name: str, cls: object) -> None: + recorded["directives"].append((name, cls)) + + def add_css_file(name: str, **kwargs: object) -> None: + recorded["css"].append(name) + + app = types.SimpleNamespace( + add_node=add_node, + add_directive=add_directive, + add_css_file=add_css_file, + ) + meta = tl.setup(t.cast("t.Any", app)) + + assert meta["parallel_read_safe"] is True + assert meta["parallel_write_safe"] is True + assert tl.tmux_layout in recorded["nodes"] + assert ("tmux-layout", tl.TmuxLayoutDirective) in recorded["directives"] + assert "css/gp-tmux-layout.css" in recorded["css"] From 88b115d75c73f65f9f94951c8beb25c36ca9f8b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:02:34 -0500 Subject: [PATCH 2951/2998] docs(CHANGES) Themed diagrams across the docs why: Record the v1.74.0 docs update for the changelog. what: - Add a Documentation entry for the build-time, theme-aware diagrams on the workspace-builders and examples pages --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 1c006c2e5d..25cc587db1 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,16 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Documentation + +#### Themed diagrams across the docs (#1071) + +The docs now render their diagrams as theme-aware inline graphics that follow the +site's light/dark palette and code styling, replacing the old static ASCII art. +{ref}`workspace-builders` gains a load → build → attach flow diagram and opens +with a concept-first overview, and {ref}`examples` shows each pane example as a +faithful tmux window layout. + ## tmuxp 1.73.0 (2026-06-28) tmuxp 1.73.0 makes the workspace build step pluggable and tunable. A workspace can now build through a third-party builder selected by registered entry-point name or Python import path, and a new `workspace_builder_options` catalog controls the pane-readiness wait per workspace. The built-in builder stays the default, so existing workspaces keep working — though the new `pane_readiness: auto` default skips the prompt wait on non-zsh shells. See {ref}`custom-workspace-builders` for the guide. From 17cf7ef810603ec93599cd2f5b3a0033221286cb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:29:12 -0500 Subject: [PATCH 2952/2998] docs(config): concept-first leads + diagram why: The configuration pages opened on raw keys instead of what the feature is, and a skimmer had no "you can stop here" cue. The docs voice guide asks for concept-first prose addressed to the reader. what: - top-level: open with what top-level keys are and that only session_name is required; second-person session_name prose - environmental-variables: add an orientation lead (rarely needed, works out of the box) - examples: add a gallery lead; fix "punctual"->"concise" and a stray "it's"->"its" - index: fix "It's"->"Its"; add a session->window->pane mermaid --- docs/configuration/environmental-variables.md | 7 +++ docs/configuration/examples.md | 12 +++- docs/configuration/index.md | 14 ++++- docs/configuration/top-level.md | 60 +++++++++---------- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md index 73c0d1e373..86e54aa1ab 100644 --- a/docs/configuration/environmental-variables.md +++ b/docs/configuration/environmental-variables.md @@ -2,6 +2,13 @@ # Environmental variables +These environment variables tune how tmuxp finds your workspaces and how much it +shows you while loading — set from your shell, outside any workspace file. You +rarely need them: tmuxp works out of the box. Reach for one when you want to +point tmuxp at a different config directory, quiet or reshape the load progress +display, or work around a rare tmux quirk. The progress variables each mirror a +`tmuxp load` flag, noted alongside the variable. + (TMUXP_CONFIGDIR)= ## `TMUXP_CONFIGDIR` diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 9ab5777308..98b917f4f4 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -2,10 +2,16 @@ # Examples +This is a gallery of working workspace files — each a small, complete YAML (with +its JSON twin) you can copy, load, and adapt. They run from the simplest +two-pane split up to a full development environment, and many preview the panes +they build. Skim for the feature you need — inline shorthand, blank panes, +environment variables, pane shells, focus, history, timed pauses — and lift the +snippet. + ## Short hand / inline style -tmuxp has a short-hand syntax for those who wish to keep their workspace -punctual. +tmuxp has a short-hand syntax for those who like to keep a workspace concise. :::{tmux-layout} :size: 36x12 @@ -628,7 +634,7 @@ A successful script will exit with a status of `0`. Important: the script file must be chmod executable `+x` or `755`. -Run a python script (and check for it's return code), the script is +Run a python script (and check for its return code), the script is _relative to the `.tmuxp.yaml`'s root_ (Windows and panes omitted in this example): diff --git a/docs/configuration/index.md b/docs/configuration/index.md index a3e82e39c8..28d08215a3 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -37,7 +37,7 @@ Select a builder and tune pane readiness. tmuxp loads your terminal workspace into tmux using workspace files. -The workspace file can be JSON or YAML. It's declarative style resembles tmux's object hierarchy: session, window and panes. +The workspace file can be JSON or YAML. Its declarative style resembles tmux's object hierarchy: session, window, and panes. ## Launching your session @@ -62,6 +62,18 @@ tmuxp will offer to assist when: 3. A list of _panes_ for each window 4. A list of _commands_ for each pane +:::{mermaid} +:caption: A workspace file mirrors tmux's own hierarchy. + +flowchart TD + session["session_name"] --> w1["window"] + session --> w2["window"] + w1 --> p1["pane"] + w1 --> p2["pane"] + p1 --> c1["shell_command"] + p1 --> c2["shell_command"] +::: + ````{tab} Basics ```yaml diff --git a/docs/configuration/top-level.md b/docs/configuration/top-level.md index b8e480522e..845ee79b9c 100644 --- a/docs/configuration/top-level.md +++ b/docs/configuration/top-level.md @@ -3,48 +3,48 @@ # Top-level configuration -## `session_name` - -Used for: - -- tmux session name -- checking for existing sessions - -Notes: - -- Session names may differ from workspace filename. +Top-level keys describe the session as a whole — its name, where it starts, +the tmux options it sets — and sit above the `windows` and `panes` that fill +it. Only `session_name` is required; leave the rest out and a workspace with +just a name and a list of windows loads fine. This page covers `session_name` +and the keys for choosing a workspace builder. For the full set of session, +window, and pane keys, work through {ref}`examples`. - e.g. _apple.yaml_: +## `session_name` - ```yaml - session_name: banana - windows: - - panes: - - - ``` +The name tmux gives the session — and the name tmuxp checks against when it +decides whether that session is already running. It need not match the +workspace filename. - Load detached: +For example, _apple.yaml_: - ```console - $ tmuxp load ./apple.yaml -d - ``` +```yaml +session_name: banana +windows: + - panes: + - +``` - Above: +Load it detached: - - tmuxp loads a file named _apple.yaml_ from the current directory. - - tmuxp built a tmux session called _banana_. - - `-d` means _detached_, loading in background. +```console +$ tmuxp load ./apple.yaml -d +``` - ```console - $ tmux attach -t banana - ``` +tmuxp reads _apple.yaml_ from the current directory and builds a tmux session +called _banana_ in the background — `-d` is detached. Attach to it with tmux +directly: - Above: Use `tmux` directly to attach _banana_. +```console +$ tmux attach -t banana +``` ## Workspace builder keys -A workspace file can also select a custom builder and tune builder behavior with +A workspace file can also choose a custom builder and tune its behavior with `workspace_builder`, `workspace_builder_paths`, and `workspace_builder_options`. +Most workspaces never set these — leave them out and you get tmuxp's built-in +classic builder. ```{seealso} {ref}`workspace-builders` From d6be89d6a8c2bad0267ccfc3bd9250f7ddf7ec4d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:33:07 -0500 Subject: [PATCH 2953/2998] docs(topics): voice + plugin/workflow diagrams why: The topics pages opened in third person about generic "users" instead of addressing the reader, and the plugin hook order and the freeze->load loop are far easier to grasp as diagrams than as prose. what: - plugins: second-person, concept-first intro; mark plugins opt-in/advanced; add a hook-lifecycle mermaid (firing order verified against the builder and load CLI); fix a dict-literal syntax error and an invalid pyproject example (>=3.8 -> >=3.10, tmuxp^=1.7.0 -> tmuxp>=1.7.0, PEP 621 authors) - workflows: second-person voice, sentence-case headings, a freeze->edit->load mermaid, {ref} the exit-codes page - custom-workspace-builders: address the reader in the intro - troubleshooting: tmux 3.2a -> 3.2; {ref} completion; bash/zsh/tcsh - library-vs-cli: link quickstart and examples --- docs/topics/custom-workspace-builders.md | 4 +- docs/topics/library-vs-cli.md | 3 + docs/topics/plugins.md | 98 ++++++++++++++---------- docs/topics/troubleshooting.md | 5 +- docs/topics/workflows.md | 50 ++++++++---- 5 files changed, 101 insertions(+), 59 deletions(-) diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md index 26f6f38ff7..18a231d013 100644 --- a/docs/topics/custom-workspace-builders.md +++ b/docs/topics/custom-workspace-builders.md @@ -5,8 +5,8 @@ A *workspace builder* turns an expanded workspace ``dict`` into a live tmux session. tmuxp ships one builder, {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`, and uses it -by default. Advanced users can point tmuxp at a different builder, and packagers -can distribute builders that users select by name. +by default. You can point tmuxp at a different builder, and packagers can +distribute builders that you select by name. This is an advanced, opt-in feature. Existing workspace files keep using the classic builder with no changes. diff --git a/docs/topics/library-vs-cli.md b/docs/topics/library-vs-cli.md index 8c431caa3d..2481a91f76 100644 --- a/docs/topics/library-vs-cli.md +++ b/docs/topics/library-vs-cli.md @@ -15,6 +15,9 @@ Use `tmuxp` when: $ tmuxp load my-workspace.yaml ``` +New to the format? Start with {ref}`quickstart`, then browse ready-to-load files +in {ref}`examples`. + ## When to Use libtmux Use [libtmux](https://libtmux.git-pull.com/) directly when: diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index 0276d66e64..c2d9280eed 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -2,15 +2,17 @@ # Plugins -The plugin system allows users to customize and extend different aspects of -tmuxp without the need to change tmuxp itself. +Plugins let you customize and extend how tmuxp builds a session — renaming it, +reacting when you reattach, running setup at specific moments — without forking +tmuxp or hand-editing your workspace files. This is an advanced, opt-in feature: +most users never write or install one, and a workspace loads exactly the same +with no plugins at all. Reach for a plugin when you want behavior the workspace +format can't express and you're comfortable writing a little Python. -## Using a Plugin +## Using a plugin -To use a plugin, install it in your local python environment and add it to -your tmuxp workspace file. - -### Example Workspace files +Install the plugin into the same Python environment as tmuxp, then name it in +your workspace file under `plugins`: ````{tab} YAML @@ -30,42 +32,61 @@ your tmuxp workspace file. ```` -## Developing a Plugin +## When your hooks fire -tmuxp expects all plugins to be a class within a python submodule named -`plugin` that is within a python module that is installed in the local -python environment. A plugin interface is provided by tmuxp to inherit. +A plugin is a class whose methods tmuxp calls at set points while it builds and +attaches the session. You override only the hooks you care about; the rest do +nothing. The order is fixed: -[uv] is the chosen python package manager for tmuxp. It is highly -suggested to use it when developing plugins; however, `pip` will work -just as well. Only one of the configuration files is needed for the packaging -tool that the package developer decides to use. +:::{mermaid} +:caption: When each plugin hook fires during `tmuxp load`. -```console +flowchart TD + load["tmuxp load"] --> bwb["before_workspace_builder
    session created, no windows yet"] + bwb --> oc["on_window_create
    per window, before its panes"] + oc --> panes["panes and commands run"] + panes --> awf["after_window_finished
    per window, after its panes"] + awf -->|more windows| oc + awf -->|all windows built| bs["before_script
    after the build completes"] + bs --> reattach["reattach
    only when re-attaching an existing session"] +::: + +Two of these names can mislead. `before_script` runs _after_ the session is +built — it augments, rather than replaces, the workspace's own `before_script`. +And `reattach` fires only on the path where tmuxp re-attaches you to a session +that already exists. + +## Developing a plugin +tmuxp expects a plugin to be a class in a Python submodule named `plugin`, inside +a module installed in the same environment as tmuxp. You inherit from the +interface tmuxp provides, {class}`~tmuxp.plugin.TmuxpPlugin`. + +[uv] is tmuxp's package manager of choice, and what these examples use; `pip` +works just as well. You need only one project file, for whichever packaging tool +you choose. + +```console python_module ├── tmuxp_plugin_my_plugin_module -│   ├── __init__.py -│   └── plugin.py +│ ├── __init__.py +│ └── plugin.py └── pyproject.toml # Python project configuration file - ``` -When publishing plugins to pypi, tmuxp advocates for standardized naming: -`tmuxp-plugin-{your-plugin-name}` to allow for easier searching. To create a -module configuration file with uv, run `uv virtualenv` in the module -directory. The resulting file looks something like this: +When publishing to PyPI, tmuxp suggests the naming convention +`tmuxp-plugin-{your-plugin-name}` so others can find it. A minimal +`pyproject.toml` looks like this: ```toml - [project] name = "tmuxp-plugin-my-tmuxp-plugin" version = "0.0.2" description = "An example tmuxp plugin." -authors = ["Author Name .com>"] -requires-python = ">=3.8,<4.0" +authors = [{ name = "Author Name", email = "author.name@example.com" }] +requires-python = ">=3.10" dependencies = [ - "tmuxp^=1.7.0" + "tmuxp>=1.7.0", ] [build-system] @@ -73,28 +94,27 @@ requires = ["hatchling"] build-backend = "hatchling.build" ``` -The `plugin.py` file could contain something like the following: +The `plugin.py` file holds the class: ```python +import datetime from tmuxp.plugin import TmuxpPlugin -import datetime + class MyTmuxpPlugin(TmuxpPlugin): def __init__(self): - """ - Initialize my custom plugin. - """ - # Optional version dependency configuration. See Plugin API docs - # for all supported config parameters + """Initialize my custom plugin.""" + # Optional version-dependency configuration. See the Plugin API + # docs for every supported parameter. config = { - 'tmuxp_min_version' = '1.6.2' + 'tmuxp_min_version': '1.6.2', } TmuxpPlugin.__init__( self, plugin_name='tmuxp-plugin-my-tmuxp-plugin', - **config + **config, ) def before_workspace_builder(self, session): @@ -103,17 +123,15 @@ class MyTmuxpPlugin(TmuxpPlugin): def reattach(self, session): now = datetime.datetime.now().strftime('%Y-%m-%d') session.rename_session('session_{}'.format(now)) - ``` -Once this plugin is installed in the local python environment, it can be used -in a configuration file like the following: +Once it's installed in the same environment, name it in a workspace file: ```yaml session_name: plugin example plugins: - my_plugin_module.plugin.MyTmuxpPlugin -# ... the rest of your config +# ... the rest of your workspace ``` ## Plugin API diff --git a/docs/topics/troubleshooting.md b/docs/topics/troubleshooting.md index bfacad2c34..7843cde76c 100644 --- a/docs/topics/troubleshooting.md +++ b/docs/topics/troubleshooting.md @@ -19,7 +19,7 @@ Ensure tmux is installed: $ tmux -V ``` -Minimum required version: tmux 3.2a. +Minimum required version: tmux 3.2. ## Configuration errors @@ -36,5 +36,4 @@ Use `tmuxp load -d` to load in detached mode alongside existing sessions. ## Shell completion not working -See [Shell Completion](../cli/completion.md) for setup instructions -for bash, zsh, and fish. +See {ref}`completion` for setup instructions for bash, zsh, and tcsh. diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md index 5965653c0d..491f19f267 100644 --- a/docs/topics/workflows.md +++ b/docs/topics/workflows.md @@ -1,32 +1,54 @@ # Workflows -## CI Integration +tmuxp is small enough to drop into a script, a CI job, or your daily startup +routine. This page collects a few patterns — running headless, branching on exit +codes, and turning a session you arranged by hand into a reusable file. None of +it is special machinery; it's the same `tmuxp load`, `freeze`, and exit codes you +already have. -tmuxp can set up tmux sessions in CI pipelines for integration testing: +## CI integration + +You can build a tmux session inside a CI pipeline for integration testing. Load +it detached so nothing waits on a terminal: ```console $ tmuxp load -d my-workspace.yaml ``` -The `-d` flag loads the session in detached mode, useful for headless environments. +The `-d` flag loads the session in the background, which is what you want in a +headless environment. ## Scripting -tmuxp's exit codes enable scripting and error handling. See -[Exit Codes](../cli/exit-codes.md) for the complete list. +tmuxp returns meaningful exit codes, so a script can tell success from failure +and branch on it. See {ref}`cli-exit-codes` for the full list. + +## Automating development environments + +You don't have to write a workspace file from scratch. Arrange a session the way +you like it, freeze it to capture the layout, then edit and replay it anywhere: + +:::{mermaid} +:caption: Capture a session once, replay it anywhere. -## Automating Development Environments +flowchart LR + arrange["arrange tmux by hand"] --> freeze["tmuxp freeze"] + freeze --> yaml["workspace.yaml"] + yaml --> edit["edit + commit"] + edit --> load["tmuxp load"] + load --> arrange +::: -Use tmuxp to codify your development environment: +1. Arrange your ideal tmux layout by hand. +2. Freeze it: `tmuxp freeze my-session`. +3. Edit the generated YAML to add commands. +4. Load it on any machine: `tmuxp load my-workspace.yaml`. -1. Set up your ideal tmux layout manually -2. Freeze it: `tmuxp freeze my-session` -3. Edit the generated YAML to add commands -4. Load it on any machine: `tmuxp load my-workspace.yaml` +## User-level configuration -## User-Level Configuration +You can store workspace files in any of these, then load them by name from +anywhere: -Workspace configs can be stored in: - `~/.tmuxp/` (legacy) - `~/.config/tmuxp/` (XDG default) -- Project-local `.tmuxp.yaml` or `.tmuxp/` directory +- a project-local `.tmuxp.yaml` or `.tmuxp/` directory From b9271eea827afb8e1e1b4484fcf95039057c9836 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:36:03 -0500 Subject: [PATCH 2954/2998] docs(cli): warmer voice + load decision diagram why: The command pages opened straight into mechanics, shell documented -c twice in non-adjacent sections, and the inside-tmux load choice was described in prose only. what: - load: warmer concept-first open; a mermaid for the y/n/a switch/append/detached choice - shell: consolidate the duplicated -c material into one "Running code directly" section after interactive usage - completion: add a concept-first lead naming shtab vs click - exit-codes: introduce each script example instead of stacking them bare - freeze: Tmuxp -> tmuxp - recipes: link the full CLI reference --- docs/cli/completion.md | 5 ++ docs/cli/exit-codes.md | 7 ++- docs/cli/freeze.md | 2 +- docs/cli/load.md | 21 ++++++-- docs/cli/recipes.md | 3 +- docs/cli/shell.md | 114 +++++++++++++++++++---------------------- 6 files changed, 83 insertions(+), 69 deletions(-) diff --git a/docs/cli/completion.md b/docs/cli/completion.md index 410aed4ee3..756f4921b8 100644 --- a/docs/cli/completion.md +++ b/docs/cli/completion.md @@ -6,6 +6,11 @@ # Completions +Shell completion teaches your shell to finish `tmuxp` subcommands and flags when +you press Tab. It's optional, and how you set it up depends on your tmuxp +version — 1.17 and newer use shtab, while 1.1 through 1.16 used click. Pick the +section that matches yours. + ## tmuxp 1.17+ (experimental) ```{note} diff --git a/docs/cli/exit-codes.md b/docs/cli/exit-codes.md index e8a80e892d..42486e21cf 100644 --- a/docs/cli/exit-codes.md +++ b/docs/cli/exit-codes.md @@ -10,7 +10,10 @@ tmuxp uses standard exit codes for scripting and automation. | `1` | General error (config validation, tmux command failure) | | `2` | Usage error (invalid arguments, missing required options) | -## Usage in Scripts +## Usage in scripts + +Because the exit code is meaningful, a script can check it and react. Test it +explicitly with `$?`: ```bash #!/bin/bash @@ -21,6 +24,8 @@ if [ $? -ne 0 ]; then fi ``` +Or short-circuit with `||` to handle the failure inline: + ```bash #!/bin/bash tmuxp load -d my-workspace.yaml || { diff --git a/docs/cli/freeze.md b/docs/cli/freeze.md index 0490dd5abf..6f3f8c55ee 100644 --- a/docs/cli/freeze.md +++ b/docs/cli/freeze.md @@ -38,7 +38,7 @@ $ tmuxp freeze --force [session_name] ## Output format -Tmuxp will offer to save your session state to `.json` or `.yaml`. +tmuxp will offer to save your session state to `.json` or `.yaml`. If no session is specified, it will default to the attached session. diff --git a/docs/cli/load.md b/docs/cli/load.md index 8be9178f29..f216dc39f7 100644 --- a/docs/cli/load.md +++ b/docs/cli/load.md @@ -6,7 +6,10 @@ # tmuxp load -Load tmux sessions from workspace configuration files. This is the primary command for starting sessions from YAML or JSON configurations. +Load a tmux session from a workspace file — this is the command you reach for +most. Point it at a project directory or a YAML/JSON file and tmuxp builds the +session and attaches you to it; the flags below are for the cases where you want +something other than that default. ## Command @@ -88,9 +91,9 @@ $ tmuxp load [filename] ## Inside sessions -If you try to load a workspace file from within a tmux session, it will ask you -if you want to load and attach to the new session, or just load detached. -You can also load a workspace file and append the windows to the current active session. +When you load a workspace from _inside_ an existing tmux client, tmuxp asks what +you want rather than guessing — switch to the freshly built session, append its +windows to the session you're in, or build it detached and stay put: ``` Already inside TMUX, switch to session? yes/no @@ -98,6 +101,16 @@ Or (a)ppend windows in the current active session? [y/n/a]: ``` +:::{mermaid} +:caption: Loading from inside an existing tmux client. + +flowchart TD + load["tmuxp load (inside tmux)"] --> q{"y / n / a ?"} + q -->|yes| switch["build the new session, switch the client to it"] + q -->|a| append["append its windows to the current session"] + q -->|no| detached["build it detached, stay where you are"] +::: + ## Options All of these options can be preselected to skip the prompt: diff --git a/docs/cli/recipes.md b/docs/cli/recipes.md index fdbdd7dad9..61836e87a7 100644 --- a/docs/cli/recipes.md +++ b/docs/cli/recipes.md @@ -2,7 +2,8 @@ # Recipes -Copy-pasteable command invocations for common tasks. +Copy-pasteable command invocations for common tasks. Each command has a full +reference — with every flag — under {ref}`cli`. ## Load a workspace diff --git a/docs/cli/shell.md b/docs/cli/shell.md index 586c305e54..ceff183a82 100644 --- a/docs/cli/shell.md +++ b/docs/cli/shell.md @@ -4,7 +4,10 @@ # tmuxp shell -Launch an interactive Python shell with [libtmux] objects pre-loaded. Similar to Django's shell command, this provides quick access to your tmux server, sessions, windows, and panes for scripting and debugging. +Launch an interactive Python shell with [libtmux] objects pre-loaded. Like +Django's `shell` command, it hands you the current tmux server, sessions, +windows, and panes already wired up, so you can poke at a live session or +prototype a script without writing boilerplate. ## Command @@ -16,26 +19,12 @@ Launch an interactive Python shell with [libtmux] objects pre-loaded. Similar to :path: shell ``` -## Directly enter commands - -```console -$ tmuxp shell -c 'python code' -``` - -```{image} ../_static/tmuxp-shell.gif -:width: 878 -:height: 109 -:loading: lazy -``` - ## Interactive usage -Launch into a Python console with [libtmux] objects. Compare to django's shell. - -Automatically preloads current tmux {class}`server `, -{class}`session `, {class}`window ` -{class}`pane `. Pass additional arguments to select a -specific one of your choice: +Run `tmuxp shell` to drop into a Python console with the current tmux +{class}`server `, {class}`session `, +{class}`window `, and {class}`pane ` already bound. +Pass arguments to select a specific one: ```console (Pdb) server @@ -56,80 +45,81 @@ Window(@3 1:your_window, Session($1 your_project)) Pane(%6 Window(@3 1:your_window, Session($1 your_project))) ``` -## Debugger integration +## Running code directly -Supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and -compatible debuggers, for instance [ipdb][ipdb]: +Pass `-c` to run a snippet and exit, much like `python -c`: ```console -$ pip install --user ipdb +$ tmuxp shell -c 'python code' ``` -Inside a [uv](https://docs.astral.sh/uv/getting-started/features/#python-versions)-managed project you can add `ipdb` as a development dependency: - -```console -$ uv add --dev ipdb +```{image} ../_static/tmuxp-shell.gif +:width: 878 +:height: 109 +:loading: lazy ``` -For a pipx-style ad hoc install, run it through [uvx](https://docs.astral.sh/uv/guides/tools/): +The same objects are in scope. Name a server, then a window, to narrow what the +snippet sees: ```console -$ uvx --from ipdb ipdb3 --help +$ tmuxp shell -c 'print(session.name); print(window.name)' +my_server +my_window ``` ```console -$ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell +$ tmuxp shell my_server my_window -c 'print(window.name.upper())' +MY_WINDOW ``` -## Code execution - -You can also pass in python code directly, similar to `python -c`, do -this via `tmuxp -c`: +Inside a tmux pane — or attached to the default server — the pane is in scope +too: ```console -$ tmuxp shell -c 'print(session.name); print(window.name)' -my_server +$ tmuxp shell -c 'print(pane.id); print(pane.window.name)' +%2 my_window ``` -```console -$ tmuxp shell my_server -c 'print(session.name); print(window.name)' -my_server -my_window -``` +## Debugger integration + +`tmuxp shell` supports [PEP 553][pep 553]'s `PYTHONBREAKPOINT` and compatible +debuggers, such as [ipdb][ipdb]: ```console -$ tmuxp shell my_server my_window -c 'print(session.name); print(window.name)' -my_server -my_window +$ pip install --user ipdb ``` +Inside a [uv](https://docs.astral.sh/uv/getting-started/features/#python-versions)-managed +project, add `ipdb` as a development dependency: + ```console -$ tmuxp shell my_server my_window -c 'print(window.name.upper())' -MY_WINDOW +$ uv add --dev ipdb ``` -Assuming inside a tmux pane or one is attached on default server: +For a pipx-style ad hoc install, run it through [uvx](https://docs.astral.sh/uv/guides/tools/): ```console -$ tmuxp shell -c 'print(pane.id); print(pane.window.name)' -%2 -my_window +$ uvx --from ipdb ipdb3 --help ``` -[pep 553]: https://www.python.org/dev/peps/pep-0553/ -[ipdb]: https://pypi.org/project/ipdb/ -[libtmux]: https://libtmux.git-pull.com +```console +$ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell +``` ## Shell detection -`tmuxp shell` detects the richest shell available in your _site packages_, you can also pick your shell via args: +`tmuxp shell` drops into the richest shell available in your _site packages_. Pick +one yourself with a flag: + +- `--pdb`: plain `breakpoint()` (python 3.7+) or `pdb.set_trace` +- `--code`: drop into `code.interact`, accepts `--use-pythonrc` +- `--bpython`: drop into bpython +- `--ipython`: drop into ipython +- `--ptpython`: drop into ptpython, accepts `--use-vi-mode` +- `--ptipython`: drop into ipython + ptpython, accepts `--use-vi-mode` -- `--pdb`: Use plain old `breakpoint()` (python 3.7+) or - `pdb.set_trace` -- `--code`: Drop into `code.interact`, accepts `--use-pythonrc` -- `--bpython`: Drop into bpython -- `--ipython`: Drop into ipython -- `--ptpython`: Drop into ptpython, accepts `--use-vi-mode` -- `--ptipython`: Drop into ipython + ptpython, accepts - `--use-vi-mode` +[pep 553]: https://www.python.org/dev/peps/pep-0553/ +[ipdb]: https://pypi.org/project/ipdb/ +[libtmux]: https://libtmux.git-pull.com From 8c4e6ecd66598a30baff550f44e0b462cc31cedf Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:41:59 -0500 Subject: [PATCH 2955/2998] docs(internals): flow diagram + linkable API why: The architecture request flow was ASCII art; the workspace builder reference rendered as dead text because the package had no module target; and the API index listed its pages as a bare toctree instead of the grid every other index page uses. what: - architecture: ASCII request flow -> mermaid; link the classic builder class instead of a stale bare WorkspaceBuilder - api/workspace/builder: register the package as a py:module so {mod}`tmuxp.workspace.builder` resolves and links - api/index: concept-first lead + grid cards linking each module group, matching the other index pages --- docs/internals/api/index.md | 65 +++++++++++++++++++ docs/internals/api/workspace/builder/index.md | 4 ++ docs/internals/architecture.md | 36 +++++----- 3 files changed, 90 insertions(+), 15 deletions(-) diff --git a/docs/internals/api/index.md b/docs/internals/api/index.md index 2debbe3f26..314e57e9e9 100644 --- a/docs/internals/api/index.md +++ b/docs/internals/api/index.md @@ -2,12 +2,77 @@ # API Reference +This is the internal Python API — the modules tmuxp's CLI is built from, +documented for contributors and plugin authors. Everyday use goes through the +{ref}`CLI `; to drive tmux from Python directly, reach for libtmux instead. + :::{seealso} See {ref}`libtmux's API ` and {ref}`Quickstart ` to see how you can control tmux via python API calls. ::: +::::{grid} 1 2 3 3 +:gutter: 2 2 3 3 + +:::{grid-item-card} Workspace +:link: workspace/index +:link-type: doc +Finding, loading, building, and freezing sessions. +::: + +:::{grid-item-card} CLI modules +:link: cli/index +:link-type: doc +The argparse commands behind each subcommand. +::: + +:::{grid-item-card} Plugin API +:link: plugin +:link-type: doc +The TmuxpPlugin base class and its hooks. +::: + +:::{grid-item-card} Internal helpers +:link: _internal/index +:link-type: doc +Config reader, colors, and private path helpers. +::: + +:::{grid-item-card} Exceptions +:link: exc +:link-type: doc +The TmuxpException hierarchy. +::: + +:::{grid-item-card} Logging +:link: log +:link-type: doc +Loggers and user-facing echo helpers. +::: + +:::{grid-item-card} Shell +:link: shell +:link-type: doc +Internals of the interactive shell launcher. +::: + +:::{grid-item-card} Utilities +:link: util +:link-type: doc +Assorted helpers used across tmuxp. +::: + +:::{grid-item-card} Types +:link: types +:link-type: doc +Shared type definitions. +::: + +:::: + ```{toctree} +:hidden: + _internal/index cli/index workspace/index diff --git a/docs/internals/api/workspace/builder/index.md b/docs/internals/api/workspace/builder/index.md index 0b3ddbfabe..723e2abf33 100644 --- a/docs/internals/api/workspace/builder/index.md +++ b/docs/internals/api/workspace/builder/index.md @@ -1,5 +1,9 @@ # Builder - `tmuxp.workspace.builder` +```{eval-rst} +.. py:module:: tmuxp.workspace.builder +``` + `tmuxp.workspace.builder` is a package. The classic, default builder lives in {mod}`tmuxp.workspace.builder.classic`; the public contract and the selection machinery live alongside it. diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 7a104dbfea..61d0e036ff 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -1,18 +1,23 @@ # Architecture -How the tmuxp CLI dispatches commands to the underlying library. - -## Request Flow - -``` -tmuxp CLI (argparse) - │ - ├── tmuxp load ──→ workspace.loader ──→ workspace.builder ──→ libtmux - ├── tmuxp freeze ──→ workspace.freezer ──→ libtmux - ├── tmuxp convert ──→ _internal.config_reader - ├── tmuxp shell ──→ libtmux (interactive) - └── tmuxp ls/search ──→ workspace.finders -``` +This page traces how a tmuxp command travels from the CLI down to libtmux, the +library that does the actual tmux work. Each subcommand takes its own short path +through one or two workspace modules: + +:::{mermaid} +:caption: How each tmuxp subcommand reaches libtmux. + +flowchart LR + cli["tmuxp CLI (argparse)"] + cli -->|load| loader["workspace.loader"] + loader --> builder["workspace.builder"] + builder --> libtmux["libtmux"] + cli -->|freeze| freezer["workspace.freezer"] + freezer --> libtmux + cli -->|convert| reader["_internal.config_reader"] + cli -->|shell| interactive["libtmux (interactive)"] + cli -->|"ls / search"| finders["workspace.finders"] +::: ## Key Components @@ -35,5 +40,6 @@ The workspace layer handles configuration lifecycle: ### Library Layer (libtmux) tmuxp delegates all tmux operations to [libtmux](https://libtmux.git-pull.com/). -The `WorkspaceBuilder` creates libtmux `Server`, `Session`, `Window`, and `Pane` -objects to construct the requested workspace. +The {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` creates +libtmux `Server`, `Session`, `Window`, and `Pane` objects to construct the +requested workspace. From 6bc87a618017740736661ea41da97e485c368b6a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:44:35 -0500 Subject: [PATCH 2956/2998] docs(quickstart): clean MyST, py>=3.10, voice why: The quickstart still carried reStructuredText link syntax ([uv]_, [pip]\:) that renders broken under MyST, claimed python >=3.9, and listed a .tmuxp.py config form that tmuxp does not load. what: - quickstart: concept-first lead; convert rST references to MyST markdown links; one command per console block; python >=3.9 -> >=3.10; drop the unsupported .tmuxp.py (only .tmuxp.{yaml,yml,json} load); fold the abstraction-layer table under Pythonics - glossary: tidy the redundant Server definition; "a layouts" -> "layouts" --- docs/glossary.md | 17 +++--- docs/quickstart.md | 149 ++++++++++++++++++++------------------------- 2 files changed, 72 insertions(+), 94 deletions(-) diff --git a/docs/glossary.md b/docs/glossary.md index 02375f742d..4ad1f3a56e 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -19,17 +19,14 @@ ConfigReader dataclasses) Server - Tmux runs in the background of your system as a process. + tmux runs in the background of your system as a process. - The server holds multiple {term}`Session`. By default, tmux - automatically starts the server the first time ``$ tmux`` is ran. + A server holds one or more {term}`Session`. tmux starts the server + automatically the first time ``$ tmux`` runs, if it isn't already + running. - A server contains {term}`session`'s. - - tmux starts the server automatically if it's not running. - - Advanced cases: multiple can be run by specifying - ``[-L socket-name]`` and ``[-S socket-path]``. + Advanced: you can run more than one by specifying + ``[-L socket-name]`` or ``[-S socket-path]``. Client Attaches to a tmux {term}`server`. When you use tmux through CLI, @@ -51,7 +48,7 @@ Window Can have 1 or more {term}`pane`. - Panes can be organized with a layouts. + Panes can be organized with layouts. Windows can have names. diff --git a/docs/quickstart.md b/docs/quickstart.md index 6b52b4e1f1..e561b5f735 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -2,45 +2,52 @@ # Quickstart +tmuxp launches a whole tmux workspace — its windows, panes, and the commands +inside them — from a single YAML or JSON file. Install it, write one file, and +`tmuxp load` builds the session and drops you into it. This page takes you from +nothing to a running session. + ## Installation -Ensure you have at least tmux **>= 3.2** and python **>= 3.9**. +Ensure you have at least tmux **>= 3.2** and python **>= 3.10**. ```console $ pip install --user tmuxp ``` -If you're managing dependencies with [uv]_ inside a project environment, -add tmuxp directly to your lockfile: +If you manage dependencies with [uv] inside a project environment, add tmuxp to +your lockfile instead: ```console $ uv add tmuxp ``` -To run tmuxp without installing it globally—similar to what you'd do with -`pipx`—invoke it via [uvx]_: +To run tmuxp without installing it globally — the way you'd use [pipx] — invoke +it through [uvx]: ```console $ uvx tmuxp ``` -You can upgrade to the latest release with: +Upgrade to the latest release with: ```console $ pip install --user --upgrade tmuxp ``` -Within a uv-managed project you can upgrade by refreshing the lockfile and -syncing the environment: +Within a uv-managed project, upgrade by refreshing the lockfile and syncing: ```console $ uv lock --upgrade-package tmuxp +``` + +```console $ uv sync ``` Then install {ref}`completion`. -If you are a Homebrew user you can install it with: +Homebrew users can install it with: ```console $ brew install tmuxp @@ -50,61 +57,47 @@ $ brew install tmuxp ### Developmental releases -New versions of tmuxp are published to PyPI as alpha, beta, or release candidates. -In their versions you will see notification like `a1`, `b1`, and `rc1`, respectively. -`1.10.0b4` would mean the 4th beta release of `1.10.0` before general availability. - -- [pip]\: - - ```console - $ pip install --user --upgrade --pre tmuxp - ``` - -- [uv]_: - - ```console - $ uv add tmuxp --prerelease allow - ``` - -- [uvx]_: - - ```console - $ uvx --from 'tmuxp' --prerelease allow tmuxp - ``` +New versions of tmuxp are published to PyPI as alpha, beta, or release +candidates. Their version carries an `a1`, `b1`, or `rc1` suffix — `1.10.0b4` is +the fourth beta of `1.10.0`, before general availability. -- [pipx]\: +Install the latest pre-release with the tool you use: - ```console - $ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force - ``` - - Then use `tmuxp@next load [session]`. +```console +$ pip install --user --upgrade --pre tmuxp +``` -via trunk (can break easily): +```console +$ uv add tmuxp --prerelease allow +``` -- [pip]\: +```console +$ uvx --from 'tmuxp' --prerelease allow tmuxp +``` - ```console - $ pip install --user -e git+https://github.com/tmux-python/tmuxp.git#egg=tmuxp - ``` +```console +$ pipx install --suffix=@next 'tmuxp' --pip-args '\--pre' --force +``` -- [uv]_: +After the pipx install, load with `tmuxp@next load [session]`. - ```console - $ uv add "tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master" - ``` +Or track trunk directly (it can break): -- [uvx]_: +```console +$ pip install --user -e git+https://github.com/tmux-python/tmuxp.git#egg=tmuxp +``` - ```console - $ uvx --from "tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master" tmuxp - ``` +```console +$ uv add "tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master" +``` -- [pipx]\: +```console +$ uvx --from "tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master" tmuxp +``` - ```console - $ pipx install --suffix=@master 'tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master' --force - ``` +```console +$ pipx install --suffix=@master 'tmuxp @ git+https://github.com/tmux-python/tmuxp.git@master' --force +``` [pip]: https://pip.pypa.io/en/stable/ [pipx]: https://pypa.github.io/pipx/docs/ @@ -121,60 +114,48 @@ via trunk (can break easily): tmuxp launches workspaces / sessions from JSON and YAML files. -Workspace files can be stored in `$HOME/.tmuxp` or in project -directories as `.tmuxp.py`, `.tmuxp.json` or `.tmuxp.yaml`. - -Every workspace file is required to have: +Workspace files live in `$HOME/.tmuxp`, or in a project directory as +`.tmuxp.yaml`, `.tmuxp.yml`, or `.tmuxp.json`. Every workspace file needs: -1. `session_name` -2. list of `windows` -3. list of `panes` for every window in `windows` +1. a `session_name` +2. a list of `windows` +3. a list of `panes` for every window Create a file, `~/.tmuxp/example.yaml`: ```{literalinclude} ../examples/2-pane-vertical.yaml :language: yaml - ``` ```console - $ tmuxp load example.yaml - ``` -This creates your tmuxp session. +This builds and attaches your session. -Load multiple tmux sessions at once: +Load several at once: ```console - $ tmuxp load example.yaml anothersession.yaml - ``` -tmuxp will offer to `switch-client` for you if you're already in a -session. You can also load a workspace and append the windows to -the current active session. +If you're already inside a session, tmuxp offers to `switch-client` for you, or +to append the new windows to the session you're in. -You can also have a custom tmuxp config directory by setting the -`TMUXP_CONFIGDIR` in your environment variables. +You can point tmuxp at a different config directory with the `TMUXP_CONFIGDIR` +environment variable: ```console - $ TMUXP_CONFIGDIR=$HOME/.tmuxpmoo tmuxp load cpython - ``` -Or in your `~/.bashrc` / `~/.zshrc` you can set: +Or set it in your `~/.bashrc` / `~/.zshrc`: ```console - -export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp - +$ export TMUXP_CONFIGDIR=$HOME/.yourconfigdir/tmuxp ``` -You can also [Import][import] configs [teamocil] and [tmuxinator]. +You can also [import][import] configs from [teamocil] and [tmuxinator]. ## Pythonics @@ -184,11 +165,11 @@ You can also [Import][import] configs [teamocil] and [tmuxinator]. ::: -ORM - [Object Relational Mapper][object relational mapper] - -AL - [Abstraction Layer][abstraction layer] - -### python abstraction layer +Under the hood, tmuxp drives tmux through +[libtmux](https://libtmux.git-pull.com/) — an +[object-relational mapper][object relational mapper] and +[abstraction layer] over `tmux(1)`'s commands. Each config concept maps to a +libtmux call: | {ref}`tmuxp python api ` | {term}`tmux(1)` equivalent | | ------------------------------------- | -------------------------- | From 19054e43e309772f6571cc90be5d0362ce18ecc2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:48:23 -0500 Subject: [PATCH 2957/2998] docs(about_tmux): modernize aafig diagrams why: The tmux primer drew its session and pane diagrams as aafig ASCII art. The repo now renders mermaid and tmux-layout to theme-aware inline SVG, which reads better in light and dark themes. what: - session/window/pane hierarchy, window switching, and the detach/reattach flow -> mermaid - the two terminal-split illustrations -> tmux-layout directives - "stores it own screen" -> "its own screen" --- docs/about_tmux.md | 176 +++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 128 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 2db7b3c4d7..6e547ffca5 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -38,29 +38,23 @@ inside the text dimension. Inside tmux you can: | ----------- | ------------------------------- | ------------------------------------- | | Multiplexer | Multi-tasking | Multiple applications simultaneously. | | Session | Desktop | Applications are visible here | -| Window | Virtual Desktop or applications | A desktop that stores it own screen | +| Window | Virtual Desktop or applications | A desktop that stores its own screen | | Pane | Application | Performs operations | -```{eval-rst} -.. aafig:: - :textual: - - +----------------------------------------------------------------+ - | +--------+--------+ +-----------------+ +-----------------+ | - | | pane | pane | | pane | | pane | | - | | | | | | | | | - | | | | | | | | | - | +--------+--------+ | | +-----------------+ | - | | pane | pane | | | | pane | | - | | | | | | | | | - | | | | | | | | | - | +--------+--------+ +-----------------+ +-----------------+ | - | | window | | window | | window | | - | \--------+--------/ \-----------------/ \-----------------/ | - +----------------------------------------------------------------+ - | session | - \----------------------------------------------------------------/ -``` +:::{mermaid} +:caption: A session holds windows; each window holds one or more panes. + +flowchart TD + session["session"] --> w1["window"] + session --> w2["window"] + session --> w3["window"] + w1 --> p1["pane"] + w1 --> p2["pane"] + w1 --> p3["pane"] + w1 --> p4["pane"] + w3 --> p5["pane"] + w3 --> p6["pane"] +::: - 1 {term}`Server`. @@ -84,66 +78,36 @@ splitting up 1 terminal into multiple. One screen can be used to edit a file, and another may be used to `$ tail -F` a logfile. -```{eval-rst} -.. aafig:: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - | | | - | | | - | | | - | | | - +--------+--------+ -``` +:::{tmux-layout} +:size: 40x10 +:layout: even-horizontal -```{eval-rst} -.. aafig:: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - +--------+--------+ - | $ vim | $ bash | - | | | - | | | - +--------+--------+ -``` +bash +--- +bash +::: + +:::{tmux-layout} +:size: 40x12 +:layout: tiled + +bash +--- +bash +--- +vim +--- +bash +::: tmux supports as many terminals as you want. -```{eval-rst} -.. aafig:: - :textual: - - +---------+---------+ - | $ bash | $ bash | - | | | - | | | /-----------------\ - +---------+---------+ --> |'switch-window 2'| - | $ bash | $ bash | \-----------------/ - | | | | - | | | | - +---------+---------+ | - | '1:sys* 2:vim' | | - +-------------------+ | - /------------------------/ - | - v - +---------+---------+ - | $ vim | - | | - | | - +-------------------+ - | $ bash | $ bash | - | | | - | | | - +-------------------+ - | '1:sys 2:vim*' | - +-------------------+ -``` +:::{mermaid} +:caption: Switch between the windows in a session. + +flowchart LR + w1["window 1 · sys (active)"] -->|"switch-window 2"| w2["window 2 · vim (active)"] +::: You can switch between the windows you create. @@ -152,57 +116,13 @@ You can switch between the windows you create. You can leave tmux and all applications running (detach), log out, make a sandwich, and re-(attach), all applications are still running! -```{eval-rst} -.. aafig:: - :textual: - - +--------+--------+ - | $ bash | $ bash | - | | | - | | | /------------\ - +--------+--------+ --> | detach | - | $ vim | $ bash | | 'Ctrl-b b' | - | | | \------------/ - | | | | - +--------+--------+ | - /------------------/ - | - v - +-----------------------+ - | $ [screen detached] | - | | - | | - | | - | | - | | - | | - +-----------------------+ - v - | - v - +-----------------------+ - | $ [screen detached] | - | $ tmux attach | - | | /------------\ - | | --> | attaching | - | | \------------/ - | | | - | | | - +-----------------------+ | - | - /---------------------------/ - | - v - +--------+--------+ - | $ bash | $ bash | - | | | - | | | - +--------+--------+ - | $ vim | $ bash | - | | | - | | | - +--------+--------+ -``` +:::{mermaid} +:caption: Detach, leave everything running, and reattach later. + +flowchart LR + running["session running"] -->|"detach · Prefix d"| detached["screen detached — apps keep running"] + detached -->|"tmux attach"| running +::: ### Manage workflow From 09698c96ca2f84ede1b39ad3e9e701a4f584a0d4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:52:18 -0500 Subject: [PATCH 2958/2998] docs(project): fix stale tooling + changelog format why: contributing documented a make-based workflow, but the repo uses just; its dev-config include paths and screenshot were one directory too shallow and never resolved. releasing showed an outdated rST changelog shape. what: - contributing: make -> just throughout (real recipe names); drop a duplicated clone block and an ownerless todo; fix the tests.yml/.tmuxp.yaml includes and the screenshot path (resolves 3 build warnings); trim tab boilerplate to single commands - releasing: active voice; changelog example uses the current Markdown "## tmuxp X.Y.Z" form and the fixed subheading order --- docs/project/contributing.md | 340 ++++++++--------------------------- docs/project/releasing.md | 46 ++--- 2 files changed, 101 insertions(+), 285 deletions(-) diff --git a/docs/project/contributing.md b/docs/project/contributing.md index cceb9eb61e..446340079b 100644 --- a/docs/project/contributing.md +++ b/docs/project/contributing.md @@ -2,16 +2,9 @@ # Developing and Testing -```{eval-rst} -.. todo:: - link to sliderepl or ipython notebook slides -``` - -Our tests are inside `tests/`. Tests are implemented using -[pytest]. - -`make test` will create a tmux server on a separate `socket_name` -using `$ tmux -L test_case`. +The tests live in `tests/`, written with [pytest]. They run against a real tmux +server on a separate socket (`$ tmux -L test_case`), so they never disturb your +own sessions. [pytest]: http://pytest.org/ @@ -21,7 +14,7 @@ using `$ tmux -L test_case`. ### Get the source -To begin developing, check out the code from github: +Check out the code from GitHub: ```console $ git clone git@github.com:tmux-python/tmuxp.git @@ -33,201 +26,152 @@ $ cd tmuxp ### Bootstrap -The easiest way to configure a dev environment is through [uv]. This -automatically will manage virtualenv and python dependencies for tmuxp. -For information on installing uv visit the [uv's documentation]. - -To begin developing, check out the code from github: +The easiest way to set up a dev environment is with [uv], which manages the +virtualenv and Python dependencies for you. (See [uv's documentation] to install +uv itself.) -```console -$ git clone git@github.com:tmux-python/tmuxp.git -``` - -```console -$ cd tmuxp -``` - -You can create a virtualenv, and install all of the locked -packages as listed in uv.lock: +Create the virtualenv and install everything locked in `uv.lock`: ```console $ uv sync --all-extras --dev ``` -If you ever need to update packages during your development session, the -following command can be used to update all packages as per uv settings: +To refresh those packages later: ```console $ uv sync --all-extras --dev --upgrade ``` -Then before any python command in tty / terminal session, run with: +Then prefix any Python command with `uv run`: ```console $ uv run [command] ``` -That is it! You are now ready to code! +That's it — you're ready to code. [uv]: https://github.com/astral-sh/uv [uv's documentation]: https://docs.astral.sh/uv -### Advanced: Manual virtualenv +### Advanced: manual virtualenv -Now create a virtualenv, if you don't know how to, you can create a -virtualenv with: +Prefer to manage the virtualenv yourself? Create one: ```console $ virtualenv .venv ``` -Then activate it to your current tty / terminal session with: +Activate it in your current shell: ```console $ source .venv/bin/activate ``` -Good! Now let's run this: +Install tmuxp in editable mode, so your edits take effect immediately: ```console $ pip install -e . ``` -This has `pip`, a python package manager install the python package -in the current directory. `-e` means `--editable`, which means you can -adjust the code and the installed software will reflect the changes. - -When you manage dependencies with -[uv](https://docs.astral.sh/uv/getting-started/features/#python-versions), -add the checkout as an editable development dependency instead: +With a uv-managed project, add the checkout as an editable dev dependency +instead: ```console $ uv add --dev --editable . ``` -Prefer a one-off, pipx-style execution while you hack? Call tmuxp via -[uvx](https://docs.astral.sh/uv/guides/tools/): +Prefer a one-off, pipx-style run while you hack? Call tmuxp through [uvx]: ```console $ uvx tmuxp ``` -```console -$ tmuxp -``` +[uvx]: https://docs.astral.sh/uv/guides/tools/ -## Test Runner +## Test runner -[pytest] is used for tests. - -As you've seen above, the `tmuxp` command will now be available to you, -since you are in the virtual environment, your `PATH` environment was -updated to include a special version of `python` inside your `.venv` -folder with its own packages. +[pytest] runs the tests. Inside the virtualenv, the `tmuxp` command and a +project-local `python` are already on your `PATH`. ### Rerun on file change -via [pytest-watcher] (works out of the box): - -```console -$ make start -``` - -via [`entr(1)`] (requires installation): +Watch files and re-run tests on every save, via [pytest-watcher]: ```console -$ make watch_test +$ just start ``` [pytest-watcher]: https://github.com/olzhasar/pytest-watcher -### Manual (just the command, please) +### Manual ```console $ uv run py.test ``` -or: +Or: ```console -$ make test +$ just test ``` ### pytest options -`PYTEST_ADDOPTS` can be set in the commands below. For more -information read [docs.pytest.com] for the latest documentation. +Pass extra arguments through `PYTEST_ADDOPTS`. See the [pytest usage docs] for +everything it accepts. -[docs.pytest.com]: https://docs.pytest.org/ +[pytest usage docs]: https://docs.pytest.org/ Verbose: ```console -$ env PYTEST_ADDOPTS="-verbose" make start +$ env PYTEST_ADDOPTS="--verbose" just start ``` Pick a file: ```console -$ env PYTEST_ADDOPTS="tests/workspace/test_builder.py" uv run make start +$ env PYTEST_ADDOPTS="tests/workspace/test_builder.py" just start ``` -Drop into `test_automatic_rename_option()` in `tests/workspace/test_builder.py`: - -```console -$ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py" \ - uv run make start -``` - -Drop into `test_automatic_rename_option()` in `tests/workspace/test_builder.py` and stop on first error: +Drop into a single test and stop on the first error: ```console $ env PYTEST_ADDOPTS="-s -x -vv tests/workspace/test_builder.py::test_automatic_rename_option" \ - uv run make start + just start ``` -Drop into `pdb` on first error: +Drop into `pdb` on the first error: ```console -$ env PYTEST_ADDOPTS="-x -s --pdb" make start +$ env PYTEST_ADDOPTS="-x -s --pdb" just start ``` -If you have [ipython] installed: +With [ipython] installed: ```console -$ env PYTEST_ADDOPTS="--pdbcls=IPython.terminal.debugger:TerminalPdb" make start +$ env PYTEST_ADDOPTS="--pdbcls=IPython.terminal.debugger:TerminalPdb" just start ``` [ipython]: https://ipython.org/ -```console -$ make test -``` - -You probably didn't see anything but tests scroll by. - -If you found a problem or are trying to write a test, you can file an -[issue on github]. - (test-specific-tests)= ### Manual invocation -Test only a file: +Test a single file: ```console $ py.test tests/test_config.py ``` -will test the `tests/test_config.py` tests. +A single test inside it: ```console $ py.test tests/test_config.py::test_export_json ``` -tests `test_export_json` inside of `tests/test_config.py`. - -Multiple can be separated by spaces: +Several at once, space-separated: ```console $ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json @@ -237,249 +181,117 @@ $ py.test tests/test_{window,pane}.py tests/test_config.py::test_export_json ### Visual testing -You can watch tmux testsuite build sessions visually by keeping a client -open in a separate terminal. - -Create two terminals: - -- Terminal 1: `$ tmux -L test_case` - -- Terminal 2: `$ cd` into the tmuxp project and into the - `virtualenv` if you are using one, see details on installing the dev - version of tmuxp above. Then: - - ```console - $ py.test tests/workspace/test_builder.py - ``` - -Terminal 1 should have flickered and built the session before your eyes. -tmuxp hides this building from normal users. - -### Run tests on save (old method) - -You can re-run tests automatically on file edit. - -:::{note} - -This requires [`entr(1)`]. +You can watch the suite build sessions in real time by keeping a client open in +a second terminal. -::: - -Install [entr]. Packages are available on most Linux and BSD -variants, including Debian, Ubuntu, FreeBSD, OS X. - -To run all tests upon editing any `.py` file: +Terminal 1 — start a server on the test socket: ```console -$ make watch_test +$ tmux -L test_case ``` -You can also re-run a specific test file or any other [py.test usage -argument]: +Terminal 2 — from the tmuxp checkout (and your virtualenv, if you use one), run +the builder tests: ```console -$ make watch_test test=tests/test_config.py +$ py.test tests/workspace/test_builder.py ``` -```console -$ make watch_test test='-x tests/test_config.py tests/test_util.py' -``` +Terminal 1 flickers as sessions build before your eyes — the building tmuxp +normally hides from users. ### Testing options -`RETRY_TIMEOUT_SECONDS` can be toggled if certain workspace builder -tests are being stubborn. +Set `RETRY_TIMEOUT_SECONDS` if certain workspace-builder tests are stubborn on +your machine, e.g. `RETRY_TIMEOUT_SECONDS=10 py.test`. CI runs the same suite: -e.g. `RETRY_TIMEOUT_SECONDS=10 py.test` - -```{literalinclude} ../.github/workflows/tests.yml +```{literalinclude} ../../.github/workflows/tests.yml :language: yaml - ``` ## Documentation -### Rebuild on save - -Rebuild the documentation when an `.md` file is edited: - -```console -$ cd doc -``` - -```console -$ make watch -``` +Rebuild the docs whenever a source file changes: ```console -$ make SPHINXBUILD='uv run sphinx-build' watch +$ just watch-docs ``` (tmuxp-developer-config)= ## tmuxp developer config -```{image} _static/tmuxp-dev-screenshot.png +```{image} /_static/tmuxp-dev-screenshot.png :width: 1030 :height: 605 :align: center :loading: lazy ``` -After you {ref}`install-dev-env`, when inside the tmuxp checkout: +After you {ref}`install-dev-env`, load the project's own workspace from the +checkout root: ```console $ tmuxp load . ``` -this will load the `.tmuxp.yaml` in the root of the project. +This loads the `.tmuxp.yaml` at the project root: -```{literalinclude} ../.tmuxp.yaml +```{literalinclude} ../../.tmuxp.yaml :language: yaml - ``` ## Formatting ### ruff -The project uses [ruff] to handle formatting, sorting imports and linting. - -````{tab} Command - -uv: - -```console -$ uv run ruff -``` - -If you setup manually: - -```console -$ ruff check . -``` - -```` - -````{tab} make - -```console -$ make ruff -``` +The project uses [ruff] for linting, import sorting, and formatting. -```` - -````{tab} Watch +Lint: ```console -$ make watch_ruff +$ just ruff ``` -requires [`entr(1)`]. - -```` - -````{tab} Fix files - -uv: +Autofix what ruff can: ```console -$ uv run ruff check . --fix +$ uv run ruff check . --fix --show-fixes ``` -If you setup manually: - -```console -$ ruff check . --fix -``` - -```` - #### ruff format -[ruff format] is used for formatting. - -````{tab} Command - -uv: +[ruff format] handles formatting: ```console -$ uv run ruff format . +$ just ruff-format ``` -If you setup manually: - -```console -$ ruff format . -``` - -```` - -````{tab} make - -```console -$ make ruff_format -``` - -```` - ### mypy -[mypy] is used for static type checking. - -````{tab} Command - -uv: +[mypy] does static type checking: ```console -$ uv run mypy . +$ just mypy ``` -If you setup manually: +Re-check on change: ```console -$ mypy . +$ just watch-mypy ``` -```` - -````{tab} make - -```console -$ make mypy -``` - -```` - -````{tab} Watch - -```console -$ make watch_mypy -``` - -requires [`entr(1)`]. -```` - (gh-actions)= ## Continuous integration -### Github Actions - -tmuxp uses [github actions] for continuous integration / automatic unit -testing. - -To view the tmux and python versions tested see the [.github/workflows/tests.yml]. -Builds are done on `master` and pull requests and can be viewed on -the [gh build site]. +tmuxp uses [GitHub Actions] for continuous integration. To see the tmux and +Python versions under test, read [.github/workflows/tests.yml]. Builds run on +`master` and on pull requests, and are visible on the [build site]. -[py.test usage argument]: https://pytest.org/latest/usage.html -[entr]: http://entrproject.org/ -[`entr(1)`]: http://entrproject.org/ [ruff]: https://ruff.rs [ruff format]: https://docs.astral.sh/ruff/formatter/ [mypy]: http://mypy-lang.org/ -[github actions]: https://github.com/features/actions -[gh build site]: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests +[GitHub Actions]: https://github.com/features/actions +[build site]: https://github.com/tmux-python/tmuxp/actions?query=workflow%3Atests [.github/workflows/tests.yml]: https://github.com/tmux-python/tmuxp/blob/master/.github/workflows/tests.yml -[issue on github]: https://github.com/tmux-python/tmuxp/issues diff --git a/docs/project/releasing.md b/docs/project/releasing.md index 37b31aa3a7..456a0cd90b 100644 --- a/docs/project/releasing.md +++ b/docs/project/releasing.md @@ -1,50 +1,54 @@ # Releasing -## Release Process +## Release process -Releases are triggered by git tags and published to PyPI via OIDC trusted publishing. +You release tmuxp by tagging a version: pushing a `v` tag triggers a CI +workflow that builds the package and publishes it to PyPI via OIDC trusted +publishing. -1. Update `CHANGES` with the release notes - -2. Bump version in `src/tmuxp/__about__.py` - -3. Commit: +1. Update `CHANGES` with the release notes. +2. Bump the version in `src/tmuxp/__about__.py`. +3. Commit the bump: ```console - $ git commit -m "tmuxp " + $ git commit -m "Tag v" ``` -4. Tag: +4. Tag it: ```console $ git tag v ``` -5. Push: +5. Push the commit and the tag: ```console $ git push && git push --tags ``` -6. CI builds and publishes to PyPI automatically via trusted publishing +6. CI builds and publishes to PyPI automatically. -## Changelog Format +## Changelog format -The `CHANGES` file uses this format: +`CHANGES` is rendered as the changelog page. Each release is a Markdown section +headed by its version and date: ```text -tmuxp () ------------------------- +## tmuxp () -### What's new +### Breaking changes -- Description of feature (#issue) +- Description of the break, with a migration path (#issue) -### Bug fixes +### What's new -- Description of fix (#issue) +- Description of the feature (#issue) -### Breaking changes +### Fixes -- Description of break, migration path (#issue) +- Description of the fix (#issue) ``` + +Subheadings appear in a fixed order when present: `### Breaking changes`, +`### Dependencies`, `### What's new`, `### Fixes`, `### Documentation`, +`### Development`. From c334b4dbfad185c26c1d817bd456a78098d37aa7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 19:54:27 -0500 Subject: [PATCH 2959/2998] docs(README): drop $ prompts, active tagline why: GitHub renders code blocks without prompt-aware copy, so a leading "$ " is copied along with the command and makes it uncopyable. The README is the sole exception to the console $-prefix convention used elsewhere in the docs. what: - drop the leading "$ " prompt from every command block - tagline -> active second person - "triage and code review and the tracker" -> "code-review on the tracker" --- README.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 359ae17202..74befa3c7a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # tmuxp -Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files. Powered by [libtmux](https://github.com/tmux-python/libtmux). +Session manager for tmux. Save and load your tmux sessions through simple configuration files. Powered by [libtmux](https://github.com/tmux-python/libtmux). [![Python Package](https://img.shields.io/pypi/v/tmuxp.svg)](https://pypi.org/project/tmuxp/) [![Docs](https://github.com/tmux-python/tmuxp/workflows/docs/badge.svg)](https://tmuxp.git-pull.com/) @@ -13,7 +13,7 @@ is available on Leanpub and [Amazon Kindle](http://amzn.to/2gPfRhC). Read and browse the book for free [on the web](https://leanpub.com/the-tao-of-tmux/read). -**Have some spare time?** Help us triage and code review and the tracker. See [issue +**Have some spare time?** Help us triage and code-review on the tracker. See [issue #290](https://github.com/tmux-python/tmuxp/discussions/290)! # Installation @@ -21,38 +21,38 @@ web](https://leanpub.com/the-tao-of-tmux/read). pip: ```console -$ pip install --user tmuxp +pip install --user tmuxp ``` If you're managing the project with [uv](https://docs.astral.sh/uv/), add tmuxp as a dependency instead: ```console -$ uv add tmuxp +uv add tmuxp ``` To run tmuxp without installing it globally, similar to `pipx`, invoke it with [uvx](https://docs.astral.sh/uv/guides/tools/): ```console -$ uvx tmuxp +uvx tmuxp ``` Homebrew: ```console -$ brew install tmuxp +brew install tmuxp ``` Debian / ubuntu: ```console -$ sudo apt install tmuxp +sudo apt install tmuxp ``` Nix: ```console -$ [[ -z $(which tmux) ]] && (nix-env -i tmux && nix-env -i tmuxp) || nix-env -i tmuxp +[[ -z $(which tmux) ]] && (nix-env -i tmux && nix-env -i tmuxp) || nix-env -i tmuxp ``` Find the package for your distro on repology: @@ -149,7 +149,7 @@ Load your tmuxp config from anywhere by using the filename, assuming _\~/.config/tmuxp/mysession.yaml_ (or _.json_): ```console -$ tmuxp load mysession +tmuxp load mysession ``` See [author's tmuxp configs](https://github.com/tony/tmuxp-config) and @@ -165,7 +165,7 @@ server, session, and window in [libtmux](https://github.com/tmux-python/libtmux) objects. ```console -$ tmuxp shell +tmuxp shell (Pdb) server @@ -190,10 +190,10 @@ Supports [PEP (including `PYTHONBREAKPOINT`). Also supports direct commands via `-c`: ```console -$ tmuxp shell -c 'print(window.name)' +tmuxp shell -c 'print(window.name)' my_window -$ tmuxp shell -c 'print(window.name.upper())' +tmuxp shell -c 'print(window.name.upper())' MY_WINDOW ``` @@ -220,7 +220,7 @@ You can also load sessions in the background by passing `-d` flag Snapshot your tmux layout, pane paths, and window/session names. ```console -$ tmuxp freeze session-name +tmuxp freeze session-name ``` See more about [freezing @@ -231,7 +231,7 @@ tmux](https://tmuxp.git-pull.com/cli/freeze/) sessions. Convert a session file from yaml to json and vice versa. ```console -$ tmuxp convert filename +tmuxp convert filename ``` This will prompt you for confirmation and shows you the new file that is @@ -240,8 +240,8 @@ going to be written. You can auto confirm the prompt. In this case no preview will be shown. ```console -$ tmuxp convert -y filename -$ tmuxp convert --yes filename +tmuxp convert -y filename +tmuxp convert --yes filename ``` # Plugin System @@ -255,13 +255,13 @@ The `load` command provides a way to log output to a log file for debugging purposes. ```console -$ tmuxp load --log-file . +tmuxp load --log-file . ``` Collect system info to submit with a Github issue: ```console -$ tmuxp debug-info +tmuxp debug-info ------------------ environment: system: Linux From c1083928e01100b3ac68b2eaabf7ffca642ecb79 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 20:04:47 -0500 Subject: [PATCH 2960/2998] docs: make mermaid flowcharts vertical why: Left-to-right flowcharts overflow horizontally and do not scale on narrow or mobile viewports; top-down charts wrap within the doc column. The architecture request-flow stays LR, where the fan-out reads better wide. what: - workflows freeze->edit->load loop: LR -> TD - about_tmux window-switch and detach/reattach flows: LR -> TD --- docs/about_tmux.md | 4 ++-- docs/topics/workflows.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 6e547ffca5..7f06817921 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -105,7 +105,7 @@ tmux supports as many terminals as you want. :::{mermaid} :caption: Switch between the windows in a session. -flowchart LR +flowchart TD w1["window 1 · sys (active)"] -->|"switch-window 2"| w2["window 2 · vim (active)"] ::: @@ -119,7 +119,7 @@ a sandwich, and re-(attach), all applications are still running! :::{mermaid} :caption: Detach, leave everything running, and reattach later. -flowchart LR +flowchart TD running["session running"] -->|"detach · Prefix d"| detached["screen detached — apps keep running"] detached -->|"tmux attach"| running ::: diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md index 491f19f267..182dff80ea 100644 --- a/docs/topics/workflows.md +++ b/docs/topics/workflows.md @@ -31,7 +31,7 @@ you like it, freeze it to capture the layout, then edit and replay it anywhere: :::{mermaid} :caption: Capture a session once, replay it anywhere. -flowchart LR +flowchart TD arrange["arrange tmux by hand"] --> freeze["tmuxp freeze"] freeze --> yaml["workspace.yaml"] yaml --> edit["edit + commit"] From fda994ad6c9e90108c59b939068ccbd0d65a0d70 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 20:17:41 -0500 Subject: [PATCH 2961/2998] docs(internals): link cli and libtmux refs why: The architecture page named tmuxp.cli, tmuxp.cli.cli(), tmuxp.cli._formatter, and the libtmux Server/Session/Window/Pane objects in plain code, so none of them linked, and _formatter had no API page to point at. what: - architecture: link the cli module and entry point, _formatter, and the libtmux objects via {mod}/{func}/{class} roles - add an api/cli/formatter page (eval-rst automodule) and wire it into the toctree, giving {mod}`tmuxp.cli._formatter` a populated target --- docs/internals/api/cli/formatter.md | 8 ++++++++ docs/internals/api/cli/index.md | 1 + docs/internals/architecture.md | 8 ++++---- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 docs/internals/api/cli/formatter.md diff --git a/docs/internals/api/cli/formatter.md b/docs/internals/api/cli/formatter.md new file mode 100644 index 0000000000..7aa37596c5 --- /dev/null +++ b/docs/internals/api/cli/formatter.md @@ -0,0 +1,8 @@ +# tmuxp formatter - `tmuxp.cli._formatter` + +```{eval-rst} +.. automodule:: tmuxp.cli._formatter + :members: + :show-inheritance: + :undoc-members: +``` diff --git a/docs/internals/api/cli/index.md b/docs/internals/api/cli/index.md index 1381fbc90f..851f620586 100644 --- a/docs/internals/api/cli/index.md +++ b/docs/internals/api/cli/index.md @@ -13,6 +13,7 @@ convert debug_info edit freeze +formatter import_config load ls diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 61d0e036ff..86becaa5e5 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -24,9 +24,9 @@ flowchart LR ### CLI Layer (`tmuxp.cli`) The CLI uses Python's `argparse` with a custom formatter ({mod}`tmuxp.cli._formatter`). -Each subcommand lives in its own module under `tmuxp.cli`. +Each subcommand lives in its own module under {mod}`tmuxp.cli`. -The entry point is `tmuxp.cli.cli()`, registered as a console script in `pyproject.toml`. +The entry point is {func}`tmuxp.cli.cli`, registered as a console script in `pyproject.toml`. ### Workspace Layer (`tmuxp.workspace`) @@ -41,5 +41,5 @@ The workspace layer handles configuration lifecycle: tmuxp delegates all tmux operations to [libtmux](https://libtmux.git-pull.com/). The {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` creates -libtmux `Server`, `Session`, `Window`, and `Pane` objects to construct the -requested workspace. +libtmux {class}`~libtmux.Server`, {class}`~libtmux.Session`, {class}`~libtmux.Window`, +and {class}`~libtmux.Pane` objects to construct the requested workspace. From a108017e3d965f33ce7cf49ad84c874d66d9f120 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 20:20:11 -0500 Subject: [PATCH 2962/2998] docs: monospace command nodes in mermaid diagrams why: Command, symbol, and config-key labels read as code, so they should render monospace the way inline code does, matching the workspace-builders diagram's :::cmd nodes. what: - tag command/symbol/key nodes with :::cmd across the workflows, plugins, configuration, load, and architecture diagrams - plugins: drop the inline per-hook timing from the nodes so the symbol nodes stay clean, and move it into the prose below --- docs/cli/load.md | 2 +- docs/configuration/index.md | 6 +++--- docs/internals/architecture.md | 12 ++++++------ docs/topics/plugins.md | 22 ++++++++++++---------- docs/topics/workflows.md | 6 +++--- 5 files changed, 25 insertions(+), 23 deletions(-) diff --git a/docs/cli/load.md b/docs/cli/load.md index f216dc39f7..c0cbfdb8ce 100644 --- a/docs/cli/load.md +++ b/docs/cli/load.md @@ -105,7 +105,7 @@ Or (a)ppend windows in the current active session? :caption: Loading from inside an existing tmux client. flowchart TD - load["tmuxp load (inside tmux)"] --> q{"y / n / a ?"} + load["tmuxp load"]:::cmd --> q{"y / n / a ?"} q -->|yes| switch["build the new session, switch the client to it"] q -->|a| append["append its windows to the current session"] q -->|no| detached["build it detached, stay where you are"] diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 28d08215a3..8cee308410 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -66,12 +66,12 @@ tmuxp will offer to assist when: :caption: A workspace file mirrors tmux's own hierarchy. flowchart TD - session["session_name"] --> w1["window"] + session["session_name"]:::cmd --> w1["window"] session --> w2["window"] w1 --> p1["pane"] w1 --> p2["pane"] - p1 --> c1["shell_command"] - p1 --> c2["shell_command"] + p1 --> c1["shell_command"]:::cmd + p1 --> c2["shell_command"]:::cmd ::: ````{tab} Basics diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 86becaa5e5..90406a33be 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -9,14 +9,14 @@ through one or two workspace modules: flowchart LR cli["tmuxp CLI (argparse)"] - cli -->|load| loader["workspace.loader"] - loader --> builder["workspace.builder"] - builder --> libtmux["libtmux"] - cli -->|freeze| freezer["workspace.freezer"] + cli -->|load| loader["workspace.loader"]:::cmd + loader --> builder["workspace.builder"]:::cmd + builder --> libtmux["libtmux"]:::cmd + cli -->|freeze| freezer["workspace.freezer"]:::cmd freezer --> libtmux - cli -->|convert| reader["_internal.config_reader"] + cli -->|convert| reader["_internal.config_reader"]:::cmd cli -->|shell| interactive["libtmux (interactive)"] - cli -->|"ls / search"| finders["workspace.finders"] + cli -->|"ls / search"| finders["workspace.finders"]:::cmd ::: ## Key Components diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index c2d9280eed..cc964a0d94 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -42,19 +42,21 @@ nothing. The order is fixed: :caption: When each plugin hook fires during `tmuxp load`. flowchart TD - load["tmuxp load"] --> bwb["before_workspace_builder
    session created, no windows yet"] - bwb --> oc["on_window_create
    per window, before its panes"] - oc --> panes["panes and commands run"] - panes --> awf["after_window_finished
    per window, after its panes"] + load["tmuxp load"]:::cmd --> bwb["before_workspace_builder"]:::cmd + bwb --> oc["on_window_create"]:::cmd + oc --> panes["create panes, run commands"] + panes --> awf["after_window_finished"]:::cmd awf -->|more windows| oc - awf -->|all windows built| bs["before_script
    after the build completes"] - bs --> reattach["reattach
    only when re-attaching an existing session"] + awf -->|all windows built| bs["before_script"]:::cmd + bs --> reattach["reattach"]:::cmd ::: -Two of these names can mislead. `before_script` runs _after_ the session is -built — it augments, rather than replaces, the workspace's own `before_script`. -And `reattach` fires only on the path where tmuxp re-attaches you to a session -that already exists. +`before_workspace_builder` runs first, once the session exists but before any +windows. `on_window_create` and `after_window_finished` bracket each window's +panes. Two of the names can mislead: `before_script` runs _after_ the whole +session is built — it augments, rather than replaces, the workspace's own +`before_script` — and `reattach` fires only when tmuxp re-attaches you to a +session that already exists. ## Developing a plugin diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md index 182dff80ea..d47530a842 100644 --- a/docs/topics/workflows.md +++ b/docs/topics/workflows.md @@ -32,10 +32,10 @@ you like it, freeze it to capture the layout, then edit and replay it anywhere: :caption: Capture a session once, replay it anywhere. flowchart TD - arrange["arrange tmux by hand"] --> freeze["tmuxp freeze"] - freeze --> yaml["workspace.yaml"] + arrange["arrange tmux by hand"] --> freeze["tmuxp freeze"]:::cmd + freeze --> yaml["workspace.yaml"]:::cmd yaml --> edit["edit + commit"] - edit --> load["tmuxp load"] + edit --> load["tmuxp load"]:::cmd load --> arrange ::: From 40afe8c4ba3fa66b7145baa16cca6f0c6faae828 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 20:22:28 -0500 Subject: [PATCH 2963/2998] docs(AGENTS): diagram + API-page conventions why: Review surfaced two conventions worth pinning so they are not re-litigated: mermaid command nodes should be monospace and vertical, and API pages need automodule (a bare py:module renders an empty page). what: - add a "Diagrams and reference pages" section: :::cmd + flowchart TD for mermaid; {eval-rst} automodule for API reference pages - add a matching before-you-commit checklist item --- docs/AGENTS.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 16961d0df4..a84054248b 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -68,6 +68,25 @@ by shrinking audience, an honest trade-off on the prompt wait, and precise reference tables left precise. Read it before reshaping another page. +## Diagrams and reference pages + +Two mechanical conventions, separate from voice: + +- **Mermaid diagrams** render to inline SVG at build time (see + `docs/_ext`). Tag any node whose label is a command, code identifier, + config key, or other symbol with `:::cmd` so it renders monospace — + the way that text reads as code inline; leave prose and concept nodes + unstyled. Prefer top-to-bottom (`flowchart TD`); wide left-to-right + charts don't scale on narrow viewports. `docs/configuration/workspace-builders.md` + is the reference. +- **Internal API pages** document a module with an `{eval-rst}` block + wrapping `.. automodule:: ` (with `:members:`), the way the + existing `docs/internals/api/**` pages do. A bare `.. py:module::` + registers a cross-reference target but renders an empty page — reach + for it only to add a *package* target to an index page that already + carries its own content (grids, prose), where `automodule` would + duplicate members documented on the leaf pages. + ## Before you commit - Does the page open with what the feature *is*, or with how to @@ -78,3 +97,5 @@ page. concept instead? - Are the advanced and Python-only parts clearly marked opt-in? - Did you leave every table, error string, and cross-reference exact? +- Are diagram command/symbol nodes tagged `:::cmd`, and is the chart + vertical unless it has a reason to be wide? From e9b2ef7ed145860a6d1905d614e59ae9d2fe2f9c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 29 Jun 2026 20:41:36 -0500 Subject: [PATCH 2964/2998] docs(CHANGES) Concept-first documentation pass --- CHANGES | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 25cc587db1..3c03028899 100644 --- a/CHANGES +++ b/CHANGES @@ -54,6 +54,16 @@ site's light/dark palette and code styling, replacing the old static ASCII art. with a concept-first overview, and {ref}`examples` shows each pane example as a faithful tmux window layout. +#### Concept-first documentation pass (#1072) + +The docs now open with what each feature *is* before its configuration, in a +consistent second-person voice, with advanced and Python-only material marked +opt-in. New diagrams trace the plugin hook lifecycle, the CLI request flow, the +workspace hierarchy, and what `tmuxp load` does inside an existing session, and +more internal API cross-references resolve to their pages. The {ref}`quickstart` +and {ref}`about-tmux` primer also pick up corrected version requirements, +tooling, and commands. + ## tmuxp 1.73.0 (2026-06-28) tmuxp 1.73.0 makes the workspace build step pluggable and tunable. A workspace can now build through a third-party builder selected by registered entry-point name or Python import path, and a new `workspace_builder_options` catalog controls the pane-readiness wait per workspace. The built-in builder stays the default, so existing workspaces keep working — though the new `pane_readiness: auto` default skips the prompt wait on non-zsh shells. See {ref}`custom-workspace-builders` for the guide. From 9ca0b9cf34160fe1dc902ec8ce41ee82662a1857 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 18:27:36 -0500 Subject: [PATCH 2965/2998] Docs(docs[links]): Link API references why: API names in the docs should resolve through Sphinx and intersphinx instead of rendering as inert Markdown links or stale hardcoded URLs. what: - Convert libtmux and Python references to MyST/Sphinx roles - Use libtmux attribute roles for documented properties - Replace selected hardcoded libtmux URLs with intersphinx refs --- docs/cli/shell.md | 4 ++-- docs/configuration/environmental-variables.md | 3 ++- docs/configuration/examples.md | 9 +++++---- docs/configuration/workspace-builders.md | 4 ++-- docs/internals/architecture.md | 2 +- docs/internals/index.md | 2 +- docs/project/code-style.md | 6 ++++-- docs/quickstart.md | 8 ++++---- docs/topics/custom-workspace-builders.md | 6 +++--- docs/topics/library-vs-cli.md | 18 +++++++++--------- 10 files changed, 33 insertions(+), 29 deletions(-) diff --git a/docs/cli/shell.md b/docs/cli/shell.md index ceff183a82..cc7f691814 100644 --- a/docs/cli/shell.md +++ b/docs/cli/shell.md @@ -113,8 +113,8 @@ $ env PYTHONBREAKPOINT=ipdb.set_trace tmuxp shell `tmuxp shell` drops into the richest shell available in your _site packages_. Pick one yourself with a flag: -- `--pdb`: plain `breakpoint()` (python 3.7+) or `pdb.set_trace` -- `--code`: drop into `code.interact`, accepts `--use-pythonrc` +- `--pdb`: plain {func}`breakpoint` (python 3.7+) or {func}`pdb.set_trace` +- `--code`: drop into {func}`code.interact`, accepts `--use-pythonrc` - `--bpython`: drop into bpython - `--ipython`: drop into ipython - `--ptpython`: drop into ptpython, accepts `--use-vi-mode` diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md index 86e54aa1ab..21c7b44b11 100644 --- a/docs/configuration/environmental-variables.md +++ b/docs/configuration/environmental-variables.md @@ -21,7 +21,8 @@ Example: `TMUXP_CONFIGDIR=$HOME/.mytmuxpconfigdir tmuxp load cpython` :::{seealso} -[`LIBTMUX_TMUX_FORMAT_SEPARATOR`](https://libtmux.git-pull.com/api.html#tmux-format-separator) in libtmux API. +{ref}`LIBTMUX_TMUX_FORMAT_SEPARATOR ` +in the libtmux API. ::: diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 98b917f4f4..3fd0df4e9b 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -333,7 +333,7 @@ _Experimental setting_: behavior and api is subject to change until stable. ``` Omit sending {kbd}`enter` to key commands. Equivalent to -[`send_keys(enter=False)`](libtmux.Pane.send_keys). +{meth}`send_keys(enter=False) `. ````{tab} YAML @@ -386,11 +386,12 @@ _Experimental setting_: behavior and api is subject to change until stable. ``` ```{warning} -**Blocking.** This will delay loading as it runs synchronously for each pane as [`asyncio`](asyncio)) is not implemented yet. +**Blocking.** This will delay loading as it runs synchronously for each pane as +{mod}`asyncio` is not implemented yet. ``` Omit sending {kbd}`enter` to key commands. Equivalent to having -a [`time.sleep`](time.sleep) before and after [`send_keys`](libtmux.Pane.send_keys). +a {func}`time.sleep` before and after {meth}`~libtmux.Pane.send_keys`. This is especially useful for expensive commands where the terminal needs some breathing room (virtualenv, poetry, pipenv, uv, sourcing a configuration, launching a tui app, etc). @@ -769,7 +770,7 @@ windows: tmuxp sessions can be scripted in python. The first way is to use the ORM in the {ref}`API`. The second is to pass a {py:obj}`dict` into {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` with a correct schema. -See: {meth}`tmuxp.validation.validate_schema`. +See: {func}`~tmuxp.workspace.validation.validate_schema`. ::: diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index b1b5576bf5..16b4e74a8e 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -78,8 +78,8 @@ When your builder lives outside tmuxp's environment — say, a script sitting in config directory — this tells tmuxp where to find it. Give it a single directory or a list of them. tmuxp expands `~` and environment variables, reads relative entries against the workspace file's own directory, and expects each one to be a directory -that already exists. The paths join `sys.path` only for the import and build, not for -the rest of your session. +that already exists. The paths join {data}`sys.path` only for the import and +build, not for the rest of your session. ```yaml workspace_builder: my_local_builder:CustomBuilder diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 90406a33be..8be7e4900f 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -23,7 +23,7 @@ flowchart LR ### CLI Layer (`tmuxp.cli`) -The CLI uses Python's `argparse` with a custom formatter ({mod}`tmuxp.cli._formatter`). +The CLI uses Python's {mod}`argparse` with a custom formatter ({mod}`tmuxp.cli._formatter`). Each subcommand lives in its own module under {mod}`tmuxp.cli`. The entry point is {func}`tmuxp.cli.cli`, registered as a console script in `pyproject.toml`. diff --git a/docs/internals/index.md b/docs/internals/index.md index 82a8c121c0..7c63fa86d0 100644 --- a/docs/internals/index.md +++ b/docs/internals/index.md @@ -8,7 +8,7 @@ no stability guarantee. Interfaces may change or be removed without notice between any release. If you are building an application with tmuxp, use the [CLI](../cli/index.md) -or refer to the [libtmux API](https://libtmux.git-pull.com/api/). +or refer to the {ref}`libtmux API `. ``` ::::{grid} 1 1 2 2 diff --git a/docs/project/code-style.md b/docs/project/code-style.md index 1ea71dc8c3..e5c86e1e3e 100644 --- a/docs/project/code-style.md +++ b/docs/project/code-style.md @@ -27,6 +27,8 @@ All public functions and methods use NumPy-style docstrings. ## Imports - Standard library: namespace imports (`import pathlib`, not `from pathlib import Path`) - - Exception: `from dataclasses import dataclass, field` -- Typing: `import typing as t`, access via `t.Optional`, `t.NamedTuple`, etc. + - Exception: `from dataclasses import dataclass, field` for + {func}`~dataclasses.dataclass` and {func}`~dataclasses.field` +- Typing: `import typing as t`, access via {data}`t.Optional `, + {class}`t.NamedTuple `, etc. - All files: `from __future__ import annotations` diff --git a/docs/quickstart.md b/docs/quickstart.md index e561b5f735..7af8e902f7 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -171,13 +171,13 @@ Under the hood, tmuxp drives tmux through [abstraction layer] over `tmux(1)`'s commands. Each config concept maps to a libtmux call: -| {ref}`tmuxp python api ` | {term}`tmux(1)` equivalent | +| {ref}`libtmux Python API ` | {term}`tmux(1)` equivalent | | ------------------------------------- | -------------------------- | | {meth}`libtmux.Server.new_session` | `$ tmux new-session` | -| {meth}`libtmux.Server.sessions` | `$ tmux list-sessions` | -| {meth}`libtmux.Session.windows` | `$ tmux list-windows` | +| {attr}`libtmux.Server.sessions` | `$ tmux list-sessions` | +| {attr}`libtmux.Session.windows` | `$ tmux list-windows` | | {meth}`libtmux.Session.new_window` | `$ tmux new-window` | -| {meth}`libtmux.Window.panes` | `$ tmux list-panes` | +| {attr}`libtmux.Window.panes` | `$ tmux list-panes` | | {meth}`libtmux.Window.split` | `$ tmux split-window` | | {meth}`libtmux.Pane.send_keys` | `$ tmux send-keys` | diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md index 18a231d013..402c21d09f 100644 --- a/docs/topics/custom-workspace-builders.md +++ b/docs/topics/custom-workspace-builders.md @@ -67,7 +67,7 @@ When a builder lives outside tmuxp's runtime environment (for example, a script in your config directory), list trusted directories in `workspace_builder_paths`. tmuxp expands `~` and environment variables, resolves relative entries against the workspace file's directory, requires each -entry to be an existing directory, and temporarily prepends them to `sys.path` +entry to be an existing directory, and temporarily prepends them to {data}`sys.path` for the import and build: ```yaml @@ -79,7 +79,7 @@ workspace_builder_paths: :::{warning} A workspace file that names a builder runs that builder's Python code. Only load workspace files you trust. tmuxp deliberately does **not** use -`site.addsitedir()` for these paths — that would execute `.pth` startup files +{func}`site.addsitedir` for these paths — that would execute `.pth` startup files and is broader than making a module importable. ::: @@ -168,7 +168,7 @@ def test_custom_builder(server): builder.session.kill() ``` -For builders that live in a trusted directory, build the `sys.path` sandbox with +For builders that live in a trusted directory, build the {data}`sys.path` sandbox with {func}`~tmuxp.workspace.builder.registry.resolve_builder_paths` and {func}`~tmuxp.workspace.builder.registry.prepended_sys_path`. diff --git a/docs/topics/library-vs-cli.md b/docs/topics/library-vs-cli.md index 2481a91f76..39d2436d9f 100644 --- a/docs/topics/library-vs-cli.md +++ b/docs/topics/library-vs-cli.md @@ -20,7 +20,7 @@ in {ref}`examples`. ## When to Use libtmux -Use [libtmux](https://libtmux.git-pull.com/) directly when: +Use libtmux directly when: - You need **dynamic logic** — conditionals, loops, branching based on state - You want to **read pane output** — capture what's on screen and react to it @@ -44,13 +44,13 @@ How tmuxp config keys map to libtmux API calls: | tmuxp YAML | libtmux equivalent | |------------|-------------------| -| `session_name: foo` | `server.new_session(session_name="foo")` | -| `windows:` | `session.new_window(...)` | -| `panes:` | `window.split(...)` | -| `shell_command:` | `pane.send_keys(...)` | -| `layout: main-vertical` | `window.select_layout("main-vertical")` | -| `start_directory: ~/project` | `session.new_window(start_directory="~/project")` | -| `before_script:` | Run via `subprocess` before building | +| `session_name: foo` | {meth}`server.new_session(session_name="foo") ` | +| `windows:` | {meth}`session.new_window(...) ` | +| `panes:` | {meth}`window.split(...) ` | +| `shell_command:` | {meth}`pane.send_keys(...) ` | +| `layout: main-vertical` | {meth}`window.select_layout("main-vertical") ` | +| `start_directory: ~/project` | {meth}`session.new_window(start_directory="~/project") ` | +| `before_script:` | Run via {mod}`subprocess` before building | ## What the CLI Can't Express @@ -62,4 +62,4 @@ tmuxp configs are static declarations. They can't: - **Orchestrate across servers** — "connect to both local and remote tmux" - **Build layouts dynamically** — "create N panes based on a list of services" -For these, use libtmux directly. See the [libtmux quickstart](https://libtmux.git-pull.com/quickstart.html). +For these, use libtmux directly. See the {ref}`libtmux quickstart `. From e741f8d9f391edbcb1ac71756860c3de8a0c4ee5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 18:34:58 -0500 Subject: [PATCH 2966/2998] Docs(docs[policy]): Require first link why: First-page mentions should lead readers to the relevant API, page, or project instead of relying on later references. what: - Document the first-mention cross-reference rule for docs prose - Clarify when to use API roles, page refs, and Markdown links - Exempt code examples, diagram labels, and literal config values --- docs/AGENTS.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/AGENTS.md b/docs/AGENTS.md index a84054248b..e6c1142552 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -60,6 +60,21 @@ put the link where their interest peaks — on the phrase that made them curious ("write your own") — not as a standalone footnote the eye skips. Use the MyST roles listed in the root `AGENTS.md`. +Link the first prose mention of any symbol that has a useful destination on +that page. This includes Python objects, tmuxp APIs, libtmux APIs, CLI command +pages, topic/configuration pages, and external tools or projects. Use the most +specific target available: `{class}`, `{meth}`, `{func}`, `{mod}`, `{exc}`, or +`{attr}` for API objects; `{ref}` or `{doc}` for documentation pages and +section anchors; and a Markdown link or reference link for external projects. +After the first linked mention on a page, later mentions can stay plain unless +the distance or context makes another link useful. + +Do not rely on a later reference section to satisfy the first-mention rule. If +the first occurrence would be a heading, grid-card teaser, or introductory +sentence, link that occurrence or retitle the heading so the first prose mention +can carry the link. Leave command examples, code blocks, Mermaid node labels, +and literal configuration values as code; link the surrounding prose instead. + ## A page that does this `docs/configuration/workspace-builders.md` is the worked example: From 9f9ffb387b6325f5a5f47ca4561260cfe1601999 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 18:39:21 -0500 Subject: [PATCH 2967/2998] Docs(docs[links]): Link first mentions why: First mentions should send readers to the command, API, page, or external project at the point of discovery. what: - Link first prose mentions of tmuxp commands and config keys - Link libtmux, Python, plugin, importer, and shell backend symbols - Keep command examples and Mermaid labels literal while linking prose --- docs/cli/completion.md | 9 ++++++--- docs/cli/import.md | 6 +++++- docs/cli/recipes.md | 2 +- docs/cli/shell.md | 11 +++++++---- docs/configuration/environmental-variables.md | 2 +- docs/configuration/examples.md | 8 +++++--- docs/glossary.md | 3 ++- docs/internals/api/index.md | 9 +++++---- docs/internals/api/workspace/builder/index.md | 6 +++--- docs/internals/architecture.md | 7 ++++--- docs/project/contributing.md | 6 +++--- docs/project/index.md | 3 ++- docs/quickstart.md | 4 ++-- docs/topics/custom-workspace-builders.md | 16 +++++++++------- docs/topics/index.md | 4 ++-- docs/topics/library-vs-cli.md | 6 ++++-- docs/topics/plugins.md | 4 ++-- docs/topics/troubleshooting.md | 6 ++++-- docs/topics/workflows.md | 3 ++- 19 files changed, 69 insertions(+), 46 deletions(-) diff --git a/docs/cli/completion.md b/docs/cli/completion.md index 756f4921b8..4d52c74938 100644 --- a/docs/cli/completion.md +++ b/docs/cli/completion.md @@ -8,7 +8,7 @@ Shell completion teaches your shell to finish `tmuxp` subcommands and flags when you press Tab. It's optional, and how you set it up depends on your tmuxp -version — 1.17 and newer use shtab, while 1.1 through 1.16 used click. Pick the +version — 1.17 and newer use [shtab], while 1.1 through 1.16 used [click]. Pick the section that matches yours. ## tmuxp 1.17+ (experimental) @@ -17,7 +17,7 @@ section that matches yours. See the [shtab library's documentation on shell completion](https://docs.iterative.ai/shtab/use/#cli-usage) for the most up to date way of connecting completion for tmuxp. ``` -Provisional support for completions in tmuxp 1.17+ are powered by [shtab](https://docs.iterative.ai/shtab/). This must be **installed separately**, as it's **not currently bundled with tmuxp**. +Provisional support for completions in tmuxp 1.17+ are powered by [shtab]. This must be **installed separately**, as it's **not currently bundled with tmuxp**. ```console $ pip install shtab --user @@ -68,7 +68,7 @@ $ shtab --shell=tcsh -u tmuxp.cli.create_parser \ See the [click library's documentation on shell completion](https://click.palletsprojects.com/en/8.0.x/shell-completion/) for the most up to date way of connecting completion for tmuxp. ``` -tmuxp 1.1 to 1.16 use [click](https://click.palletsprojects.com)'s completion: +tmuxp 1.1 to 1.16 use [click]'s completion: :::{tab} Bash @@ -93,3 +93,6 @@ eval "$(_TMUXP_COMPLETE=zsh_source tmuxp)" ``` ::: + +[shtab]: https://docs.iterative.ai/shtab/ +[click]: https://click.palletsprojects.com diff --git a/docs/cli/import.md b/docs/cli/import.md index 1e5d191ff8..6418de3439 100644 --- a/docs/cli/import.md +++ b/docs/cli/import.md @@ -2,7 +2,8 @@ # tmuxp import -Import and convert workspace configurations from other tmux session managers like teamocil and tmuxinator. +Import and convert workspace configurations from other tmux session managers like +[teamocil] and [tmuxinator]. (import-teamocil)= @@ -71,3 +72,6 @@ $ tmuxp import tmuxinator /path/to/file.json ``` ```` + +[teamocil]: https://github.com/remiprev/teamocil +[tmuxinator]: https://github.com/aziz/tmuxinator diff --git a/docs/cli/recipes.md b/docs/cli/recipes.md index 61836e87a7..91ccd02347 100644 --- a/docs/cli/recipes.md +++ b/docs/cli/recipes.md @@ -71,7 +71,7 @@ $ tmuxp debug-info $ tmuxp shell ``` -Access libtmux objects directly: +Access [libtmux](https://libtmux.git-pull.com/) objects directly: ```console $ tmuxp shell --best --command 'print(server.sessions)' diff --git a/docs/cli/shell.md b/docs/cli/shell.md index cc7f691814..42b01bfb84 100644 --- a/docs/cli/shell.md +++ b/docs/cli/shell.md @@ -115,11 +115,14 @@ one yourself with a flag: - `--pdb`: plain {func}`breakpoint` (python 3.7+) or {func}`pdb.set_trace` - `--code`: drop into {func}`code.interact`, accepts `--use-pythonrc` -- `--bpython`: drop into bpython -- `--ipython`: drop into ipython -- `--ptpython`: drop into ptpython, accepts `--use-vi-mode` -- `--ptipython`: drop into ipython + ptpython, accepts `--use-vi-mode` +- `--bpython`: drop into [bpython] +- `--ipython`: drop into [IPython] +- `--ptpython`: drop into [ptpython], accepts `--use-vi-mode` +- `--ptipython`: drop into [IPython] + [ptpython], accepts `--use-vi-mode` [pep 553]: https://www.python.org/dev/peps/pep-0553/ [ipdb]: https://pypi.org/project/ipdb/ [libtmux]: https://libtmux.git-pull.com +[bpython]: https://bpython-interpreter.org/ +[IPython]: https://ipython.org/ +[ptpython]: https://github.com/prompt-toolkit/ptpython diff --git a/docs/configuration/environmental-variables.md b/docs/configuration/environmental-variables.md index 21c7b44b11..0b3f8f6260 100644 --- a/docs/configuration/environmental-variables.md +++ b/docs/configuration/environmental-variables.md @@ -7,7 +7,7 @@ shows you while loading — set from your shell, outside any workspace file. You rarely need them: tmuxp works out of the box. Reach for one when you want to point tmuxp at a different config directory, quiet or reshape the load progress display, or work around a rare tmux quirk. The progress variables each mirror a -`tmuxp load` flag, noted alongside the variable. +{ref}`tmuxp load ` flag, noted alongside the variable. (TMUXP_CONFIGDIR)= diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 3fd0df4e9b..05f07ceb9a 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -393,7 +393,9 @@ _Experimental setting_: behavior and api is subject to change until stable. Omit sending {kbd}`enter` to key commands. Equivalent to having a {func}`time.sleep` before and after {meth}`~libtmux.Pane.send_keys`. -This is especially useful for expensive commands where the terminal needs some breathing room (virtualenv, poetry, pipenv, uv, sourcing a configuration, launching a tui app, etc). +This is especially useful for expensive commands where the terminal needs some +breathing room (virtualenv, [poetry], [pipenv], [uv], sourcing a configuration, +launching a tui app, etc). ````{tab} Virtualenv @@ -689,8 +691,8 @@ before_script: /absolute/path/this.sh # abs path to shell script You can load your software project in tmux by placing a `.tmuxp.yaml` or `.tmuxp.json` in the project's workspace and loading it. -tmuxp supports loading workspace via absolute filename with `tmuxp load` -and via `$ tmuxp load .` if workspace is in the directory. +Use {ref}`tmuxp load ` with an absolute filename, or `$ tmuxp load .` +when the workspace is in the current directory. ```console diff --git a/docs/glossary.md b/docs/glossary.md index 4ad1f3a56e..bac56bd12c 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -14,7 +14,8 @@ tmux(1) layer on top of tmux. ConfigReader - configuration management class, for parsing YAML / JSON / etc. files + The {class}`~tmuxp._internal.config_reader.ConfigReader` configuration + management class, for parsing YAML / JSON / etc. files to and from python data (dictionaries, in the future, potentially dataclasses) diff --git a/docs/internals/api/index.md b/docs/internals/api/index.md index 314e57e9e9..287bd0ba7f 100644 --- a/docs/internals/api/index.md +++ b/docs/internals/api/index.md @@ -4,7 +4,8 @@ This is the internal Python API — the modules tmuxp's CLI is built from, documented for contributors and plugin authors. Everyday use goes through the -{ref}`CLI `; to drive tmux from Python directly, reach for libtmux instead. +{ref}`CLI `; to drive tmux from Python directly, reach for +[libtmux](https://libtmux.git-pull.com/) instead. :::{seealso} See {ref}`libtmux's API ` and {ref}`Quickstart ` to see how you can control @@ -23,13 +24,13 @@ Finding, loading, building, and freezing sessions. :::{grid-item-card} CLI modules :link: cli/index :link-type: doc -The argparse commands behind each subcommand. +The {mod}`argparse` commands behind each subcommand. ::: :::{grid-item-card} Plugin API :link: plugin :link-type: doc -The TmuxpPlugin base class and its hooks. +The {class}`~tmuxp.plugin.TmuxpPlugin` base class and its hooks. ::: :::{grid-item-card} Internal helpers @@ -41,7 +42,7 @@ Config reader, colors, and private path helpers. :::{grid-item-card} Exceptions :link: exc :link-type: doc -The TmuxpException hierarchy. +The {exc}`~tmuxp.exc.TmuxpException` hierarchy. ::: :::{grid-item-card} Logging diff --git a/docs/internals/api/workspace/builder/index.md b/docs/internals/api/workspace/builder/index.md index 723e2abf33..114a511fa9 100644 --- a/docs/internals/api/workspace/builder/index.md +++ b/docs/internals/api/workspace/builder/index.md @@ -8,9 +8,9 @@ {mod}`tmuxp.workspace.builder.classic`; the public contract and the selection machinery live alongside it. -`WorkspaceBuilder` remains importable from `tmuxp.workspace.builder` as a -backwards-compatible alias of -{class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. +{class}`WorkspaceBuilder ` +remains importable from {mod}`tmuxp.workspace.builder` as a backwards-compatible +alias of {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`. ::::{grid} 1 1 2 2 :gutter: 2 2 3 3 diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 8be7e4900f..699f8249d0 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -1,8 +1,9 @@ # Architecture -This page traces how a tmuxp command travels from the CLI down to libtmux, the -library that does the actual tmux work. Each subcommand takes its own short path -through one or two workspace modules: +This page traces how a tmuxp command travels from the CLI down to +[libtmux](https://libtmux.git-pull.com/), the library that does the actual tmux +work. Each subcommand takes its own short path through one or two workspace +modules: :::{mermaid} :caption: How each tmuxp subcommand reaches libtmux. diff --git a/docs/project/contributing.md b/docs/project/contributing.md index 446340079b..49214355bf 100644 --- a/docs/project/contributing.md +++ b/docs/project/contributing.md @@ -243,7 +243,7 @@ This loads the `.tmuxp.yaml` at the project root: ## Formatting -### ruff +### Linting The project uses [ruff] for linting, import sorting, and formatting. @@ -259,7 +259,7 @@ Autofix what ruff can: $ uv run ruff check . --fix --show-fixes ``` -#### ruff format +#### Formatting [ruff format] handles formatting: @@ -267,7 +267,7 @@ $ uv run ruff check . --fix --show-fixes $ just ruff-format ``` -### mypy +### Type checking [mypy] does static type checking: diff --git a/docs/project/index.md b/docs/project/index.md index 2b60711f5c..3c6fb76ec2 100644 --- a/docs/project/index.md +++ b/docs/project/index.md @@ -16,7 +16,8 @@ Development setup, running tests, submitting PRs. :::{grid-item-card} Code Style :link: code-style :link-type: doc -Ruff, mypy, NumPy docstrings, import conventions. +[Ruff](https://ruff.rs), [mypy](https://mypy-lang.org/), NumPy docstrings, +import conventions. ::: :::{grid-item-card} Releasing diff --git a/docs/quickstart.md b/docs/quickstart.md index 7af8e902f7..3698848627 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -4,8 +4,8 @@ tmuxp launches a whole tmux workspace — its windows, panes, and the commands inside them — from a single YAML or JSON file. Install it, write one file, and -`tmuxp load` builds the session and drops you into it. This page takes you from -nothing to a running session. +{ref}`tmuxp load ` builds the session and drops you into it. This page +takes you from nothing to a running session. ## Installation diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md index 402c21d09f..a7a7d5f073 100644 --- a/docs/topics/custom-workspace-builders.md +++ b/docs/topics/custom-workspace-builders.md @@ -2,7 +2,7 @@ # Custom workspace builders -A *workspace builder* turns an expanded workspace ``dict`` into a live tmux +A *workspace builder* turns an expanded workspace {class}`dict` into a live tmux session. tmuxp ships one builder, {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder`, and uses it by default. You can point tmuxp at a different builder, and packagers can @@ -18,10 +18,11 @@ If you only want to set these keys in a workspace file, see ## How a workspace is built -1. `tmuxp load` reads the YAML/JSON file and expands it (shorthand, environment - variables, trickle-down defaults). -2. tmuxp resolves which builder to use from the `workspace_builder` config key - (default: the classic builder). +1. {ref}`tmuxp load ` reads the YAML/JSON file and expands it + (shorthand, environment variables, trickle-down defaults). +2. tmuxp resolves which builder to use from the + {ref}`workspace_builder ` config key (default: the + classic builder). 3. tmuxp constructs the builder with the expanded workspace and a {class}`libtmux.Server`, then calls `.build()`. 4. The builder creates the session, windows, and panes, honoring plugin hooks @@ -65,7 +66,8 @@ mybuilder = "my_tmuxp_builders.builders:CustomBuilder" When a builder lives outside tmuxp's runtime environment (for example, a script in your config directory), list trusted directories in -`workspace_builder_paths`. tmuxp expands `~` and environment variables, +{ref}`workspace_builder_paths `. tmuxp expands `~` +and environment variables, resolves relative entries against the workspace file's directory, requires each entry to be an existing directory, and temporarily prepends them to {data}`sys.path` for the import and build: @@ -125,7 +127,7 @@ later as an additive extension without changing this surface. tmuxp waits for a pane's shell prompt before dispatching layout and commands, which avoids a zsh prompt-redraw artifact. That wait is only needed for zsh, so it is configurable independently of which builder you use, through the -`workspace_builder_options` catalog: +{ref}`workspace_builder_options ` catalog: ```yaml workspace_builder_options: diff --git a/docs/topics/index.md b/docs/topics/index.md index 8dd1d70866..52c8cacb81 100644 --- a/docs/topics/index.md +++ b/docs/topics/index.md @@ -28,7 +28,7 @@ Select or ship a custom builder; tune pane readiness. :::{grid-item-card} Library vs CLI :link: library-vs-cli :link-type: doc -When to use tmuxp CLI vs libtmux directly. +When to use tmuxp CLI vs [libtmux](https://libtmux.git-pull.com/) directly. ::: :::{grid-item-card} Troubleshooting @@ -39,7 +39,7 @@ Common shell, PATH, and tmux issues. :::: -## Compared to tmuxinator / teamocil +## Compared to other session managers tmuxp, [tmuxinator](https://github.com/aziz/tmuxinator), and [teamocil](https://github.com/remiprev/teamocil) all load tmux sessions diff --git a/docs/topics/library-vs-cli.md b/docs/topics/library-vs-cli.md index 39d2436d9f..d0da75531d 100644 --- a/docs/topics/library-vs-cli.md +++ b/docs/topics/library-vs-cli.md @@ -8,7 +8,8 @@ Use `tmuxp` when: - You want **declarative workspace configs** — define your layout in YAML, load it with one command - You're setting up **daily development environments** — same windows, same panes, every time -- You need **CI/CD tmux sessions** — `tmuxp load -d` in a script +- You need **CI/CD tmux sessions** — run {ref}`tmuxp load -d ` in a + script - You prefer **configuration over code** — no Python needed ```console @@ -24,7 +25,8 @@ Use libtmux directly when: - You need **dynamic logic** — conditionals, loops, branching based on state - You want to **read pane output** — capture what's on screen and react to it -- You're **testing** tmux interactions — libtmux provides pytest fixtures +- You're **testing** tmux interactions — libtmux provides + [pytest](https://docs.pytest.org/) fixtures - You need **multi-server orchestration** — manage multiple tmux servers programmatically - The CLI's config format **can't express** what you need diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index cc964a0d94..d683f4fcab 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -36,10 +36,10 @@ your workspace file under `plugins`: A plugin is a class whose methods tmuxp calls at set points while it builds and attaches the session. You override only the hooks you care about; the rest do -nothing. The order is fixed: +nothing. {ref}`tmuxp load ` drives the lifecycle in a fixed order: :::{mermaid} -:caption: When each plugin hook fires during `tmuxp load`. +:caption: When each plugin hook fires. flowchart TD load["tmuxp load"]:::cmd --> bwb["before_workspace_builder"]:::cmd diff --git a/docs/topics/troubleshooting.md b/docs/topics/troubleshooting.md index 7843cde76c..60f231a8f4 100644 --- a/docs/topics/troubleshooting.md +++ b/docs/topics/troubleshooting.md @@ -23,7 +23,8 @@ Minimum required version: tmux 3.2. ## Configuration errors -Use `tmuxp debug-info` to collect system information for bug reports: +Use {ref}`tmuxp debug-info ` to collect system information for +bug reports: ```console $ tmuxp debug-info @@ -32,7 +33,8 @@ $ tmuxp debug-info ## Session already exists If a session with the same name already exists, tmuxp will prompt you. -Use `tmuxp load -d` to load in detached mode alongside existing sessions. +Use {ref}`tmuxp load -d ` to load in detached mode alongside existing +sessions. ## Shell completion not working diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md index d47530a842..68a4e52739 100644 --- a/docs/topics/workflows.md +++ b/docs/topics/workflows.md @@ -3,7 +3,8 @@ tmuxp is small enough to drop into a script, a CI job, or your daily startup routine. This page collects a few patterns — running headless, branching on exit codes, and turning a session you arranged by hand into a reusable file. None of -it is special machinery; it's the same `tmuxp load`, `freeze`, and exit codes you +it is special machinery; it's the same {ref}`tmuxp load `, +{ref}`tmuxp freeze `, and {ref}`exit codes ` you already have. ## CI integration From db743ae0bc6fdd95a4ffcecf26d07999eb00cb67 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 19:25:59 -0500 Subject: [PATCH 2968/2998] Docs(docs[examples]): Match pane previews why: The rendered pane previews should not show `pwd` when the adjacent workspace snippets run other commands. what: - Show `echo hello` in the two-pane preview - Show the log-directory command sequence in the first 3/4-pane preview - Keep the remaining preview panes aligned with their `echo hello` snippets --- docs/configuration/examples.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 05f07ceb9a..36ce35db9e 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -75,9 +75,9 @@ Note `''` counts as an empty carriage return. :size: 30x10 :layout: even-vertical -pwd +echo hello --- -pwd +echo hello ::: ````{tab} YAML @@ -104,11 +104,12 @@ pwd :size: 30x12 :layout: main-horizontal -pwd +cd /var/log +ls -al | grep \.log --- -pwd +echo hello --- -pwd +echo hello ::: ````{tab} YAML @@ -135,13 +136,14 @@ pwd :size: 30x12 :layout: tiled -pwd +cd /var/log +ls -al | grep \.log --- -pwd +echo hello --- -pwd +echo hello --- -pwd +echo hello ::: ````{tab} YAML From 164df2cead747620293e629e97fb845e121ec88e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 19:57:07 -0500 Subject: [PATCH 2969/2998] Docs(docs[links]): Link API docstrings why: Keep docs/ first-mention policy consistent across prose pages and rendered Python API docstrings. what: - Link plugin hook and workspace-builder protocol references - Link external project mentions in contributor docs - Replace stale source docstring references with Sphinx API roles --- docs/configuration/examples.md | 2 +- docs/configuration/workspace-builders.md | 18 +++++++++++------- docs/project/code-style.md | 3 ++- docs/project/index.md | 3 ++- docs/project/releasing.md | 9 ++++++--- docs/quickstart.md | 3 ++- docs/topics/custom-workspace-builders.md | 21 ++++++++++++++------- docs/topics/plugins.md | 18 +++++++++++------- src/tmuxp/cli/load.py | 17 +++++++++-------- src/tmuxp/plugin.py | 5 +++-- src/tmuxp/workspace/builder/classic.py | 12 ++++++------ src/tmuxp/workspace/freezer.py | 4 +++- src/tmuxp/workspace/importers.py | 8 ++++---- src/tmuxp/workspace/loader.py | 2 +- 14 files changed, 75 insertions(+), 50 deletions(-) diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 36ce35db9e..4a0e7bb9e6 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -772,7 +772,7 @@ windows: :::{note} tmuxp sessions can be scripted in python. The first way is to use the -ORM in the {ref}`API`. The second is to pass a {py:obj}`dict` into +ORM in the {ref}`API`. The second is to pass a {class}`dict` into {class}`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` with a correct schema. See: {func}`~tmuxp.workspace.validation.validate_schema`. diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 16b4e74a8e..837338c0e2 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -7,10 +7,12 @@ A *workspace builder* is the part of tmuxp that turns a workspace configuration into a live tmux session — it creates the session, lays out its windows and panes, and runs -their commands. You usually never have to think about it: tmuxp ships with a built-in -*classic* builder, and your YAML or JSON workspace files load through it out of the -box, just as they always have. **Everything on this page is optional; leave a setting -out to fall back to the default.** +their commands. You usually never have to think about it: tmuxp ships with the +built-in +{class}`classic builder `, +and your YAML or JSON workspace files load through it out of the box, just as +they always have. **Everything on this page is optional; leave a setting out to +fall back to the default.** :::{mermaid} :caption: How a workspace file becomes a live tmux session. @@ -31,9 +33,11 @@ before sending its layout and commands — by default only when that shell is zs `pane_readiness` option). Waiting makes a session a little slower to load, but guarantees the workspace is fully prepped before you attach. -You can also send a workspace through a different or custom builder instead of the -classic one, and tune its options the same way. For the braver cases, you can subclass -the classic builder or write your own in Python on top of +You can also send a workspace through a different or custom builder instead of +the classic one, and tune its options the same way. For the braver cases, you +can subclass the +{class}`classic builder ` +or write your own in Python on top of [libtmux](https://libtmux.git-pull.com/) — see {ref}`custom-workspace-builders` for writing, packaging, testing, and the trust boundary that comes with running builder code. diff --git a/docs/project/code-style.md b/docs/project/code-style.md index e5c86e1e3e..8ce7748dbe 100644 --- a/docs/project/code-style.md +++ b/docs/project/code-style.md @@ -22,7 +22,8 @@ $ uv run mypy ## Docstrings -All public functions and methods use NumPy-style docstrings. +All public functions and methods use +[NumPy-style docstrings](https://numpydoc.readthedocs.io/en/latest/format.html). ## Imports diff --git a/docs/project/index.md b/docs/project/index.md index 3c6fb76ec2..f3360dc2e2 100644 --- a/docs/project/index.md +++ b/docs/project/index.md @@ -16,7 +16,8 @@ Development setup, running tests, submitting PRs. :::{grid-item-card} Code Style :link: code-style :link-type: doc -[Ruff](https://ruff.rs), [mypy](https://mypy-lang.org/), NumPy docstrings, +[Ruff](https://ruff.rs), [mypy](https://mypy-lang.org/), +[NumPy-style docstrings](https://numpydoc.readthedocs.io/en/latest/format.html), import conventions. ::: diff --git a/docs/project/releasing.md b/docs/project/releasing.md index 456a0cd90b..9460f03027 100644 --- a/docs/project/releasing.md +++ b/docs/project/releasing.md @@ -3,8 +3,8 @@ ## Release process You release tmuxp by tagging a version: pushing a `v` tag triggers a CI -workflow that builds the package and publishes it to PyPI via OIDC trusted -publishing. +workflow that builds the package and publishes it to [PyPI] via +[OIDC trusted publishing]. 1. Update `CHANGES` with the release notes. 2. Bump the version in `src/tmuxp/__about__.py`. @@ -26,7 +26,7 @@ publishing. $ git push && git push --tags ``` -6. CI builds and publishes to PyPI automatically. +6. CI builds and publishes to [PyPI] automatically. ## Changelog format @@ -52,3 +52,6 @@ headed by its version and date: Subheadings appear in a fixed order when present: `### Breaking changes`, `### Dependencies`, `### What's new`, `### Fixes`, `### Documentation`, `### Development`. + +[PyPI]: https://pypi.org/project/tmuxp/ +[OIDC trusted publishing]: https://docs.pypi.org/trusted-publishers/ diff --git a/docs/quickstart.md b/docs/quickstart.md index 3698848627..f296445e43 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -57,7 +57,7 @@ $ brew install tmuxp ### Developmental releases -New versions of tmuxp are published to PyPI as alpha, beta, or release +New versions of tmuxp are published to [PyPI] as alpha, beta, or release candidates. Their version carries an `a1`, `b1`, or `rc1` suffix — `1.10.0b4` is the fourth beta of `1.10.0`, before general availability. @@ -101,6 +101,7 @@ $ pipx install --suffix=@master 'tmuxp @ git+https://github.com/tmux-python/tmux [pip]: https://pip.pypa.io/en/stable/ [pipx]: https://pypa.github.io/pipx/docs/ +[PyPI]: https://pypi.org/project/tmuxp/ [uv]: https://docs.astral.sh/uv/getting-started/features/#python-versions [uvx]: https://docs.astral.sh/uv/guides/tools/ diff --git a/docs/topics/custom-workspace-builders.md b/docs/topics/custom-workspace-builders.md index a7a7d5f073..4fbb4422b6 100644 --- a/docs/topics/custom-workspace-builders.md +++ b/docs/topics/custom-workspace-builders.md @@ -24,7 +24,8 @@ If you only want to set these keys in a workspace file, see {ref}`workspace_builder ` config key (default: the classic builder). 3. tmuxp constructs the builder with the expanded workspace and a - {class}`libtmux.Server`, then calls `.build()`. + {class}`libtmux.Server`, then calls + {meth}`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol.build`. 4. The builder creates the session, windows, and panes, honoring plugin hooks and progress callbacks. @@ -109,13 +110,19 @@ covers what `tmuxp load` drives: - **Constructor** accepting `session_config`, `server`, and the optional `plugins` list and `on_progress` / `on_before_script` / `on_script_output` / `on_build_event` callbacks. -- **`build(session=None, append=False)`** — create or populate the session; the - `append` path adds windows to an existing session. -- **`session`** — the populated {class}`libtmux.Session`. -- **`session_exists()`** and **`find_current_attached_session()`** — used by the - CLI for attach/append decisions. +- **{meth}`build(session=None, append=False) `** + — create or populate the session; the `append` path adds windows to an + existing session. +- **{attr}`session `** + — the populated {class}`libtmux.Session`. +- **{meth}`session_exists() `** + and + **{meth}`find_current_attached_session() `** + — used by the CLI for attach/append decisions. - **`plugins`** — the list of plugin instances; honor the plugin lifecycle hooks - (`before_workspace_builder`, `on_window_create`, `after_window_finished`). + ({meth}`~tmuxp.plugin.TmuxpPlugin.before_workspace_builder`, + {meth}`~tmuxp.plugin.TmuxpPlugin.on_window_create`, + {meth}`~tmuxp.plugin.TmuxpPlugin.after_window_finished`). - The **`on_*` callbacks** — call them at the documented milestones so the CLI's progress display and `before_script` output stay accurate. diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index d683f4fcab..027e2df44a 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -51,12 +51,15 @@ flowchart TD bs --> reattach["reattach"]:::cmd ::: -`before_workspace_builder` runs first, once the session exists but before any -windows. `on_window_create` and `after_window_finished` bracket each window's -panes. Two of the names can mislead: `before_script` runs _after_ the whole -session is built — it augments, rather than replaces, the workspace's own -`before_script` — and `reattach` fires only when tmuxp re-attaches you to a -session that already exists. +{meth}`~tmuxp.plugin.TmuxpPlugin.before_workspace_builder` runs first, once +the session exists but before any windows. +{meth}`~tmuxp.plugin.TmuxpPlugin.on_window_create` and +{meth}`~tmuxp.plugin.TmuxpPlugin.after_window_finished` bracket each window's +panes. Two of the names can mislead: +{meth}`~tmuxp.plugin.TmuxpPlugin.before_script` runs _after_ the whole session +is built — it augments, rather than replaces, the workspace's own +`before_script` — and {meth}`~tmuxp.plugin.TmuxpPlugin.reattach` fires only +when tmuxp re-attaches you to a session that already exists. ## Developing a plugin @@ -76,7 +79,7 @@ python_module └── pyproject.toml # Python project configuration file ``` -When publishing to PyPI, tmuxp suggests the naming convention +When publishing to [PyPI], tmuxp suggests the naming convention `tmuxp-plugin-{your-plugin-name}` so others can find it. A minimal `pyproject.toml` looks like this: @@ -163,3 +166,4 @@ plugins: ``` [uv]: https://github.com/astral-sh/uv +[PyPI]: https://pypi.org/ diff --git a/src/tmuxp/cli/load.py b/src/tmuxp/cli/load.py index ed85f67d32..8016daacbc 100644 --- a/src/tmuxp/cli/load.py +++ b/src/tmuxp/cli/load.py @@ -206,7 +206,7 @@ def _reattach(builder: WorkspaceBuilderProtocol, colors: Colors | None = None) - Parameters ---------- - builder: :class:`workspace.builder.WorkspaceBuilder` + builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` colors : Colors | None Optional Colors instance for styled output. @@ -246,7 +246,7 @@ def _load_attached( Parameters ---------- - builder: :class:`workspace.builder.WorkspaceBuilder` + builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` detached : bool pre_attach_hook : callable, optional called after build, before attach/switch_client; use to stop the spinner @@ -279,7 +279,7 @@ def _load_detached( Parameters ---------- - builder: :class:`workspace.builder.WorkspaceBuilder` + builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` colors : Colors | None Optional Colors instance for styled output. pre_output_hook : Callable | None @@ -305,7 +305,7 @@ def _load_append_windows_to_current_session( Parameters ---------- - builder: :class:`workspace.builder.WorkspaceBuilder` + builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` """ current_attached_session = builder.find_current_attached_session() builder.build(current_attached_session, append=True) @@ -317,7 +317,7 @@ def _setup_plugins(builder: WorkspaceBuilderProtocol) -> Session: Parameters ---------- - builder: :class:`workspace.builder.WorkspaceBuilder` + builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` """ assert builder.session is not None for plugin in builder.plugins: @@ -510,7 +510,7 @@ def load_workspace( just the object. The prepared workspace and its server object is passed into an instance - of :class:`~tmuxp.workspace.builder.WorkspaceBuilder`. + of :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol`. A sanity check against :meth:`libtmux.common.which` is ran. It will raise an exception if tmux isn't found. @@ -520,8 +520,9 @@ def load_workspace( does not allow appending a workspace / incremental building on top of a current session (pull requests are welcome!). - :meth:`~tmuxp.workspace.builder.build` will build the session in - the background via using tmux's detached state (``-d``). + :meth:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol.build` + will build the session in the background via using tmux's detached state + (``-d``). After the session (workspace) is built, unless the user decided to load the session in the background via ``tmuxp -d`` (which is in the spirit diff --git a/src/tmuxp/plugin.py b/src/tmuxp/plugin.py index fa153c7771..d5a65b8024 100644 --- a/src/tmuxp/plugin.py +++ b/src/tmuxp/plugin.py @@ -275,8 +275,9 @@ def before_script(self, session: Session) -> None: is currently being used for the workspace, it would be cleaner to continue using the script in the ``before_section``. - If changes to the session need to be made prior to - anything being built, please use ``before_workspace_builder`` instead. + If changes to the session need to be made prior to anything being + built, please use + :meth:`~tmuxp.plugin.TmuxpPlugin.before_workspace_builder` instead. Parameters ---------- diff --git a/src/tmuxp/workspace/builder/classic.py b/src/tmuxp/workspace/builder/classic.py index 03d2fba87c..f2749308f1 100644 --- a/src/tmuxp/workspace/builder/classic.py +++ b/src/tmuxp/workspace/builder/classic.py @@ -288,15 +288,15 @@ class ClassicWorkspaceBuilder: pathlib.Path('path/to/config.yaml') ) - 2. :meth:`config.expand` session_config inline shorthand:: + 2. :func:`tmuxp.workspace.loader.expand` session_config inline shorthand:: - from tmuxp import config - session_config = config.expand(session_config) + from tmuxp.workspace import loader + session_config = loader.expand(session_config) - 3. :meth:`config.trickle` passes down default values from session + 3. :func:`tmuxp.workspace.loader.trickle` passes down default values from session -> window -> pane if applicable:: - session_config = config.trickle(session_config) + session_config = loader.trickle(session_config) 4. (You are here) We will create a :class:`libtmux.Session` (a real ``tmux(1)`` session) and iterate through the list of windows, and @@ -430,7 +430,7 @@ def build(self, session: Session | None = None, append: bool = False) -> None: Optionally accepts ``session`` to build with only session object. - Without ``session``, it will use :class:`libmtux.Server` at ``self.server`` + Without ``session``, it will use :class:`libtmux.Server` at ``self.server`` passed in on initialization to create a new Session object. Parameters diff --git a/src/tmuxp/workspace/freezer.py b/src/tmuxp/workspace/freezer.py index 7ec302494f..a1df02c1dc 100644 --- a/src/tmuxp/workspace/freezer.py +++ b/src/tmuxp/workspace/freezer.py @@ -14,7 +14,9 @@ def inline(workspace_dict: dict[str, t.Any]) -> t.Any: - """Return workspace with inlined shorthands. Opposite of :meth:`loader.expand`. + """Return workspace with inlined shorthands. + + Opposite of :func:`~tmuxp.workspace.loader.expand`. Parameters ---------- diff --git a/src/tmuxp/workspace/importers.py b/src/tmuxp/workspace/importers.py index 65184d73a4..3505981ec4 100644 --- a/src/tmuxp/workspace/importers.py +++ b/src/tmuxp/workspace/importers.py @@ -9,9 +9,9 @@ def import_tmuxinator(workspace_dict: dict[str, t.Any]) -> dict[str, t.Any]: - """Return tmuxp workspace from a `tmuxinator`_ yaml workspace. + """Return tmuxp workspace from a `tmuxinator`__ YAML workspace. - .. _tmuxinator: https://github.com/aziz/tmuxinator + __ https://github.com/aziz/tmuxinator Parameters ---------- @@ -114,9 +114,9 @@ def import_tmuxinator(workspace_dict: dict[str, t.Any]) -> dict[str, t.Any]: def import_teamocil(workspace_dict: dict[str, t.Any]) -> dict[str, t.Any]: - """Return tmuxp workspace from a `teamocil`_ yaml workspace. + """Return tmuxp workspace from a `teamocil`__ YAML workspace. - .. _teamocil: https://github.com/remiprev/teamocil + __ https://github.com/remiprev/teamocil Parameters ---------- diff --git a/src/tmuxp/workspace/loader.py b/src/tmuxp/workspace/loader.py index 9efcd05b52..2fc4d64a6b 100644 --- a/src/tmuxp/workspace/loader.py +++ b/src/tmuxp/workspace/loader.py @@ -197,7 +197,7 @@ def trickle(workspace_dict: dict[str, t.Any]) -> dict[str, t.Any]: """Return a dict with "trickled down" / inherited workspace values. This will only work if workspace has been expanded to full form with - :meth:`loader.expand`. + :func:`~tmuxp.workspace.loader.expand`. tmuxp allows certain commands to be default at the session, window level. shell_command_before trickles down and prepends the From 21e0a778cacc1bf8663fd3e19a11683dbda50d5c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 20:35:13 -0500 Subject: [PATCH 2970/2998] Docs(docs[layout]): Fix pane previews why: Compact tmux layout examples could either overflow panes or become unreadably small when commands were squeezed into the SVG preview. what: - Clip command text to pane bounds without rescaling text - Keep tmux layout command text at a fixed readable size - Widen compact example previews to realistic columns - Add focused coverage for compact command rendering --- docs/_ext/tmux_layout.py | 31 +++++++++++++++++++++++++++-- docs/_static/css/gp-tmux-layout.css | 7 +++---- docs/configuration/examples.md | 4 ++-- tests/test_docs_tmux_layout.py | 22 ++++++++++++++++++++ 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/docs/_ext/tmux_layout.py b/docs/_ext/tmux_layout.py index 4ae13c7bba..1f74fc181a 100644 --- a/docs/_ext/tmux_layout.py +++ b/docs/_ext/tmux_layout.py @@ -34,6 +34,7 @@ from __future__ import annotations import html +import itertools import typing as t from docutils import nodes @@ -72,6 +73,7 @@ "tiled", ) _LEXER = BashLexer() +_SVG_IDS = itertools.count(1) class TmuxLayoutError(ValueError): @@ -209,6 +211,15 @@ def _highlight(line: str) -> str: return "".join(spans) +def _clip_id(prefix: str, index: int) -> str: + """Return a clip-path id for one pane in a rendered SVG. + + >>> _clip_id("tmux-layout-1", 0) + 'tmux-layout-1-clip-0' + """ + return f"{prefix}-clip-{index}" + + def _parse_size(size: str) -> tuple[int, int]: """Parse a ``WxH`` screen size. @@ -233,11 +244,25 @@ def render_layout(panes: list[list[str]], layout: str, size: tuple[int, int]) -> w, h = size rects = arrange(layout, len(panes), w, h) vb_w, vb_h = w * _CW, h * _CH + svg_id = f"tmux-layout-{next(_SVG_IDS)}" parts = [ f'', ] + parts.append("") + for index, rect in enumerate(rects): + clip_x = rect.x * _CW + 1 + clip_y = rect.y * _CH + 1 + clip_w = max(rect.w * _CW - 2, 1.0) + clip_h = max(rect.h * _CH - 2, 1.0) + parts.append( + f'' + f'', + ) + parts.append("") # Pane fills first; the window border and single dividers go on top so a # shared edge is one line, not two abutting pane strokes. parts.extend( @@ -263,16 +288,18 @@ def render_layout(panes: list[list[str]], layout: str, size: tuple[int, int]) -> # Pygments colours come from furo's own `.highlight` rules (theme-matched, # light/dark) via `fill: currentColor`; a ignores its background. parts.append('') - for rect, commands in zip(rects, panes, strict=True): + for index, (rect, commands) in enumerate(zip(rects, panes, strict=True)): tx = rect.x * _CW + _PAD baseline = rect.y * _CH + _PAD + _FONT + clip_path = _clip_id(svg_id, index) for i, line in enumerate(commands): body = _highlight(line) if not body: continue ty = baseline + i * _LINE_H parts.append( - f'{_PROMPT}{body}', ) parts.append("") diff --git a/docs/_static/css/gp-tmux-layout.css b/docs/_static/css/gp-tmux-layout.css index 8718724809..8ed400bfeb 100644 --- a/docs/_static/css/gp-tmux-layout.css +++ b/docs/_static/css/gp-tmux-layout.css @@ -8,9 +8,8 @@ * wrapped in , so `.highlight .nb`, `.highlight .gp` * (the prompt), etc. apply, and SVG takes its colour from `color` via * `fill: currentColor` — so the panes match the site's console blocks exactly, - * font and colours, in both light and dark. The viewBox is in pixels (one tmux - * cell = _CW x _CH), so at intrinsic size the text renders at the code font - * size. + * colours in both light and dark. The SVG itself owns the command text size + * because compact tiled panes need predictable cell math. */ .gp-tmux-layout-wrapper { @@ -58,7 +57,7 @@ body[data-theme="dark"] .gp-tmux-layout .pane { .gp-tmux-layout text { font-family: var(--font-stack--monospace, "SFMono-Regular", Menlo, monospace); - font-size: var(--code-font-size, 0.8125rem); + font-size: 12px; /* Match the site's code blocks (pre): even monospace advance, no kerning. */ font-kerning: none; text-rendering: optimizeSpeed; diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 4a0e7bb9e6..bc3f085e47 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -101,7 +101,7 @@ echo hello ## 3 panes :::{tmux-layout} -:size: 30x12 +:size: 44x12 :layout: main-horizontal cd /var/log @@ -133,7 +133,7 @@ echo hello ## 4 panes :::{tmux-layout} -:size: 30x12 +:size: 44x12 :layout: tiled cd /var/log diff --git a/tests/test_docs_tmux_layout.py b/tests/test_docs_tmux_layout.py index d787eae874..b5f1b6b0d2 100644 --- a/tests/test_docs_tmux_layout.py +++ b/tests/test_docs_tmux_layout.py @@ -175,6 +175,28 @@ def test_render_layout_structure() -> None: assert svg.endswith("") +def test_render_layout_clips_compact_pane_text_without_rescaling() -> None: + """Compact panes clip long text instead of shrinking the whole command.""" + svg = tl.render_layout( + [ + ["cd /var/log", "ls -al | grep \\.log"], + ["echo hello"], + ["echo hello"], + ["echo hello"], + ], + "tiled", + (30, 12), + ) + assert "ls<" in svg + assert ">grep<" in svg + assert "\\.log" in svg + + def test_setup_registers_components() -> None: """``setup`` registers the node, directive, css, and is parallel-safe.""" recorded: dict[str, list[t.Any]] = {"nodes": [], "directives": [], "css": []} From 085f9d93d05799c1fe8452bb535bc810aa1788ef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 30 Jun 2026 20:36:46 -0500 Subject: [PATCH 2971/2998] Docs(docs[links]): Disambiguate API refs why: Source docstrings still had ambiguous or stale Sphinx roles that violated the first-mention link policy and produced avoidable docs warnings. what: - Fully qualify Colors, ColorMode, loader, logging, and builder references - Fix function/class role mismatches in source docstrings - Exclude the ColorMode compatibility re-export from cli utils indexing --- docs/internals/api/cli/utils.md | 1 + src/tmuxp/cli/_formatter.py | 9 +++--- src/tmuxp/cli/_progress.py | 6 ++-- src/tmuxp/cli/debug_info.py | 2 +- src/tmuxp/cli/import_config.py | 4 +-- src/tmuxp/cli/load.py | 39 ++++++++++++++------------ src/tmuxp/cli/ls.py | 8 +++--- src/tmuxp/cli/search.py | 4 +-- src/tmuxp/cli/utils.py | 13 +++++++-- src/tmuxp/exc.py | 4 +-- src/tmuxp/log.py | 10 +++---- src/tmuxp/workspace/builder/classic.py | 6 ++-- src/tmuxp/workspace/loader.py | 5 ++-- src/tmuxp/workspace/options.py | 6 ++-- 14 files changed, 67 insertions(+), 50 deletions(-) diff --git a/docs/internals/api/cli/utils.md b/docs/internals/api/cli/utils.md index 4556dcf534..7a110a570c 100644 --- a/docs/internals/api/cli/utils.md +++ b/docs/internals/api/cli/utils.md @@ -3,6 +3,7 @@ ```{eval-rst} .. automodule:: tmuxp.cli.utils :members: + :exclude-members: ColorMode :show-inheritance: :undoc-members: ``` diff --git a/src/tmuxp/cli/_formatter.py b/src/tmuxp/cli/_formatter.py index d4efb9ff47..2296c37bf5 100644 --- a/src/tmuxp/cli/_formatter.py +++ b/src/tmuxp/cli/_formatter.py @@ -269,11 +269,11 @@ class HelpTheme(t.NamedTuple): @classmethod def from_colors(cls, colors: t.Any) -> HelpTheme: - """Create theme from Colors instance. + """Create theme from a :class:`~tmuxp._internal.colors.Colors` instance. Parameters ---------- - colors : Colors | None + colors : :class:`~tmuxp._internal.colors.Colors` | None Colors instance, or None for no colors. Returns @@ -328,8 +328,9 @@ def create_themed_formatter( Parameters ---------- - colors : Colors | None - Colors instance for styling. If None, uses ColorMode.AUTO. + colors : :class:`~tmuxp._internal.colors.Colors` | None + Colors instance for styling. If None, uses + :attr:`~tmuxp._internal.colors.ColorMode.AUTO`. Returns ------- diff --git a/src/tmuxp/cli/_progress.py b/src/tmuxp/cli/_progress.py index 01d31d7272..b2783f3ff7 100644 --- a/src/tmuxp/cli/_progress.py +++ b/src/tmuxp/cli/_progress.py @@ -17,7 +17,7 @@ import time import typing as t -from ._colors import ANSI_SEQ_RE, ColorMode, Colors, strip_ansi +from tmuxp._internal.colors import ANSI_SEQ_RE, ColorMode, Colors, strip_ansi logger = logging.getLogger(__name__) @@ -490,7 +490,7 @@ def render(self, colors: Colors, width: int) -> list[str]: Parameters ---------- - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Colors instance for ANSI styling. width : int Terminal width; window lines are truncated to ``width - 1``. @@ -731,7 +731,7 @@ def __init__( ---------- message : str Text displayed next to the spinner animation. - color_mode : ColorMode + color_mode : :class:`~tmuxp._internal.colors.ColorMode` ANSI color mode for styled output. stream : t.TextIO Output stream (default ``sys.stderr``). diff --git a/src/tmuxp/cli/debug_info.py b/src/tmuxp/cli/debug_info.py index 8a69f81bdd..5454294462 100644 --- a/src/tmuxp/cli/debug_info.py +++ b/src/tmuxp/cli/debug_info.py @@ -155,7 +155,7 @@ def _format_human_output(data: dict[str, t.Any], colors: Colors) -> str: ---------- data : dict[str, Any] Debug information dictionary. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager for formatting. Returns diff --git a/src/tmuxp/cli/import_config.py b/src/tmuxp/cli/import_config.py index df49c221ba..84446adddd 100644 --- a/src/tmuxp/cli/import_config.py +++ b/src/tmuxp/cli/import_config.py @@ -58,7 +58,7 @@ def get_tmuxinator_dir() -> pathlib.Path: See Also -------- - :meth:`tmuxp.workspace.importers.import_tmuxinator` + :func:`tmuxp.workspace.importers.import_tmuxinator` """ if "TMUXINATOR_CONFIG" in os.environ: return pathlib.Path(os.environ["TMUXINATOR_CONFIG"]).expanduser() @@ -76,7 +76,7 @@ def get_teamocil_dir() -> pathlib.Path: See Also -------- - :meth:`tmuxp.workspace.importers.import_teamocil` + :func:`tmuxp.workspace.importers.import_teamocil` """ return pathlib.Path("~/.teamocil/").expanduser() diff --git a/src/tmuxp/cli/load.py b/src/tmuxp/cli/load.py index 8016daacbc..a9faf89bce 100644 --- a/src/tmuxp/cli/load.py +++ b/src/tmuxp/cli/load.py @@ -129,8 +129,9 @@ def load_plugins( ---------- session_config : dict Session configuration dictionary. - colors : Colors | None - Colors instance for output formatting. If None, uses AUTO mode. + colors : :class:`~tmuxp._internal.colors.Colors` | None + Colors instance for output formatting. If None, uses + :attr:`~tmuxp._internal.colors.ColorMode.AUTO`. Returns ------- @@ -207,7 +208,7 @@ def _reattach(builder: WorkspaceBuilderProtocol, colors: Colors | None = None) - Parameters ---------- builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` - colors : Colors | None + colors : :class:`~tmuxp._internal.colors.Colors` | None Optional Colors instance for styled output. Notes @@ -280,7 +281,7 @@ def _load_detached( Parameters ---------- builder: :class:`~tmuxp.workspace.builder.protocol.WorkspaceBuilderProtocol` - colors : Colors | None + colors : :class:`~tmuxp._internal.colors.Colors` | None Optional Colors instance for styled output. pre_output_hook : Callable | None Called after build but before printing, e.g. to stop a spinner. @@ -352,7 +353,7 @@ def _dispatch_build( Append windows to the current session. answer_yes : bool Skip interactive prompts. - cli_colors : Colors + cli_colors : :class:`~tmuxp._internal.colors.Colors` Colors instance for styled output. pre_attach_hook : callable, optional Called before attach/switch_client (e.g. stop spinner). @@ -480,8 +481,9 @@ def load_workspace( append : bool Assume current when given prompt to append windows in same session. Default False. - cli_colors : Colors, optional - Colors instance for CLI output formatting. If None, uses AUTO mode. + cli_colors : :class:`~tmuxp._internal.colors.Colors`, optional + Colors instance for CLI output formatting. If None, uses + :attr:`~tmuxp._internal.colors.ColorMode.AUTO`. progress_format : str, optional Spinner format preset name or custom format string with tokens. panel_lines : int, optional @@ -494,17 +496,18 @@ def load_workspace( Notes ----- - tmuxp will check and load a workspace file. The file will use ConfigReader - to load a JSON/YAML into a :py:obj:`dict`. Then :func:`loader.expand` and - :func:`loader.trickle` will be used to expand any shorthands, template - variables, or file paths relative to where the config/script is executed - from. - - :func:`loader.expand` accepts the directory of the config file, so the - user's workspace can resolve absolute paths relative to where the - workspace file is. In otherwords, if a workspace file at */var/moo/hi.yaml* - has *./* in its workspaces, we want to be sure any file path with *./* is - relative to */var/moo*, not the user's PWD. + tmuxp will check and load a workspace file. The file will use + :class:`~tmuxp._internal.config_reader.ConfigReader` to load a JSON/YAML + into a :class:`dict`. Then :func:`~tmuxp.workspace.loader.expand` and + :func:`~tmuxp.workspace.loader.trickle` will be used to expand any + shorthands, template variables, or file paths relative to where the + config/script is executed from. + + :func:`~tmuxp.workspace.loader.expand` accepts the directory of the config + file, so the user's workspace can resolve absolute paths relative to where + the workspace file is. In otherwords, if a workspace file at + */var/moo/hi.yaml* has *./* in its workspaces, we want to be sure any file + path with *./* is relative to */var/moo*, not the user's PWD. A :class:`libtmux.Server` object is created. No tmux server is started yet, just the object. diff --git a/src/tmuxp/cli/ls.py b/src/tmuxp/cli/ls.py index cd1ff5da75..9b293d5eca 100644 --- a/src/tmuxp/cli/ls.py +++ b/src/tmuxp/cli/ls.py @@ -262,7 +262,7 @@ def _render_config_tree(config: dict[str, t.Any], colors: Colors) -> list[str]: ---------- config : dict[str, Any] Parsed config content. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager. Returns @@ -347,7 +347,7 @@ def _render_global_workspace_dirs( ---------- formatter : OutputFormatter Output formatter. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager. global_dir_candidates : list[dict[str, Any]] List of global workspace directory candidates with metadata. @@ -414,7 +414,7 @@ def _output_flat( Workspaces to display. formatter : OutputFormatter Output formatter. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager. full : bool If True, show full config details in tree format. Default False. @@ -495,7 +495,7 @@ def _output_tree( Workspaces to display. formatter : OutputFormatter Output formatter. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager. full : bool If True, show full config details in tree format. Default False. diff --git a/src/tmuxp/cli/search.py b/src/tmuxp/cli/search.py index 3be4cb1974..cd1eb37bd7 100644 --- a/src/tmuxp/cli/search.py +++ b/src/tmuxp/cli/search.py @@ -875,7 +875,7 @@ def highlight_matches( Text to search and highlight. patterns : list[SearchPattern] Compiled search patterns (uses their regex attribute). - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager for highlighting. Returns @@ -959,7 +959,7 @@ def _output_search_results( Patterns used for highlighting. formatter : OutputFormatter Output formatter for JSON/NDJSON/human modes. - colors : Colors + colors : :class:`~tmuxp._internal.colors.Colors` Color manager. """ if not results: diff --git a/src/tmuxp/cli/utils.py b/src/tmuxp/cli/utils.py index 034c98b2ed..5429b7867e 100644 --- a/src/tmuxp/cli/utils.py +++ b/src/tmuxp/cli/utils.py @@ -61,8 +61,17 @@ def prompt( See Also -------- - :meth:`~prompt`, :meth:`~prompt_bool` and :meth:`~prompt_choices` are from - `flask-script `_. See the + prompt_bool + Prompt for a boolean response. + prompt_choices + Prompt for a value from a fixed choice list. + prompt_yes_no + Prompt for a yes/no response. + + Notes + ----- + The prompt helpers are adapted from + `flask-script `_; see the `flask-script license `_. """ colors = Colors(color_mode if color_mode is not None else ColorMode.AUTO) diff --git a/src/tmuxp/exc.py b/src/tmuxp/exc.py index 8e76e531d5..5168aa10d0 100644 --- a/src/tmuxp/exc.py +++ b/src/tmuxp/exc.py @@ -221,8 +221,8 @@ def __init__(self, *args: object, **kwargs: object) -> None: class BeforeLoadScriptError(Exception): """Shell script execution error. - Replaces :py:class:`subprocess.CalledProcessError` for - :meth:`tmuxp.util.run_before_script`. + Replaces :class:`subprocess.CalledProcessError` for + :func:`tmuxp.util.run_before_script`. """ def __init__( diff --git a/src/tmuxp/log.py b/src/tmuxp/log.py index d4b9684957..d4867f052a 100644 --- a/src/tmuxp/log.py +++ b/src/tmuxp/log.py @@ -67,7 +67,7 @@ def setup_logger( Parameters ---------- - logger : :py:class:`Logger` + logger : :class:`logging.Logger` logger instance for tmuxp """ if not logger: # if no logger exists, make one @@ -113,8 +113,8 @@ def template( Parameters ---------- - record : :py:class:`logging.LogRecord` - Object passed from :py:meth:`logging.Formatter.format`. + record : :class:`logging.LogRecord` + Object passed from :meth:`logging.Formatter.format`. Returns ------- @@ -183,8 +183,8 @@ def debug_log_template( Parameters ---------- - record : :py:class:`logging.LogRecord` - Object passed from :py:meth:`logging.Formatter.format`. + record : :class:`logging.LogRecord` + Object passed from :meth:`logging.Formatter.format`. Returns ------- diff --git a/src/tmuxp/workspace/builder/classic.py b/src/tmuxp/workspace/builder/classic.py index f2749308f1..c465eb29e4 100644 --- a/src/tmuxp/workspace/builder/classic.py +++ b/src/tmuxp/workspace/builder/classic.py @@ -1,4 +1,4 @@ -"""Create a tmux workspace from a workspace :py:obj:`dict`.""" +"""Create a tmux workspace from a workspace :class:`dict`.""" from __future__ import annotations @@ -108,7 +108,7 @@ def get_default_rows() -> int: class ClassicWorkspaceBuilder: - """Load workspace from workspace :py:obj:`dict` object. + """Load workspace from workspace :class:`dict` object. Build tmux workspace from a configuration. Creates and names windows, sets options, splits windows into panes. @@ -336,7 +336,7 @@ def __init__( Parameters ---------- session_config : dict - session config, includes a :py:obj:`list` of ``windows``. + session config, includes a :class:`list` of ``windows``. plugins : list plugins to be used for this session diff --git a/src/tmuxp/workspace/loader.py b/src/tmuxp/workspace/loader.py index 2fc4d64a6b..b022a4da21 100644 --- a/src/tmuxp/workspace/loader.py +++ b/src/tmuxp/workspace/loader.py @@ -72,8 +72,9 @@ def expand( ) -> dict[str, t.Any]: """Resolve workspace variables and expand shorthand style / inline properties. - This is necessary to keep the code in the :class:`WorkspaceBuilder` clean - and also allow for neat, short-hand "sugarified" syntax. + This is necessary to keep the code in + :class:`~tmuxp.workspace.builder.classic.ClassicWorkspaceBuilder` clean and + also allow for neat, short-hand "sugarified" syntax. As a simple example, internally, tmuxp expects that workspace options like ``shell_command`` are a list (array):: diff --git a/src/tmuxp/workspace/options.py b/src/tmuxp/workspace/options.py index cc2fad0401..37fa90244f 100644 --- a/src/tmuxp/workspace/options.py +++ b/src/tmuxp/workspace/options.py @@ -34,7 +34,8 @@ class PaneReadiness(enum.Enum): tmuxp waits for each default-shell pane to draw its prompt before dispatching layout and commands, which avoids a zsh prompt-redraw artifact (see :func:`tmuxp.workspace.builder.classic._wait_for_pane_ready`). The wait - is only needed for zsh, so the default :attr:`AUTO` policy waits only when + is only needed for zsh, so the default + :attr:`~tmuxp.workspace.options.PaneReadiness.AUTO` policy waits only when the session's interactive shell is zsh. """ @@ -53,7 +54,8 @@ def from_config(cls, value: t.Any) -> PaneReadiness: ---------- value : Any value from ``workspace_builder_options.pane_readiness``; ``None`` - (key absent) resolves to :attr:`AUTO` + (key absent) resolves to + :attr:`~tmuxp.workspace.options.PaneReadiness.AUTO` Returns ------- From 27b16b43f1d2a7d11b30550257a9bce89e442b33 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 3 Jul 2026 18:03:22 -0500 Subject: [PATCH 2972/2998] py(deps[dev]) Bump dev packages --- uv.lock | 237 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 120 insertions(+), 117 deletions(-) diff --git a/uv.lock b/uv.lock index 11ede46c19..ad25ab41f1 100644 --- a/uv.lock +++ b/uv.lock @@ -77,42 +77,43 @@ wheels = [ [[package]] name = "ast-serialize" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, - { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, - { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, - { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, - { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, - { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, - { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, - { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, - { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, - { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, - { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, - { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, - { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, - { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, - { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, - { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, - { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, - { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, - { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, - { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, - { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, - { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, - { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, - { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, - { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/ad/0d70a3a2d6e01968d985415259e8ec7ad3f777903f9b1c1f3c8c44642c60/ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe", size = 61489, upload-time = "2026-06-30T20:02:55.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/12/3e5f575f156555547c250a8b0d1347517a3a20fc7f4492e9703a69d4f45e/ast_serialize-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a7520b672827885bafeae7501f684d14d47d17e5f45256f9df547686cca52264", size = 1177640, upload-time = "2026-06-30T20:02:06.708Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a4/921a9e27951627983b0f368859ea00f8330a551dc0bf4c2fdcb11855a98b/ast_serialize-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a14191beec7e0c078d2fc1f6edc0aee88bcd4db9f18e1bc9f8052b559c22dddc", size = 1168111, upload-time = "2026-06-30T20:02:08.366Z" }, + { url = "https://files.pythonhosted.org/packages/00/69/950cf404de7b8782cf95e5c1237e25e2aa46177b287f39f9eeddf481fd6f/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32ef62ec34cf6be20ad77d4799556638fbdf187f3ae10698dfb20ef9f2c89516", size = 1227656, upload-time = "2026-06-30T20:02:09.843Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a8/46f8f6a6479d9d2273980957bb091a506c55f5b95d3c029ee58518a78407/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13b7769970a39983b0adf2f38917b1cd3b8946f76df045756c3d741bc689f089", size = 1227706, upload-time = "2026-06-30T20:02:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/9ac415bda0a40e49eab8fea3b2741c19c98bb84d57d62c4cfc6230eb67be/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f7a408601bb3edaefb3bc67a4c01f5235e3253653b6a5729a2ee2382b35341c", size = 1431705, upload-time = "2026-06-30T20:02:12.737Z" }, + { url = "https://files.pythonhosted.org/packages/e5/06/8807115d441444879f7561b5eede5ac18fc80392f11826d61ccf31f503b1/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8670bfa51208a2c0c8d138928e40e998fab158f9200d53bb80c088b5b8eda7b8", size = 1249533, upload-time = "2026-06-30T20:02:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c0/c2ba82ef9618650357d9421a1fdb27ffec862a7f57e8e2de82a3ccd11e12/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4826809eb8597a8cd59fd924b6d7c285b8969a1e0007e2cb652cab62376270f", size = 1252619, upload-time = "2026-06-30T20:02:16.219Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a7/fa31d52dd4102cede29fb9634e98d214129b2783b4f95528c6dc6a8f6587/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:577a6c189068686869f5f1ddc38363f3ae1808a4753b577266f9202071a7bb66", size = 1242983, upload-time = "2026-06-30T20:02:17.813Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/ddf742b5ad3c4bafd3466f2265037cfd99bc1b9a5ee46a5d58c90d523242/ast_serialize-0.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085de7f62dc9cc247eb01e965a362707d1d90b1d89a82c5bf78301a60a3c417b", size = 1296148, upload-time = "2026-06-30T20:02:19.146Z" }, + { url = "https://files.pythonhosted.org/packages/24/cb/9f6f217cce8b3b632c5568b478d195a35e79dce4dbe309438cb89ba6ea4f/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9f8a8b78b13173de6a9ec22111d9be674874cd5bdccda04f14ae5ebc2bef403a", size = 1403826, upload-time = "2026-06-30T20:02:20.696Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f8/9d16d4f0107a183924425cc0e7618d8bf76f96b45afa9ff19f924ed1ad57/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f2ff3baffc3a29c1f15bc9098aa0c09763410262d5e6cef42116f7356c184554", size = 1502943, upload-time = "2026-06-30T20:02:22.034Z" }, + { url = "https://files.pythonhosted.org/packages/80/dd/bbc1c38756350dddf7e24acae1c9482ef42051c267417e019aecc1ed4075/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0067b25fce104eaae5b88383de9ab803faeb671831e14ca698b771b356e2600f", size = 1497632, upload-time = "2026-06-30T20:02:23.517Z" }, + { url = "https://files.pythonhosted.org/packages/42/7e/9daffefcf5b97e6bb4c3e0b3c024c1aee9722f23d3cf7cd2ff80d6fb4a40/ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c617417f9cbb0cb144f6283c3cbe0d2e0f01beaf9f608f662b21191058a626ec", size = 1448858, upload-time = "2026-06-30T20:02:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1f/f9baaab81a677ea0af7d2458cac2f94ebcc85958f8a3c15ba9d9e5dab653/ast_serialize-0.6.0-cp314-cp314t-win32.whl", hash = "sha256:5337cb256dcea3df9288205213d1601581536526b8f4da44b6974f1180f3252a", size = 1052600, upload-time = "2026-06-30T20:02:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1f/41b535866519512d8cf6669cb2cff7823b7672bb6279c0333b4ff89d7d9f/ast_serialize-0.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d947e45cafc4b09bd7528917fa84c517654a43de173c79785574b7b3068ac24", size = 1095570, upload-time = "2026-06-30T20:02:27.639Z" }, + { url = "https://files.pythonhosted.org/packages/50/64/e472fe3e3a2d33d874b987e8518aedf24562919e3b6161a4fa1797e89c0f/ast_serialize-0.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6e15ec740436e1a0d62de848641abe5f3a2f89a7f94907d534795ac91bbacf14", size = 1067267, upload-time = "2026-06-30T20:02:28.949Z" }, + { url = "https://files.pythonhosted.org/packages/52/19/ac8348ae8711c9b5ae834634f635780cab62a0f5e6f988882e048b89c2ae/ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596", size = 1185367, upload-time = "2026-06-30T20:02:30.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad", size = 1178657, upload-time = "2026-06-30T20:02:31.964Z" }, + { url = "https://files.pythonhosted.org/packages/6f/02/613a7534a41d0122f37d1e0c64aa8ac78bfb831f8c92f6db057a311abb3c/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a", size = 1238620, upload-time = "2026-06-30T20:02:33.664Z" }, + { url = "https://files.pythonhosted.org/packages/4d/21/087957bba486242afc52f49b2d9e21c9dad00289356cf9efe67084015a9d/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081", size = 1236075, upload-time = "2026-06-30T20:02:34.936Z" }, + { url = "https://files.pythonhosted.org/packages/82/04/78128bbb170071c2c72a210a181f1c00e11cc1cec60a8beef747b07f9201/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77", size = 1441348, upload-time = "2026-06-30T20:02:36.245Z" }, + { url = "https://files.pythonhosted.org/packages/64/64/62fb99d6faf199b4c3e5b08a07136e9a0d7664bb249c6de3670e5b63e9b6/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790", size = 1258580, upload-time = "2026-06-30T20:02:37.53Z" }, + { url = "https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7", size = 1261693, upload-time = "2026-06-30T20:02:39.123Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/3676ca2191f39bafb75f93f99b2f429ec464586158fece2165f3572805dc/ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b", size = 1252517, upload-time = "2026-06-30T20:02:40.511Z" }, + { url = "https://files.pythonhosted.org/packages/f3/58/494ef8c4b4acb2f4a265ac934caf45f792a08fe27d6b853de35ad991941a/ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b", size = 1304843, upload-time = "2026-06-30T20:02:41.961Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f2/13736d920ab3d49bbee80ef1a277dd7b7aaf3b3545efd9d2a8114fe05525/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32", size = 1413698, upload-time = "2026-06-30T20:02:44.179Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5a/e046f3899e2acba4677d7427b76431443a1aa1a0e583dfb05b55b69d55cf/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b", size = 1512209, upload-time = "2026-06-30T20:02:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/e42aaca7bb2d22a7c06d5a8c7930086c5a334e93d716e6fa5e6647a4515f/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a", size = 1508464, upload-time = "2026-06-30T20:02:46.942Z" }, + { url = "https://files.pythonhosted.org/packages/95/93/5524a3dc6c3f593de3228ed9cbef73afa047625b7000ec21b7f58e6eb4d4/ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e", size = 1457164, upload-time = "2026-06-30T20:02:48.294Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c0/36a6ffb4d653cf621427b4c4928671f53ad800c453474de2b82564a44ad9/ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b", size = 863014, upload-time = "2026-06-30T20:02:49.742Z" }, + { url = "https://files.pythonhosted.org/packages/09/c7/7d5ad8b49e1278e1c2a1e0274bd7850560b3f09313aa00c13bc8d5544792/ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1", size = 1063165, upload-time = "2026-06-30T20:02:50.98Z" }, + { url = "https://files.pythonhosted.org/packages/47/ae/6710c14ecb276031cf10249f6adf5a59e2d3fdb3b5183bd59f70524067ee/ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e", size = 1101444, upload-time = "2026-06-30T20:02:52.554Z" }, + { url = "https://files.pythonhosted.org/packages/66/40/c53deb2cd0c9b0fb636d24d9f40924cf2e65028e6b20b10cd5c1eeb2c730/ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e", size = 1072965, upload-time = "2026-06-30T20:02:54.097Z" }, ] [[package]] @@ -519,87 +520,89 @@ wheels = [ [[package]] name = "librt" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", size = 141706, upload-time = "2026-05-10T18:15:16.129Z" }, - { url = "https://files.pythonhosted.org/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", size = 142605, upload-time = "2026-05-10T18:15:18.148Z" }, - { url = "https://files.pythonhosted.org/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", size = 476555, upload-time = "2026-05-10T18:15:19.569Z" }, - { url = "https://files.pythonhosted.org/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", size = 468434, upload-time = "2026-05-10T18:15:20.87Z" }, - { url = "https://files.pythonhosted.org/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", size = 496918, upload-time = "2026-05-10T18:15:22.616Z" }, - { url = "https://files.pythonhosted.org/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", size = 490334, upload-time = "2026-05-10T18:15:24.2Z" }, - { url = "https://files.pythonhosted.org/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", size = 511287, upload-time = "2026-05-10T18:15:26.226Z" }, - { url = "https://files.pythonhosted.org/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", size = 517202, upload-time = "2026-05-10T18:15:27.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", size = 497517, upload-time = "2026-05-10T18:15:29.614Z" }, - { url = "https://files.pythonhosted.org/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", size = 538878, upload-time = "2026-05-10T18:15:30.928Z" }, - { url = "https://files.pythonhosted.org/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", size = 100070, upload-time = "2026-05-10T18:15:32.551Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", size = 117918, upload-time = "2026-05-10T18:15:33.678Z" }, - { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, - { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, - { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, - { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, - { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, - { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, - { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, - { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, - { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, - { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, - { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, - { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, - { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, - { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, - { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, - { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, - { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, - { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, - { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, - { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, - { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, - { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, - { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, - { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, - { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, - { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, - { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, - { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, - { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, - { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, - { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, - { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, - { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, - { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, - { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, - { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, - { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, - { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, - { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, - { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, - { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, - { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, - { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, - { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, - { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, - { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/e0/dbd0f2a68a1c1a1991eb7921ff6014465d56608cdc9a9fb468a616210a37/librt-0.12.0.tar.gz", hash = "sha256:cb26faedbd09c6130e9c1b64d8000efec5076ffd18d606c6cd1cf02730e6d8b0", size = 203841, upload-time = "2026-06-30T16:14:29.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/66/c9d88366893b4b0df6b5375c27ebc9f14c43419d9e244b493be20e85bc74/librt-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fe3547407bbce45c09885591f90168325c5a31a6795b9a13f6b9ff3d25093d93", size = 144398, upload-time = "2026-06-30T16:12:03.947Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f2/9be1c6da204701163ec3aaedbf893d2f656b363d8fa302af536ce6471eb4/librt-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5925eca673207204a3adca040a91bdd3738fc7ba48da647ccd55732692a35736", size = 148924, upload-time = "2026-06-30T16:12:05.583Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f3/256824ee27649c6e0a693db25d391f97b43b52364f8efb466014a564bbc7/librt-0.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f9ef097a7711465a204454c69658bbb6b2a6be9bdef0eeeba9a042016d00688", size = 479654, upload-time = "2026-06-30T16:12:07.175Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3f/f4adbb3f293a04bd3dc2eb91d814f5b1e221e6b4522585696ba6901a0b9a/librt-0.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57abc8b65edf1a8e80e5472c81c108a7527202e5febfda9e00a684dbaeae534e", size = 472318, upload-time = "2026-06-30T16:12:08.758Z" }, + { url = "https://files.pythonhosted.org/packages/9d/b5/362c93f7b43d4ef84a3d5f156c8d4eeddb22badcf5529a1281c387abbbd7/librt-0.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e6f53732a8ae5012a3b6ae092da2933be74ec4169d16038f4af87a0019afea", size = 501555, upload-time = "2026-06-30T16:12:10.623Z" }, + { url = "https://files.pythonhosted.org/packages/24/1d/2d6abf059c3a4b88a6668e7bb81af332b14463028ac8f2b08a1212eb1ebc/librt-0.12.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:edb5f06cdb38d6ef9fd7ae06d62962d65c881b5f965d5e8a6c53e59c15ae4338", size = 494118, upload-time = "2026-06-30T16:12:12.503Z" }, + { url = "https://files.pythonhosted.org/packages/39/c1/f91f3094be2c76361d88aca613d8b7586d15b6026714d59d2e3dc0e35f44/librt-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1473ef42263dfee7553a5c460f11730a4409acf0d52629b284eb1e6b13eb460a", size = 516318, upload-time = "2026-06-30T16:12:14.192Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e2/5211af94252458cbed7a6250163dff9c5a84aec29609121c828375a3b319/librt-0.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1d6f69a06295fb6ad8dcf92b4b2d15d211842005e86eedce64d88e0633592f58", size = 522294, upload-time = "2026-06-30T16:12:15.879Z" }, + { url = "https://files.pythonhosted.org/packages/90/9b/de31f5b9fdf7fa3699c4bbbecf82ebd52013d5d6b500b70b07b0ebacbd51/librt-0.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3275d0270cd07ca9c2e140ae4da34e24a0350e98c6e3815dce96ead67cf0487d", size = 502494, upload-time = "2026-06-30T16:12:17.394Z" }, + { url = "https://files.pythonhosted.org/packages/b1/48/22c18dff89f3900dddb3e470e6f7febcda37ff3667b73097a848c9a608b2/librt-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4834462ec68613024d063c7efe9b188e350d40fda9ba937372039883d2a8051", size = 543422, upload-time = "2026-06-30T16:12:19.006Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/74691b4b55944227245fffef063714e3ab9707ab1111eb0068512b428c7c/librt-0.12.0-cp310-cp310-win32.whl", hash = "sha256:bcf9b55ac089e8cf201d2146833e1097812c15dcea61911e84d6a2904cf78893", size = 97642, upload-time = "2026-06-30T16:12:20.386Z" }, + { url = "https://files.pythonhosted.org/packages/c5/dc/7f8fa369a1f7cc9b090fecd373659ada0e9bab1ae4a3ac9f163eabd04977/librt-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0a122002f7e0d5c93e84465c4b3fe86621402b7b92f1e2bc0784ebe67793112", size = 117583, upload-time = "2026-06-30T16:12:21.829Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ab/628490f42d1eba82f3c7e5821aa62013e6df7f525b7a9e92c048f8d1cc1c/librt-0.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f13c1e8563102c2b17581cf37fcb2c6dae7ad485ccea93ae46258998c25f9a1", size = 143821, upload-time = "2026-06-30T16:12:23.248Z" }, + { url = "https://files.pythonhosted.org/packages/38/5f/793e8b6f4b6ac16e7d7198478c0af3670606fbb535c768d5f3e954781423/librt-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1ddff067610a122387024c4df527493b909d41e54a6e5b2d0e6c1041d6dfa09", size = 148442, upload-time = "2026-06-30T16:12:24.582Z" }, + { url = "https://files.pythonhosted.org/packages/ad/92/c780fe37a9e0982f3bd8fd9a631d6b95d09a5a7201c6c50366ce843b7e42/librt-0.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8dc7ebb5f3eec062398e9d0ef1938acd21b589e74286c4a8906d0183318d91b", size = 478276, upload-time = "2026-06-30T16:12:26.101Z" }, + { url = "https://files.pythonhosted.org/packages/41/bb/226d444bc20d7dff4a19ec6c1ff2c13a76385eebddb59c9c00c923b67536/librt-0.12.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:198de569ea9d5f6f33808f1c00cc3db9de62bf4d6deafa3b052bd08255083038", size = 472337, upload-time = "2026-06-30T16:12:27.83Z" }, + { url = "https://files.pythonhosted.org/packages/12/79/98ac0840ee90a75d4e1155c79062860b12ccca508587ff2119fc086965f2/librt-0.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e958678a8bca56016aedc891b391c0e0813ea382a874b54a2c1b313c1d232720", size = 502087, upload-time = "2026-06-30T16:12:29.443Z" }, + { url = "https://files.pythonhosted.org/packages/6f/72/a6b1a0d080606a7f5f646b79a1496f21d709f8563877759ace9ce5adad73/librt-0.12.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575a6eca68c8437ed4a8e0f534e31d74b562ba1049a0ee4b5f09e114bcc21be1", size = 493202, upload-time = "2026-06-30T16:12:31.077Z" }, + { url = "https://files.pythonhosted.org/packages/69/cf/e1b036b45f2fc272205ee18bf272b47e8d684bf1a75af26db440c7504359/librt-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:86f241c50dc9e9a3f0db6dbb37a607c8205aa87b920802dabbd50b70d40f6939", size = 514139, upload-time = "2026-06-30T16:12:33.032Z" }, + { url = "https://files.pythonhosted.org/packages/40/34/b193b3e6985469a2f8afa86c90012329c86480b6ff4f2e4bd7b5b937e134/librt-0.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:113417b934fbf38220a9c7fe94578cefbe7dbb047adcb75aa197905af2b13724", size = 519486, upload-time = "2026-06-30T16:12:34.996Z" }, + { url = "https://files.pythonhosted.org/packages/31/9e/7de4947b1695f247c813f833e3c1e7b77b52e52a7dba2c35411cf806b58e/librt-0.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:762f17c0eb6b5d74e269126996cea8a89e35ab6464c5151619163abcd8623ae2", size = 499609, upload-time = "2026-06-30T16:12:36.663Z" }, + { url = "https://files.pythonhosted.org/packages/59/11/f3730e04e758b1fbf215359062ad2d5b6bd0b0ab5ac46b1c140628795be7/librt-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa93b3bd7f7588c628f6e9bf66485d3467fd9a1ccdb8975b770178f39f35697", size = 542205, upload-time = "2026-06-30T16:12:38.56Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/710453617eabe20e18433864f335534c8aff63fbc68d8cd9dbc70a3d08f6/librt-0.12.0-cp311-cp311-win32.whl", hash = "sha256:aaa04b44d4fe86d824616b1f9c13e34c7c01ec0c96dd2abc4f59423696f788e2", size = 98067, upload-time = "2026-06-30T16:12:40.102Z" }, + { url = "https://files.pythonhosted.org/packages/42/53/401bff50a56e95daf151d911c99adf5732af2190e8f4d11886c9a229103c/librt-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aaeeddb8e7e4ae3bb9f944e0e618418cb91c0071d5ddbfcc3584b3cf59d39f0", size = 118346, upload-time = "2026-06-30T16:12:41.388Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9a/a3a9078fe88bfc2d2d99dcf1c18593938ae830089cf84c3b2532a6c49d63/librt-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:18a2402fa3123ab76ecca670e6fb33038fde7c1e91181b885226ec4d30af2c2c", size = 104760, upload-time = "2026-06-30T16:12:43.112Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1a/5bec493821b0e85b91de4f234912b50133d1aedb875048eef27938ec3f96/librt-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9bce19aa7c05f91c989f9da7b567f81d21d57a2e6501e2b811aa0f3f79614c1a", size = 146756, upload-time = "2026-06-30T16:12:44.395Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d0/cc04b48a57c1f275387f5578847214c4a6c21bfb24c6c8c8d6ba753fe403/librt-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0ace09f5bf4d982fe726015f102fb856658b41580597104e301e630ed1d8d86", size = 145537, upload-time = "2026-06-30T16:12:45.95Z" }, + { url = "https://files.pythonhosted.org/packages/9e/10/c02325556beb2aa158c9e549ddade8cc9a23b36cdad14756dbed730c1ff1/librt-0.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d007efe9243ede81ce75990ad7aa172da1e2024144b3eff17ba46a5fff1fff3c", size = 488637, upload-time = "2026-06-30T16:12:47.658Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9e/7b49ca1c30baa9c8df96024aa09a97c35a97455e36004c9b5311703c56f3/librt-0.12.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ad324a5e4858388a4864915b90a42efc8b374376393f14b9940f2454e791912b", size = 483651, upload-time = "2026-06-30T16:12:49.283Z" }, + { url = "https://files.pythonhosted.org/packages/4d/71/03c8c8cec39645fda451132ff9d6d662fc5aea42a1a188a77a4fddb35906/librt-0.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10a40cf74cdd97b6f8f905056db73f5d459783de2ca04c6ebd1bf47652818e7e", size = 518359, upload-time = "2026-06-30T16:12:50.999Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ec/a9f357f94bbcba92277d22af22cff42ef706ae5d9d6d58b69bebf3a67954/librt-0.12.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:92e61c09de95217ae02a9d17f4f66cf073253cdc51bcfdc0f15c62c9a70baa85", size = 509510, upload-time = "2026-06-30T16:12:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/717055325d028743aa01a7691ad59a63352a26a8ff2e7eeb0c9249514150/librt-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0461344061d6fc3718940f5855d95647831cef6d03a6c7506897f98222784ad4", size = 527302, upload-time = "2026-06-30T16:12:54.244Z" }, + { url = "https://files.pythonhosted.org/packages/95/f8/7612eeedb3395d92f7c6a84dca5f15e282d650483a4dc01aa5b9cffdfda3/librt-0.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6dfe89074732c9287b3c0f5a6af575c9ede380a788013876cc7b14fe0da0361", size = 532568, upload-time = "2026-06-30T16:12:55.74Z" }, + { url = "https://files.pythonhosted.org/packages/79/1e/a9afe85d5bb8b65dc27be3809ed1d69082079e1e9717fd2c66aa9939600c/librt-0.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9efed79d51ad1383bba0855f613cca7aa91c943e709af2413ac7f4bb9936ce08", size = 521579, upload-time = "2026-06-30T16:12:57.884Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1e/93aebb219d52c37ea578f83b0588cd7b040974e464d4e435086a48b4dc4d/librt-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1eac6cc0e23e448fb3c1446ed85ff796afb616eed5897c978d35dbec030b7c7c", size = 558743, upload-time = "2026-06-30T16:12:59.577Z" }, + { url = "https://files.pythonhosted.org/packages/3c/85/1680c0ec332f238e3145c5608d313ab0a43281e210a5dd87e3bc3cc25631/librt-0.12.0-cp312-cp312-win32.whl", hash = "sha256:0ab8ee0210047ae86ca023ccfbfe3df82077fd1c9bc021aebbf37d993ef64af0", size = 99200, upload-time = "2026-06-30T16:13:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/30/0e/abca12d8904875aa2ad66327390a3f7b1b75ebc43c0a00fc763cecf32ea5/librt-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:51c8bfa12632c81b94401c101bcedd0c56c3a1f8fa3273ca3472b28cd2f54003", size = 119390, upload-time = "2026-06-30T16:13:02.493Z" }, + { url = "https://files.pythonhosted.org/packages/32/a5/4203481b6d3a3bb348c82ac71abf1fcb4cb3ae8422a24a8dee4cd3ac5bd7/librt-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:5eebd451f5def089369ba6d8ff0291303d035e8154f9f26f7633835c5b029ade", size = 105117, upload-time = "2026-06-30T16:13:03.952Z" }, + { url = "https://files.pythonhosted.org/packages/f2/87/568d948c8079c9ff3c9e8110cf85f1eb70218e1209af29d0b7b89aa4a60c/librt-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8d9a55760a34ae5ce70434aabb6a6c61c6c44a0ec58ca1cfd9cd86e4745d417d", size = 146808, upload-time = "2026-06-30T16:13:05.417Z" }, + { url = "https://files.pythonhosted.org/packages/e7/1d/bea471ecea210088847bb5f3c4b4b424d596518934c06679b78ca85d6e63/librt-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ff0b197e338b4cf432873e0d6ef025213fdea85311ec4d87d2ea88c28adf2409", size = 145503, upload-time = "2026-06-30T16:13:07.023Z" }, + { url = "https://files.pythonhosted.org/packages/eb/9e/984ad422b56de95fdce158f06b051655373784ebea0aba9a7fcbc41614d1/librt-0.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e69f120a20b69e2539d603bbd4d62db38399b10f8bf73a1cf445038a621e8af", size = 488421, upload-time = "2026-06-30T16:13:08.492Z" }, + { url = "https://files.pythonhosted.org/packages/50/03/1a2f94009b07ea71f8e1a4cfe53370565b56da9caa341b89e0699325e9f5/librt-0.12.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fde3cde595e947fc8e755b0a21f919a1622483d07c662d00496e040773d22591", size = 483488, upload-time = "2026-06-30T16:13:10.169Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3b/084bdc295823fbb6ab91670047adf8f420787f9e8794bf2d140b66dc196b/librt-0.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d977447315fa09ea4e8c7ae9b4e22f7659b5128161c1fd55ff786b5349f73503", size = 518428, upload-time = "2026-06-30T16:13:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/c9/22/5a307390b93a115ffbecd95c64eecb4e56269680e45e9415ada7285f2cf4/librt-0.12.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ffac8a67e4143cea9a549d4822b93bc0bbaad73fc25aa0ab0ba5ec27d178677", size = 509744, upload-time = "2026-06-30T16:13:13.217Z" }, + { url = "https://files.pythonhosted.org/packages/b5/90/83f3cb6184f5d669660717b4b2e317c9ddaccf7ca5bb97f2196deac1a3b7/librt-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:94af1ed773ff104ef08ef3d669a0ba9d3a5916c609eb698cffe5d5476d66ff9b", size = 527749, upload-time = "2026-06-30T16:13:15.277Z" }, + { url = "https://files.pythonhosted.org/packages/7d/3b/f162be5cc88d47378e3a20776fe425fa1c2bece755da15e2783ebf06d3d6/librt-0.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:548199d21d22fb26398dfbbe0ba953a52465c66f3a49f38e6fddce1b127faf53", size = 532582, upload-time = "2026-06-30T16:13:17.074Z" }, + { url = "https://files.pythonhosted.org/packages/c9/28/6c5d2f6b7232fd24f284fc4cab37a459fe69a9096a09942f44cc5c55e073/librt-0.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c8f1f413b966a9dd3ecf80cd337b0ad7bb3de2474a4ff448ed3ebabfc3f803fc", size = 522235, upload-time = "2026-06-30T16:13:18.823Z" }, + { url = "https://files.pythonhosted.org/packages/a9/1c/bd115360587fdc22c8ae8fac14c040a556b442e2965d4370d2cf274c8b95/librt-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55f13f95b629be5b6ab38918e439bf14169d6f9a8deaae55e0c14e12fb0c74b9", size = 559055, upload-time = "2026-06-30T16:13:20.509Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5a/c26f49f576437014825a86faea3cec60c1ed17f976abd567b6c12b8e35a7/librt-0.12.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:8b2dc079dfe29e77a47a19073d2040fa4879aa3656501f1650f8402ddce0313c", size = 79809, upload-time = "2026-06-30T16:13:22.401Z" }, + { url = "https://files.pythonhosted.org/packages/69/0b/a55244261d9ad7375ac039b8af06d42602722e2e8b8d8d6b86e4a3888c02/librt-0.12.0-cp313-cp313-win32.whl", hash = "sha256:da58944be8270f2bfee628a9a2a60c1cf6a12c8bea8e2c9b6edf3e5414ca7793", size = 99308, upload-time = "2026-06-30T16:13:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bf/ed9465e58d44c5a5637795547d0841c8934aab905ea452cac1adf14672cf/librt-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db4be3037e4ce065a071fa7deee93e78ebc25f448340a02a6c1c0b82c37e383", size = 119438, upload-time = "2026-06-30T16:13:25.188Z" }, + { url = "https://files.pythonhosted.org/packages/c0/44/3cad652aeb892e6e8ffe48d0fafa2bc652f28ec7ed3f4403fcbb1be4f948/librt-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:05fd2542892ad770b5dd45003fd080477cf220b611d3ee59b0792097eb0873a9", size = 105118, upload-time = "2026-06-30T16:13:26.533Z" }, + { url = "https://files.pythonhosted.org/packages/0e/51/3a0e05618c12423b6fc5141b590ec02a6efb645833edc8736a6c7b46d1ec/librt-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b37ee42e09722284a6d9288fe44a191f7276060a3195939bb77c6502058dbb34", size = 145579, upload-time = "2026-06-30T16:13:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/77/9e/fd399d099dfb4020f3f7c34e7e6210c389fa89f7d79ca92f5afb0395f278/librt-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ade11988728b3e4768dadc5696e82c60e9b35fc95335a9b4d1f5d69e753ccec7", size = 150139, upload-time = "2026-06-30T16:13:29.357Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ee/610239fbd8c4b005443664c5d4c3bc1717daedd8c71369bf45011aa87194/librt-0.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f351ed425380e39bd86df382578aa5b8c5b98e2e265112de7379e7d030258150", size = 480457, upload-time = "2026-06-30T16:13:30.78Z" }, + { url = "https://files.pythonhosted.org/packages/0c/10/ceddc9010f26c541444be36e1153a79b64626694db2d33a524c719fa3e46/librt-0.12.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:857d2163e088c868967717ace8e980017fd868a735f3de010412af02bdc30319", size = 479002, upload-time = "2026-06-30T16:13:32.398Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/b1523d9718e8192e5403e6b41a02742e17ba554369f0729b9f30ab590e2d/librt-0.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2befc80aa5f2f5b93f28abaaf11feff6677931dd548320e44c52deaa9399744", size = 510527, upload-time = "2026-06-30T16:13:34.615Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0e/0f3ff43befb18a531615736791e52fb67eaa71ff7b89e6e5f7004b64cc6e/librt-0.12.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:be3694dcfa97c6715dd19ac73d3e1b21a805514a5785663e57fecacd3ff64e5a", size = 500988, upload-time = "2026-06-30T16:13:36.408Z" }, + { url = "https://files.pythonhosted.org/packages/a8/1a/0278ea4a9e599dc507c43839a87f2c764ad04bf69418e2d763d58659e55f/librt-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2d5f67e86f45638843d025b0828f2e9e55fc45ff9180d2618ccdeaf72a796050", size = 519318, upload-time = "2026-06-30T16:13:37.883Z" }, + { url = "https://files.pythonhosted.org/packages/59/55/090e10e62be2f35265e41601337f83ac9f83be9aca1bf92692e3a82effdd/librt-0.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:64572c85e4ab7d572c9b72cd76b5f90b21181b1459fa6b1aac6f8958c4fcff31", size = 527127, upload-time = "2026-06-30T16:13:39.682Z" }, + { url = "https://files.pythonhosted.org/packages/1f/34/8052c9ec678be6ba751279947831f089aa69b009000b985ce91d1979669a/librt-0.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8b961912b0e688c1eb4658a46bdb0606b31918d65597fbe7356ca83aa653ffcc", size = 509766, upload-time = "2026-06-30T16:13:41.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/f8/8761b36189e9ec8dc20b49fa84cef22852c6c41fcda56f760f7fc1360da5/librt-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:722375903e3f079436a7a33da51ce73931536dd041f9feb01536f05d8e010c96", size = 552043, upload-time = "2026-06-30T16:13:43.197Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/7283971ef6b70269938b49c7b25f670ec6325d252265fbcc996f9b364379/librt-0.12.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:a5a96a8f536b65ef1bf910c09e7e71647edde5111f6e1b51f413c6fba5bfe71b", size = 79472, upload-time = "2026-06-30T16:13:44.64Z" }, + { url = "https://files.pythonhosted.org/packages/c3/5e/b30940dea935e8ac5bd0e0abb1985f5274590d557ac3a252ca0d5392ce52/librt-0.12.0-cp314-cp314-win32.whl", hash = "sha256:8ffc99c356f1777c506e1b69dc303879153ae2640ba15b8f3d4448bc87139149", size = 94246, upload-time = "2026-06-30T16:13:45.962Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4e/0af9fe63f35fa304da3b05688f30ff6a329bcc59581b1cc51dc87fd30141/librt-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:1e68fb20798f455cda41d20a306a23c901218883f17a4bab1ed6e1331b265fb7", size = 114951, upload-time = "2026-06-30T16:13:47.279Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8e/843c495d7db35e13b84cd533898fa89145c40dc255da0bc316d53d631464/librt-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:2df534f97916cf38ec9b1ddafeb68ae1a4cd4a54775ff26a797026774c0517cf", size = 100562, upload-time = "2026-06-30T16:13:48.699Z" }, + { url = "https://files.pythonhosted.org/packages/75/30/c686d0f978d5fd6867c5bbad96b015c9445746764d1c228e16a2d30d9382/librt-0.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c09e581b1c2b8a62b809d4f4bd101ca3de93791e5b0ed1a14085d911be3dee3f", size = 153897, upload-time = "2026-06-30T16:13:50.017Z" }, + { url = "https://files.pythonhosted.org/packages/40/46/f6f2d77ce46628b48fb5280709013b5109cf3a2c46a2472093cdfc03519d/librt-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:976888d0d831402086e641018bcc3208e0a38f0835789da91f72894b2cb4161f", size = 156391, upload-time = "2026-06-30T16:13:51.462Z" }, + { url = "https://files.pythonhosted.org/packages/c2/46/cd790c7e19e460779471530ffab454541d6ea4a3b7d338cad7f16ff96995/librt-0.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:563c37cdb41d08fe1e3f08b201abac0e317ca18e88b91285466ee0a585797520", size = 564151, upload-time = "2026-06-30T16:13:53.146Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/724559a15fb023cbdef7aee1e81fbfbc3ee22fd09009baa816cea63e3a60/librt-0.12.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b97eb1a3140e279cc76f85b0fb92b7eb3dfbe0471260ee878bc9dc4bf9a0d649", size = 546002, upload-time = "2026-06-30T16:13:54.665Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7e/f9d8c257ab4909f101c7c13734367749e782fd8625545f0343502c2f09f1/librt-0.12.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06e0623351ab9904cf628245f99c714586f4dd23dc740b88c8bc670d8401a847", size = 584204, upload-time = "2026-06-30T16:13:56.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/33/64665810575ac23b6cb6ef364de51309b7803620c12885b6e895ebc29591/librt-0.12.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da12f017b2e404554be14d466cd992459feaa44f252b0f18d909a85266ce1237", size = 573688, upload-time = "2026-06-30T16:13:58.1Z" }, + { url = "https://files.pythonhosted.org/packages/0f/01/27522995c6627455abc7a939d57535fb1a7836d398ccedb3d7585f46039e/librt-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d97f31003a5c86b9e78155a829572c3a26484064fb7ac1d9695fe628bd93d029", size = 604719, upload-time = "2026-06-30T16:13:59.831Z" }, + { url = "https://files.pythonhosted.org/packages/ee/1f/099e61b1b688551d6d2ce9d4d2ae2242a938759db8551e6cbac7f7176ee5/librt-0.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:bd43a6c69876aef4f04eaae3d3b99b0be64755fda274002fa445b92480bf664e", size = 598183, upload-time = "2026-06-30T16:14:01.457Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c1/050400249665503bdd5b83cec518fa7b183b609341c8dcd58161775c4226/librt-0.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c01755c72fca1dc6b8d5c2ed228b8e7b2ffe184675c22f0f05ebd8fe188b9250", size = 582559, upload-time = "2026-06-30T16:14:03.29Z" }, + { url = "https://files.pythonhosted.org/packages/da/d1/eef8f0e6722518b65a3d3bcd9309f9f44e208ce5d6728070820f988e7078/librt-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:625ae561d5fa36400856dcc27464400d047bc2d5e3446be88f437b03fefd72e4", size = 626375, upload-time = "2026-06-30T16:14:04.957Z" }, + { url = "https://files.pythonhosted.org/packages/8b/78/f0bb41a6f2bbd3c77bdcc66980dc0d69ca1192a0ecec25377afcc5e6db73/librt-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8d73191883553ee0739741544bf3b00aba2a1224e45d9580b30cbc29e21dc03b", size = 97752, upload-time = "2026-06-30T16:14:06.555Z" }, + { url = "https://files.pythonhosted.org/packages/92/24/e279c27972ab051a070237cfa45728fa51670c3f22f1a4d391711e9f4c31/librt-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e1cbb037324e759f0afa270229731ff0047772667f3cb38ef5df2cabf0175ede", size = 119562, upload-time = "2026-06-30T16:14:07.908Z" }, + { url = "https://files.pythonhosted.org/packages/06/e6/42a475bfca683b0cd5366f6dd06580062b7e567bb8534d225c877c2f14f3/librt-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bca1472acbd473eff61059b4409f802c5a1bcb4cd0344d06f939df9c4c125d40", size = 104282, upload-time = "2026-06-30T16:14:09.29Z" }, ] [[package]] From a5a5c85d6369b7737e4587371a407dcb8491ecd1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 05:54:32 -0500 Subject: [PATCH 2973/2998] py(deps[dev]) Bump dev packages --- uv.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uv.lock b/uv.lock index ad25ab41f1..d0b9164bf9 100644 --- a/uv.lock +++ b/uv.lock @@ -1053,15 +1053,15 @@ wheels = [ [[package]] name = "pytest-rerunfailures" -version = "16.3" +version = "16.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/f0/74f8e685be7ecd1572c1256132f18fce3a665d7e07649a3f23b7eb2d3bec/pytest_rerunfailures-16.3.tar.gz", hash = "sha256:37c9b1231c8083e9f4e724f50f7a21241822f9516c15c700ebbf218d6452355c", size = 34148, upload-time = "2026-05-22T06:51:22.292Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/60/a90ca1cc6cffcb97b4260ed0ad2b7934b999d7c48abe4ea0840344862a3b/pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11", size = 36635, upload-time = "2026-07-01T06:30:56.813Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/98/58a71d68d3126d7f6a6ed1944c37ec207a4ff3dc66cad3bed7b59d38df61/pytest_rerunfailures-16.3-py3-none-any.whl", hash = "sha256:6bdfb8ffb46c46072e6c16bdedee38b6c13eac620d9415ed5b63152cbf283170", size = 15396, upload-time = "2026-05-22T06:51:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/ce/93/3cdcc4033444e822e01b573414b03fd37fd5533070c750477b8f5fa5224b/pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c", size = 16955, upload-time = "2026-07-01T06:30:55.333Z" }, ] [[package]] From 8d73d5e0e867a352043eb240ac7451a60c2e9426 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 07:09:26 -0500 Subject: [PATCH 2974/2998] py(deps[dev]) Bump dev packages --- uv.lock | 184 +++++++++++++++++++++++++++----------------------------- 1 file changed, 90 insertions(+), 94 deletions(-) diff --git a/uv.lock b/uv.lock index d0b9164bf9..6f0b85cf3e 100644 --- a/uv.lock +++ b/uv.lock @@ -893,100 +893,96 @@ wheels = [ [[package]] name = "pillow" -version = "12.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, - { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, - { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, - { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, - { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, - { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, - { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, - { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, - { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, - { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, - { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, - { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, - { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, - { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, - { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, - { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, - { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, - { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, - { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, - { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, - { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, - { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, - { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, - { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, - { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, - { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, - { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, - { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, - { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, - { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, - { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, - { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, - { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, - { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, - { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, - { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, - { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, - { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, - { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, - { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, - { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, - { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, - { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, - { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, - { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, - { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, - { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, - { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, - { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, - { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, - { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, - { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, - { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, - { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, - { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, - { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, - { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, - { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" }, + { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" }, + { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" }, + { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" }, + { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, + { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, + { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, + { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, + { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, + { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, + { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, ] [[package]] From c94b283e5d489edfa735fbced15dc1e2a7f41508 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 1 Jul 2026 19:02:40 -0500 Subject: [PATCH 2975/2998] py(deps[docs]): Add sphinx-gp-mermaid why: The vendored mermaid renderer moved into the sphinx-gp-mermaid workspace package; the docs build needs it available before the local copy can be dropped. what: - Add sphinx-gp-mermaid==0.0.1a32 to the dev and docs groups - Bump the gp-sphinx family of packages to 0.0.1a32 - Regenerate uv.lock --- pyproject.toml | 15 +++++--- uv.lock | 102 +++++++++++++++++++++++++++++-------------------- 2 files changed, 69 insertions(+), 48 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7abefdeaf8..ec0e402e53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,9 +60,10 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a31", + "gp-sphinx==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a32", + "sphinx-gp-mermaid==0.0.1a32", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -86,9 +87,10 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a31", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a31", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a31", + "gp-sphinx==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a32", + "sphinx-gp-mermaid==0.0.1a32", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] @@ -135,6 +137,7 @@ sphinx-autodoc-pytest-fixtures = false sphinx-autodoc-sphinx = false sphinx-autodoc-typehints-gp = false sphinx-fonts = false +sphinx-gp-mermaid = false sphinx-gp-opengraph = false sphinx-gp-llms = false sphinx-gp-sitemap = false diff --git a/uv.lock b/uv.lock index 6f0b85cf3e..aac16baafd 100644 --- a/uv.lock +++ b/uv.lock @@ -12,6 +12,7 @@ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for exclude-newer-span = "P3D" [options.exclude-newer-package] +sphinx-gp-mermaid = false libtmux = false gp-sphinx = false sphinx-autodoc-sphinx = false @@ -412,7 +413,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -422,9 +423,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/b2/b44f19a537ff7cbe0a95d4da5bfb8904bf3152ffb5fa206d061427682543/gp_furo_theme-0.0.1a31.tar.gz", hash = "sha256:367f07f702eaf2aa0eb579144a0646a65dc68a084414729bddbc493e5c8c294f", size = 34306, upload-time = "2026-06-16T01:38:10.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/21/673b50e07bd4600bced2cf8a52cab444793c0ab5e32c74b8db137c2cdf9a/gp_furo_theme-0.0.1a32.tar.gz", hash = "sha256:2faa3715a727d64c7dbfbacb4999f994cd19dbb731466fbfb92133ae37f9497a", size = 34308, upload-time = "2026-07-04T11:54:25.507Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/3a/663e5fdc839ca81dd58f79d848d1c5397fe813bbfca97a6a7730bf324851/gp_furo_theme-0.0.1a31-py3-none-any.whl", hash = "sha256:153bba2a3566f66bba80d9d4a7ad39f599a8ba8215d51a4c46dcd581d5de53a2", size = 43659, upload-time = "2026-06-16T01:37:46.742Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7e/26e4fd2494249bc5b29e12e738cf2b12a78f0ca2afe12307426c5e5ac443/gp_furo_theme-0.0.1a32-py3-none-any.whl", hash = "sha256:d13a9281f4d92c15475a40a23b3b152619c6e85e70d8c626c72e5a36ce0b6de3", size = 43660, upload-time = "2026-07-04T11:54:04.898Z" }, ] [[package]] @@ -443,7 +444,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -465,9 +466,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/40/bb18d84b0f11facb32977b7590ac89678b19a5621906337e4b48982eb151/gp_sphinx-0.0.1a31.tar.gz", hash = "sha256:52fad798e198f10e0460cec5b16535dedcb5d4ad118f471a45a773a74b7b7100", size = 19629, upload-time = "2026-06-16T01:38:11.297Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/d5/d3368d24f899bb0914632be7a982e7c2ecf8e3eb6f7fad527c2e1b3e8de6/gp_sphinx-0.0.1a32.tar.gz", hash = "sha256:2eca9add0fc6b0d0d72c96faa13d14d7c25edcb87041c0e5eea82d342e120e76", size = 19762, upload-time = "2026-07-04T11:54:26.28Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/79/45ddf1d696179839699e550a47c3908e0ad6889d0968d5b0cc0e3b79419c/gp_sphinx-0.0.1a31-py3-none-any.whl", hash = "sha256:3377ebe1834204d402ebb8b4789ef1a8c80e4e9a7863a2c7abe29bef4755f862", size = 20134, upload-time = "2026-06-16T01:37:48.055Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e8/ca57b2e4c51b5c0c159dd1eec70e4e40ddfa72260402b64124bf35267b0c/gp_sphinx-0.0.1a32-py3-none-any.whl", hash = "sha256:ebcd29e0afbdd414b0ad7e66439c2b4ca2de2ea45ca7c3da4df8c0e06220b952", size = 20280, upload-time = "2026-07-04T11:54:06.147Z" }, ] [[package]] @@ -1322,7 +1323,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1330,14 +1331,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/ce/2c91d418da951ce677372633abff8c6a991952074ec45446dcc844cde286/sphinx_autodoc_api_style-0.0.1a31.tar.gz", hash = "sha256:6abff9addb0fdd22e920cf4b3f2b06fa73bee9ef6d9650112749f291f2448b0f", size = 8977, upload-time = "2026-06-16T01:38:12.384Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/40/39e04757fbb9ad30d1bd8cbe6c9c379a4b308b3c5b0382add6d8fb32d11d/sphinx_autodoc_api_style-0.0.1a32.tar.gz", hash = "sha256:8f70765e35ff1efe0b3a3703d22ea2466570c14a2ed7cda99559f436383d9892", size = 8977, upload-time = "2026-07-04T11:54:27.079Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/8c/a3c5d0fe6643e67a299e2002609496120e38b275ab93162496a86a6f8623/sphinx_autodoc_api_style-0.0.1a31-py3-none-any.whl", hash = "sha256:ae7ca8032c3a26c8d70e84df8d095d424513270aac03e1ec6dc875f87b44d9fc", size = 9066, upload-time = "2026-06-16T01:37:49.62Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bc/5c4d7a158c92f8e1201c2b158f0c8a556407533ce0db2a824392bfd5cc7b/sphinx_autodoc_api_style-0.0.1a32-py3-none-any.whl", hash = "sha256:d4d64df73c8d398ae37aef17b199b5a955d0aded73e48571e4cf85fb05837c6f", size = 9064, upload-time = "2026-07-04T11:54:07.378Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1345,22 +1346,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/cd/5bf51b23a41af75da19c6c9ffcafb7e954fded44bd2103a404dc8d8395a3/sphinx_autodoc_argparse-0.0.1a31.tar.gz", hash = "sha256:1ca3dfa92d4e53069e573cab936f727b04daa4b48b3c3a02da1ea2579024f569", size = 42804, upload-time = "2026-06-16T01:38:13.244Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/64/826b8d3d85e279492380483e4e2db35df08447297eb6c8d0a6e57020c9e4/sphinx_autodoc_argparse-0.0.1a32.tar.gz", hash = "sha256:f0ecfe4b061cde8fd1a9beb8d6166ed5382c6f4c4ea6b98b6f13fb57859f6224", size = 42801, upload-time = "2026-07-04T11:54:27.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/26/64faac071dbf00142c2b67d35c54c4e720aa869ae1910b6606bbfa3ecc3e/sphinx_autodoc_argparse-0.0.1a31-py3-none-any.whl", hash = "sha256:db4546fc851740ad051d0072c8bcdbda6548a1662d3bdbfb2b0272b67fa1b881", size = 47654, upload-time = "2026-06-16T01:37:50.882Z" }, + { url = "https://files.pythonhosted.org/packages/07/c4/9976edafd52e57a77f2c9b52320fd5ae28089a326ff6bb2316734cbe4694/sphinx_autodoc_argparse-0.0.1a32-py3-none-any.whl", hash = "sha256:c68f79619541611061bf77170956ff47706ed18af67075be96eaa88340673e4e", size = 47653, upload-time = "2026-07-04T11:54:08.629Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/6d/f509e55463159bfc4fff7196a7bac51116a0ecdc3b0e22f4102bab39be5c/sphinx_autodoc_typehints_gp-0.0.1a31.tar.gz", hash = "sha256:f269e2125c5de6bdeae159667bd8f92fadc81e1b2aa702ca8eb0cf55aee937f3", size = 36501, upload-time = "2026-06-16T01:38:18.006Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/50/0a942b324511faf127fa1efbba82f764d32f024940c9366c9c0750cba037/sphinx_autodoc_typehints_gp-0.0.1a32.tar.gz", hash = "sha256:9e40e0a9de37fd53bd9821e1dd089cc088a9ce5e8ca28bb8d2289c2a7f7089e5", size = 36501, upload-time = "2026-07-04T11:54:32.483Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/07/eb1160f8c4e7adac433802f398cbe70c245c9d0ee5127209f880625bb2b9/sphinx_autodoc_typehints_gp-0.0.1a31-py3-none-any.whl", hash = "sha256:34140405eb5be548b034155f1424b8b9119be09470f102d7d4a1b7fc155cd16d", size = 38660, upload-time = "2026-06-16T01:37:58.325Z" }, + { url = "https://files.pythonhosted.org/packages/58/af/dfd3b19faf45409b41ee8e0cdf9487086d7e2066dd4595fa8ae730530214/sphinx_autodoc_typehints_gp-0.0.1a32-py3-none-any.whl", hash = "sha256:ac1937bde4781cb83a850aee90df746e952fe6f5ae4712dd8f1304eef07af379", size = 38656, upload-time = "2026-07-04T11:54:14.118Z" }, ] [[package]] @@ -1422,68 +1423,81 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/c1/dbce2c627aa219432b7495e96e5fef65de2930f5a58d570b31c88a1e33b8/sphinx_fonts-0.0.1a31.tar.gz", hash = "sha256:9264a7d511796302b27b7727d1553ffc69cfe3f5bfb8e32e0308880d7b9471f0", size = 5790, upload-time = "2026-06-16T01:38:18.89Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/98/564c7286058a70cac4920232a3e12810b0f7c7c12cc0af721de7a4ec7dde/sphinx_fonts-0.0.1a32.tar.gz", hash = "sha256:c7bfa095ea63489ce7c5c980aa0caa737ca1a17fbbb394c6572ee8d4278aebd3", size = 5788, upload-time = "2026-07-04T11:54:33.261Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/6a/e8bd1bec0334cf8ac07624a04c2a252d38474bf984567cd742aa5d3b250e/sphinx_fonts-0.0.1a31-py3-none-any.whl", hash = "sha256:7176f0c5092873d75a1904d477e6a6a1995b2fdab9d1aa1feaf38afa896fe501", size = 4363, upload-time = "2026-06-16T01:37:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c5/917086ef201db6b21d8743236cb7ac549fd27846bdd7d70773d87800ae75/sphinx_fonts-0.0.1a32-py3-none-any.whl", hash = "sha256:2a147d87b79986292d36957f4135da280432f2e03c70e4a160065c9e7bc0a7eb", size = 4361, upload-time = "2026-07-04T11:54:15.441Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d0/516ecda5dea91292bffd4cebb171b7c3a1ef5cf9dc4ef8b361123f49b422/sphinx_gp_llms-0.0.1a31.tar.gz", hash = "sha256:d5f79894cc017596858c929337c87fe8fb57852ad36541fcfa716d1220079201", size = 9911, upload-time = "2026-06-16T01:38:19.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/91/c12bb22eff9c838ef51e4ad2f2f8e8c2286957bd804a55cd823a89b77f1e/sphinx_gp_llms-0.0.1a32.tar.gz", hash = "sha256:b043a9b81b6c2a273820092afe02a4d9c0c63021b5054bf5dab42aa7d8730d9f", size = 9910, upload-time = "2026-07-04T11:54:34.665Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/6c/44f85843c51a4ca2f40de16d380260d9e59cba6b5859d052052a37c9a6b3/sphinx_gp_llms-0.0.1a31-py3-none-any.whl", hash = "sha256:7c1639bc3c6a065125235977fc5b3783bdda236aa96f4f3bbfdffdfc6f94512f", size = 12637, upload-time = "2026-06-16T01:38:00.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/f0/1191ce0af7c39192db0ab0c02b6b57e98e91344a2e813adc56a73ba512f8/sphinx_gp_llms-0.0.1a32-py3-none-any.whl", hash = "sha256:4ee8bc2824b88f4182d8857010446d0102697a1eba29946057ba3c0c21cf0c8f", size = 12636, upload-time = "2026-07-04T11:54:16.667Z" }, +] + +[[package]] +name = "sphinx-gp-mermaid" +version = "0.0.1a32" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/e8/3397aecb017a8beab4f13122ed6e961cc0b96eb3a0b5bb9535f7a533b741/sphinx_gp_mermaid-0.0.1a32.tar.gz", hash = "sha256:01e035add8e998daf25a433146ef57854a955c0b39219f4a71b1ac9cc9d1c84e", size = 70478, upload-time = "2026-07-04T11:54:35.57Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/46/9ecc34f7e39c235653907e3dd5a26ba72926e6e2caaad7decd7f4f7f314c/sphinx_gp_mermaid-0.0.1a32-py3-none-any.whl", hash = "sha256:6ffefab4bac2b77dc726aff6c5f7ec53a4fba58152c0cd2fa6505a80b0846d07", size = 11895, upload-time = "2026-07-04T11:54:17.755Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/f4/a520d59a00104be849b5af5a34ae05aef2b16d55768fcc7450b58ee8b110/sphinx_gp_opengraph-0.0.1a31.tar.gz", hash = "sha256:2a6bc17cc21fad51b56daa7ef874d971b7d7ac6eb99fc6d23fd20729bb1ef782", size = 11944, upload-time = "2026-06-16T01:38:20.516Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/2c/bbdd1f5adafacd3ef2d8237f5af1b95459b938a10f4f73398d75124254d1/sphinx_gp_opengraph-0.0.1a32.tar.gz", hash = "sha256:5d9c445248605d646a64ec2cbcb15aaa5ec3ef8ab10957a82533e32ed6efafd7", size = 11946, upload-time = "2026-07-04T11:54:36.502Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/92/4620bc3506b2d732948770dcddea5d1b13aea807057a344dbe4301d2979e/sphinx_gp_opengraph-0.0.1a31-py3-none-any.whl", hash = "sha256:b9eaf5e2c434c1819ae144f3043b5dab4d28a0182d7b3931cd4752e1a3ff6e05", size = 12186, upload-time = "2026-06-16T01:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6b/e4b89d1250195837abf3885b65ffc092924d801cb472481f3d02987f50a5/sphinx_gp_opengraph-0.0.1a32-py3-none-any.whl", hash = "sha256:5010e191aa722397d5914e7e3195f2d3cc1c4d166c4038a883227a20c7cbb301", size = 12185, upload-time = "2026-07-04T11:54:18.832Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/14/cc4cae7fde38ea9445fcc6eda121da358661119bae5de84933a0ed04c8e1/sphinx_gp_sitemap-0.0.1a31.tar.gz", hash = "sha256:8a142c3b8846954b3fca75ee1a5adefc773bfe0463ad554069a655f74320e346", size = 9957, upload-time = "2026-06-16T01:38:21.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/32/9f7d32566a090f140ae0dd80fa4e8575a0e676434212b89afedbf048b114/sphinx_gp_sitemap-0.0.1a32.tar.gz", hash = "sha256:66cea7cb58646e8ecbcb3087135c2f1bb4dcd3870b659cc1d37e25dc0e06798c", size = 9958, upload-time = "2026-07-04T11:54:37.244Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/ae/a1b054b95698964a7a234da9a787fbb3b21b65f706279022b0d1ec82309e/sphinx_gp_sitemap-0.0.1a31-py3-none-any.whl", hash = "sha256:1b4552dad75c39c63d062dc2559f91bb80b1d7c01c8a6fba048ab0cc474de405", size = 8981, upload-time = "2026-06-16T01:38:03.739Z" }, + { url = "https://files.pythonhosted.org/packages/b6/0e/f20d72402ea14bcb96ca7608264f621ad5d5cb8d933a14a4612cf8c2fa78/sphinx_gp_sitemap-0.0.1a32-py3-none-any.whl", hash = "sha256:276e17cca3f9a9418095f046e591589cdf750b20166d34d71d5e86a8bdf0b804", size = 8980, upload-time = "2026-07-04T11:54:19.95Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/38/3a88c5db34eaf51f73a60bdaabfb9cacfa7efe29770961a2e5e0ca0440ea/sphinx_gp_theme-0.0.1a31.tar.gz", hash = "sha256:6d9161ef9d451eec42e5792f90358792e7e23a6e1de04d6e6a4d548af9b5651b", size = 18289, upload-time = "2026-06-16T01:38:22.185Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/fe/e28b12a7507608aae092b3f5e655431059b7492fe1ffa8fe216b6b82d7ea/sphinx_gp_theme-0.0.1a32.tar.gz", hash = "sha256:483cad379b19d87ae51b6d4d466f56b25664ec29238c8a4516b9cd903e94481e", size = 18287, upload-time = "2026-07-04T11:54:37.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/22/0e7be302e82cffaad4de578d7997a2b41709aefbb4cda664da2126d0a3c0/sphinx_gp_theme-0.0.1a31-py3-none-any.whl", hash = "sha256:91cb217461554d436e34a99509de64b037e28b9ed479557b86566e49bc676b3c", size = 19889, upload-time = "2026-06-16T01:38:05.077Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ce/5e675df472b0611e7a735b4303d037f8ee02c3bda350c2d6753c284ad4c6/sphinx_gp_theme-0.0.1a32-py3-none-any.whl", hash = "sha256:497bee19c6fbfd4a75ac13305208761837bb7d53b42301282e98e5cd9f60097b", size = 19886, upload-time = "2026-07-04T11:54:21.106Z" }, ] [[package]] @@ -1501,28 +1515,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/17/fd806bccf73d5a4a1ab5504cdd9253b54a58ac393c7ecd4a9e5a8c239928/sphinx_ux_autodoc_layout-0.0.1a31.tar.gz", hash = "sha256:debebc1f632af4a7a7ca9a00285cc68419c08f73740f77241fc7beb2f39fa611", size = 30604, upload-time = "2026-06-16T01:38:23.168Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ad/1f9332428a464f508381277ff746d889a9707f40372be5dd4bf6322d8f04/sphinx_ux_autodoc_layout-0.0.1a32.tar.gz", hash = "sha256:8e09495db4c4f22de78f57e4b12a4b4275025f6d0fe633617af6d3029b5e2da0", size = 30603, upload-time = "2026-07-04T11:54:38.912Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/d4/cc594472a755ced2702cf20d5e60db9c6714af6b362e3507445cd67a7763/sphinx_ux_autodoc_layout-0.0.1a31-py3-none-any.whl", hash = "sha256:06fbdaa8544118fac6a5c77e8fcf4309cae778fa1ace9b129e66d91731181fb7", size = 35000, upload-time = "2026-06-16T01:38:06.359Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d4/dd8a974db360b6989d464e2918466454a7961541f430dcec49b36dbd705f/sphinx_ux_autodoc_layout-0.0.1a32-py3-none-any.whl", hash = "sha256:ea47497f16f8e56d0c8072fd8e6424259b4987fe2e6bbf3d0ebcca46d7db817e", size = 34999, upload-time = "2026-07-04T11:54:22.242Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a31" +version = "0.0.1a32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/16/a861f04c971fc4668c84accc4a5ecd35e56c8bdd0e8ebd1baef28221caac/sphinx_ux_badges-0.0.1a31.tar.gz", hash = "sha256:274c9cfe5dc47ea8b98f32e5d04d92dac949bac7a87d2320b08231a68d83d2d5", size = 16723, upload-time = "2026-06-16T01:38:24.086Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/9b/886dad978434d0307bf94c8e348779e37f53389febdcd9a85c262f3db2cb/sphinx_ux_badges-0.0.1a32.tar.gz", hash = "sha256:e78d170cc5f8a9a456b6356333fca66ad22af70f76a5cae4c8f49509b21161ea", size = 16724, upload-time = "2026-07-04T11:54:39.951Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/e6/d5e95df77827691e1efd1411eea47c0ef75745040cb5247cbde47adb3440/sphinx_ux_badges-0.0.1a31-py3-none-any.whl", hash = "sha256:a757b65b3cef1d7ee0e2bf0f84ea1be32a8e063bd1620a4effc86478a594b2ee", size = 17487, upload-time = "2026-06-16T01:38:07.814Z" }, + { url = "https://files.pythonhosted.org/packages/32/0f/b97b0d26813b1d3dd76741f2278467866cea35862c9a2d459518af7f8ec6/sphinx_ux_badges-0.0.1a32-py3-none-any.whl", hash = "sha256:21b49a9d219e79a65f4c9ba1c8c961f3680d1f393348dc08d3f1ca12cd7b47fd", size = 17489, upload-time = "2026-07-04T11:54:23.322Z" }, ] [[package]] @@ -1638,6 +1652,7 @@ dev = [ { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, { name = "sphinx-autodoc-argparse" }, + { name = "sphinx-gp-mermaid" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1651,6 +1666,7 @@ docs = [ { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, { name = "sphinx-autodoc-argparse" }, + { name = "sphinx-gp-mermaid" }, ] lint = [ { name = "mypy" }, @@ -1684,7 +1700,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a31" }, + { name = "gp-sphinx", specifier = "==0.0.1a32" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1694,8 +1710,9 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a31" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a31" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a32" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a32" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a32" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1703,11 +1720,12 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a31" }, + { name = "gp-sphinx", specifier = "==0.0.1a32" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a31" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a31" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a32" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a32" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a32" }, ] lint = [ { name = "mypy" }, From e58b867b3578077f27055c6c0c70cd73a83847fc Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 1 Jul 2026 19:07:08 -0500 Subject: [PATCH 2976/2998] Docs(conf[mermaid]): Adopt sphinx-gp-mermaid why: The vendored docs/_ext/mermaid_inline.py moved into the sphinx-gp-mermaid workspace package; load the package instead so the local copy can be dropped. what: - extra_extensions: mermaid_inline -> sphinx_gp_mermaid - Keep the explicit myst_fence_as_directive: the pinned gp-sphinx release predates the auto-routing that ships with the package; drop it on the next gp-sphinx bump - Existing _mermaid_cache entries stay valid (identical cache-key inputs), so adoption re-renders nothing --- docs/conf.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 9217bea552..c0186c62f0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -34,12 +34,14 @@ extra_extensions=[ "sphinx_autodoc_api_style", "aafig", - "mermaid_inline", + "sphinx_gp_mermaid", "tmux_layout", "sphinx_autodoc_argparse.exemplar", ], - # Route a plain ```mermaid fence to the mermaid_inline directive (the colon - # and brace forms route there already via colon_fence). + # Route a plain ```mermaid fence to the mermaid directive (the colon and + # brace forms route there already via colon_fence). Redundant once the + # pinned gp-sphinx release auto-routes when sphinx_gp_mermaid is active; + # drop this on the next gp-sphinx bump. myst_fence_as_directive=["mermaid"], intersphinx_mapping={ "python": ("https://docs.python.org/", None), From 2c89516428aca26acebc3503debd6a638e0ef0a1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Wed, 1 Jul 2026 19:09:12 -0500 Subject: [PATCH 2977/2998] Docs(ext[mermaid]): Drop vendored mermaid_inline why: The renderer now ships as sphinx-gp-mermaid and the docs build already loads the package, so the docs/_ext copy, its stylesheet, and its test suite are dead weight. what: - Delete docs/_ext/mermaid_inline.py, docs/_static/css/gp-diagram.css, and tests/test_docs_mermaid.py (the suite moved to the gp-sphinx workspace with the code) - Retarget the AGENTS.md diagrams convention, .gitignore comment, and docs.yml toolchain comment at the package; the pnpm/puppeteer provisioning itself is unchanged --- .github/workflows/docs.yml | 2 +- .gitignore | 2 +- docs/AGENTS.md | 7 +- docs/_ext/mermaid_inline.py | 513 -------------------------------- docs/_static/css/gp-diagram.css | 72 ----- tests/test_docs_mermaid.py | 343 --------------------- 6 files changed, 6 insertions(+), 933 deletions(-) delete mode 100644 docs/_ext/mermaid_inline.py delete mode 100644 docs/_static/css/gp-diagram.css delete mode 100644 tests/test_docs_mermaid.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c589d98ef8..376d1567b1 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -78,7 +78,7 @@ jobs: restore-keys: | puppeteer-${{ runner.os }}- - # Diagrams (docs/_ext/mermaid_inline.py) are rendered at build time by + # Diagrams (sphinx-gp-mermaid) are rendered at build time by # mmdc, which drives a headless Chrome. Without it the build still # succeeds but degrades diagrams to a text fallback, so provision both. - name: Install diagram toolchain (mermaid-cli + Chrome) diff --git a/.gitignore b/.gitignore index 192e58cfc8..7e36db2f4f 100644 --- a/.gitignore +++ b/.gitignore @@ -59,7 +59,7 @@ coverage.xml # Sphinx documentation docs/_build/ -# Mermaid diagram tooling (docs/_ext/mermaid_inline.py) +# Mermaid diagram tooling (sphinx-gp-mermaid) docs/node_modules/ docs/_mermaid_cache/ diff --git a/docs/AGENTS.md b/docs/AGENTS.md index e6c1142552..9a9051410e 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -87,9 +87,10 @@ page. Two mechanical conventions, separate from voice: -- **Mermaid diagrams** render to inline SVG at build time (see - `docs/_ext`). Tag any node whose label is a command, code identifier, - config key, or other symbol with `:::cmd` so it renders monospace — +- **Mermaid diagrams** render to inline SVG at build time (via the + `sphinx-gp-mermaid` package). Tag any node whose label is a command, + code identifier, config key, or other symbol with `:::cmd` so it + renders monospace — the way that text reads as code inline; leave prose and concept nodes unstyled. Prefer top-to-bottom (`flowchart TD`); wide left-to-right charts don't scale on narrow viewports. `docs/configuration/workspace-builders.md` diff --git a/docs/_ext/mermaid_inline.py b/docs/_ext/mermaid_inline.py deleted file mode 100644 index 6a1f86e736..0000000000 --- a/docs/_ext/mermaid_inline.py +++ /dev/null @@ -1,513 +0,0 @@ -"""Build-time mermaid rendering for Sphinx, producing inline SVG. - -Renders fenced ``mermaid`` blocks to inline ```` at build time via -``mmdc`` (`@mermaid-js/mermaid-cli`_), so diagrams paint with the page: there is -no client-side mermaid runtime, no asynchronous pop-in, and no layout shift. The -finished SVG ships inside ``.article-container``, so it also rides through -gp-sphinx's SPA navigation as live DOM with zero re-initialisation. - -Each diagram is rendered twice — a light and a dark variant — and both are -inlined, toggled by CSS on ``body[data-theme]`` (see ``gp-diagram.css``). Mermaid -bakes literal colours into an id-scoped, ``!important`` ``
    ' + html.escape(source) + "
    ", - ) - raise nodes.SkipNode from None - - digest = _diagram_digest(source, "") - light = _normalize_svg(light, svg_id=_svg_element_id(digest, _THEME_LIGHT)) - dark = _normalize_svg(dark, svg_id=_svg_element_id(digest, _THEME_DARK)) - - caption: str = node.get("caption", "") - alt = node.get("alt", "") or caption - aria = f' aria-label="{html.escape(alt, quote=True)}"' if alt else "" - ids: list[str] = node.get("ids", []) - fig_id = f' id="{ids[0]}"' if ids else "" - - parts = [ - f'
    ', - f'', - ( - '' - ), - ] - if caption: - parts.append(f"
    {html.escape(caption)}
    ") - parts.append("
    ") - self.body.append("".join(parts)) - raise nodes.SkipNode - - -def _depart_mermaid_inline(self: HTML5Translator, node: mermaid_inline) -> None: - """No-op; :func:`html_visit_mermaid_inline` raises ``SkipNode``.""" - - -def setup(app: Sphinx) -> dict[str, t.Any]: - """Register the directive, node, config values, and stylesheet.""" - app.add_node( - mermaid_inline, - html=(html_visit_mermaid_inline, _depart_mermaid_inline), - ) - app.add_directive("mermaid", MermaidDirective) - app.add_config_value("mermaid_inline_cmd", "", "env") - app.add_config_value("mermaid_inline_puppeteer_config", "", "env") - app.add_css_file("css/gp-diagram.css") - return { - "version": "0.1.0", - "parallel_read_safe": True, - "parallel_write_safe": True, - } diff --git a/docs/_static/css/gp-diagram.css b/docs/_static/css/gp-diagram.css deleted file mode 100644 index c032e4332a..0000000000 --- a/docs/_static/css/gp-diagram.css +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Build-time mermaid diagrams (docs/_ext/mermaid_inline.py). - * - * Each diagram is inlined twice — a light and a dark SVG — and this stylesheet - * shows exactly one. Mermaid bakes literal colours into an id-scoped, - * !important " - 'a' - '' - "" -) - - -class NormalizeCase(t.NamedTuple): - """A ``_normalize_svg`` scenario and its expected substrings.""" - - test_id: str - raw_svg: str - svg_id: str - expect_contains: tuple[str, ...] - expect_absent: tuple[str, ...] - - -_NORMALIZE_CASES: list[NormalizeCase] = [ - NormalizeCase( - test_id="width-and-height-from-viewbox", - raw_svg=( - '' - ), - svg_id="mermaid-deadbeef-light", - expect_contains=( - 'width="200"', - 'height="80"', - 'id="mermaid-deadbeef-light"', - "#mermaid-deadbeef-light{", - ), - expect_absent=("my-svg", "max-width", 'width="100%"'), - ), - NormalizeCase( - test_id="marker-references-rewritten", - raw_svg=( - '' - '' - ), - svg_id="mermaid-abc-dark", - expect_contains=("url(#mermaid-abc-dark_end)", 'width="10"', 'height="10"'), - expect_absent=("my-svg",), - ), - NormalizeCase( - test_id="decimal-viewbox-dimensions", - raw_svg=( - '' - ), - svg_id="mermaid-x-light", - expect_contains=('width="1141.25"', 'height="94"'), - expect_absent=("max-width",), - ), - NormalizeCase( - test_id="block-negative-viewbox-origin", - raw_svg=( - '' - '' - ), - svg_id="mermaid-blk-light", - expect_contains=('width="148"', 'height="194"'), - expect_absent=('width="100%"', 'width="10"'), - ), -] - - -@pytest.mark.parametrize( - "case", - _NORMALIZE_CASES, - ids=[c.test_id for c in _NORMALIZE_CASES], -) -def test_normalize_svg(case: NormalizeCase) -> None: - """``_normalize_svg`` rewrites the id, sets size, and drops ``max-width``.""" - out = mi._normalize_svg(case.raw_svg, svg_id=case.svg_id) - for needle in case.expect_contains: - assert needle in out, f"{case.test_id}: expected {needle!r}" - for needle in case.expect_absent: - assert needle not in out, f"{case.test_id}: unexpected {needle!r}" - - -class DigestCase(t.NamedTuple): - """Two ``_diagram_digest`` inputs and whether their hashes should match.""" - - test_id: str - a_source: str - a_theme: str - b_source: str - b_theme: str - expect_equal: bool - - -_DIGEST_CASES: list[DigestCase] = [ - DigestCase( - "identical-inputs-match", - "flowchart LR a-->b", - "default", - "flowchart LR a-->b", - "default", - True, - ), - DigestCase( - "theme-differs", - "flowchart LR a-->b", - "default", - "flowchart LR a-->b", - "dark", - False, - ), - DigestCase( - "source-differs", - "flowchart LR a-->b", - "default", - "flowchart LR a-->c", - "default", - False, - ), -] - - -@pytest.mark.parametrize( - "case", - _DIGEST_CASES, - ids=[c.test_id for c in _DIGEST_CASES], -) -def test_diagram_digest(case: DigestCase) -> None: - """``_diagram_digest`` is stable per input and varies by theme and source.""" - a = mi._diagram_digest(case.a_source, case.a_theme) - b = mi._diagram_digest(case.b_source, case.b_theme) - assert (a == b) is case.expect_equal - assert len(a) == 40 - - -def test_svg_element_id_is_themed_and_unique() -> None: - """``_svg_element_id`` yields distinct, theme-suffixed ids per variant.""" - digest = mi._diagram_digest("flowchart LR a-->b", "") - light = mi._svg_element_id(digest, "light") - dark = mi._svg_element_id(digest, "dark") - assert light != dark - assert light.startswith("mermaid-") - assert light.endswith("-light") - - -class PaletteCase(t.NamedTuple): - """A theme name whose furo palette must define the flowchart variables.""" - - test_id: str - theme: str - - -_PALETTE_CASES: list[PaletteCase] = [ - PaletteCase(test_id=f"{theme}-palette", theme=theme) - for theme in (mi._THEME_LIGHT, mi._THEME_DARK) -] - -_REQUIRED_PALETTE_KEYS = ( - "primaryColor", - "primaryBorderColor", - "primaryTextColor", - "lineColor", - "textColor", -) - - -@pytest.mark.parametrize( - "case", - _PALETTE_CASES, - ids=[c.test_id for c in _PALETTE_CASES], -) -def test_palette_defines_flowchart_colors(case: PaletteCase) -> None: - """Each theme palette defines the mermaid colour variables as hex values.""" - palette = mi._PALETTES[case.theme] - for key in _REQUIRED_PALETTE_KEYS: - assert key in palette, f"{case.test_id}: missing {key}" - assert palette[key].startswith("#"), f"{case.test_id}: {key} not hex" - - -def _make_translator(tmp_path: Path) -> types.SimpleNamespace: - """Return a minimal stand-in for the HTML translator the visitor needs.""" - config = types.SimpleNamespace( - mermaid_inline_cmd="", - mermaid_inline_puppeteer_config="", - ) - app = types.SimpleNamespace(confdir=str(tmp_path), config=config) - builder = types.SimpleNamespace(app=app) - return types.SimpleNamespace(builder=builder, body=[]) - - -def test_visitor_emits_dual_themed_svg( - monkeypatch: pytest.MonkeyPatch, - tmp_path: Path, -) -> None: - """The visitor inlines one light and one dark SVG with shared geometry.""" - seen: list[str] = [] - - def fake_render_cached(app: object, source: str, theme: str) -> str: - seen.append(theme) - return _FAKE_MMDC_SVG - - monkeypatch.setattr(mi, "_render_cached", fake_render_cached) - translator = _make_translator(tmp_path) - node = mi.mermaid_inline() - node["mermaid_source"] = "flowchart LR a-->b" - node["caption"] = "How it flows" - node["alt"] = "" - - with pytest.raises(nodes.SkipNode): - mi.html_visit_mermaid_inline(t.cast("t.Any", translator), node) - - html = "".join(translator.body) - assert seen == [mi._THEME_LIGHT, mi._THEME_DARK] - assert html.count("gp-diagram--light") == 1 - assert html.count("gp-diagram--dark") == 1 - assert "
    How it flows
    " in html - assert "my-svg" not in html - # Both variants normalized to identical geometry -> shift-free toggle. - assert html.count('viewBox="0 0 200 80"') == 2 - - -def test_visitor_falls_back_when_renderer_missing( - monkeypatch: pytest.MonkeyPatch, - tmp_path: Path, - caplog: pytest.LogCaptureFixture, -) -> None: - """A missing renderer degrades to a text fallback and warns once.""" - monkeypatch.setattr(mi, "_render_warned", False) - - def boom(app: object, source: str, theme: str) -> str: - msg = "no mmdc" - raise mi.MermaidRendererMissing(msg) - - monkeypatch.setattr(mi, "_render_cached", boom) - translator = _make_translator(tmp_path) - node = mi.mermaid_inline() - node["mermaid_source"] = "flowchart LR a-->b" - node["caption"] = "" - node["alt"] = "" - - with caplog.at_level(logging.WARNING), pytest.raises(nodes.SkipNode): - mi.html_visit_mermaid_inline(t.cast("t.Any", translator), node) - - html = "".join(translator.body) - assert 'class="gp-diagram-fallback"' in html - assert "flowchart LR a-->b" in html - warnings = [r for r in caplog.records if r.levelno == logging.WARNING] - assert any("mermaid render unavailable" in r.getMessage() for r in warnings) - - -def test_render_cache_is_idempotent( - monkeypatch: pytest.MonkeyPatch, - tmp_path: Path, -) -> None: - """``_render_cached`` invokes mmdc once, then serves from the disk cache.""" - calls = {"n": 0} - - def fake_render(app: object, source: str, config_json: str) -> str: - calls["n"] += 1 - return _FAKE_MMDC_SVG - - monkeypatch.setattr(mi, "_render", fake_render) - config = types.SimpleNamespace( - mermaid_inline_cmd="", - mermaid_inline_puppeteer_config="", - ) - app = types.SimpleNamespace(confdir=str(tmp_path), config=config) - - first = mi._render_cached( - t.cast("t.Any", app), "flowchart LR a-->b", mi._THEME_LIGHT - ) - second = mi._render_cached( - t.cast("t.Any", app), "flowchart LR a-->b", mi._THEME_LIGHT - ) - - assert first == second == _FAKE_MMDC_SVG - assert calls["n"] == 1 - assert list((tmp_path / "_mermaid_cache").glob("*.svg")) - - -def test_setup_registers_components() -> None: - """``setup`` registers the node, directive, config values, css, and is safe.""" - recorded: dict[str, list[t.Any]] = { - "nodes": [], - "directives": [], - "config": [], - "css": [], - } - - def add_node(node: object, **kwargs: object) -> None: - recorded["nodes"].append(node) - - def add_directive(name: str, cls: object) -> None: - recorded["directives"].append((name, cls)) - - def add_config_value(name: str, default: object, rebuild: object) -> None: - recorded["config"].append(name) - - def add_css_file(name: str, **kwargs: object) -> None: - recorded["css"].append(name) - - app = types.SimpleNamespace( - add_node=add_node, - add_directive=add_directive, - add_config_value=add_config_value, - add_css_file=add_css_file, - ) - meta = mi.setup(t.cast("t.Any", app)) - - assert meta["parallel_read_safe"] is True - assert meta["parallel_write_safe"] is True - assert mi.mermaid_inline in recorded["nodes"] - assert ("mermaid", mi.MermaidDirective) in recorded["directives"] - assert "mermaid_inline_cmd" in recorded["config"] - assert "mermaid_inline_puppeteer_config" in recorded["config"] - assert "css/gp-diagram.css" in recorded["css"] From 5aa5e905e953924f2169383ae0b36d91b3c8749a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 07:46:05 -0500 Subject: [PATCH 2978/2998] docs(CHANGES): sphinx-gp-mermaid docs renderer why: Record for 1.74.0 that the docs mermaid renderer moved from a vendored extension to the reusable upstream sphinx-gp-mermaid package, with rendered output unchanged. what: - Add a Development entry under the unreleased 1.74.0 section --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index 3c03028899..d1ebfe2fed 100644 --- a/CHANGES +++ b/CHANGES @@ -64,6 +64,14 @@ more internal API cross-references resolve to their pages. The {ref}`quickstart` and {ref}`about-tmux` primer also pick up corrected version requirements, tooling, and commands. +### Development + +#### Docs adopt the upstream `sphinx-gp-mermaid` renderer (#1073) + +The build-time mermaid diagram renderer, previously bundled with the docs, now +comes from the reusable `sphinx-gp-mermaid` package (a dev/docs dependency). +Rendered output is unchanged. + ## tmuxp 1.73.0 (2026-06-28) tmuxp 1.73.0 makes the workspace build step pluggable and tunable. A workspace can now build through a third-party builder selected by registered entry-point name or Python import path, and a new `workspace_builder_options` catalog controls the pane-readiness wait per workspace. The built-in builder stays the default, so existing workspaces keep working — though the new `pane_readiness: auto` default skips the prompt wait on non-zsh shells. See {ref}`custom-workspace-builders` for the guide. From 55acbff559f912ca44e1f29172564eed88179b34 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 08:11:41 -0500 Subject: [PATCH 2979/2998] deps(libtmux[~=0.61.0]): Bump from ~=0.60.0 for 3.7a/3.7b, get_version_str why: Pick up libtmux 0.61.0, which hardens support for the tmux 3.7 patch line and adds a helper for the raw tmux version string. what: - Bump libtmux dependency specifier ~=0.60.0 -> ~=0.61.0 in pyproject.toml - Update uv.lock (resolved 0.60.0 -> 0.61.0) libtmux 0.61.0 (2026-07-04): - break_pane() keeps tmux's default window name on tmux 3.7a/3.7b instead of forcing "libtmux" (#699) - get_version_str() returns the raw tmux version with its point-release suffix intact (e.g. "3.7a"), where get_version() strips it for numeric comparison (#699) - Test suite now passes against tmux 3.7a and 3.7b (#698) Release: https://github.com/tmux-python/libtmux/releases/tag/v0.61.0 Changelog: https://libtmux.git-pull.com/history.html#libtmux-0-61-0-2026-07-04 --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ec0e402e53..81c1220475 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ include = [ { path = "conftest.py", format = "sdist" }, ] dependencies = [ - "libtmux~=0.60.0", + "libtmux~=0.61.0", "PyYAML>=6.0" ] diff --git a/uv.lock b/uv.lock index aac16baafd..8917b16310 100644 --- a/uv.lock +++ b/uv.lock @@ -608,11 +608,11 @@ wheels = [ [[package]] name = "libtmux" -version = "0.60.0" +version = "0.61.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/e2/c2fc23e871855cb3feb5119ab3426656b2caa83f220fb6f1b7a770cb887e/libtmux-0.60.0.tar.gz", hash = "sha256:03d9740fd18090378a1f1a763403b127808b327b1466a1d3812c562f595ce06f", size = 527549, upload-time = "2026-06-28T21:19:35.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/c2/6abbac4420c35b3f1140c72607117236b160173f74fd86941f99b28375d5/libtmux-0.61.0.tar.gz", hash = "sha256:2d6081081a629b9236a36a64f874667533811d2ce5a1b0caa9c821f4d9d2e618", size = 546122, upload-time = "2026-07-04T12:57:36.401Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/c3/e524f498fe5dfc26c975ec8b52332fdd0b50e020f3ecc09423ba5d4ebc61/libtmux-0.60.0-py3-none-any.whl", hash = "sha256:a085e5653709d9e1c809c68f7daf1cd55c8af1ca938eb1e866388b9b13905ed3", size = 117368, upload-time = "2026-06-28T21:19:33.635Z" }, + { url = "https://files.pythonhosted.org/packages/73/14/934d0d9076d1d46fcc71f3397daea7921363781674337084b15d1bbcbf84/libtmux-0.61.0-py3-none-any.whl", hash = "sha256:b9315db6600757f840a8f16438725103e579aaa4be3c32728c105f2c284330df", size = 118059, upload-time = "2026-07-04T12:57:34.598Z" }, ] [[package]] @@ -1685,7 +1685,7 @@ testing = [ [package.metadata] requires-dist = [ - { name = "libtmux", specifier = "~=0.60.0" }, + { name = "libtmux", specifier = "~=0.61.0" }, { name = "pyyaml", specifier = ">=6.0" }, ] From 885834b5ffefe42b62d2a5830c7375b295fa25a7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 08:12:57 -0500 Subject: [PATCH 2980/2998] cli/debug_info(feat[version]): Report raw tmux patch version why: libtmux 0.61.0 adds get_version_str(), which keeps the tmux point-release suffix (e.g. "3.7a") that get_version() strips for numeric comparison. debug-info exists for bug reports, where the exact patch release matters -- 3.7 and 3.7a differ in behavior. what: - Switch debug-info's tmux_version from str(get_version()) to get_version_str(), preserving the letter suffix - Add a test asserting the raw version reaches the output verbatim plugin.py keeps get_version() for LooseVersion constraint checks. --- src/tmuxp/cli/debug_info.py | 4 ++-- tests/cli/test_debug_info.py | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/tmuxp/cli/debug_info.py b/src/tmuxp/cli/debug_info.py index 5454294462..4e1bf0c5d5 100644 --- a/src/tmuxp/cli/debug_info.py +++ b/src/tmuxp/cli/debug_info.py @@ -12,7 +12,7 @@ import typing as t from libtmux.__about__ import __version__ as libtmux_version -from libtmux.common import get_version, tmux_cmd +from libtmux.common import get_version_str, tmux_cmd from tmuxp.__about__ import __version__ from tmuxp._internal.private_path import PrivatePath, collapse_home_in_string @@ -132,7 +132,7 @@ def _collect_debug_info() -> dict[str, t.Any]: }, "python_version": " ".join(sys.version.split("\n")), "system_path": collapse_home_in_string(os.environ.get("PATH", "")), - "tmux_version": str(get_version()), + "tmux_version": get_version_str(), "libtmux_version": libtmux_version, "tmuxp_version": __version__, "tmux_path": _private(shutil.which("tmux")), diff --git a/tests/cli/test_debug_info.py b/tests/cli/test_debug_info.py index bb1c0bb479..9aba904d13 100644 --- a/tests/cli/test_debug_info.py +++ b/tests/cli/test_debug_info.py @@ -167,3 +167,26 @@ def test_debug_info_json_paths_use_private_path( assert data["shell"] == "~/.local/bin/zsh", ( f"Expected shell path to be masked with ~, got: {data['shell']}" ) + + +def test_debug_info_reports_raw_tmux_version( + monkeypatch: pytest.MonkeyPatch, + capsys: pytest.CaptureFixture[str], +) -> None: + """debug-info reports tmux's raw version, keeping the point-release suffix. + + libtmux's ``get_version()`` strips the letter suffix (``"3.7a"`` -> ``"3.7"``) + for numeric comparison; ``get_version_str()`` keeps it. Bug reports want the + exact patch release, so debug-info reads the raw string verbatim. + """ + monkeypatch.setenv("SHELL", "/bin/bash") + monkeypatch.setattr( + "tmuxp.cli.debug_info.get_version_str", + lambda *args, **kwargs: "3.7a", + ) + + cli.cli(["debug-info", "--json"]) + output = capsys.readouterr().out + data = json.loads(output) + + assert data["tmux_version"] == "3.7a" From 7f6f76d4a2a7dd82486cadd5e289bc6b62dec1e9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 08:14:32 -0500 Subject: [PATCH 2981/2998] docs(CHANGES): libtmux ~=0.60.0 -> ~=0.61.0 why: Document the dependency bump and the debug-info change for the upcoming 1.74.0 release. what: - Add ### Dependencies entry for the libtmux 0.61.0 minimum bump - Add ### What's new entry for debug-info reporting the raw tmux patch version --- CHANGES | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGES b/CHANGES index d1ebfe2fed..b3d71d3390 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,26 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Dependencies + +#### Minimum `libtmux~=0.61.0` (was `~=0.60.0`) (#1074) + +Picks up libtmux 0.61.0, which hardens tmux 3.7 patch-line support: +{meth}`~libtmux.Pane.break_pane` keeps tmux's own default window name on +tmux 3.7a/3.7b instead of forcing `libtmux`, and the new +{func}`~libtmux.common.get_version_str` exposes the raw tmux version +string. tmux 3.2a-3.6 are unaffected. + +### What's new + +#### `tmuxp debug-info` reports the exact tmux patch release (#1074) + +`tmuxp debug-info` now shows tmux's full version, keeping the +point-release letter (for example `3.7a`) that was previously normalized +away to `3.7`. Because tmux patch releases can differ in behavior, the +precise release is what a bug report needs. This reads libtmux 0.61.0's +{func}`~libtmux.common.get_version_str`. + ### Documentation #### Themed diagrams across the docs (#1071) From 91ac8519ac7d54bf540e3488637b9d26a1ee80ef Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 4 Jul 2026 08:45:40 -0500 Subject: [PATCH 2982/2998] Tag v1.74.0 why: Cut the 1.74.0 release, pairing the libtmux 0.61.0 upgrade with the documentation overhaul accumulated since 1.73.0. what: - Date the 1.74.0 CHANGES section (2026-07-04) and add its lead paragraph - Open a fresh 1.75.0 (Yet to be released) placeholder - Bump version 1.73.0 -> 1.74.0 in pyproject.toml and __about__.py - Refresh uv.lock --- CHANGES | 6 +++++- pyproject.toml | 2 +- src/tmuxp/__about__.py | 2 +- uv.lock | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index b3d71d3390..49eb9ef957 100644 --- a/CHANGES +++ b/CHANGES @@ -36,7 +36,7 @@ Run the developmental install with: $ tmuxp@next load yoursession ``` -## tmuxp 1.74.0 (Yet to be released) +## tmuxp 1.75.0 (Yet to be released) @@ -44,6 +44,10 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +## tmuxp 1.74.0 (2026-07-04) + +tmuxp 1.74.0 pairs a libtmux upgrade with a documentation overhaul. It bumps libtmux to 0.61.0 — hardening tmux 3.7 patch-line support — and teaches `tmuxp debug-info` to report the exact tmux patch release (`3.7a`/`3.7b`) instead of the numeric-normalized version. The docs also gain theme-aware inline diagrams and a concept-first rewrite that leads with what each feature is before its configuration. + ### Dependencies #### Minimum `libtmux~=0.61.0` (was `~=0.60.0`) (#1074) diff --git a/pyproject.toml b/pyproject.toml index 81c1220475..8b5a634713 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tmuxp" -version = "1.73.0" +version = "1.74.0" description = "Session manager for tmux, which allows users to save and load tmux sessions through simple configuration files." requires-python = ">=3.10,<4.0" authors = [ diff --git a/src/tmuxp/__about__.py b/src/tmuxp/__about__.py index 4bfc1730c9..6356e4c242 100644 --- a/src/tmuxp/__about__.py +++ b/src/tmuxp/__about__.py @@ -8,7 +8,7 @@ __title__ = "tmuxp" __package_name__ = "tmuxp" -__version__ = "1.73.0" +__version__ = "1.74.0" __description__ = "tmux session manager" __email__ = "tony@git-pull.com" __author__ = "Tony Narlock" diff --git a/uv.lock b/uv.lock index 8917b16310..4953f4c511 100644 --- a/uv.lock +++ b/uv.lock @@ -1621,7 +1621,7 @@ wheels = [ [[package]] name = "tmuxp" -version = "1.73.0" +version = "1.74.0" source = { editable = "." } dependencies = [ { name = "libtmux" }, From acd7a61fbf36df5a8eee25dac7677a6141bb9227 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Jul 2026 16:06:04 -0500 Subject: [PATCH 2983/2998] py(deps[uv]) Whitelist sphinx-gp-highlighting cooldown why: New gp-sphinx workspace package; without an `exclude-newer-package` exemption the release cooldown blocks `uv sync` on Python 3.15 resolution splits. what: - Add sphinx-gp-highlighting = false to [tool.uv.exclude-newer-package] - Refresh the lockfile options block to match --- pyproject.toml | 1 + uv.lock | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8b5a634713..a7dba223aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,6 +137,7 @@ sphinx-autodoc-pytest-fixtures = false sphinx-autodoc-sphinx = false sphinx-autodoc-typehints-gp = false sphinx-fonts = false +sphinx-gp-highlighting = false sphinx-gp-mermaid = false sphinx-gp-opengraph = false sphinx-gp-llms = false diff --git a/uv.lock b/uv.lock index 4953f4c511..d091d40808 100644 --- a/uv.lock +++ b/uv.lock @@ -19,8 +19,9 @@ sphinx-autodoc-sphinx = false sphinx-autodoc-api-style = false sphinx-autodoc-fastmcp = false sphinx-autodoc-pytest-fixtures = false -sphinx-gp-llms = false +sphinx-gp-highlighting = false sphinx-autodoc-argparse = false +sphinx-gp-llms = false sphinx-ux-autodoc-layout = false sphinx-ux-badges = false gp-libs = false From 9772829c6ce78c6de7703c6dc957ce6edec229b1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Jul 2026 16:06:32 -0500 Subject: [PATCH 2984/2998] py(deps[docs]) gp-sphinx 0.0.1a33 why: Pick up the gp-sphinx 0.0.1a33 docs-family release from PyPI, which ships the sphinx-gp-highlighting package. what: - Bump gp-sphinx and its sibling pins 0.0.1a32 -> 0.0.1a33 - Add sphinx-gp-highlighting==0.0.1a33 to the dev/docs groups - Refresh the lockfile to match --- pyproject.toml | 18 ++++---- uv.lock | 113 +++++++++++++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 55 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a7dba223aa..7be7c60599 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,10 +60,11 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a32", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a32", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a32", - "sphinx-gp-mermaid==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a33", + "sphinx-gp-highlighting==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a33", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -87,10 +88,11 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a32", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a32", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a32", - "sphinx-gp-mermaid==0.0.1a32", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a33", + "sphinx-gp-highlighting==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a33", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index d091d40808..72b1b25728 100644 --- a/uv.lock +++ b/uv.lock @@ -414,7 +414,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -424,9 +424,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/21/673b50e07bd4600bced2cf8a52cab444793c0ab5e32c74b8db137c2cdf9a/gp_furo_theme-0.0.1a32.tar.gz", hash = "sha256:2faa3715a727d64c7dbfbacb4999f994cd19dbb731466fbfb92133ae37f9497a", size = 34308, upload-time = "2026-07-04T11:54:25.507Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/76/60aabfebbb1f1ba252f6b6e88c0ebfbf71f44efa24653fce927523b82492/gp_furo_theme-0.0.1a33.tar.gz", hash = "sha256:9e1b88480e9934e9bdcd6275e6ca2b2e0ebdfc158d2b1168e65c5cabc04eb8fe", size = 34309, upload-time = "2026-07-05T20:59:18.128Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/7e/26e4fd2494249bc5b29e12e738cf2b12a78f0ca2afe12307426c5e5ac443/gp_furo_theme-0.0.1a32-py3-none-any.whl", hash = "sha256:d13a9281f4d92c15475a40a23b3b152619c6e85e70d8c626c72e5a36ce0b6de3", size = 43660, upload-time = "2026-07-04T11:54:04.898Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9a/f49007947023fc6434f99f024ff07e93a29bf3b7516d5ae891ebf87c0003/gp_furo_theme-0.0.1a33-py3-none-any.whl", hash = "sha256:c551e2cd2d5183ba2b3a5f27abe23684800ed4c5c74a9664fa9d87aabf5c8ce4", size = 43660, upload-time = "2026-07-05T20:58:52.094Z" }, ] [[package]] @@ -445,7 +445,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -467,9 +467,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/d5/d3368d24f899bb0914632be7a982e7c2ecf8e3eb6f7fad527c2e1b3e8de6/gp_sphinx-0.0.1a32.tar.gz", hash = "sha256:2eca9add0fc6b0d0d72c96faa13d14d7c25edcb87041c0e5eea82d342e120e76", size = 19762, upload-time = "2026-07-04T11:54:26.28Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/24/77c1e04cc5ba09a6ee86f4a9ae9c32188d9fd130ded03a85bbcfdfb4f697/gp_sphinx-0.0.1a33.tar.gz", hash = "sha256:f4641cb9ca80bc27ff0d56fba7d52d0ae551e6af1b2f29ef934442d05abfd1cf", size = 19762, upload-time = "2026-07-05T20:59:19.043Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/e8/ca57b2e4c51b5c0c159dd1eec70e4e40ddfa72260402b64124bf35267b0c/gp_sphinx-0.0.1a32-py3-none-any.whl", hash = "sha256:ebcd29e0afbdd414b0ad7e66439c2b4ca2de2ea45ca7c3da4df8c0e06220b952", size = 20280, upload-time = "2026-07-04T11:54:06.147Z" }, + { url = "https://files.pythonhosted.org/packages/20/3c/02dd665b29fad830a696873a9f33abc675c2259a0add1c596279a7526836/gp_sphinx-0.0.1a33-py3-none-any.whl", hash = "sha256:c5447abf6c300514accf917e93fd93d1893dda5c1d929e0b2f31d2e0967ff1d5", size = 20282, upload-time = "2026-07-05T20:58:53.655Z" }, ] [[package]] @@ -1324,7 +1324,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1332,14 +1332,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/40/39e04757fbb9ad30d1bd8cbe6c9c379a4b308b3c5b0382add6d8fb32d11d/sphinx_autodoc_api_style-0.0.1a32.tar.gz", hash = "sha256:8f70765e35ff1efe0b3a3703d22ea2466570c14a2ed7cda99559f436383d9892", size = 8977, upload-time = "2026-07-04T11:54:27.079Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/76/080b7c325b8f60b4cc57bdc39858baebe2a9e5da31069db98da73ea54036/sphinx_autodoc_api_style-0.0.1a33.tar.gz", hash = "sha256:ddfbe402e57b20b99dbc6b1524da0310c0cdd031058c9ef1e73cdd9bc2b66421", size = 8978, upload-time = "2026-07-05T20:59:19.918Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/bc/5c4d7a158c92f8e1201c2b158f0c8a556407533ce0db2a824392bfd5cc7b/sphinx_autodoc_api_style-0.0.1a32-py3-none-any.whl", hash = "sha256:d4d64df73c8d398ae37aef17b199b5a955d0aded73e48571e4cf85fb05837c6f", size = 9064, upload-time = "2026-07-04T11:54:07.378Z" }, + { url = "https://files.pythonhosted.org/packages/71/79/2adee7e13b1f5848333d0024269d25a86e2095d70dc7a37d14eac465f342/sphinx_autodoc_api_style-0.0.1a33-py3-none-any.whl", hash = "sha256:c6e10bb27422dd047e490e4b55d7c6129ba172a6292e6a438f54891c84d2caf5", size = 9066, upload-time = "2026-07-05T20:58:55.379Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1347,22 +1347,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/64/826b8d3d85e279492380483e4e2db35df08447297eb6c8d0a6e57020c9e4/sphinx_autodoc_argparse-0.0.1a32.tar.gz", hash = "sha256:f0ecfe4b061cde8fd1a9beb8d6166ed5382c6f4c4ea6b98b6f13fb57859f6224", size = 42801, upload-time = "2026-07-04T11:54:27.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/ab/d57d083b043aecf4a98fd9dee2c83a9b1d0954ca343cfa11a8e1af6f7056/sphinx_autodoc_argparse-0.0.1a33.tar.gz", hash = "sha256:4ae9a7955eee39ccab6eae53818444b7b00f1412093bb45f68d36e533bf331de", size = 42804, upload-time = "2026-07-05T20:59:20.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c4/9976edafd52e57a77f2c9b52320fd5ae28089a326ff6bb2316734cbe4694/sphinx_autodoc_argparse-0.0.1a32-py3-none-any.whl", hash = "sha256:c68f79619541611061bf77170956ff47706ed18af67075be96eaa88340673e4e", size = 47653, upload-time = "2026-07-04T11:54:08.629Z" }, + { url = "https://files.pythonhosted.org/packages/f2/07/66c7c4effef6d9f4562b055459b1524f23e6e06649ed004c3eb565c468ce/sphinx_autodoc_argparse-0.0.1a33-py3-none-any.whl", hash = "sha256:625223f98b8ac8ce259dd1049d803139878d3d7282c1cc6d4d858c0e067a9f9e", size = 47654, upload-time = "2026-07-05T20:58:56.631Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/50/0a942b324511faf127fa1efbba82f764d32f024940c9366c9c0750cba037/sphinx_autodoc_typehints_gp-0.0.1a32.tar.gz", hash = "sha256:9e40e0a9de37fd53bd9821e1dd089cc088a9ce5e8ca28bb8d2289c2a7f7089e5", size = 36501, upload-time = "2026-07-04T11:54:32.483Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/f6/2e63ba25c40c81dda92069c83a38db483e0510466c286b0fcb81d2ef1899/sphinx_autodoc_typehints_gp-0.0.1a33.tar.gz", hash = "sha256:c7b1da543002d9b61e46ab2e22d9bdceb8f8acec790e5651e0bbeca5979571e4", size = 36501, upload-time = "2026-07-05T20:59:25.657Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/af/dfd3b19faf45409b41ee8e0cdf9487086d7e2066dd4595fa8ae730530214/sphinx_autodoc_typehints_gp-0.0.1a32-py3-none-any.whl", hash = "sha256:ac1937bde4781cb83a850aee90df746e952fe6f5ae4712dd8f1304eef07af379", size = 38656, upload-time = "2026-07-04T11:54:14.118Z" }, + { url = "https://files.pythonhosted.org/packages/92/2b/55d6d5ce62d2b9d892622661a2408fff6624093dc0cd8ee65a7c514e2dbf/sphinx_autodoc_typehints_gp-0.0.1a33-py3-none-any.whl", hash = "sha256:dd7c0522383146d4caf8f10db5145ffa0ed405837e4d5e57c500a6a242e5cf9b", size = 38657, upload-time = "2026-07-05T20:59:04.037Z" }, ] [[package]] @@ -1424,81 +1424,96 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/98/564c7286058a70cac4920232a3e12810b0f7c7c12cc0af721de7a4ec7dde/sphinx_fonts-0.0.1a32.tar.gz", hash = "sha256:c7bfa095ea63489ce7c5c980aa0caa737ca1a17fbbb394c6572ee8d4278aebd3", size = 5788, upload-time = "2026-07-04T11:54:33.261Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/97/dae5e823ab8474828f870bfdf2bc6003448beec1365e42391ce9fc55615c/sphinx_fonts-0.0.1a33.tar.gz", hash = "sha256:f5e8c304086ebda2b739c3f72127d2a1ad88153c8c7b59b03b1a015b8e072847", size = 5790, upload-time = "2026-07-05T20:59:26.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/c5/917086ef201db6b21d8743236cb7ac549fd27846bdd7d70773d87800ae75/sphinx_fonts-0.0.1a32-py3-none-any.whl", hash = "sha256:2a147d87b79986292d36957f4135da280432f2e03c70e4a160065c9e7bc0a7eb", size = 4361, upload-time = "2026-07-04T11:54:15.441Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/d5526216ce75d361f9aebd6bc052e0dd1b200870bc0e082468d22a38b65f/sphinx_fonts-0.0.1a33-py3-none-any.whl", hash = "sha256:4eaa49f30bfa3e2705a6fe7f73865840e6fc387e69a8cb9872543e86ac3ed111", size = 4362, upload-time = "2026-07-05T20:59:05.315Z" }, +] + +[[package]] +name = "sphinx-gp-highlighting" +version = "0.0.1a33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/64/391a3cce536f5c94e27a9bfe8a2642b7a94db3c2ac888ab4b041813e2275/sphinx_gp_highlighting-0.0.1a33.tar.gz", hash = "sha256:6dfd4ac73478497f3e5a277a38b10698dd8d18819d404aa7a9e3aee5b901e19a", size = 7452, upload-time = "2026-07-05T20:59:27.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/43/afaf5370f0992731e9c7554d51661b7328db3836c19549dabad73702a4b2/sphinx_gp_highlighting-0.0.1a33-py3-none-any.whl", hash = "sha256:87e8411505d6f81af95c60d2053e3316c65ed6fee026ff3ad2e1c7180965650d", size = 7389, upload-time = "2026-07-05T20:59:06.446Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/91/c12bb22eff9c838ef51e4ad2f2f8e8c2286957bd804a55cd823a89b77f1e/sphinx_gp_llms-0.0.1a32.tar.gz", hash = "sha256:b043a9b81b6c2a273820092afe02a4d9c0c63021b5054bf5dab42aa7d8730d9f", size = 9910, upload-time = "2026-07-04T11:54:34.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/cc/2c09d454b8864e0a097e231759de3c75525adb7f7e5a8a671db7f7719f11/sphinx_gp_llms-0.0.1a33.tar.gz", hash = "sha256:8314ba66140210d7cfe8ab2f5be6b7a805df9a6076b96ff16219b1ca18783504", size = 9910, upload-time = "2026-07-05T20:59:28.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/f0/1191ce0af7c39192db0ab0c02b6b57e98e91344a2e813adc56a73ba512f8/sphinx_gp_llms-0.0.1a32-py3-none-any.whl", hash = "sha256:4ee8bc2824b88f4182d8857010446d0102697a1eba29946057ba3c0c21cf0c8f", size = 12636, upload-time = "2026-07-04T11:54:16.667Z" }, + { url = "https://files.pythonhosted.org/packages/56/c3/7e338f137ac12a1343c86f0ed1ec11bebc05dc00d159c3271594005b8070/sphinx_gp_llms-0.0.1a33-py3-none-any.whl", hash = "sha256:a4f2b2e037b9f6366482a6acbaa460d3320e32d5bb2581e4cc9d0d070a93d166", size = 12637, upload-time = "2026-07-05T20:59:07.823Z" }, ] [[package]] name = "sphinx-gp-mermaid" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/e8/3397aecb017a8beab4f13122ed6e961cc0b96eb3a0b5bb9535f7a533b741/sphinx_gp_mermaid-0.0.1a32.tar.gz", hash = "sha256:01e035add8e998daf25a433146ef57854a955c0b39219f4a71b1ac9cc9d1c84e", size = 70478, upload-time = "2026-07-04T11:54:35.57Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/1e/70bfe4ac964dd6a99399c6bf534fbf7ba555e78362bbefbc0e354c4c47c8/sphinx_gp_mermaid-0.0.1a33.tar.gz", hash = "sha256:569541543f4a7e9aa26c935718162da438f63268b48db32a3d3d48a1b6ec0697", size = 71321, upload-time = "2026-07-05T20:59:29.391Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/46/9ecc34f7e39c235653907e3dd5a26ba72926e6e2caaad7decd7f4f7f314c/sphinx_gp_mermaid-0.0.1a32-py3-none-any.whl", hash = "sha256:6ffefab4bac2b77dc726aff6c5f7ec53a4fba58152c0cd2fa6505a80b0846d07", size = 11895, upload-time = "2026-07-04T11:54:17.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fb/871bc7600222d93a270add236c80f9b8b6460f7a5c81fccde5801e6708c7/sphinx_gp_mermaid-0.0.1a33-py3-none-any.whl", hash = "sha256:d520f808ed308eb469f7cacd8c79348334f23e1a5bec05bcfdc63aa932efb8f8", size = 12812, upload-time = "2026-07-05T20:59:09.114Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/2c/bbdd1f5adafacd3ef2d8237f5af1b95459b938a10f4f73398d75124254d1/sphinx_gp_opengraph-0.0.1a32.tar.gz", hash = "sha256:5d9c445248605d646a64ec2cbcb15aaa5ec3ef8ab10957a82533e32ed6efafd7", size = 11946, upload-time = "2026-07-04T11:54:36.502Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/32/5d3621a1b8f2734469f2ecfb3f8600c31dfa4680d0740ec10a30afbd7f31/sphinx_gp_opengraph-0.0.1a33.tar.gz", hash = "sha256:e244a9c4c878251412bb1fe4cd8e334f0fc43617181c4dea396ec5c3e7128b24", size = 11945, upload-time = "2026-07-05T20:59:30.361Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/6b/e4b89d1250195837abf3885b65ffc092924d801cb472481f3d02987f50a5/sphinx_gp_opengraph-0.0.1a32-py3-none-any.whl", hash = "sha256:5010e191aa722397d5914e7e3195f2d3cc1c4d166c4038a883227a20c7cbb301", size = 12185, upload-time = "2026-07-04T11:54:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/a8/04/b6d54579356384c5c891927d79b4794bee3d044f94bba4872c964331b3f3/sphinx_gp_opengraph-0.0.1a33-py3-none-any.whl", hash = "sha256:dcda4aff8b6a2288623e007e3b92996442a920f1a4da011fa037d2c525ae949c", size = 12184, upload-time = "2026-07-05T20:59:10.255Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/32/9f7d32566a090f140ae0dd80fa4e8575a0e676434212b89afedbf048b114/sphinx_gp_sitemap-0.0.1a32.tar.gz", hash = "sha256:66cea7cb58646e8ecbcb3087135c2f1bb4dcd3870b659cc1d37e25dc0e06798c", size = 9958, upload-time = "2026-07-04T11:54:37.244Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/a9/cab24647aca36ca8c4d961c3eaf906bc0bf1f1ae8e8248aa5a7a72c3381d/sphinx_gp_sitemap-0.0.1a33.tar.gz", hash = "sha256:7177a71c6cedc577a1828bac60cff2fd60b3323da527d8dd012e6bedd88065ce", size = 9956, upload-time = "2026-07-05T20:59:31.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/0e/f20d72402ea14bcb96ca7608264f621ad5d5cb8d933a14a4612cf8c2fa78/sphinx_gp_sitemap-0.0.1a32-py3-none-any.whl", hash = "sha256:276e17cca3f9a9418095f046e591589cdf750b20166d34d71d5e86a8bdf0b804", size = 8980, upload-time = "2026-07-04T11:54:19.95Z" }, + { url = "https://files.pythonhosted.org/packages/f9/17/83f60b5009886ef70c73b5935f49e38effe64fa53218784cf72fab8eae7e/sphinx_gp_sitemap-0.0.1a33-py3-none-any.whl", hash = "sha256:613444bf15ef05fcf025e0997321b459e16edffa75a918ac6c54a3482009e382", size = 8982, upload-time = "2026-07-05T20:59:11.429Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/fe/e28b12a7507608aae092b3f5e655431059b7492fe1ffa8fe216b6b82d7ea/sphinx_gp_theme-0.0.1a32.tar.gz", hash = "sha256:483cad379b19d87ae51b6d4d466f56b25664ec29238c8a4516b9cd903e94481e", size = 18287, upload-time = "2026-07-04T11:54:37.963Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/62/e55df0428b61f184034f66ce7f094f336eb6538c2206325397b2d18ae215/sphinx_gp_theme-0.0.1a33.tar.gz", hash = "sha256:08ca545683715ee8dd3a68083f07453d5d4c2bc70a7df9c709859be17e2fa965", size = 18289, upload-time = "2026-07-05T20:59:32.206Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/ce/5e675df472b0611e7a735b4303d037f8ee02c3bda350c2d6753c284ad4c6/sphinx_gp_theme-0.0.1a32-py3-none-any.whl", hash = "sha256:497bee19c6fbfd4a75ac13305208761837bb7d53b42301282e98e5cd9f60097b", size = 19886, upload-time = "2026-07-04T11:54:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6c/bb66179307b4622db1ad4e9542eaefc079b5a5b893c50cbf1e8990819a66/sphinx_gp_theme-0.0.1a33-py3-none-any.whl", hash = "sha256:cc3f7de56bfeee2f37bffa26d509e8e8cac178378cff644abd3d5ac43f9fe370", size = 19888, upload-time = "2026-07-05T20:59:12.866Z" }, ] [[package]] @@ -1516,28 +1531,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/ad/1f9332428a464f508381277ff746d889a9707f40372be5dd4bf6322d8f04/sphinx_ux_autodoc_layout-0.0.1a32.tar.gz", hash = "sha256:8e09495db4c4f22de78f57e4b12a4b4275025f6d0fe633617af6d3029b5e2da0", size = 30603, upload-time = "2026-07-04T11:54:38.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/f3/da87e32ffaba14d5536dfb290dad0dc790257433a8cac0d575f3a0d07a34/sphinx_ux_autodoc_layout-0.0.1a33.tar.gz", hash = "sha256:71791469867946b7341ce3e6a8d192bfefc534f26fed447f77da13f46e363dcd", size = 30603, upload-time = "2026-07-05T20:59:33.228Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/d4/dd8a974db360b6989d464e2918466454a7961541f430dcec49b36dbd705f/sphinx_ux_autodoc_layout-0.0.1a32-py3-none-any.whl", hash = "sha256:ea47497f16f8e56d0c8072fd8e6424259b4987fe2e6bbf3d0ebcca46d7db817e", size = 34999, upload-time = "2026-07-04T11:54:22.242Z" }, + { url = "https://files.pythonhosted.org/packages/fb/44/68143caeab975add760ff2ce4fca4b0569d20e304c0ee42182d1a649e460/sphinx_ux_autodoc_layout-0.0.1a33-py3-none-any.whl", hash = "sha256:855027108528a770e40cb0521b78f38c085f0779d5efe167b3248606293e8d22", size = 34999, upload-time = "2026-07-05T20:59:14.217Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a32" +version = "0.0.1a33" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/9b/886dad978434d0307bf94c8e348779e37f53389febdcd9a85c262f3db2cb/sphinx_ux_badges-0.0.1a32.tar.gz", hash = "sha256:e78d170cc5f8a9a456b6356333fca66ad22af70f76a5cae4c8f49509b21161ea", size = 16724, upload-time = "2026-07-04T11:54:39.951Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/7c/5b8a75ad4fbc0e64d3d2b9b76460568fb3a2715edecdbaea37d1276ea95b/sphinx_ux_badges-0.0.1a33.tar.gz", hash = "sha256:9a31a48c49c2431afc2450cba0fc6b2af821c3176f8dc742d52cf711f8f07823", size = 16723, upload-time = "2026-07-05T20:59:34.085Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/0f/b97b0d26813b1d3dd76741f2278467866cea35862c9a2d459518af7f8ec6/sphinx_ux_badges-0.0.1a32-py3-none-any.whl", hash = "sha256:21b49a9d219e79a65f4c9ba1c8c961f3680d1f393348dc08d3f1ca12cd7b47fd", size = 17489, upload-time = "2026-07-04T11:54:23.322Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e4/8ddb21f95d22eee8d48f724e359bf2b26f225f815e29bc91dd93652f5539/sphinx_ux_badges-0.0.1a33-py3-none-any.whl", hash = "sha256:1824228a2ecdd7784feb53b2e1aa657f7a48ea17b4c7be8d35f3c90082a67d61", size = 17491, upload-time = "2026-07-05T20:59:15.621Z" }, ] [[package]] @@ -1653,6 +1668,7 @@ dev = [ { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, { name = "sphinx-autodoc-argparse" }, + { name = "sphinx-gp-highlighting" }, { name = "sphinx-gp-mermaid" }, { name = "types-docutils" }, { name = "types-pygments" }, @@ -1667,6 +1683,7 @@ docs = [ { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-api-style" }, { name = "sphinx-autodoc-argparse" }, + { name = "sphinx-gp-highlighting" }, { name = "sphinx-gp-mermaid" }, ] lint = [ @@ -1701,7 +1718,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a32" }, + { name = "gp-sphinx", specifier = "==0.0.1a33" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1711,9 +1728,10 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a32" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a32" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a32" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a33" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a33" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a33" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a33" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1721,12 +1739,13 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a32" }, + { name = "gp-sphinx", specifier = "==0.0.1a33" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a32" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a32" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a32" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a33" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a33" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a33" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a33" }, ] lint = [ { name = "mypy" }, From 8f51976f8c91e3604460a2154eb39a157393df21 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Jul 2026 09:55:36 -0500 Subject: [PATCH 2985/2998] docs(mermaid): Improve responsive diagrams why: tmuxp's diagrams should stay readable on narrow documentation layouts while using the responsive Mermaid policy from gp-sphinx. what: - Add alt text, stable names, and explicit fit policy to Mermaid diagrams - Convert the architecture chart from left-to-right to top-to-bottom --- docs/AGENTS.md | 6 ++++-- docs/about_tmux.md | 9 +++++++++ docs/cli/load.md | 3 +++ docs/configuration/index.md | 3 +++ docs/configuration/workspace-builders.md | 3 +++ docs/internals/architecture.md | 20 ++++++++++++++------ docs/topics/plugins.md | 3 +++ docs/topics/workflows.md | 3 +++ 8 files changed, 42 insertions(+), 8 deletions(-) diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 9a9051410e..da88da5f44 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -93,8 +93,10 @@ Two mechanical conventions, separate from voice: renders monospace — the way that text reads as code inline; leave prose and concept nodes unstyled. Prefer top-to-bottom (`flowchart TD`); wide left-to-right - charts don't scale on narrow viewports. `docs/configuration/workspace-builders.md` - is the reference. + charts don't scale on narrow viewports. Add `:alt:`, `:name:`, and + `:responsive: fit` to every diagram; use `:responsive: preserve` only + when the wide artifact is intentional and should scroll instead of + shrinking. `docs/configuration/workspace-builders.md` is the reference. - **Internal API pages** document a module with an `{eval-rst}` block wrapping `.. automodule:: ` (with `:members:`), the way the existing `docs/internals/api/**` pages do. A bare `.. py:module::` diff --git a/docs/about_tmux.md b/docs/about_tmux.md index 7f06817921..1eee7989e1 100644 --- a/docs/about_tmux.md +++ b/docs/about_tmux.md @@ -43,6 +43,9 @@ inside the text dimension. Inside tmux you can: :::{mermaid} :caption: A session holds windows; each window holds one or more panes. +:alt: tmux session containing windows and panes +:name: tmux-session-window-pane-tree +:responsive: fit flowchart TD session["session"] --> w1["window"] @@ -104,6 +107,9 @@ tmux supports as many terminals as you want. :::{mermaid} :caption: Switch between the windows in a session. +:alt: switching from one active tmux window to another +:name: tmux-window-switching +:responsive: fit flowchart TD w1["window 1 · sys (active)"] -->|"switch-window 2"| w2["window 2 · vim (active)"] @@ -118,6 +124,9 @@ a sandwich, and re-(attach), all applications are still running! :::{mermaid} :caption: Detach, leave everything running, and reattach later. +:alt: detaching from and reattaching to a running tmux session +:name: tmux-detach-reattach-cycle +:responsive: fit flowchart TD running["session running"] -->|"detach · Prefix d"| detached["screen detached — apps keep running"] diff --git a/docs/cli/load.md b/docs/cli/load.md index c0cbfdb8ce..ce1ba88d5a 100644 --- a/docs/cli/load.md +++ b/docs/cli/load.md @@ -103,6 +103,9 @@ Or (a)ppend windows in the current active session? :::{mermaid} :caption: Loading from inside an existing tmux client. +:alt: tmuxp load prompt choices inside an existing tmux client +:name: tmuxp-load-inside-client +:responsive: fit flowchart TD load["tmuxp load"]:::cmd --> q{"y / n / a ?"} diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 8cee308410..0cde232732 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -64,6 +64,9 @@ tmuxp will offer to assist when: :::{mermaid} :caption: A workspace file mirrors tmux's own hierarchy. +:alt: tmuxp workspace file hierarchy from session to windows, panes, and shell commands +:name: tmuxp-workspace-hierarchy +:responsive: fit flowchart TD session["session_name"]:::cmd --> w1["window"] diff --git a/docs/configuration/workspace-builders.md b/docs/configuration/workspace-builders.md index 837338c0e2..0630477df7 100644 --- a/docs/configuration/workspace-builders.md +++ b/docs/configuration/workspace-builders.md @@ -16,6 +16,9 @@ fall back to the default.** :::{mermaid} :caption: How a workspace file becomes a live tmux session. +:alt: tmuxp load reading workspace config through a workspace builder to attach a session +:name: tmuxp-workspace-builder-flow +:responsive: fit --- config: diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 699f8249d0..0156f25eb5 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -7,17 +7,25 @@ modules: :::{mermaid} :caption: How each tmuxp subcommand reaches libtmux. +:alt: tmuxp CLI subcommands reaching workspace modules and libtmux +:name: tmuxp-command-architecture +:responsive: fit -flowchart LR +flowchart TD cli["tmuxp CLI (argparse)"] - cli -->|load| loader["workspace.loader"]:::cmd + cli --> load["load"]:::cmd + load --> loader["workspace.loader"]:::cmd loader --> builder["workspace.builder"]:::cmd builder --> libtmux["libtmux"]:::cmd - cli -->|freeze| freezer["workspace.freezer"]:::cmd + cli --> freeze["freeze"]:::cmd + freeze --> freezer["workspace.freezer"]:::cmd freezer --> libtmux - cli -->|convert| reader["_internal.config_reader"]:::cmd - cli -->|shell| interactive["libtmux (interactive)"] - cli -->|"ls / search"| finders["workspace.finders"]:::cmd + cli --> convert["convert"]:::cmd + convert --> reader["_internal.config_reader"]:::cmd + cli --> shell["shell"]:::cmd + shell --> interactive["libtmux (interactive)"] + cli --> search["ls / search"]:::cmd + search --> finders["workspace.finders"]:::cmd ::: ## Key Components diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index 027e2df44a..c1ec3185f2 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -40,6 +40,9 @@ nothing. {ref}`tmuxp load ` drives the lifecycle in a fixed order: :::{mermaid} :caption: When each plugin hook fires. +:alt: tmuxp plugin hook order during tmuxp load +:name: tmuxp-plugin-hook-order +:responsive: fit flowchart TD load["tmuxp load"]:::cmd --> bwb["before_workspace_builder"]:::cmd diff --git a/docs/topics/workflows.md b/docs/topics/workflows.md index 68a4e52739..2f8108d7cc 100644 --- a/docs/topics/workflows.md +++ b/docs/topics/workflows.md @@ -31,6 +31,9 @@ you like it, freeze it to capture the layout, then edit and replay it anywhere: :::{mermaid} :caption: Capture a session once, replay it anywhere. +:alt: manual tmux session captured with tmuxp freeze and replayed with tmuxp load +:name: tmuxp-freeze-load-workflow +:responsive: fit flowchart TD arrange["arrange tmux by hand"] --> freeze["tmuxp freeze"]:::cmd From 24d10bbb73b7e706b11c89a60681fdf3d04308c6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Jul 2026 11:22:59 -0500 Subject: [PATCH 2986/2998] docs(feat[highlighting]): Use shared lexer why: The mermaid-improvements branch should exercise the shared gp-sphinx highlighting package against real tmuxp documentation before it is released. what: - Enable safe inline tmuxp command and path highlighting - Render the plugin module layout with the tree lexer --- docs/conf.py | 3 +++ docs/topics/plugins.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index c0186c62f0..f48447201c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -35,9 +35,12 @@ "sphinx_autodoc_api_style", "aafig", "sphinx_gp_mermaid", + "sphinx_gp_highlighting", "tmux_layout", "sphinx_autodoc_argparse.exemplar", ], + gp_highlighting_inline_literals="safe", + gp_highlighting_inline_commands=["tmuxp"], # Route a plain ```mermaid fence to the mermaid directive (the colon and # brace forms route there already via colon_fence). Redundant once the # pinned gp-sphinx release auto-routes when sphinx_gp_mermaid is active; diff --git a/docs/topics/plugins.md b/docs/topics/plugins.md index c1ec3185f2..d664cb633f 100644 --- a/docs/topics/plugins.md +++ b/docs/topics/plugins.md @@ -74,7 +74,7 @@ interface tmuxp provides, {class}`~tmuxp.plugin.TmuxpPlugin`. works just as well. You need only one project file, for whichever packaging tool you choose. -```console +```tree python_module ├── tmuxp_plugin_my_plugin_module │ ├── __init__.py From 48a0914295b8f2f3337811c010a1012f93268c69 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 5 Jul 2026 17:45:02 -0500 Subject: [PATCH 2987/2998] docs(CHANGES): Responsive diagrams, inline highlighting why: Document the user-visible docs changes merged for the next release. what: - Note the responsive diagram policy with alt text and stable names - Note shared inline command/path highlighting adoption --- CHANGES | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES b/CHANGES index 49eb9ef957..0b2d4fe37f 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,21 @@ $ tmuxp@next load yoursession _Notes on the upcoming release will go here._ +### Documentation + +#### Diagrams stay readable on narrow screens (#1076) + +Every diagram now declares alt text, a stable link target, and a responsive +policy that scales it to the content column, and the architecture chart flows +top-to-bottom instead of running wide. Phone-width layouts and screen readers +get the same information as the desktop site. + +#### Inline commands and paths are highlighted (#1076) + +Inline mentions of `tmuxp` commands and file paths now carry syntax +highlighting via the shared `sphinx-gp-highlighting` package, and the plugin +module layout renders as a highlighted directory tree. + ## tmuxp 1.74.0 (2026-07-04) tmuxp 1.74.0 pairs a libtmux upgrade with a documentation overhaul. It bumps libtmux to 0.61.0 — hardening tmux 3.7 patch-line support — and teaches `tmuxp debug-info` to report the exact tmux patch release (`3.7a`/`3.7b`) instead of the numeric-normalized version. The docs also gain theme-aware inline diagrams and a concept-first rewrite that leads with what each feature is before its configuration. From 7e75ef81355ff15dcccc7901c6d4111a14ece4fa Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 11 Jul 2026 05:16:55 -0500 Subject: [PATCH 2988/2998] py(deps[dev]) Bump dev packages --- uv.lock | 477 +++++++++++++++++++++++++++----------------------------- 1 file changed, 230 insertions(+), 247 deletions(-) diff --git a/uv.lock b/uv.lock index 72b1b25728..34a8e5f36f 100644 --- a/uv.lock +++ b/uv.lock @@ -151,107 +151,89 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", size = 315182, upload-time = "2026-04-02T09:25:40.673Z" }, - { url = "https://files.pythonhosted.org/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", size = 209329, upload-time = "2026-04-02T09:25:42.354Z" }, - { url = "https://files.pythonhosted.org/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", size = 231230, upload-time = "2026-04-02T09:25:44.281Z" }, - { url = "https://files.pythonhosted.org/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", size = 225890, upload-time = "2026-04-02T09:25:45.475Z" }, - { url = "https://files.pythonhosted.org/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", size = 216930, upload-time = "2026-04-02T09:25:46.58Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", size = 202109, upload-time = "2026-04-02T09:25:48.031Z" }, - { url = "https://files.pythonhosted.org/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", size = 214684, upload-time = "2026-04-02T09:25:49.245Z" }, - { url = "https://files.pythonhosted.org/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", size = 212785, upload-time = "2026-04-02T09:25:50.671Z" }, - { url = "https://files.pythonhosted.org/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", size = 203055, upload-time = "2026-04-02T09:25:51.802Z" }, - { url = "https://files.pythonhosted.org/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", size = 232502, upload-time = "2026-04-02T09:25:53.388Z" }, - { url = "https://files.pythonhosted.org/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", size = 214295, upload-time = "2026-04-02T09:25:54.765Z" }, - { url = "https://files.pythonhosted.org/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", size = 227145, upload-time = "2026-04-02T09:25:55.904Z" }, - { url = "https://files.pythonhosted.org/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", size = 218884, upload-time = "2026-04-02T09:25:57.074Z" }, - { url = "https://files.pythonhosted.org/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", size = 148343, upload-time = "2026-04-02T09:25:58.199Z" }, - { url = "https://files.pythonhosted.org/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", size = 159174, upload-time = "2026-04-02T09:25:59.322Z" }, - { url = "https://files.pythonhosted.org/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", size = 147805, upload-time = "2026-04-02T09:26:00.756Z" }, - { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, - { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, - { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, - { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, - { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, - { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, - { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, - { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, - { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, - { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, - { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, - { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, - { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, - { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, - { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, - { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, - { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, - { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, - { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, - { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, - { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, - { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, - { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, - { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, - { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, - { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, - { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, - { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, - { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, - { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, - { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, - { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, - { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, - { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, - { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, - { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, - { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, - { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, - { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, - { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, - { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, - { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, - { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, - { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, - { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, - { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, - { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, - { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, - { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, - { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, - { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, - { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, - { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, - { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, - { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, - { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, - { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, - { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a", size = 322240, upload-time = "2026-07-07T14:32:36.236Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616", size = 216475, upload-time = "2026-07-07T14:32:38.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209", size = 238670, upload-time = "2026-07-07T14:32:39.658Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99", size = 233476, upload-time = "2026-07-07T14:32:41.155Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8", size = 223817, upload-time = "2026-07-07T14:32:42.592Z" }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b", size = 207974, upload-time = "2026-07-07T14:32:44.258Z" }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2", size = 221655, upload-time = "2026-07-07T14:32:45.64Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9", size = 219229, upload-time = "2026-07-07T14:32:47.376Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15", size = 209704, upload-time = "2026-07-07T14:32:48.855Z" }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d", size = 226243, upload-time = "2026-07-07T14:32:50.239Z" }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381", size = 150935, upload-time = "2026-07-07T14:32:51.676Z" }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee", size = 162314, upload-time = "2026-07-07T14:32:53.193Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419", size = 153075, upload-time = "2026-07-07T14:32:54.554Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, ] [[package]] @@ -290,100 +272,100 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b4/91/0a7c28934e50d8ac9a7b117712d176f2953c3170bccced5eaacfa3e96175/coverage-7.14.3.tar.gz", hash = "sha256:1a7563a443f3d53fdeb040ec8c9f7466aed7ca3dc5891aa09d3ca3625fa4387f", size = 924398, upload-time = "2026-06-22T23:10:25.584Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/bd/b01188f0de73ee8b6597cf20c63fccd898ad31405772f15165cb61a62c00/coverage-7.14.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:360bec1f58e7243e3405d3bdf7a1a8115aa9b448d54dc7cd6f7b7e0e9406b62e", size = 220378, upload-time = "2026-06-22T23:07:38.925Z" }, - { url = "https://files.pythonhosted.org/packages/33/eb/f7aa3cb46500b709070c8d12335446971ec8b8c2ea155fea05d2000b4b1f/coverage-7.14.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed68faa5e85de2f3e400bc3f122e5c82735a58c8bb24b9f63a2215954ba17b2d", size = 220895, upload-time = "2026-06-22T23:07:41.536Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c0/b41b8499fc9060ca40ad2a197d301155be1ead398f0f0bfdb27b2b4a660f/coverage-7.14.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:830c1fca669c572dec37ce9c838224ee45aac5be0f6961edf871e82e49d6537c", size = 247631, upload-time = "2026-06-22T23:07:43.244Z" }, - { url = "https://files.pythonhosted.org/packages/da/bb/e9ecea1307c6a549c223842cccbd5d55193cc27b82f26338782d4355047c/coverage-7.14.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a64caee2193563601dbaaa55fe2dcf597debef04a2f8f1fa8a07aa4bb7ac7a1e", size = 249460, upload-time = "2026-06-22T23:07:45.147Z" }, - { url = "https://files.pythonhosted.org/packages/59/cb/3821542809b7b726296fd364ed1c23d10a5770f1469957010c3b4bc5d408/coverage-7.14.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0096fd7559178f0cc9cf088f2dbd2a02ef85bacaa69732c633517286b4494610", size = 251324, upload-time = "2026-06-22T23:07:46.875Z" }, - { url = "https://files.pythonhosted.org/packages/76/27/f34f66f0ff152189ccc7b3f0582cf7909e239cb3b8c214362ed2149719b8/coverage-7.14.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6197e5a00183c11a8ce7c6abd18be1a9189fd8399084ffc95196f4f0db4f2137", size = 253237, upload-time = "2026-06-22T23:07:48.352Z" }, - { url = "https://files.pythonhosted.org/packages/22/81/aa363fa95d14fc892bd5de80edadc8d7cce584a0f6376f6336e492618e67/coverage-7.14.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7dfe427045520d6abca33687dfef767b4f635015893a1816c5decb12eb72ce18", size = 248344, upload-time = "2026-06-22T23:07:49.896Z" }, - { url = "https://files.pythonhosted.org/packages/66/fe/dc8a149441a3fea611cbbaf46bb12099adbe08f69903df1794581b0504b8/coverage-7.14.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9a3f142070eb7b82fc4085a55d887396f9c4e21250bccebe2ba22502c45b9647", size = 249365, upload-time = "2026-06-22T23:07:51.464Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a2/0004127deee122e020be24a4d86ce72fa14ae28198811b945aabf91293b5/coverage-7.14.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64b2055bb6e0dc945af35cdeceb3633e6ed9273475ef3af85592410fd6803803", size = 247369, upload-time = "2026-06-22T23:07:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/1e/72/3654c004f4df4f0c5a9643d9abaed5b26e5d3c1d0ecabe788786cb425efa/coverage-7.14.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1551b4caac3e3ec9f2bfcec6bf3776e01c0edbdd2e240431a50ca1a1aac72c27", size = 251182, upload-time = "2026-06-22T23:07:54.789Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2f/7bdcdf1e7c4d0632648852768063c25582a0a747bb5f8036a04e211e7eb7/coverage-7.14.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:583d50d59142f8549470bd6390471d0fe8b8c8d69d6a0f28ac71e05380cef640", size = 247639, upload-time = "2026-06-22T23:07:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/03/dc/0e01b071f69021d262a51ce39345dd6bc194465db0acfc7b34fd89e6b787/coverage-7.14.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0bb8a6bc7015efdf8a928753b25da1b9ca2d6f24ef04d2ee0688e486f32aae7", size = 248242, upload-time = "2026-06-22T23:07:57.692Z" }, - { url = "https://files.pythonhosted.org/packages/1c/51/08279e6ebe3479bf705db5fdc1a968e44ba1567e4cbc567f76b45f5e646e/coverage-7.14.3-cp310-cp310-win32.whl", hash = "sha256:d48400185564042287dc487c1f016a3397f18ab4f4c5d5ec36edc218f7ffa35b", size = 222431, upload-time = "2026-06-22T23:07:59.094Z" }, - { url = "https://files.pythonhosted.org/packages/40/2f/5c56670781fee5722ef0c415a74750c9a033bfacdb9d07b1493a0308108d/coverage-7.14.3-cp310-cp310-win_amd64.whl", hash = "sha256:eadea7aba74e40adee867a8c0eec17b820b061d308a4b014f7a0e118c2b0aa61", size = 223059, upload-time = "2026-06-22T23:08:00.662Z" }, - { url = "https://files.pythonhosted.org/packages/f1/24/efb17eb94018dd3415d0e8a76a4786a866e8964aa9c50f033399d23939c2/coverage-7.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e574801e1d643561594aa021206c46d80b257e9853087090ba97bed8b0a509d3", size = 220501, upload-time = "2026-06-22T23:08:02.182Z" }, - { url = "https://files.pythonhosted.org/packages/76/93/32f1bfca6cdd34259c8af42820a034b7a28dfb44969a13ed38c17e0ba5b0/coverage-7.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f82b6bb7d75a2613e85d07cefa3a8c973d0544a8993337f6e2728e4a1e94c305", size = 221008, upload-time = "2026-06-22T23:08:03.701Z" }, - { url = "https://files.pythonhosted.org/packages/eb/88/0d0f974855ff905d15a64f7873d00bdc4182e2736267486c6634f4af293c/coverage-7.14.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2335ea5fed26af2e831094964fa3f8fae60b45f7e37fcc2d3b615b2add3ad87", size = 251420, upload-time = "2026-06-22T23:08:05.211Z" }, - { url = "https://files.pythonhosted.org/packages/39/7f/117dd2ec65e4140576f8ef991d88220f9b806769f7a8c20e0550c0f924e2/coverage-7.14.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fbb8c3a98e779013786ae01d229662aeacbc77100efbd3f2f245219ace5af700", size = 253331, upload-time = "2026-06-22T23:08:06.672Z" }, - { url = "https://files.pythonhosted.org/packages/87/55/f0bd6d6538e3f16829fb8a44b6c0d2fe9da638bbfdd6a20f8b5da8f4fa81/coverage-7.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac082660de8f429ba0ea363595abb838998570b9a7546777c60f413ab902bbde", size = 255441, upload-time = "2026-06-22T23:08:08.208Z" }, - { url = "https://files.pythonhosted.org/packages/1e/98/aa71f7879019c846a8a9662579ea4484b0202cf1e252ffeed647075e7eca/coverage-7.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac012839ff7e396030f1e94e10553a431d14e4de2ab65cb3acb72bbd5628ca2", size = 257398, upload-time = "2026-06-22T23:08:09.749Z" }, - { url = "https://files.pythonhosted.org/packages/f3/4f/5fd367e59844190f5965015d7bee899e67a89d13eb2760118479bf836f2f/coverage-7.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5952f8c1bda2a5347154450379316e6dfa4d934d62ca35f6784451e6f55074fb", size = 251558, upload-time = "2026-06-22T23:08:11.37Z" }, - { url = "https://files.pythonhosted.org/packages/8f/de/5383a6ee5a6376701fe07d980fa8e4a66c0c377fead16712720340d701a3/coverage-7.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cf0f2509acb4619e2471a1951089054dd58ebea7a912066d2ea56dd4c24ca4a", size = 253134, upload-time = "2026-06-22T23:08:13.04Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/09542b1a99f788e3daec7f0fadc288821e71aca9ea298d51bfa1ba79fed5/coverage-7.14.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2e41fd3aab806770008279a93879b0924b16247e09ab537c043d08bbca53b4ab", size = 251195, upload-time = "2026-06-22T23:08:14.606Z" }, - { url = "https://files.pythonhosted.org/packages/02/9d/722fe8c13f0fbb064491b9e8656e56a606286792e5068c47ca1042e773e8/coverage-7.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f0a47095963cfe054e0df178daca95aec21e680d6076da807c3add28dfe920f7", size = 254959, upload-time = "2026-06-22T23:08:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/fb/58/943627179ff1d82da9e54d0a5b0bb907bb19cf19515599ccd921de50b469/coverage-7.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a090cbf9521e78ffdb2fcf448b72902afe9f5923ff6a12d5c0d0120200348af9", size = 250914, upload-time = "2026-06-22T23:08:18.03Z" }, - { url = "https://files.pythonhosted.org/packages/a5/d4/803efcbf9ae5567454a0c71e983589529448e2704ee0da2dc0163d482f18/coverage-7.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d310baf69a4fbe8a098ce727e4808a34866ac718a6f759ae659cbd3221358bc", size = 251824, upload-time = "2026-06-22T23:08:19.704Z" }, - { url = "https://files.pythonhosted.org/packages/32/79/3f78ea9563132746eed5cecb75d2e576f9d8fec45a47242b5ae0950b82a3/coverage-7.14.3-cp311-cp311-win32.whl", hash = "sha256:74fdd718d88fe144f4579b8747873a07ec3f04cb837d5faec5a25d9e22fa31a8", size = 222594, upload-time = "2026-06-22T23:08:21.311Z" }, - { url = "https://files.pythonhosted.org/packages/85/22/9ebbc5a2ab42ac5d0eea1f48648629e1de9bbe41ec243ed6b93d55a5a53f/coverage-7.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:cc96aa922e21d4bc5d5ed3c915cef27dfcbc13686f47d5e378d647fbfba655a2", size = 223073, upload-time = "2026-06-22T23:08:23.318Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/69d5fcc16cb555153f99cec5467922f226be0369f7335a9506856d2a7bd0/coverage-7.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:c66f9f9d4f1e9712eb9b1de5310f881d4e2188cfcba5065e1a8490f38687f2c4", size = 222617, upload-time = "2026-06-22T23:08:25.054Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b0/8a911f6ffe6974dac4df95b468ab9a2899d0e59f0f99a489afeec39f00bc/coverage-7.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d74ff26299c4879ce3a4d826f9d3d4d556fd285fde7bbce3c0ef5a8ab1cec24", size = 220672, upload-time = "2026-06-22T23:08:26.621Z" }, - { url = "https://files.pythonhosted.org/packages/36/16/0fc0cb52538783dbbae0934b834f5a58fd5354380ee6cad4a07b15dc845d/coverage-7.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:96150a9cf3468ea20f0bc5d0e21b3df8972c31480ef90fa7614b773cc6429665", size = 221035, upload-time = "2026-06-22T23:08:28.372Z" }, - { url = "https://files.pythonhosted.org/packages/77/e2/421ccfbb48335ac49e93301478cf5d623b0c2bf1c0cadd8e2b2fc6c0c710/coverage-7.14.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:27d07a46500ba23515b838dbcf52512026af04090755cf6cc64166d88c9b9a1a", size = 252540, upload-time = "2026-06-22T23:08:30.226Z" }, - { url = "https://files.pythonhosted.org/packages/06/c2/05b8c890097c61a7f4406b35396b997a635200ded0339eda83dfbe526c5f/coverage-7.14.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:621e13c6108234d7960aaf5762ab5c3c00f33c30c15af06dcbff0c73bf112727", size = 255274, upload-time = "2026-06-22T23:08:31.876Z" }, - { url = "https://files.pythonhosted.org/packages/dc/be/b6d9efe447f8ba3c3c854195f326bd64c54b907d936cd2fdebf8767ec72e/coverage-7.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b60ca6d8af70473491a15a343cbabab2e8f9ea66a4376e81c7aa24876a6f977", size = 256389, upload-time = "2026-06-22T23:08:33.843Z" }, - { url = "https://files.pythonhosted.org/packages/d4/3c/f26e50acc429e608bc534ac06f0a3c169019c798178ec5e9de3dbc0df9c9/coverage-7.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c90a7cdd5e380e1ce02f19792e2ac2fbfbf177e35a27e69fd3e873b30d895c0c", size = 258648, upload-time = "2026-06-22T23:08:35.481Z" }, - { url = "https://files.pythonhosted.org/packages/9e/a2/01c1fabf816c8e1dae197e258edf878a3d3ddc86fbda34b76e5794277d8f/coverage-7.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d788e5fd55347eef06ca0732c77d04a264de67e8ff24631270cdff3767a60cf", size = 252949, upload-time = "2026-06-22T23:08:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/89/c6/941166dd79c31fd44a13063780ae8d552eee0089a0a0930b9bdb7df554ed/coverage-7.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62c7f79db2851c95ef020e5d28b97afde3daf9f7febcd35b53e05638f729063f", size = 254310, upload-time = "2026-06-22T23:08:39.174Z" }, - { url = "https://files.pythonhosted.org/packages/10/31/80b1fd028201a961033ce95be3cd1e39e521b3762e6b4a1ac1616cb291e7/coverage-7.14.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:90f7608aeb5d9b60b523b9fb2a4ee1973867cc4865a3f26fe6c7577073b70205", size = 252453, upload-time = "2026-06-22T23:08:40.84Z" }, - { url = "https://files.pythonhosted.org/packages/5f/85/c3d9addd94c4b524f3f4af0232075f5fe7170ce99a1386edff803e5934db/coverage-7.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1e3b91f9c4740aeb571ecf82e5e8d8e4ab62d34fcb5a5d4e5baa38c6f7d2857c", size = 256522, upload-time = "2026-06-22T23:08:42.494Z" }, - { url = "https://files.pythonhosted.org/packages/91/14/e5a0575f73795af3a7a9ae13dadf812e17d32422896839987dc3f86947e1/coverage-7.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c946099774a7699de03cbd0ff0a64e21aed4525eed9d959adde4afe6d15758ef", size = 252023, upload-time = "2026-06-22T23:08:44.243Z" }, - { url = "https://files.pythonhosted.org/packages/38/9b/9652ee531937ce3b8a63a8896885b2b4a2d56adc30e53c9540c666286d88/coverage-7.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16b206e521feb8b7133a45754643dead0538489cf8b783b90cf5f4e3299625fd", size = 253893, upload-time = "2026-06-22T23:08:46.113Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/42678841c8c38e4b08bdfc48269f5a16dfbf5806000fe6a89b4cece3c691/coverage-7.14.3-cp312-cp312-win32.whl", hash = "sha256:ea3169c7116eb6cdf7608c6c7da9ecfcb3da40688e3a510fac2d1d2bafd6dc35", size = 222734, upload-time = "2026-06-22T23:08:47.858Z" }, - { url = "https://files.pythonhosted.org/packages/df/87/07a4fcee55177a25f1b52331a8e92cf4f2c53b1a9c75ce2981fd59c684ad/coverage-7.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:7ea52fc08f007bcc494d4bb3df3851e95843d881860ba38fe2c64dc100db5e7d", size = 223266, upload-time = "2026-06-22T23:08:49.494Z" }, - { url = "https://files.pythonhosted.org/packages/aa/34/2b8b66a989282ea7b370beb49f50bab29470dc30bb0b03935b6b802782f7/coverage-7.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:8cec0ad652ec57790970d817490105bd917d783c2f7b38d6b58a0ca312e1a336", size = 222655, upload-time = "2026-06-22T23:08:51.766Z" }, - { url = "https://files.pythonhosted.org/packages/a9/83/7fefbf5df23ed2b7f489907564a7b34b9b07098128e12e0fdfa92626e456/coverage-7.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47968988b367990ae4ab17523790c38cd125e02c6bfd379b6022be2d40bdc38c", size = 220699, upload-time = "2026-06-22T23:08:53.522Z" }, - { url = "https://files.pythonhosted.org/packages/31/e6/38c3653ff6d56d704b29241362387ca824e38e15b76fdcb7096538195790/coverage-7.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0ee68f5c34812780f3a7063382c0a9fcbb99985b7ddcdcaa626e4f3fb2e0783a", size = 221068, upload-time = "2026-06-22T23:08:55.571Z" }, - { url = "https://files.pythonhosted.org/packages/20/86/4f5c45d51c5cd10a128933f0fd235393c9146abbfd2ce2dfa68b3267ead3/coverage-7.14.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fa9e5c6857a7e80fa22ace5cf3550ae392bbfc322f1d8dd2d2d5a8be38cec027", size = 252060, upload-time = "2026-06-22T23:08:57.464Z" }, - { url = "https://files.pythonhosted.org/packages/82/50/dfce42eff2cecabcd5a9bbad5489449c87db3415f408d23ffee417ce01f6/coverage-7.14.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:98a0859b0e98e43e1178a9402e19c8127766b14f7109a374d976e5a62c0e5c73", size = 254657, upload-time = "2026-06-22T23:08:59.453Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d2/639ceb1bc8038fd0d66768278d5dc22df3391918b8278c2a21aa2602a531/coverage-7.14.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69918344541ed9c8368566c2adc03c0e33d4550d7faa87d1b35e49b6a3286ea9", size = 255892, upload-time = "2026-06-22T23:09:01.291Z" }, - { url = "https://files.pythonhosted.org/packages/8b/96/002094a10e113512500dc1e10430a449417e17b0f90f7d496bcb820208b7/coverage-7.14.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f300ac92cd4b570724c8ffbbd0c130fee298d2447f41d5a3abf58976fae1de", size = 258026, upload-time = "2026-06-22T23:09:03.017Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ec/286a5d2fad9c4bee59bd724feeb7d5bf8303c6c9200b51d1dd945a9c72b0/coverage-7.14.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11a7ec9f97ab950f4c5af62229befc7faf208fdbc0116d3902d7e306cf2c5abd", size = 252285, upload-time = "2026-06-22T23:09:04.773Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7d/a17753a0b12dd48d0d50f5fab079ad99d3be1eac790494d89f3a417ca0b9/coverage-7.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a571bd889cd36c5922ce8e42e059f9d37d02301531d11374afa4c87a578625d5", size = 254023, upload-time = "2026-06-22T23:09:06.513Z" }, - { url = "https://files.pythonhosted.org/packages/86/ef/a76c6ceba6a2c313f905310abf2701d534cada22d372db11731831e9e209/coverage-7.14.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de76caefc8deabb0dd1678b6a980be97d14c8d87e213ac194dbf8b09e96d63fb", size = 251989, upload-time = "2026-06-22T23:09:08.382Z" }, - { url = "https://files.pythonhosted.org/packages/d9/39/353013a75fec0fb49f7553519f9d52b4441e902e5178c93f38eb6c07cedb/coverage-7.14.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d20a15c622194234161535459affa8f7905830391c9ccfa060d495dbfe3a1c7f", size = 256144, upload-time = "2026-06-22T23:09:10.369Z" }, - { url = "https://files.pythonhosted.org/packages/29/0e/613878555d734def11c5b20a2701a15cb3781b9e9ea749da27c5f436e928/coverage-7.14.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b488bd4b23397db62e7a9459129d01ff06a846582a732efd24834b24a6ada498", size = 251808, upload-time = "2026-06-22T23:09:12.057Z" }, - { url = "https://files.pythonhosted.org/packages/af/76/359c058c9cfdcf1e8b107663881225b03b364a320017eda24a2a66e55102/coverage-7.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a3693b4153394d265f44fb855fdc80e72403024d4d6f91c4871b334d028e4e0", size = 253579, upload-time = "2026-06-22T23:09:13.858Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d9/4ba2f060933a30ebe363cef9f67a365b0a317e580c0d5d9169d56a73ef1c/coverage-7.14.3-cp313-cp313-win32.whl", hash = "sha256:338b19131ab1a6b767b462bfcbaa692e7ae22f24463e39d49b02a83410ff6b37", size = 222741, upload-time = "2026-06-22T23:09:15.636Z" }, - { url = "https://files.pythonhosted.org/packages/76/e8/196ebc25d8f34c06d43a6e9c8513c9266ef8dbf3b5672beb1a00cf5e29fa/coverage-7.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:b3d77f7f196abdef7e01415de1bce09f216189e83e58159cfeef2b92d0464994", size = 223283, upload-time = "2026-06-22T23:09:17.478Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/51d2aac6417523a286f10fb25f09eb9518a84df9f1151e93ff6871f34849/coverage-7.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:e6230e688c7c3e65cedd41a774eb4ec221adc6bfee13768231015b702d5e4150", size = 222678, upload-time = "2026-06-22T23:09:19.7Z" }, - { url = "https://files.pythonhosted.org/packages/61/56/14e3b97facbfa1304dd19e676e26599ad359f04714bed32f7f1c5a88efdc/coverage-7.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:605ab2b566a22bd94834529d66d295c364aba84afd3e5498285c7a524017b1fc", size = 220741, upload-time = "2026-06-22T23:09:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/12/1d/db378b5cca433b90b893f26dab728b280ddd89f272a1fdfed4aeaa05c686/coverage-7.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a3c2134809e80fac091bfed18a6991b5a5eb5df5ae32b17ac4f4f99864b73dd7", size = 221068, upload-time = "2026-06-22T23:09:23.452Z" }, - { url = "https://files.pythonhosted.org/packages/47/f0/3f8421b20d9c4fcd39be9a8ca3c3fda8bc204b44efbd09fede153afd3e2f/coverage-7.14.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c02efd507227bde9969cab0db8f48890eb3b5dcad6afac57a4792df4133543ce", size = 252117, upload-time = "2026-06-22T23:09:25.458Z" }, - { url = "https://files.pythonhosted.org/packages/27/ca/59ea35fb99743549ec8b37eff141ece4431fea590c89e536ed8032ef45cf/coverage-7.14.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1bb93c2aa61d2a5b38f1526546d95cf4132cb681e541a337bf8dfd092be816e5", size = 254622, upload-time = "2026-06-22T23:09:27.523Z" }, - { url = "https://files.pythonhosted.org/packages/c8/25/ec6de51ae7493b92a1cf74d1b763121c29636759167e2a593ba4db5881e4/coverage-7.14.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f502e948e03e866538048bba081c075caaa62e5bda6ea5b7432e45f587eb462a", size = 255968, upload-time = "2026-06-22T23:09:29.43Z" }, - { url = "https://files.pythonhosted.org/packages/5d/05/c8bfc77823f42b4664fb25842f13b567022f6f84a4c83c8ecbb16734b7cb/coverage-7.14.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9973ef2463f8e6cfb61a6324126bb3e17d67a85f22f58d856e583ea2e3ca6501", size = 258284, upload-time = "2026-06-22T23:09:31.397Z" }, - { url = "https://files.pythonhosted.org/packages/f6/15/1d1b242027124a32b26ef01f82018b8c4ef34ef174aa6aeba7b1eeef48e8/coverage-7.14.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9be4e7d4c5ca0427889f8f9d614bd630c2be741b1de7699bca3b2b6c0e41003e", size = 252143, upload-time = "2026-06-22T23:09:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/74/b6/d2a9842fd2a5d7d27f1ac851c043a734a494ad75402c5331db3da79ed691/coverage-7.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a574912f3bde4b0619f6e97d01aa590b70998859244793769eb3a6df78ee56d3", size = 253976, upload-time = "2026-06-22T23:09:35.351Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/e1600ddf7e226db5558bb5323d2186fff00f505c4b764643ec89ce5d8175/coverage-7.14.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e343fb086c9cd780b38622fea7c369acd64c1a0724312149b5d769c387a2b1f5", size = 251942, upload-time = "2026-06-22T23:09:37.313Z" }, - { url = "https://files.pythonhosted.org/packages/d9/2c/9159de64f9dd648e324328d588a44cfab1e331eb5259ce1141afe2a92dfb/coverage-7.14.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3c68df8e61f1e09633fefc7538297145623957a048534368c9d212782aa5e845", size = 256220, upload-time = "2026-06-22T23:09:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/91/67/b7f536cc2c124f48e91b22fbb741d2261f4e3d310faf6f76007f47566e5d/coverage-7.14.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3e5b550a128419373c2f6cec28a244207013ef15f5cbcff6a5ca09d1dfaaf027", size = 251756, upload-time = "2026-06-22T23:09:41.056Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ec/f3718038e2d4860c715a55428377ca7f6c75872caf98cabd982e1d76967d/coverage-7.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2bfc4dd0a912329eccc7484a7d0b2a38032b38c40663b1e1ac595f10c457954b", size = 253413, upload-time = "2026-06-22T23:09:43.306Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a5/91f11efeef89b3cc9b30461128db15b0511ef813ab889a7b7ab636b3a497/coverage-7.14.3-cp314-cp314-win32.whl", hash = "sha256:0423d64c013057a06e70f070f073cec4b0cbc7d2b27f3c7007292f2ff1d52965", size = 222946, upload-time = "2026-06-22T23:09:45.261Z" }, - { url = "https://files.pythonhosted.org/packages/58/fd/98ac9f524d9ec378de831c034dbdeb544ca7ef7d2d9c9996daf232a037fd/coverage-7.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:92c22e19ce64ca3f2ad751f16f14df1468b4c231bd6af97185063a9c292a0cb3", size = 223436, upload-time = "2026-06-22T23:09:47.177Z" }, - { url = "https://files.pythonhosted.org/packages/b4/a0/7cd612d650a772a0ae80144443406bf61981c896c3d57c9e6e79fb2cdbd1/coverage-7.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:41de778bd41780586e2b04912079c73089ab5d839624e28db3bdb26de638da92", size = 222861, upload-time = "2026-06-22T23:09:49.384Z" }, - { url = "https://files.pythonhosted.org/packages/55/57/017353fab573779c0d00448e47d102edd36c792f7b6f233a4d89a7a08384/coverage-7.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8427f370ca67db4c975d2a26acfc0e5783ca0b52444dbc50278ace0f35445949", size = 221474, upload-time = "2026-06-22T23:09:51.417Z" }, - { url = "https://files.pythonhosted.org/packages/69/92/90cf1f1a5c468a9c1b7ba2716e0e205293ad9b02f5f573a6de4318b15ba1/coverage-7.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d8e88f335544a47e22ae2e45b344772925ec65166555c958720d5ed971880891", size = 221738, upload-time = "2026-06-22T23:09:53.487Z" }, - { url = "https://files.pythonhosted.org/packages/a4/c0/4df964fa539f8399fd7679c09c472d73744de334686fd3f01e3a2465ce4e/coverage-7.14.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:beaab199b9e5ceaf5a225e16a9d4df136f2a1eae0a5c20de1e277c8a5225f388", size = 263101, upload-time = "2026-06-22T23:09:55.895Z" }, - { url = "https://files.pythonhosted.org/packages/06/76/e5d33b2576ae3bf2be2058cd1cae57774b61e400f2c3c58f3783dc2ffb4a/coverage-7.14.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3ff255799f5a1676c71c1c32ec01fd043aa09d57b3d95764b24992757184784", size = 265225, upload-time = "2026-06-22T23:09:57.904Z" }, - { url = "https://files.pythonhosted.org/packages/61/d2/e52419afe391a39ba27fdefaf0737d8e34bf03faef6ab3b3006545bbd0d0/coverage-7.14.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:878832eaac515b62decfa76965aed558775f86bf1fc8cca76993c0c84ae31aed", size = 267643, upload-time = "2026-06-22T23:09:59.938Z" }, - { url = "https://files.pythonhosted.org/packages/58/7a/f2625d8d5006b6b20fba5afaef00b24a763fe96476ea798a3076cbc1f84e/coverage-7.14.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:611e62cb9386096d81b63e0a05330750268617231e7bd598e1fe77482a2c58a5", size = 268762, upload-time = "2026-06-22T23:10:01.943Z" }, - { url = "https://files.pythonhosted.org/packages/7d/bf/908024006bba57127354d74e938954b9c3cd765cc2e0412dc9c37b415cda/coverage-7.14.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:02c41de2a88011b893050fc9830267d927a50a215f7ad5ec17349db7090ccf26", size = 262208, upload-time = "2026-06-22T23:10:03.954Z" }, - { url = "https://files.pythonhosted.org/packages/34/a0/d4f9296441b909817442fdb26bd77a698f08272ec683a7394b00eb2e47a0/coverage-7.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:526ce9721116af23b1065089f0b75046fe521e7772ab94b641cd66b7a0421889", size = 265096, upload-time = "2026-06-22T23:10:05.936Z" }, - { url = "https://files.pythonhosted.org/packages/e8/da/4ae4f3f4e477b56a4ce1e5c48a35eff38a94b50130ce5bdc897024741cfc/coverage-7.14.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e4ed44705ca4bead6fc977a8b741f2145608289b33c8a9b42a95d0f15aedbf4d", size = 262699, upload-time = "2026-06-22T23:10:07.973Z" }, - { url = "https://files.pythonhosted.org/packages/d8/7a/6927148073ff32856d78baa77b4ddc07a9be7e90020f9db0661c4ca523a1/coverage-7.14.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2415902f385a23dcc4ccd26e0ba803249a169af6a930c003a4c715eeb9a5444e", size = 266433, upload-time = "2026-06-22T23:10:10.145Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a7/774f658dbe9c4c3f5daa86a87e0459ac3832e4e3cc67affe078547f727b9/coverage-7.14.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b75ee850fc2d7c831e883220c445b035f2224de2ba6103f1e56dbd237ab913f7", size = 261547, upload-time = "2026-06-22T23:10:12.191Z" }, - { url = "https://files.pythonhosted.org/packages/3d/14/a0c18c0376c43cbf973f43ef6ca20019c950597180e6396232f7b6a27102/coverage-7.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dc9b4e35e7c3920e925ba7f14886fd5fbe481232754624e832ddba66c7535635", size = 263859, upload-time = "2026-06-22T23:10:14.492Z" }, - { url = "https://files.pythonhosted.org/packages/10/ac/43a3d0f460af524b131a6191805bc5d18b806ab4e828fbf82e8c8c3af446/coverage-7.14.3-cp314-cp314t-win32.whl", hash = "sha256:7b27c822a8161afbe48e99f1adfb098d270ae7e0f7d7b0555ce110529bdb69cc", size = 223250, upload-time = "2026-06-22T23:10:16.758Z" }, - { url = "https://files.pythonhosted.org/packages/3f/5f/d5e5c56b0712e96ce8f69fe7dbf229ff938b437bc50862743c8a0d2cea84/coverage-7.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:39e1dbbb6ff2c338e0196a482558a792a1de3aa64261196f5cdb3da016ad9cda", size = 224082, upload-time = "2026-06-22T23:10:19.23Z" }, - { url = "https://files.pythonhosted.org/packages/62/35/947cbd5be1d3bcbbdc43d6791de8a56c6501903311d42915ae06a82815f0/coverage-7.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:68520c90babfa2d560eca6d497921ed3a4f469623bd709733124491b2aa8ef3f", size = 223400, upload-time = "2026-06-22T23:10:21.24Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e3/a0aa32bfa3a081951f60a23bc0e7b512891ef0eecda1153cf1d8ba36c6b1/coverage-7.14.3-py3-none-any.whl", hash = "sha256:fb7e18afb6e903c1a92401a2f0501ac277dca527bb9ca6fe1f691a8a0026a0e8", size = 212469, upload-time = "2026-06-22T23:10:23.405Z" }, +version = "7.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/8b/adeb62ea8951f13c4c7fef2e7a85e1a06b499c8d8237ea589d496029e53f/coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f", size = 925362, upload-time = "2026-07-02T13:10:50.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/97/c52dc440c390b6cfa87be9432b141a956e2d56d9b9f5fc8bd71c5f471722/coverage-7.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50913d4bf5ddafa6ca3693da5e4dd833dd1b772e0283c99ca7f7d287db67331a", size = 220539, upload-time = "2026-07-02T13:08:19.252Z" }, + { url = "https://files.pythonhosted.org/packages/3f/26/602de8c2aec7e2e3e99ebfb8e04ba65598f746275396eea5f6794ff4673f/coverage-7.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:359e141ccd33893ce3f1ad5525f8b96083003677c82182e5907d62d4ea5799fc", size = 221058, upload-time = "2026-07-02T13:08:21.013Z" }, + { url = "https://files.pythonhosted.org/packages/fc/13/ebab0743138891c1d646d61e247ec29639afcbb6c4e1905e6a0f0c75291a/coverage-7.15.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3200b6204935f928c64b2ca1f923ab8c1acb7c9de45ec61569711b34d25cccaf", size = 247797, upload-time = "2026-07-02T13:08:22.474Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b7/b6ffb9e042aa48dc4144a8a65529affaec8dca0685309353614a2a7386ad/coverage-7.15.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:be616bf61346883b2cfdc5178669647e03531d81ab761a7e378558b7e8bcb628", size = 249626, upload-time = "2026-07-02T13:08:23.803Z" }, + { url = "https://files.pythonhosted.org/packages/9c/06/243ff05b652333d8e3d060c11223efc2723b19cacf6605e433fa686ab5d4/coverage-7.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7bafc3fe1059463a8fdd97ca79972d6e2bf819d775c7d54991b5b1971201d6", size = 251493, upload-time = "2026-07-02T13:08:25.397Z" }, + { url = "https://files.pythonhosted.org/packages/d3/2b/867faa17030a806114dae388b32a3fa929d8cd4bf39226fbc11f6e6bb705/coverage-7.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b713aa7fcf325a01d4184d848acb46fd84f78fdb0978470c636b23a06a753d91", size = 253406, upload-time = "2026-07-02T13:08:26.842Z" }, + { url = "https://files.pythonhosted.org/packages/94/c0/d789ce18f6605afc4895db75723424be2ef494282f77f61d8e5832923183/coverage-7.15.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e38e6fba2d56652fdfaf0231f8f78aeb805234a912de25dc291ee5cce5b8faa4", size = 248512, upload-time = "2026-07-02T13:08:28.398Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b6/b2673c30739f4a2e06649a0a38ad8b093c4d865462dc7bab0e9524a2c3b1/coverage-7.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:884499f42e382675be80770391983b90e0c0c774d87dbeeebf5f991cf6612b20", size = 249532, upload-time = "2026-07-02T13:08:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/acd79e9a41beabee92b623afe4f30b549916f48566271475f2907e752828/coverage-7.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:840481b12e083dbcbafab14794a8781a958edf327c8d3d70b4eee42f9b8253aa", size = 247537, upload-time = "2026-07-02T13:08:31.173Z" }, + { url = "https://files.pythonhosted.org/packages/12/d4/2d301c4d1b3238d7c88b70ab9d13fd53ed9505662a7ff1b46ba1e2e4e3c3/coverage-7.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:276646e9481703d09f854f3b2f018f24e19fd7049ae670a92570043eb97203b1", size = 251348, upload-time = "2026-07-02T13:08:32.63Z" }, + { url = "https://files.pythonhosted.org/packages/35/bb/c67708b2bc00f32e12805ec23d5fa677a0a51652f449341a89f9d6b1b715/coverage-7.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4de4b4d3f5545aa6c60dc4efd9c63b5b5dcc3bf00fe83146b2bdfffb8f6613bd", size = 247806, upload-time = "2026-07-02T13:08:33.931Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/57c4f653c47a6e917748f8938e389e72fbcae44e3643cd906664f0477a13/coverage-7.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c504097b2a89b1e85bc6070d920df77daec701337e3aeef2c17775a5dd0ca90", size = 248410, upload-time = "2026-07-02T13:08:35.189Z" }, + { url = "https://files.pythonhosted.org/packages/6c/94/bb083041aef828903668f134273f319f2bd49224962875359c52faa5497f/coverage-7.15.0-cp310-cp310-win32.whl", hash = "sha256:f6e80ed91f98316e86b9c137206b04b2bcfbffccbdff49bd2eb09dddb1cf14e0", size = 222588, upload-time = "2026-07-02T13:08:36.486Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/a09d8ee618956f626741b0734854bac4425a00e10c0565f5abca64e7e751/coverage-7.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3b3e22030f3f6f5e01a5ce69936552a5c0f6992b7698777377b99041961031f", size = 223214, upload-time = "2026-07-02T13:08:37.885Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/82e910835ef4b8391047025e1d53aa48d66029f444eb8b25373c849bf503/coverage-7.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:003fff99412ea848c0aaebcc78ed2b6ce7d8a1227ed17e68470672770b78a02a", size = 220662, upload-time = "2026-07-02T13:08:39.205Z" }, + { url = "https://files.pythonhosted.org/packages/6d/0d/c7b213dde2f1579de5231062b386d8413f79c11667eb58c39319b25991da/coverage-7.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cbd804bf2784ce7b45114516050f346ecd50f960c4bb630a7ee9e1d78fa2118", size = 221168, upload-time = "2026-07-02T13:08:40.471Z" }, + { url = "https://files.pythonhosted.org/packages/33/77/d000aeedfac085088337b3c7becdad328474b1f8a9e4c9368a0c99605d68/coverage-7.15.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8773e15c23305b58882a4611fb9b2755977eae0dc2e515366a1b6c98866cc4c2", size = 251587, upload-time = "2026-07-02T13:08:42.033Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e0/86787c56b9df17afd370d5e293515dd4d9a107a561d13054873eefad8ecc/coverage-7.15.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f50e40081494c1dc4239ebb202014cbcc3306ea96fb6302a34c8cc0967fc5ae8", size = 253497, upload-time = "2026-07-02T13:08:43.387Z" }, + { url = "https://files.pythonhosted.org/packages/3f/02/181bc917359299c07dead6270f94e411151c8b60cec905c33499da69afe6/coverage-7.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daf96f37f5fc3a7b6c6da862eb4aee61c426bd63da236ed4a73ef0e503b4bca5", size = 255607, upload-time = "2026-07-02T13:08:44.897Z" }, + { url = "https://files.pythonhosted.org/packages/b9/35/ca5e7427699913da6788c4f910e73ab16c5f4b59ec5d3a999dce2a45112f/coverage-7.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:51aa20f6ae2788fd197747766edf4cd8234fd9423309b934257fa6b21a592723", size = 257563, upload-time = "2026-07-02T13:08:46.334Z" }, + { url = "https://files.pythonhosted.org/packages/0b/4d/b8220bacc2fc3c4e9078e27c32e99fb411479a4718a72bdd00036a9891c8/coverage-7.15.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03d1f922757662eb7af586e77834792274cff776bc7b1d1a0b66a49ea9d84735", size = 251726, upload-time = "2026-07-02T13:08:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e4/2e145da1991d72189b9c3cf7eca05c716ee7080d099aaea6757cfc7df008/coverage-7.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a6d6acc9a7666245e6133dd15144ca038a85a9cd5026bb06d6bbae9e77440dc9", size = 253301, upload-time = "2026-07-02T13:08:49.5Z" }, + { url = "https://files.pythonhosted.org/packages/72/28/d2c841d698bf762e481f08bd4839d370246b6d9b61dab085a7b20b201a08/coverage-7.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ac2c4c27c7df851dc9a017c2d7de00b69147e84ba3d96f37a530b0b6fb51035", size = 251361, upload-time = "2026-07-02T13:08:51.304Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ed/55d9ffde994fba3897c0c783f77a7d053b0c18787f6892ed5b0aed73f469/coverage-7.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b761a1d504fd4bd1f20f418753964dca9f5862a511fc854dac58296b3b223671", size = 255129, upload-time = "2026-07-02T13:08:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/1d/c0/ecbf33b8c460ea2718aeb813e2df8140d0370e5f67261c31524ceb0a2a8d/coverage-7.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e43b045e11c16e897895758ae90e4a90cf99e93d58549e2f90c0e2272e155695", size = 251081, upload-time = "2026-07-02T13:08:54.188Z" }, + { url = "https://files.pythonhosted.org/packages/a9/de/fb87b4261f54448dd2b9504ef19a58be42cef0d9520595fbfe1219b15234/coverage-7.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:589b54513e901739f4b4582c705ce96b80c96f57641b1464607e2367a270e540", size = 251988, upload-time = "2026-07-02T13:08:55.726Z" }, + { url = "https://files.pythonhosted.org/packages/df/27/3494d5f291b9a4cb868f73c11221a8bd2d5bd761a8f9acea61ff57128dd1/coverage-7.15.0-cp311-cp311-win32.whl", hash = "sha256:106781b8482749162d0b47056937ba0933508e5d9447f65a5e7d5c422f0d6bb4", size = 222754, upload-time = "2026-07-02T13:08:57.091Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ee/cd4847ebc9be6a9c0123d763645a6f1f3be6b8c58c962706368b79cbac07/coverage-7.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:821e92b3631d762a339695824cadbbc73020354eba2a23a551a99ad34938fbe6", size = 223225, upload-time = "2026-07-02T13:08:58.594Z" }, + { url = "https://files.pythonhosted.org/packages/57/37/5011581aa7f2be498b97dcc7c9902192442a42f4f9a748aeadb3d6506b42/coverage-7.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:309990eb5fb8014b9f67cb211f7fd41876ec8a88a88d3ae76de0ed1d611e3640", size = 222774, upload-time = "2026-07-02T13:09:00.074Z" }, + { url = "https://files.pythonhosted.org/packages/2a/74/fd4c0901137c4f8d81a76ada99e43c65163b4c94a02ece107a4ec0c6b615/coverage-7.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b75ee5e8cb7575636ac598719b4307ac529ec8fcd79608a35c3cd4d4dada812d", size = 220838, upload-time = "2026-07-02T13:09:02.084Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2e/2347583467bd7f0402635101a916961915cc68fce652cd0db5f173ea04fc/coverage-7.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffb31267816b93b075302248cc1737506081b4f163df4401e9df1a6424aafabe", size = 221197, upload-time = "2026-07-02T13:09:03.617Z" }, + { url = "https://files.pythonhosted.org/packages/f0/17/99fa688541ae1d6e84543a0e544f83de0c944815b63e9e7b1ed411d15036/coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c", size = 252705, upload-time = "2026-07-02T13:09:05.059Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/6a95a5cd83b74839017ef9cf48d2d8c9ae60af919e17a3f336e6f9f1b7bd/coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4", size = 255441, upload-time = "2026-07-02T13:09:06.559Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/406f6c57d600f68185942422c4c00f1a3255d60aee6e5fd961425cd9987e/coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5", size = 256556, upload-time = "2026-07-02T13:09:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/74/8e/d3fa48489c15ecdec1ba48fd61f68798555dddd2f6716f9ad42adeb1a2a9/coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01", size = 258815, upload-time = "2026-07-02T13:09:09.691Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/2d40ddd110462c6a2769677cf7f1c119a52b45f568978fc6c98e4cc0dd0f/coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4", size = 253117, upload-time = "2026-07-02T13:09:11.212Z" }, + { url = "https://files.pythonhosted.org/packages/51/c0/310782f0d7c3cb2b5ac05ba8d205fe91f24a36f6bf3256098f1782181c38/coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796", size = 254475, upload-time = "2026-07-02T13:09:13.029Z" }, + { url = "https://files.pythonhosted.org/packages/86/f7/702da6c275f8ae6ade423d2877243122932c9b27f5403003b9ef8c927d12/coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382", size = 252619, upload-time = "2026-07-02T13:09:14.699Z" }, + { url = "https://files.pythonhosted.org/packages/fb/84/c5b15a7e5ecba4e56218d772d99fe80a63e63f8d11f12783723a6005ab45/coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c", size = 256689, upload-time = "2026-07-02T13:09:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/95/2f/c8b07559b57701230c61b23a953858c052890c12ef568d81780c6c46e92e/coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766", size = 252189, upload-time = "2026-07-02T13:09:17.828Z" }, + { url = "https://files.pythonhosted.org/packages/6b/80/6d2f049dd3fd3dbfd60b62ba6b2162a04009e2c002ce70b24cf3878dec7a/coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da", size = 254059, upload-time = "2026-07-02T13:09:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/ce/92/b0287a2c42031d25c628f815f89a3cd9f8268ee78bb1252c9356cda1c689/coverage-7.15.0-cp312-cp312-win32.whl", hash = "sha256:5f764a3fa339bde6b3aa97657f5a6a3a9451e4a5b4ea98a2892c773a43525f77", size = 222893, upload-time = "2026-07-02T13:09:20.812Z" }, + { url = "https://files.pythonhosted.org/packages/a9/69/e34c481915fecb499b3146975061dac528752e37706edc1804f32c822469/coverage-7.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:52f9a4d2c4c56c8848bc2f524916698354b0211488b38c49ad9ae54f6cafbff6", size = 223429, upload-time = "2026-07-02T13:09:22.315Z" }, + { url = "https://files.pythonhosted.org/packages/fe/98/6e878f0b571d32684ef3f38d7c03db241ca5b82a5da8a5391596a8f209c4/coverage-7.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:31e5c3e70c85307ea35a12964e2e40f56ca2ee4b1c8c721ccf4609d17071080b", size = 222810, upload-time = "2026-07-02T13:09:23.812Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/145a3748098bcc86b631a85408d2c3dc5c104e0bd86d605468239b25b6c4/coverage-7.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5be4caf3b28836f078abe700f8944dac4a65d78f16d6c600c89cb624e5535782", size = 220863, upload-time = "2026-07-02T13:09:25.371Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/4ed55708fed2c64b63c9bc5715daef670872202101938869b7fe5d5fbb8f/coverage-7.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd58ad1404704303ca8d4f4b8a1095e7cbc7040ef17a66df1e6619aa10176430", size = 221230, upload-time = "2026-07-02T13:09:26.897Z" }, + { url = "https://files.pythonhosted.org/packages/7b/19/3a80b97d3b2a5c77a01ae359c6bed20c13738fe3d9380f08616d4fec0281/coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5", size = 252227, upload-time = "2026-07-02T13:09:28.543Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/b70062750686bd7da454da27927622f48bbac6990ac7a4c4a4653e7b0036/coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970", size = 254823, upload-time = "2026-07-02T13:09:30.177Z" }, + { url = "https://files.pythonhosted.org/packages/a9/09/dad6a75a2e561b9dc5086a8c5257a7591d584246f67e23e70d2995b89ab6/coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c", size = 256059, upload-time = "2026-07-02T13:09:31.979Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/b5d2941fa9564573d44b693a871ff3156f0c42cbefe977a09fa7fdc59971/coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84", size = 258190, upload-time = "2026-07-02T13:09:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1d/8e895bcde3c57ccd46d896dda5f2b3d5df761a1b0c6c9d450d175dedc632/coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389", size = 252456, upload-time = "2026-07-02T13:09:35.765Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/f6997da343ddeb959be82c3b05322793f92c071ad45f7cb8a96336e2dd5f/coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950", size = 254192, upload-time = "2026-07-02T13:09:37.445Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/a0bc09d032267b9da89d95a2d874cfbef2a5aebbf0e87cf7aba221d79a99/coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e", size = 252153, upload-time = "2026-07-02T13:09:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/54/c0/77fc233d9fba07b244c40948c53fe27308b8f21732fb3417f87fbd6fd992/coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e", size = 256310, upload-time = "2026-07-02T13:09:41.006Z" }, + { url = "https://files.pythonhosted.org/packages/d5/24/601cecfb5825becacb8d45219a018a3b55b9dbaec624efdb0ea249d08be2/coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837", size = 251974, upload-time = "2026-07-02T13:09:42.733Z" }, + { url = "https://files.pythonhosted.org/packages/47/1e/6f45e5a5b3d5484318d368702af6716b5ab8913b0428bec981a562fcf296/coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37", size = 253745, upload-time = "2026-07-02T13:09:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4df027a77bd11d0e527f44c53557c76e54ad027413d0304252ea3a78d67e/coverage-7.15.0-cp313-cp313-win32.whl", hash = "sha256:0bf781da64326b677be344df505171435b6f58716108606621d5d27d964fff8b", size = 222902, upload-time = "2026-07-02T13:09:46.122Z" }, + { url = "https://files.pythonhosted.org/packages/a0/10/0355894d34e231f2c5449e71287e81a50793a325df2e2b027b7bcd9dfd19/coverage-7.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:2c57a275078ee3fa185f83e400f765bc764a549de66d99b47881645cbd4ea629", size = 223444, upload-time = "2026-07-02T13:09:47.687Z" }, + { url = "https://files.pythonhosted.org/packages/06/ef/bb725f263befaaff851203ab338e68af15e195d7f7b5f323162532d9b6a8/coverage-7.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:3812c61afc6685c7999b39320779ab8f43b7a3081fdb0def39976e56fbdb9a21", size = 222839, upload-time = "2026-07-02T13:09:49.717Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9c/1e3ca54f72a3185ece06c58d871099898c48f0ed6430d17b6ab75f0d180a/coverage-7.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:41cb79af843222e11da87127ad0ecbfa878abadd0f770a4a99391a27d3887324", size = 220906, upload-time = "2026-07-02T13:09:51.339Z" }, + { url = "https://files.pythonhosted.org/packages/09/37/f718613d83b274880382f6b67e78f3802549ae39b0b3e65ae5b5974df56e/coverage-7.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7d2008989ef8fe54188d3f3bfa2e3099b025af11e90a6a1b9e7dc433d04263d8", size = 221239, upload-time = "2026-07-02T13:09:53.138Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/22bae91e0b75445f68d365c7643ed0aa4880bbf77450ee74ca65bdae53a7/coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092", size = 252286, upload-time = "2026-07-02T13:09:54.996Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/bec5e32aa508615d9d7a2790effb25fb4dc28606e995816afe400b25ece3/coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502", size = 254789, upload-time = "2026-07-02T13:09:56.678Z" }, + { url = "https://files.pythonhosted.org/packages/17/29/0e865435b4354e4a7c03b1b7920046d31d0a273d55decefea27e011cb9bf/coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2", size = 256135, upload-time = "2026-07-02T13:09:58.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/33a870b58a13325d62fc0a6c8f01fa0ff667cef60c7498e2382a147dfa18/coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e", size = 258449, upload-time = "2026-07-02T13:10:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/18/7b/6fffe596bf3ddba8462758d02c5dad730fd91055a6634aa2e4226229181a/coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888", size = 252313, upload-time = "2026-07-02T13:10:01.946Z" }, + { url = "https://files.pythonhosted.org/packages/58/1b/11468dd6c1676ab831a70cb9a8d4e198e8607fa0b7220ab918b73fe9bfbd/coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859", size = 254142, upload-time = "2026-07-02T13:10:04.065Z" }, + { url = "https://files.pythonhosted.org/packages/79/41/29328e21d16b1b95092c30dd700e08cf915bd3734f836df8f3bdb0e8fa9f/coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99", size = 252108, upload-time = "2026-07-02T13:10:06.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/de/05ccfb990439655b35afbfd8e0d13fe66677565a7d4eb38c3f5ef2635e1c/coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676", size = 256385, upload-time = "2026-07-02T13:10:08.141Z" }, + { url = "https://files.pythonhosted.org/packages/51/0e/486828a3d2695ea7a2609f17ff572f6b01905e608379440a11da4b8dffbe/coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6", size = 251923, upload-time = "2026-07-02T13:10:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/18/c7/03582b6715f078e5e558354c87616d945b9894cda2dace8e4009b17035e4/coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe", size = 253580, upload-time = "2026-07-02T13:10:12.052Z" }, + { url = "https://files.pythonhosted.org/packages/db/dc/9e578bbaf2ecb4959a81b7e7601ad8cca772cba2892e8d144cb749b4a71a/coverage-7.15.0-cp314-cp314-win32.whl", hash = "sha256:ab282853ed5fbd64bbb162f19cb8fcb7087187508a6374b4f9c34ec1577c4e8f", size = 223107, upload-time = "2026-07-02T13:10:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3e/c8c3b75d8dbe0e35f7b0cc3ff5e949fc59500f70b21d0398813f66740664/coverage-7.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bb3040e9f4bbe26fcb0cd7cc85ac63e630d3f3a9c74f027abf4caa27e706663", size = 223597, upload-time = "2026-07-02T13:10:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/cd/bc/3cbc9fb036eb388519bccd521f783499c39b64256013fbc362782f196fe1/coverage-7.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:346771144d34f7fa84ec28386f78e0f31653f33cf35e19d253d5b35f9e8201da", size = 223020, upload-time = "2026-07-02T13:10:17.844Z" }, + { url = "https://files.pythonhosted.org/packages/28/00/199c4a8d656dff63102577a056c0fce2ff6a79e40adac092fc986c49cbf1/coverage-7.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d34a010905fb6401324ba016b5da03d574967f7b21ce48ea41e66f0f1f95f641", size = 221638, upload-time = "2026-07-02T13:10:19.703Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8e/9d0092c96a3d3a26951ecc7020826aa57bcb1b119ca81acbba996884ab13/coverage-7.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bb25d825d885ca8036795dacfc3924d33091fc76d71ebc99420c6b79e77d96fa", size = 221903, upload-time = "2026-07-02T13:10:21.514Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/c0ca3028f42c9a08e51feb4561ef1192e5de99797cd1db5b04590c215bda/coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461", size = 263267, upload-time = "2026-07-02T13:10:23.261Z" }, + { url = "https://files.pythonhosted.org/packages/5f/aa/a375e3846e5d3c013dc600b2a3231089055c73d77f5393dd2192a8d64da6/coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72", size = 265390, upload-time = "2026-07-02T13:10:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/92/e1/5783cdabb797305e1c9e4809fea496d31834c51fa772514f73dc148bcfc9/coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd", size = 267811, upload-time = "2026-07-02T13:10:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/85/31/96d8bbf58b8e9193bc8389574a91a0db48355ee98feb66aa6bf8d1b32eea/coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5", size = 268928, upload-time = "2026-07-02T13:10:29.242Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7a/5294567e811a1cb7eda93140c628fa050d66189da28da320f93d1d815c73/coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007", size = 262378, upload-time = "2026-07-02T13:10:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/69/3f/3f48538421f899f28946f90a3d272136a4686e1abf461cc9249a783ee0f3/coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9", size = 265263, upload-time = "2026-07-02T13:10:32.942Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d3/092df15efcab8a9c1467ee960eb8019bbad3f9300d115d89ea6195f369ff/coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f", size = 262866, upload-time = "2026-07-02T13:10:35.104Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ab/0254d2b88665efb2c57ad368cc77ab5de3435bd8d5add4729c1b0e79431e/coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571", size = 266599, upload-time = "2026-07-02T13:10:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/a8/79/1cfa4023e489ce6fbc7be4a5d442dbc375edb4f4fda39a352cedb53263c2/coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8", size = 261714, upload-time = "2026-07-02T13:10:38.966Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/fee5c8665656be63f497418d410484637c438172568688e8ac92e06574e7/coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68", size = 264025, upload-time = "2026-07-02T13:10:40.789Z" }, + { url = "https://files.pythonhosted.org/packages/ab/99/63005db722f91edc81abc16302f9cc2f6228c1679e46e15be9ae144b14d0/coverage-7.15.0-cp314-cp314t-win32.whl", hash = "sha256:54fd9c53a5fafff509195f1b6a3f9be615d8e8362a3629ff1de23d270c03c86b", size = 223413, upload-time = "2026-07-02T13:10:42.597Z" }, + { url = "https://files.pythonhosted.org/packages/c1/e8/2bc6181c4fb06f1a6b981eb85330cc57bfad7e3f710fc9c9d350013ba228/coverage-7.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:87b47553097ba185ed964866078e7e63adea9f5f51b5f39691c34f30afd21080", size = 224245, upload-time = "2026-07-02T13:10:44.47Z" }, + { url = "https://files.pythonhosted.org/packages/79/b8/4d959bf9cc45d0cfed2f4d35cafcab978cdb6ea02eb5100009cd740632a3/coverage-7.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aeefb2dd178fe7eee79f0ad25d75855cb35ee9ed472db2c5ea06f5b4fd00cec5", size = 223558, upload-time = "2026-07-02T13:10:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/52/30/21b2ad45959cd50e909e02ebac1e30b4ceb7162e91c11d4c570223a458b7/coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19", size = 212632, upload-time = "2026-07-02T13:10:48.641Z" }, ] [package.optional-dependencies] @@ -768,7 +750,7 @@ wheels = [ [[package]] name = "mypy" -version = "2.1.0" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, @@ -778,51 +760,52 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", size = 14778792, upload-time = "2026-05-11T18:36:23.605Z" }, - { url = "https://files.pythonhosted.org/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", size = 13645739, upload-time = "2026-05-11T18:37:22.752Z" }, - { url = "https://files.pythonhosted.org/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", size = 14074199, upload-time = "2026-05-11T18:35:09.292Z" }, - { url = "https://files.pythonhosted.org/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", size = 14953128, upload-time = "2026-05-11T18:31:57.678Z" }, - { url = "https://files.pythonhosted.org/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", size = 15249378, upload-time = "2026-05-11T18:33:00.101Z" }, - { url = "https://files.pythonhosted.org/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", size = 11060994, upload-time = "2026-05-11T18:33:18.848Z" }, - { url = "https://files.pythonhosted.org/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", size = 9976743, upload-time = "2026-05-11T18:31:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, - { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, - { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, - { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, - { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, - { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, - { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, - { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, - { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, - { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, - { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, - { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, - { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, - { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, - { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, - { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, - { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, - { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, - { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, - { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, - { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, - { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, - { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, - { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, - { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, - { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e9/7e/be536678c6ae49ef058aba4b483d8c7bc104f471479016066f345bc1f5f8/mypy-2.2.0.tar.gz", hash = "sha256:2cdd99d48590dce6f6b7f1961eda75386364398fcdaad86923bc0f0231bf9baf", size = 3950939, upload-time = "2026-07-08T01:37:27.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/f1/a818c375094e20a74ec51444cce6979cedd61d476f860c2f084ea8653bd2/mypy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97d21f3a1582ef30d0b77f9ca3ad88b4263f3c5aea9e7380cb5d7175160aec7e", size = 14903842, upload-time = "2026-07-08T01:33:27.944Z" }, + { url = "https://files.pythonhosted.org/packages/33/15/f332590488a8e4bb4a24036484c8bc750fe01fbef09701451a8790ac4c44/mypy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2529017942b951cc43db2e2712b71cc3aa7e9d90567630c03ed63d430aeec61a", size = 13902986, upload-time = "2026-07-08T01:36:59.24Z" }, + { url = "https://files.pythonhosted.org/packages/38/9f/7ae37860922d264b536790a3307caa195eb8abb733f2e81608229bbb0f07/mypy-2.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0823d7f273f3b4a49df7573eac271ddbf77a0e5f53e24d294a4f0f77ad22e1d7", size = 14132163, upload-time = "2026-07-08T01:34:16.111Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6d/25c31c85a793340a4a9be593f8fe2cea08fd7b615f8b602b3f52f2d822f6/mypy-2.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d78a0fc90704894bc9948d78affad14b882b08183a7c30412d185748aaa9418b", size = 15070110, upload-time = "2026-07-08T01:34:44.933Z" }, + { url = "https://files.pythonhosted.org/packages/cb/67/7adf1caa143f6a0d9c564de24e0c1ed48340185110c3b918adc2f447192b/mypy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6efab25fa3568569fda06928743382900860c48be9200c1758ef5ce94b532714", size = 15371554, upload-time = "2026-07-08T01:34:27.688Z" }, + { url = "https://files.pythonhosted.org/packages/49/cb/ceca928213076f540d9b068c3655c52d43549f124c1f6dece5ecb747bbeb/mypy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:daeaf5287091d68f674c91416cabab0f80f36e347ed17fded38d7ebde682e9d1", size = 11063618, upload-time = "2026-07-08T01:36:13.235Z" }, + { url = "https://files.pythonhosted.org/packages/41/24/08caa177a4f2e0c44b96d5ad85f2754761b45bb6d65841451ef5dc9edb86/mypy-2.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:f8d97940a0259e09c219903579720b2df12170c0c3a3b3799837c1fb63deb44e", size = 10070720, upload-time = "2026-07-08T01:37:13.251Z" }, + { url = "https://files.pythonhosted.org/packages/96/2e/1ea8028583fef6561d146b51d738d91268201313ecf69e603e808a740e74/mypy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea6fe1a30f3e7dc574d641497ffead2428046b0f8bc5804d13b4e4392fdc317b", size = 14739569, upload-time = "2026-07-08T01:35:33.202Z" }, + { url = "https://files.pythonhosted.org/packages/ba/67/c0607da57d78358b3b4fbfa90ee8ca5c6bd1dbb997c9648904ad4d8861d8/mypy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6965829a6d847a0925f51149472bbeb7a39332fb4801972fdfd9cedd9f8d43a4", size = 13821442, upload-time = "2026-07-08T01:33:45.991Z" }, + { url = "https://files.pythonhosted.org/packages/bb/56/0407007d4ec7a762bac20724af1f0a57a9d860186c39e73105b6b8396fa2/mypy-2.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a906bfc9c4c5de3ece6dc4726f8076d56ce9be1720baf0c6f84e926c10262a4", size = 14049813, upload-time = "2026-07-08T01:35:44.282Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d1/d718e006c8fed4bece7a1bebeea6dcd05f31433af552fc45a82fef426379/mypy-2.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91df92625cb3452758f27f4965b000fb05ad89b00c282cc3430a7bd6b0e5389e", size = 14978473, upload-time = "2026-07-08T01:36:54.064Z" }, + { url = "https://files.pythonhosted.org/packages/82/03/dae7299c45a84efb1590875f92652a5beb2da98a2cff9a567995e2583fe4/mypy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d42893d15894fd34f395090e2d78315ba7c637d5ee221683e02893f578c2f548", size = 15224649, upload-time = "2026-07-08T01:35:15.988Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8e/738e4e73d030f20852a81383c74319ca4a9a4fdaadc3a75823588fe2c833/mypy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3abaeec02cdc72e30a147d99eb81852b6b745a2c8d19607e25241d79b1abbce", size = 11049851, upload-time = "2026-07-08T01:34:39.31Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/6c58caedb3fa5831a9b179687cd7dc252c66a61dca4800e5ba19c8eff82b/mypy-2.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c39bdb7ceab252d15011e26d3a254b4aaa3bbf121b551febfa301df9b0c69abe", size = 10060307, upload-time = "2026-07-08T01:33:21.852Z" }, + { url = "https://files.pythonhosted.org/packages/d1/be/fbaba7b0ee89874fb11668416dec9e5585c190b676b0796cff26a9290fe8/mypy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:484a2be712b245ac6e89847141f1f50c612b0a924aa25917e63e6cfcf4da07cd", size = 14928025, upload-time = "2026-07-08T01:37:24.376Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8f/f79a7c5a76671b0f563d4beaa7d99fe90df4500d2c1d2ba1be0432121bcf/mypy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb0a020dc68480d40e484675558ed637140df1ccbf896a81ba68bca85f2b50a0", size = 13793027, upload-time = "2026-07-08T01:34:33.937Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b9/3db0086bab611d34e26061b86189e6f71de6d22a9b81699a93b006eabcf6/mypy-2.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc361340732ce7108fa0308812caf02bb6868f16112f1efd35bcad88badf3327", size = 14108322, upload-time = "2026-07-08T01:36:08.316Z" }, + { url = "https://files.pythonhosted.org/packages/58/29/4f1e13979a848de2a0fd385462354b58358b6e8b3d9661663e308f6e3d5d/mypy-2.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b0179a3a0b833f724a65f22613607cf7ea941ab17ec34fa283f8d6dfe21d9fa9", size = 15190198, upload-time = "2026-07-08T01:36:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/14/f7/7759f6294d9d25d86671957d0974a215a2a24d429526e26a2f603de951c5/mypy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e0899b13da1e4ba44b880550f247402ce90ffecc71c54b220bcbe7ecb34f394", size = 15424222, upload-time = "2026-07-08T01:33:39.398Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1b/05b212bef4d2234b5f0b551ea53ce0680d8075b2e79861c765f70b590945/mypy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:511320b17467402e2906130e185abffffa3d7648aff1444fc2abb61f4c8a087d", size = 11135191, upload-time = "2026-07-08T01:35:03.019Z" }, + { url = "https://files.pythonhosted.org/packages/92/51/495e7122f6589948b36d3820a046461906756a0eb1b6dedc13ebfec7815e/mypy-2.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:7589f370b33dcdd95708f5340f13a67c2c49140957f934b42ef63064d343cca0", size = 10132502, upload-time = "2026-07-08T01:34:04.508Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5f/2d7a9ac5646274cd6e77ce3abcc2a9ece760c2b21f4c4b9f301711e07855/mypy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6968f27347ef539c443ddfd6897e79db525ddb8c856aa8fbf14c34f310ca5193", size = 14931618, upload-time = "2026-07-08T01:33:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8a/1adaa7caaa104f87021b1ac71252d62e646e9b623d77900ac7a0ae252bf3/mypy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3df226d2a0ae2c3b03845af217800a68e2965d4b14914c99b78d3a2c8ae23299", size = 13857718, upload-time = "2026-07-08T01:35:27.555Z" }, + { url = "https://files.pythonhosted.org/packages/1d/15/b11586b5aebbb82213e297fc30a6fcf3bed6a9deea3739cd8dd87621f3fd/mypy-2.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc53553996aca2094216ad9306a6f06c5265d206c1bcb54dd367560bd3557825", size = 14059704, upload-time = "2026-07-08T01:33:57.363Z" }, + { url = "https://files.pythonhosted.org/packages/03/db/071e05ab442596bdf7a845e830d5ef7128a0175281038245b171a6b16873/mypy-2.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:996abf2f0bebf572556c60720e8dc0cf5292b64060fa68d7f2bc9caa48e01b6f", size = 15128719, upload-time = "2026-07-08T01:33:33.855Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1c/c4b84eafb85ee315da72471523cc1bf7d7c42164085c42333601da7a8817/mypy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ec287c2381898c652bf8ff79448627fe1a9ee76d22005181fac7315a485c7108", size = 15378692, upload-time = "2026-07-08T01:34:10.468Z" }, + { url = "https://files.pythonhosted.org/packages/68/a4/59a0ee94877fdfe2958cec9b6add72a75393063c79cb60ab4026dd5e10c2/mypy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2c967a7685fa93fcf1a778b3ebe76e756b28ba14655f539d7b61ff3da69352a", size = 11150911, upload-time = "2026-07-08T01:35:21.603Z" }, + { url = "https://files.pythonhosted.org/packages/90/e4/6a9144be50180ed43d8c92de9b03dff504daa92b5bcc0353e8960799a23b/mypy-2.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:d59a4b80351ec92e5f7415fcdd008bd77fcbefc7adf9cbc7ffe4eb9f71617734", size = 10125389, upload-time = "2026-07-08T01:36:36.164Z" }, + { url = "https://files.pythonhosted.org/packages/73/32/0aa8d8d197023ca6040f7b25a486cb47037b6350b0d3bae657c8f85fb43f/mypy-2.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1f6c3d76853071409ac58fc0aadfb276a22af5f190fdaa02152a858088a39ebd", size = 14926083, upload-time = "2026-07-08T01:36:02.365Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7c/35bbe0cb10e6699f90e988e537aaf4282a6c16e37f58848a242eb0a98bde/mypy-2.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bdaa177e80cc3292824d4ef3670b5b58771ee8d57c290e0c9c89e7968212332c", size = 13879985, upload-time = "2026-07-08T01:36:31.093Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0c/1597fbebd873e9b63452317740ae3dd32692cec5da180cc65acd96cd28cf/mypy-2.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80923e6d6e7878291f537ee11052f974954c20cb569798429a5dc265eb780b47", size = 14076883, upload-time = "2026-07-08T01:34:21.789Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/2ec021a83ec01b5d522639f78d8b36adade7fa4821db0f48fd6d82e861f3/mypy-2.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f24bd465a09077c8d64be8f19a6646db467a55490fd315fe7871afe6bb9645", size = 15103567, upload-time = "2026-07-08T01:36:47.717Z" }, + { url = "https://files.pythonhosted.org/packages/53/3a/8cb3529f6d6800c7d069935e5c83a05d80263847b8a947cf6b0b16a9e958/mypy-2.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:db34595464869f474708e769413d1d739fc33a69850f253757b9a4cc20bc1fec", size = 15354641, upload-time = "2026-07-08T01:36:41.592Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4d/320bc9a9553f8a9db5e847ec5ded762ef7ed7403c76c4ba2e8181c80e2f0/mypy-2.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b48092132c7b0ef4322773fecae62fc5b0bc339be348badeec8af502122a4a51", size = 7694355, upload-time = "2026-07-08T01:37:03.291Z" }, + { url = "https://files.pythonhosted.org/packages/90/05/bf3b349e2f885cd3aab488111bb9049439c28bc028dac5073350d3df8fbe/mypy-2.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:6fc0e98b95e31755ca06d89f75fafa7820fbb3ea2caace6d83cba17625cd0acb", size = 11329146, upload-time = "2026-07-08T01:35:38.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/a5/558b06e6cfe17ab88bb38f7b370b6bc68a74ba177c9e138db9748e422d2d/mypy-2.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:bc73a5b4d40e8a3e6b12ef82eb0c90430964e34016a36c2aff4e3bfe37ba41f0", size = 10316586, upload-time = "2026-07-08T01:36:25.458Z" }, + { url = "https://files.pythonhosted.org/packages/0b/21/f0b96f19a9b8ba111a45ffbe9508e818b7f6990469b38f6888943f7bfd3a/mypy-2.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6257bd4b4c0ae2148548b869a1ff3758e38645b92c8fe65eca401866c3c551c1", size = 15922565, upload-time = "2026-07-08T01:35:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/18/f2/1dbcb20b0865d5e992541450a8c73f2fcc90f8bd7d8a4b81313e16934870/mypy-2.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa22b3ae862ac1ce76f5976ddd402651b5f090bcfd49c6d0484b8983a29eaf8", size = 14816515, upload-time = "2026-07-08T01:34:58.167Z" }, + { url = "https://files.pythonhosted.org/packages/84/a2/18cce9c7d5b4d14010d1f13836da11b234dda917b17ca8671fc32c136997/mypy-2.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a430bf26fe8cf372f3933fbd83e633d6561868803645a20e4e6d4523f52a3b", size = 15272246, upload-time = "2026-07-08T01:37:08.72Z" }, + { url = "https://files.pythonhosted.org/packages/ce/71/24d720c7924829bd675cbde2d0fa779f50abf676ca617f53d6a8bfef5fa7/mypy-2.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d58655a60e823b1a4c9ebcda072897fb0193c2f3e6f8e7c433e152aa4cb00233", size = 16226295, upload-time = "2026-07-08T01:34:51.861Z" }, + { url = "https://files.pythonhosted.org/packages/b7/5e/785730990fc863ad8340b4ab44ac4ca23270aecff92c180ccdf27f9f5869/mypy-2.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d4452c955caf14e28bb046cbd0c3671272e6381630a8b81b0da9713558148890", size = 16493275, upload-time = "2026-07-08T01:35:09.337Z" }, + { url = "https://files.pythonhosted.org/packages/93/33/55b1edf16f639f153972380d6977b81f65509c5b8f9c86b58b94b7990b03/mypy-2.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:68f5b7f7f755200f68c7181e3dfb28be9858162257690e539759c9f57721e388", size = 11749038, upload-time = "2026-07-08T01:35:50.071Z" }, + { url = "https://files.pythonhosted.org/packages/61/36/67424748a4e65e97f0e05bf00df379dfb6c2d817f82cc3a4ce5c96d99beb/mypy-2.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:78d201accfafce3801d978f2b8dbbd473a9ce364cc0a0dfd9192fe47d977e129", size = 10704254, upload-time = "2026-07-08T01:37:17.971Z" }, + { url = "https://files.pythonhosted.org/packages/28/cb/142c2097ca02c0d295b00625ff946808bdda65acda17d163c680d8a6a474/mypy-2.2.0-py3-none-any.whl", hash = "sha256:ecc138da861e932d1344214da4bae866b21900a9c2778824b51fe2fb47f5180e", size = 2726094, upload-time = "2026-07-08T01:34:00.075Z" }, ] [[package]] @@ -1848,11 +1831,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.15.0" +version = "4.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, ] [[package]] @@ -1875,16 +1858,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.49.0" +version = "0.50.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", size = 91284, upload-time = "2026-06-03T22:01:30.448Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/f6/cc9aadc0e481344a42095d222bfa764122fb8cfba708d1922917bd8bfb01/uvicorn-0.50.2.tar.gz", hash = "sha256:b92bf03509b82bcb9d49e7335b4fd364518ad021c2dc18b4e6a2fec8c955a0bb", size = 93716, upload-time = "2026-07-06T10:38:31.984Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f0/7c228ee10c7ab8fd3a21d06579a6f7c6075c6ce72594a20fb5d2f206ff24/uvicorn-0.50.2-py3-none-any.whl", hash = "sha256:4ae72a385630bcc17a0adb8290f26c993865e0b43a2114c2aab96420172c056a", size = 72846, upload-time = "2026-07-06T10:38:30.543Z" }, ] [[package]] From 87b1ff8dedbd71aafe6b75c7b505afa95a2b88ec Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 12 Jul 2026 06:03:50 -0500 Subject: [PATCH 2989/2998] py(deps[dev]) Bump dev packages --- uv.lock | 172 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/uv.lock b/uv.lock index 34a8e5f36f..157f8b0041 100644 --- a/uv.lock +++ b/uv.lock @@ -504,89 +504,89 @@ wheels = [ [[package]] name = "librt" -version = "0.12.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c6/e0/dbd0f2a68a1c1a1991eb7921ff6014465d56608cdc9a9fb468a616210a37/librt-0.12.0.tar.gz", hash = "sha256:cb26faedbd09c6130e9c1b64d8000efec5076ffd18d606c6cd1cf02730e6d8b0", size = 203841, upload-time = "2026-06-30T16:14:29.671Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/66/c9d88366893b4b0df6b5375c27ebc9f14c43419d9e244b493be20e85bc74/librt-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fe3547407bbce45c09885591f90168325c5a31a6795b9a13f6b9ff3d25093d93", size = 144398, upload-time = "2026-06-30T16:12:03.947Z" }, - { url = "https://files.pythonhosted.org/packages/bd/f2/9be1c6da204701163ec3aaedbf893d2f656b363d8fa302af536ce6471eb4/librt-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5925eca673207204a3adca040a91bdd3738fc7ba48da647ccd55732692a35736", size = 148924, upload-time = "2026-06-30T16:12:05.583Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f3/256824ee27649c6e0a693db25d391f97b43b52364f8efb466014a564bbc7/librt-0.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f9ef097a7711465a204454c69658bbb6b2a6be9bdef0eeeba9a042016d00688", size = 479654, upload-time = "2026-06-30T16:12:07.175Z" }, - { url = "https://files.pythonhosted.org/packages/a8/3f/f4adbb3f293a04bd3dc2eb91d814f5b1e221e6b4522585696ba6901a0b9a/librt-0.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57abc8b65edf1a8e80e5472c81c108a7527202e5febfda9e00a684dbaeae534e", size = 472318, upload-time = "2026-06-30T16:12:08.758Z" }, - { url = "https://files.pythonhosted.org/packages/9d/b5/362c93f7b43d4ef84a3d5f156c8d4eeddb22badcf5529a1281c387abbbd7/librt-0.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e6f53732a8ae5012a3b6ae092da2933be74ec4169d16038f4af87a0019afea", size = 501555, upload-time = "2026-06-30T16:12:10.623Z" }, - { url = "https://files.pythonhosted.org/packages/24/1d/2d6abf059c3a4b88a6668e7bb81af332b14463028ac8f2b08a1212eb1ebc/librt-0.12.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:edb5f06cdb38d6ef9fd7ae06d62962d65c881b5f965d5e8a6c53e59c15ae4338", size = 494118, upload-time = "2026-06-30T16:12:12.503Z" }, - { url = "https://files.pythonhosted.org/packages/39/c1/f91f3094be2c76361d88aca613d8b7586d15b6026714d59d2e3dc0e35f44/librt-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1473ef42263dfee7553a5c460f11730a4409acf0d52629b284eb1e6b13eb460a", size = 516318, upload-time = "2026-06-30T16:12:14.192Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e2/5211af94252458cbed7a6250163dff9c5a84aec29609121c828375a3b319/librt-0.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1d6f69a06295fb6ad8dcf92b4b2d15d211842005e86eedce64d88e0633592f58", size = 522294, upload-time = "2026-06-30T16:12:15.879Z" }, - { url = "https://files.pythonhosted.org/packages/90/9b/de31f5b9fdf7fa3699c4bbbecf82ebd52013d5d6b500b70b07b0ebacbd51/librt-0.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3275d0270cd07ca9c2e140ae4da34e24a0350e98c6e3815dce96ead67cf0487d", size = 502494, upload-time = "2026-06-30T16:12:17.394Z" }, - { url = "https://files.pythonhosted.org/packages/b1/48/22c18dff89f3900dddb3e470e6f7febcda37ff3667b73097a848c9a608b2/librt-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4834462ec68613024d063c7efe9b188e350d40fda9ba937372039883d2a8051", size = 543422, upload-time = "2026-06-30T16:12:19.006Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/74691b4b55944227245fffef063714e3ab9707ab1111eb0068512b428c7c/librt-0.12.0-cp310-cp310-win32.whl", hash = "sha256:bcf9b55ac089e8cf201d2146833e1097812c15dcea61911e84d6a2904cf78893", size = 97642, upload-time = "2026-06-30T16:12:20.386Z" }, - { url = "https://files.pythonhosted.org/packages/c5/dc/7f8fa369a1f7cc9b090fecd373659ada0e9bab1ae4a3ac9f163eabd04977/librt-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0a122002f7e0d5c93e84465c4b3fe86621402b7b92f1e2bc0784ebe67793112", size = 117583, upload-time = "2026-06-30T16:12:21.829Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ab/628490f42d1eba82f3c7e5821aa62013e6df7f525b7a9e92c048f8d1cc1c/librt-0.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f13c1e8563102c2b17581cf37fcb2c6dae7ad485ccea93ae46258998c25f9a1", size = 143821, upload-time = "2026-06-30T16:12:23.248Z" }, - { url = "https://files.pythonhosted.org/packages/38/5f/793e8b6f4b6ac16e7d7198478c0af3670606fbb535c768d5f3e954781423/librt-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1ddff067610a122387024c4df527493b909d41e54a6e5b2d0e6c1041d6dfa09", size = 148442, upload-time = "2026-06-30T16:12:24.582Z" }, - { url = "https://files.pythonhosted.org/packages/ad/92/c780fe37a9e0982f3bd8fd9a631d6b95d09a5a7201c6c50366ce843b7e42/librt-0.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8dc7ebb5f3eec062398e9d0ef1938acd21b589e74286c4a8906d0183318d91b", size = 478276, upload-time = "2026-06-30T16:12:26.101Z" }, - { url = "https://files.pythonhosted.org/packages/41/bb/226d444bc20d7dff4a19ec6c1ff2c13a76385eebddb59c9c00c923b67536/librt-0.12.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:198de569ea9d5f6f33808f1c00cc3db9de62bf4d6deafa3b052bd08255083038", size = 472337, upload-time = "2026-06-30T16:12:27.83Z" }, - { url = "https://files.pythonhosted.org/packages/12/79/98ac0840ee90a75d4e1155c79062860b12ccca508587ff2119fc086965f2/librt-0.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e958678a8bca56016aedc891b391c0e0813ea382a874b54a2c1b313c1d232720", size = 502087, upload-time = "2026-06-30T16:12:29.443Z" }, - { url = "https://files.pythonhosted.org/packages/6f/72/a6b1a0d080606a7f5f646b79a1496f21d709f8563877759ace9ce5adad73/librt-0.12.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575a6eca68c8437ed4a8e0f534e31d74b562ba1049a0ee4b5f09e114bcc21be1", size = 493202, upload-time = "2026-06-30T16:12:31.077Z" }, - { url = "https://files.pythonhosted.org/packages/69/cf/e1b036b45f2fc272205ee18bf272b47e8d684bf1a75af26db440c7504359/librt-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:86f241c50dc9e9a3f0db6dbb37a607c8205aa87b920802dabbd50b70d40f6939", size = 514139, upload-time = "2026-06-30T16:12:33.032Z" }, - { url = "https://files.pythonhosted.org/packages/40/34/b193b3e6985469a2f8afa86c90012329c86480b6ff4f2e4bd7b5b937e134/librt-0.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:113417b934fbf38220a9c7fe94578cefbe7dbb047adcb75aa197905af2b13724", size = 519486, upload-time = "2026-06-30T16:12:34.996Z" }, - { url = "https://files.pythonhosted.org/packages/31/9e/7de4947b1695f247c813f833e3c1e7b77b52e52a7dba2c35411cf806b58e/librt-0.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:762f17c0eb6b5d74e269126996cea8a89e35ab6464c5151619163abcd8623ae2", size = 499609, upload-time = "2026-06-30T16:12:36.663Z" }, - { url = "https://files.pythonhosted.org/packages/59/11/f3730e04e758b1fbf215359062ad2d5b6bd0b0ab5ac46b1c140628795be7/librt-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa93b3bd7f7588c628f6e9bf66485d3467fd9a1ccdb8975b770178f39f35697", size = 542205, upload-time = "2026-06-30T16:12:38.56Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/710453617eabe20e18433864f335534c8aff63fbc68d8cd9dbc70a3d08f6/librt-0.12.0-cp311-cp311-win32.whl", hash = "sha256:aaa04b44d4fe86d824616b1f9c13e34c7c01ec0c96dd2abc4f59423696f788e2", size = 98067, upload-time = "2026-06-30T16:12:40.102Z" }, - { url = "https://files.pythonhosted.org/packages/42/53/401bff50a56e95daf151d911c99adf5732af2190e8f4d11886c9a229103c/librt-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aaeeddb8e7e4ae3bb9f944e0e618418cb91c0071d5ddbfcc3584b3cf59d39f0", size = 118346, upload-time = "2026-06-30T16:12:41.388Z" }, - { url = "https://files.pythonhosted.org/packages/e5/9a/a3a9078fe88bfc2d2d99dcf1c18593938ae830089cf84c3b2532a6c49d63/librt-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:18a2402fa3123ab76ecca670e6fb33038fde7c1e91181b885226ec4d30af2c2c", size = 104760, upload-time = "2026-06-30T16:12:43.112Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1a/5bec493821b0e85b91de4f234912b50133d1aedb875048eef27938ec3f96/librt-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9bce19aa7c05f91c989f9da7b567f81d21d57a2e6501e2b811aa0f3f79614c1a", size = 146756, upload-time = "2026-06-30T16:12:44.395Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d0/cc04b48a57c1f275387f5578847214c4a6c21bfb24c6c8c8d6ba753fe403/librt-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0ace09f5bf4d982fe726015f102fb856658b41580597104e301e630ed1d8d86", size = 145537, upload-time = "2026-06-30T16:12:45.95Z" }, - { url = "https://files.pythonhosted.org/packages/9e/10/c02325556beb2aa158c9e549ddade8cc9a23b36cdad14756dbed730c1ff1/librt-0.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d007efe9243ede81ce75990ad7aa172da1e2024144b3eff17ba46a5fff1fff3c", size = 488637, upload-time = "2026-06-30T16:12:47.658Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9e/7b49ca1c30baa9c8df96024aa09a97c35a97455e36004c9b5311703c56f3/librt-0.12.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ad324a5e4858388a4864915b90a42efc8b374376393f14b9940f2454e791912b", size = 483651, upload-time = "2026-06-30T16:12:49.283Z" }, - { url = "https://files.pythonhosted.org/packages/4d/71/03c8c8cec39645fda451132ff9d6d662fc5aea42a1a188a77a4fddb35906/librt-0.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10a40cf74cdd97b6f8f905056db73f5d459783de2ca04c6ebd1bf47652818e7e", size = 518359, upload-time = "2026-06-30T16:12:50.999Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ec/a9f357f94bbcba92277d22af22cff42ef706ae5d9d6d58b69bebf3a67954/librt-0.12.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:92e61c09de95217ae02a9d17f4f66cf073253cdc51bcfdc0f15c62c9a70baa85", size = 509510, upload-time = "2026-06-30T16:12:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/7a/34/717055325d028743aa01a7691ad59a63352a26a8ff2e7eeb0c9249514150/librt-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0461344061d6fc3718940f5855d95647831cef6d03a6c7506897f98222784ad4", size = 527302, upload-time = "2026-06-30T16:12:54.244Z" }, - { url = "https://files.pythonhosted.org/packages/95/f8/7612eeedb3395d92f7c6a84dca5f15e282d650483a4dc01aa5b9cffdfda3/librt-0.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6dfe89074732c9287b3c0f5a6af575c9ede380a788013876cc7b14fe0da0361", size = 532568, upload-time = "2026-06-30T16:12:55.74Z" }, - { url = "https://files.pythonhosted.org/packages/79/1e/a9afe85d5bb8b65dc27be3809ed1d69082079e1e9717fd2c66aa9939600c/librt-0.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9efed79d51ad1383bba0855f613cca7aa91c943e709af2413ac7f4bb9936ce08", size = 521579, upload-time = "2026-06-30T16:12:57.884Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1e/93aebb219d52c37ea578f83b0588cd7b040974e464d4e435086a48b4dc4d/librt-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1eac6cc0e23e448fb3c1446ed85ff796afb616eed5897c978d35dbec030b7c7c", size = 558743, upload-time = "2026-06-30T16:12:59.577Z" }, - { url = "https://files.pythonhosted.org/packages/3c/85/1680c0ec332f238e3145c5608d313ab0a43281e210a5dd87e3bc3cc25631/librt-0.12.0-cp312-cp312-win32.whl", hash = "sha256:0ab8ee0210047ae86ca023ccfbfe3df82077fd1c9bc021aebbf37d993ef64af0", size = 99200, upload-time = "2026-06-30T16:13:01.015Z" }, - { url = "https://files.pythonhosted.org/packages/30/0e/abca12d8904875aa2ad66327390a3f7b1b75ebc43c0a00fc763cecf32ea5/librt-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:51c8bfa12632c81b94401c101bcedd0c56c3a1f8fa3273ca3472b28cd2f54003", size = 119390, upload-time = "2026-06-30T16:13:02.493Z" }, - { url = "https://files.pythonhosted.org/packages/32/a5/4203481b6d3a3bb348c82ac71abf1fcb4cb3ae8422a24a8dee4cd3ac5bd7/librt-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:5eebd451f5def089369ba6d8ff0291303d035e8154f9f26f7633835c5b029ade", size = 105117, upload-time = "2026-06-30T16:13:03.952Z" }, - { url = "https://files.pythonhosted.org/packages/f2/87/568d948c8079c9ff3c9e8110cf85f1eb70218e1209af29d0b7b89aa4a60c/librt-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8d9a55760a34ae5ce70434aabb6a6c61c6c44a0ec58ca1cfd9cd86e4745d417d", size = 146808, upload-time = "2026-06-30T16:13:05.417Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1d/bea471ecea210088847bb5f3c4b4b424d596518934c06679b78ca85d6e63/librt-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ff0b197e338b4cf432873e0d6ef025213fdea85311ec4d87d2ea88c28adf2409", size = 145503, upload-time = "2026-06-30T16:13:07.023Z" }, - { url = "https://files.pythonhosted.org/packages/eb/9e/984ad422b56de95fdce158f06b051655373784ebea0aba9a7fcbc41614d1/librt-0.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e69f120a20b69e2539d603bbd4d62db38399b10f8bf73a1cf445038a621e8af", size = 488421, upload-time = "2026-06-30T16:13:08.492Z" }, - { url = "https://files.pythonhosted.org/packages/50/03/1a2f94009b07ea71f8e1a4cfe53370565b56da9caa341b89e0699325e9f5/librt-0.12.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fde3cde595e947fc8e755b0a21f919a1622483d07c662d00496e040773d22591", size = 483488, upload-time = "2026-06-30T16:13:10.169Z" }, - { url = "https://files.pythonhosted.org/packages/aa/3b/084bdc295823fbb6ab91670047adf8f420787f9e8794bf2d140b66dc196b/librt-0.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d977447315fa09ea4e8c7ae9b4e22f7659b5128161c1fd55ff786b5349f73503", size = 518428, upload-time = "2026-06-30T16:13:11.681Z" }, - { url = "https://files.pythonhosted.org/packages/c9/22/5a307390b93a115ffbecd95c64eecb4e56269680e45e9415ada7285f2cf4/librt-0.12.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ffac8a67e4143cea9a549d4822b93bc0bbaad73fc25aa0ab0ba5ec27d178677", size = 509744, upload-time = "2026-06-30T16:13:13.217Z" }, - { url = "https://files.pythonhosted.org/packages/b5/90/83f3cb6184f5d669660717b4b2e317c9ddaccf7ca5bb97f2196deac1a3b7/librt-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:94af1ed773ff104ef08ef3d669a0ba9d3a5916c609eb698cffe5d5476d66ff9b", size = 527749, upload-time = "2026-06-30T16:13:15.277Z" }, - { url = "https://files.pythonhosted.org/packages/7d/3b/f162be5cc88d47378e3a20776fe425fa1c2bece755da15e2783ebf06d3d6/librt-0.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:548199d21d22fb26398dfbbe0ba953a52465c66f3a49f38e6fddce1b127faf53", size = 532582, upload-time = "2026-06-30T16:13:17.074Z" }, - { url = "https://files.pythonhosted.org/packages/c9/28/6c5d2f6b7232fd24f284fc4cab37a459fe69a9096a09942f44cc5c55e073/librt-0.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c8f1f413b966a9dd3ecf80cd337b0ad7bb3de2474a4ff448ed3ebabfc3f803fc", size = 522235, upload-time = "2026-06-30T16:13:18.823Z" }, - { url = "https://files.pythonhosted.org/packages/a9/1c/bd115360587fdc22c8ae8fac14c040a556b442e2965d4370d2cf274c8b95/librt-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55f13f95b629be5b6ab38918e439bf14169d6f9a8deaae55e0c14e12fb0c74b9", size = 559055, upload-time = "2026-06-30T16:13:20.509Z" }, - { url = "https://files.pythonhosted.org/packages/fe/5a/c26f49f576437014825a86faea3cec60c1ed17f976abd567b6c12b8e35a7/librt-0.12.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:8b2dc079dfe29e77a47a19073d2040fa4879aa3656501f1650f8402ddce0313c", size = 79809, upload-time = "2026-06-30T16:13:22.401Z" }, - { url = "https://files.pythonhosted.org/packages/69/0b/a55244261d9ad7375ac039b8af06d42602722e2e8b8d8d6b86e4a3888c02/librt-0.12.0-cp313-cp313-win32.whl", hash = "sha256:da58944be8270f2bfee628a9a2a60c1cf6a12c8bea8e2c9b6edf3e5414ca7793", size = 99308, upload-time = "2026-06-30T16:13:23.661Z" }, - { url = "https://files.pythonhosted.org/packages/c9/bf/ed9465e58d44c5a5637795547d0841c8934aab905ea452cac1adf14672cf/librt-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db4be3037e4ce065a071fa7deee93e78ebc25f448340a02a6c1c0b82c37e383", size = 119438, upload-time = "2026-06-30T16:13:25.188Z" }, - { url = "https://files.pythonhosted.org/packages/c0/44/3cad652aeb892e6e8ffe48d0fafa2bc652f28ec7ed3f4403fcbb1be4f948/librt-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:05fd2542892ad770b5dd45003fd080477cf220b611d3ee59b0792097eb0873a9", size = 105118, upload-time = "2026-06-30T16:13:26.533Z" }, - { url = "https://files.pythonhosted.org/packages/0e/51/3a0e05618c12423b6fc5141b590ec02a6efb645833edc8736a6c7b46d1ec/librt-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b37ee42e09722284a6d9288fe44a191f7276060a3195939bb77c6502058dbb34", size = 145579, upload-time = "2026-06-30T16:13:27.909Z" }, - { url = "https://files.pythonhosted.org/packages/77/9e/fd399d099dfb4020f3f7c34e7e6210c389fa89f7d79ca92f5afb0395f278/librt-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ade11988728b3e4768dadc5696e82c60e9b35fc95335a9b4d1f5d69e753ccec7", size = 150139, upload-time = "2026-06-30T16:13:29.357Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ee/610239fbd8c4b005443664c5d4c3bc1717daedd8c71369bf45011aa87194/librt-0.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f351ed425380e39bd86df382578aa5b8c5b98e2e265112de7379e7d030258150", size = 480457, upload-time = "2026-06-30T16:13:30.78Z" }, - { url = "https://files.pythonhosted.org/packages/0c/10/ceddc9010f26c541444be36e1153a79b64626694db2d33a524c719fa3e46/librt-0.12.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:857d2163e088c868967717ace8e980017fd868a735f3de010412af02bdc30319", size = 479002, upload-time = "2026-06-30T16:13:32.398Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f1/b1523d9718e8192e5403e6b41a02742e17ba554369f0729b9f30ab590e2d/librt-0.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2befc80aa5f2f5b93f28abaaf11feff6677931dd548320e44c52deaa9399744", size = 510527, upload-time = "2026-06-30T16:13:34.615Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0e/0f3ff43befb18a531615736791e52fb67eaa71ff7b89e6e5f7004b64cc6e/librt-0.12.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:be3694dcfa97c6715dd19ac73d3e1b21a805514a5785663e57fecacd3ff64e5a", size = 500988, upload-time = "2026-06-30T16:13:36.408Z" }, - { url = "https://files.pythonhosted.org/packages/a8/1a/0278ea4a9e599dc507c43839a87f2c764ad04bf69418e2d763d58659e55f/librt-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2d5f67e86f45638843d025b0828f2e9e55fc45ff9180d2618ccdeaf72a796050", size = 519318, upload-time = "2026-06-30T16:13:37.883Z" }, - { url = "https://files.pythonhosted.org/packages/59/55/090e10e62be2f35265e41601337f83ac9f83be9aca1bf92692e3a82effdd/librt-0.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:64572c85e4ab7d572c9b72cd76b5f90b21181b1459fa6b1aac6f8958c4fcff31", size = 527127, upload-time = "2026-06-30T16:13:39.682Z" }, - { url = "https://files.pythonhosted.org/packages/1f/34/8052c9ec678be6ba751279947831f089aa69b009000b985ce91d1979669a/librt-0.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8b961912b0e688c1eb4658a46bdb0606b31918d65597fbe7356ca83aa653ffcc", size = 509766, upload-time = "2026-06-30T16:13:41.266Z" }, - { url = "https://files.pythonhosted.org/packages/6f/f8/8761b36189e9ec8dc20b49fa84cef22852c6c41fcda56f760f7fc1360da5/librt-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:722375903e3f079436a7a33da51ce73931536dd041f9feb01536f05d8e010c96", size = 552043, upload-time = "2026-06-30T16:13:43.197Z" }, - { url = "https://files.pythonhosted.org/packages/c8/98/7283971ef6b70269938b49c7b25f670ec6325d252265fbcc996f9b364379/librt-0.12.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:a5a96a8f536b65ef1bf910c09e7e71647edde5111f6e1b51f413c6fba5bfe71b", size = 79472, upload-time = "2026-06-30T16:13:44.64Z" }, - { url = "https://files.pythonhosted.org/packages/c3/5e/b30940dea935e8ac5bd0e0abb1985f5274590d557ac3a252ca0d5392ce52/librt-0.12.0-cp314-cp314-win32.whl", hash = "sha256:8ffc99c356f1777c506e1b69dc303879153ae2640ba15b8f3d4448bc87139149", size = 94246, upload-time = "2026-06-30T16:13:45.962Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4e/0af9fe63f35fa304da3b05688f30ff6a329bcc59581b1cc51dc87fd30141/librt-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:1e68fb20798f455cda41d20a306a23c901218883f17a4bab1ed6e1331b265fb7", size = 114951, upload-time = "2026-06-30T16:13:47.279Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8e/843c495d7db35e13b84cd533898fa89145c40dc255da0bc316d53d631464/librt-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:2df534f97916cf38ec9b1ddafeb68ae1a4cd4a54775ff26a797026774c0517cf", size = 100562, upload-time = "2026-06-30T16:13:48.699Z" }, - { url = "https://files.pythonhosted.org/packages/75/30/c686d0f978d5fd6867c5bbad96b015c9445746764d1c228e16a2d30d9382/librt-0.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c09e581b1c2b8a62b809d4f4bd101ca3de93791e5b0ed1a14085d911be3dee3f", size = 153897, upload-time = "2026-06-30T16:13:50.017Z" }, - { url = "https://files.pythonhosted.org/packages/40/46/f6f2d77ce46628b48fb5280709013b5109cf3a2c46a2472093cdfc03519d/librt-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:976888d0d831402086e641018bcc3208e0a38f0835789da91f72894b2cb4161f", size = 156391, upload-time = "2026-06-30T16:13:51.462Z" }, - { url = "https://files.pythonhosted.org/packages/c2/46/cd790c7e19e460779471530ffab454541d6ea4a3b7d338cad7f16ff96995/librt-0.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:563c37cdb41d08fe1e3f08b201abac0e317ca18e88b91285466ee0a585797520", size = 564151, upload-time = "2026-06-30T16:13:53.146Z" }, - { url = "https://files.pythonhosted.org/packages/54/12/724559a15fb023cbdef7aee1e81fbfbc3ee22fd09009baa816cea63e3a60/librt-0.12.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b97eb1a3140e279cc76f85b0fb92b7eb3dfbe0471260ee878bc9dc4bf9a0d649", size = 546002, upload-time = "2026-06-30T16:13:54.665Z" }, - { url = "https://files.pythonhosted.org/packages/4b/7e/f9d8c257ab4909f101c7c13734367749e782fd8625545f0343502c2f09f1/librt-0.12.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06e0623351ab9904cf628245f99c714586f4dd23dc740b88c8bc670d8401a847", size = 584204, upload-time = "2026-06-30T16:13:56.301Z" }, - { url = "https://files.pythonhosted.org/packages/9b/33/64665810575ac23b6cb6ef364de51309b7803620c12885b6e895ebc29591/librt-0.12.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da12f017b2e404554be14d466cd992459feaa44f252b0f18d909a85266ce1237", size = 573688, upload-time = "2026-06-30T16:13:58.1Z" }, - { url = "https://files.pythonhosted.org/packages/0f/01/27522995c6627455abc7a939d57535fb1a7836d398ccedb3d7585f46039e/librt-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d97f31003a5c86b9e78155a829572c3a26484064fb7ac1d9695fe628bd93d029", size = 604719, upload-time = "2026-06-30T16:13:59.831Z" }, - { url = "https://files.pythonhosted.org/packages/ee/1f/099e61b1b688551d6d2ce9d4d2ae2242a938759db8551e6cbac7f7176ee5/librt-0.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:bd43a6c69876aef4f04eaae3d3b99b0be64755fda274002fa445b92480bf664e", size = 598183, upload-time = "2026-06-30T16:14:01.457Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c1/050400249665503bdd5b83cec518fa7b183b609341c8dcd58161775c4226/librt-0.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c01755c72fca1dc6b8d5c2ed228b8e7b2ffe184675c22f0f05ebd8fe188b9250", size = 582559, upload-time = "2026-06-30T16:14:03.29Z" }, - { url = "https://files.pythonhosted.org/packages/da/d1/eef8f0e6722518b65a3d3bcd9309f9f44e208ce5d6728070820f988e7078/librt-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:625ae561d5fa36400856dcc27464400d047bc2d5e3446be88f437b03fefd72e4", size = 626375, upload-time = "2026-06-30T16:14:04.957Z" }, - { url = "https://files.pythonhosted.org/packages/8b/78/f0bb41a6f2bbd3c77bdcc66980dc0d69ca1192a0ecec25377afcc5e6db73/librt-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8d73191883553ee0739741544bf3b00aba2a1224e45d9580b30cbc29e21dc03b", size = 97752, upload-time = "2026-06-30T16:14:06.555Z" }, - { url = "https://files.pythonhosted.org/packages/92/24/e279c27972ab051a070237cfa45728fa51670c3f22f1a4d391711e9f4c31/librt-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e1cbb037324e759f0afa270229731ff0047772667f3cb38ef5df2cabf0175ede", size = 119562, upload-time = "2026-06-30T16:14:07.908Z" }, - { url = "https://files.pythonhosted.org/packages/06/e6/42a475bfca683b0cd5366f6dd06580062b7e567bb8534d225c877c2f14f3/librt-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bca1472acbd473eff61059b4409f802c5a1bcb4cd0344d06f939df9c4c125d40", size = 104282, upload-time = "2026-06-30T16:14:09.29Z" }, +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/2f/3908645ddddab7120b46295e541ead308109fa48dbec7d67d7a778870d60/librt-0.13.0.tar.gz", hash = "sha256:1d2a610c14ac0d0750ee0a3ab8548e83155258387891caaca04def4bf7289781", size = 211402, upload-time = "2026-07-08T12:26:29.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/2f/ec5241c38e7fa0fe6c26bfc450e78b9489a6c3c08b394b85d2c10e506975/librt-0.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:34e47058fcc69a313293d6dee94216a4f30c929ae6f2476e58c5ba635aa639d5", size = 148654, upload-time = "2026-07-08T12:24:30.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1a/d651e18d3ee7aa2879322368c4f278bb7ecaa6b90caadfdec4ebfa8389f3/librt-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbdd5b6509d0c2a8fe72cf494c299a61dbd58142a90a4190664ae159e4a7b547", size = 153537, upload-time = "2026-07-08T12:24:31.773Z" }, + { url = "https://files.pythonhosted.org/packages/45/18/10bff2122577246009d9619b6569596daf69b7648812f997ca9ca0426f60/librt-0.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e56ea4ee4df77585a6b5c138f6538680886024fa559f5b55bd14b12e98e67b2", size = 494336, upload-time = "2026-07-08T12:24:33.079Z" }, + { url = "https://files.pythonhosted.org/packages/67/69/87dfee871b852970f137fdeae8e2ca356c5ab38e6f21d2a3299535fc3159/librt-0.13.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f1f9cc4d09a46d9cb3c2063ae100629d3f52a6517c3c08c2f4c9828261883929", size = 485393, upload-time = "2026-07-08T12:24:34.324Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d5/625447a8c0441ff5f15f4ac5e1d323fb9d4d256ebfde7a3c8e003f646057/librt-0.13.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f125f5d46b20f89dc5587a55cc416b4ba2a5b2ffda36d048ee120e17598a653a", size = 515382, upload-time = "2026-07-08T12:24:35.575Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d8/1c8c49ea04235960426444deece9092a6b3a9587a850a81bae2335317411/librt-0.13.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2608d3b39f9e0b4a66a130d9150c615cba40a5090d25eeeaa225e0e46de8c0ac", size = 509483, upload-time = "2026-07-08T12:24:36.923Z" }, + { url = "https://files.pythonhosted.org/packages/6f/65/f1760fc48050e215201a03506c32b7270159088d01f64557b53e39e74a45/librt-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9fd35e95ab5e45c3901d37110263c7db85a961110f5460588fe37f8c131f88a7", size = 532503, upload-time = "2026-07-08T12:24:38.203Z" }, + { url = "https://files.pythonhosted.org/packages/18/1b/793e281dcf494879eff99f642b63ebc9c7c58694a1c2d1e93362a22c7041/librt-0.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5f31b0aa13c9b04370d4da6be1ab7779776b3a075cceb6747a39a4be85fe1e40", size = 537027, upload-time = "2026-07-08T12:24:39.34Z" }, + { url = "https://files.pythonhosted.org/packages/69/45/0801bbb40c9eea795d3dd3ce91c4c5f3fe7d42d23ec4be3e8cb283bcc754/librt-0.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0b795f5fc70fbbb787ceaf79bb3a0d627bcc33c53de51741755263ec406b775a", size = 517100, upload-time = "2026-07-08T12:24:40.907Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6c/eb5f514f8e29d4924bc0ff4601dd7b4175557e182e7c0721e84cffa39b8a/librt-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36b306a623aaad96fe4b378692b54f9c0789fccd833b9851753d5fbf6138cfde", size = 558653, upload-time = "2026-07-08T12:24:42.359Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bf/f140100d1b59fe87ff40b5ecbb4e27924335b189a784e230ee465452f6c2/librt-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a3762e75fcac8c9e4dacaaf438bffd9003e2ca2c531b756f3c0035deefa674c8", size = 104402, upload-time = "2026-07-08T12:24:43.668Z" }, + { url = "https://files.pythonhosted.org/packages/22/7c/57e40fef7cfb61869341cb28bdcefe8a950bebcbecca74a397bae14dce4a/librt-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:d63bae12a8aeb51380be3438e4dc4bd27354d0f8e19166b2f44e3e94d6f552dc", size = 125002, upload-time = "2026-07-08T12:24:44.793Z" }, + { url = "https://files.pythonhosted.org/packages/89/25/a6498964cfeec270c468cffdc118f69c29b412593610d55fa1327ca51ff4/librt-0.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b5a7bbff495baedbd9b916c367d66854008f8f3b575908ded477c499dc60082", size = 148029, upload-time = "2026-07-08T12:24:45.961Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/dc86d1bffd8e0c2818bace29d9f7783cfbb8e0673bf3673b5bbd5bbe0420/librt-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34bc7938b9fdf14fe32a406c19c71faf894c5cee7e7474bd0be2f17200b82d14", size = 153036, upload-time = "2026-07-08T12:24:47.257Z" }, + { url = "https://files.pythonhosted.org/packages/29/3f/b923826660f02f286186cd9303d52bb05ced0a13708edc104dc8480920e3/librt-0.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f40e56b61b41be5f7dec938cfeffd660668cf4b5e72c78e7bd671d66b7bc2c79", size = 493062, upload-time = "2026-07-08T12:24:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/88/87/6c0980a9c9b1302cb68d108906697b89eceb55889bb1dcf77c109aa56ca5/librt-0.13.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:9c5d02b89de5acd0379a51ec44a89476fb03df6145442e1c8ecd6bee2f91b176", size = 485510, upload-time = "2026-07-08T12:24:49.727Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/795ae3b9df5dd94079fb807e38191855e023e8c6249014ae6bc3f0d9a490/librt-0.13.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7db9a3ff32ef5f7d1703d93831a3316cdf0b537de6a1cc03cc8fdd09b9194e89", size = 515909, upload-time = "2026-07-08T12:24:51.135Z" }, + { url = "https://files.pythonhosted.org/packages/20/e5/182de15abce8907108a6fdb41487de65beb5099b74dc5841b19b099168db/librt-0.13.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3dbb2a31882456cadc7053378e81ad7ed7693db4ac9f98ab5f81ef034aa8ec9f", size = 508620, upload-time = "2026-07-08T12:24:52.358Z" }, + { url = "https://files.pythonhosted.org/packages/32/03/33978d32db76e1f66377e8f78e42a2ca3c162143331677d1f50bbad36cfb/librt-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c6014e3c80f9c1fe268ef8b0e0ef113bac672cc032f2f93866e7ddad4f3e663d", size = 530363, upload-time = "2026-07-08T12:24:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f5/b291fbd2d00f7d8287bcbf67b5aa0c6afed4bc26cef23e079629c47a2c04/librt-0.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:091b60a4d2174fc1ec5c34cdc0b72efb6224753d76b7da61ebeab7a191aec8bd", size = 534209, upload-time = "2026-07-08T12:24:55.138Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/6f41f17939d191bc21609f220da8509316bc62797f078545fe83be522e78/librt-0.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:66cb1138f384a191a6d75f986064841fcfdc0cea98f7bd9c9ab9b38049917588", size = 514254, upload-time = "2026-07-08T12:24:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/af/c2/2e4befa5410a7443019c14abccc94ff619797171f6b72013635fb87f31d7/librt-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:17221a7569f8f292aa0014226e48aa25b8c2b08da18088cd230953d0ea0f9cd1", size = 557611, upload-time = "2026-07-08T12:24:57.561Z" }, + { url = "https://files.pythonhosted.org/packages/ab/54/8b69f81448417adbc040a2185f4e2eece1e1994b7dcfaeed4662b30f98a5/librt-0.13.0-cp311-cp311-win32.whl", hash = "sha256:fc67741da44c6eaa90e01eafb586bbba9b51eb5b6ed381ee6f5ae72eb3316d21", size = 104906, upload-time = "2026-07-08T12:24:58.806Z" }, + { url = "https://files.pythonhosted.org/packages/76/5a/f4aaf37b50f2fde12c8c663b83fdd499cdc24f957f19543d7414bfcc9e25/librt-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:cc99dfb62b23c9207c33d0be8a2e2af7a42e21e6ea388b380a0c948c7b88953b", size = 125852, upload-time = "2026-07-08T12:25:00.065Z" }, + { url = "https://files.pythonhosted.org/packages/f2/99/bf1820e6feeabc2f218c24450ec0c995d6a91e8ba0fd3caf042c9e8adb2a/librt-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:40ccd13c252d3fe473ffc8a57be7565abc8b64cf1b108344c859d5164f7f3e0c", size = 111832, upload-time = "2026-07-08T12:25:01.148Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/b2933ddae222dac338476abb872641169a5cfed2c2bb5444a5b07b32b0c3/librt-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30536798f4504c0fad0885b1d371b0539abb081e4570c9d7c641cb51141b49f0", size = 150990, upload-time = "2026-07-08T12:25:02.42Z" }, + { url = "https://files.pythonhosted.org/packages/90/ef/db98f744ca50e6efc9c95c70ee49b77aefac31f6a3fc7c83754a42d6a74f/librt-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93d24ebb82aa4420b1409c389e7857bc35bd0b668007ac8172427d5c73cc8cc5", size = 155238, upload-time = "2026-07-08T12:25:03.681Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/a197e7bc72baf2c61ce7fdc6906a5054dc05bd8da0819aa894e4857bf87e/librt-0.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb8a1adce42d8b75485a5d56a9623a50bcab995b6079f1dac59fc44034dd93d9", size = 503073, upload-time = "2026-07-08T12:25:05.049Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e7/7887712e27da7c1ab80fcabb1de6eb24243964f6557cae530d4b70706dbd/librt-0.13.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0763ca2ab66058174f9dee426dc64f5e0a89c24a7df8d3fe3f1836c04e25de4b", size = 496528, upload-time = "2026-07-08T12:25:06.26Z" }, + { url = "https://files.pythonhosted.org/packages/94/f0/f2283385bb6b950b26a1410f4ce51ec27231e0b3a4b925c46366d218b198/librt-0.13.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b222493da6e7b6199db9bd79502436cf5a27da3c1f7fa83c7e285444fc93fd03", size = 531786, upload-time = "2026-07-08T12:25:07.658Z" }, + { url = "https://files.pythonhosted.org/packages/36/11/69ac3b54766ffba5fd7e5acebfb048d66dbe1f9f2d14516c2b3edc59cf87/librt-0.13.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fadc63331f4388c3dc90090448f682a7e9feafc11481391c1e94f2f907a3976e", size = 524393, upload-time = "2026-07-08T12:25:09.121Z" }, + { url = "https://files.pythonhosted.org/packages/61/5f/d72f95fd444a926a3c14b4e24979474116988dd57a45be242077c45d3c22/librt-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70d9c62a4cffd9f23396cd5ef93fc5d11b31596b9b7d6306074abe3d5fcf09bd", size = 543026, upload-time = "2026-07-08T12:25:10.459Z" }, + { url = "https://files.pythonhosted.org/packages/c4/08/dcd9993ad192737a004ba263d549f8ea605b326b952e7d6205c7d4170b76/librt-0.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66c0e7e6b02a155576df2c77ec933a70b72da726e248c494abf690923e624348", size = 546829, upload-time = "2026-07-08T12:25:11.716Z" }, + { url = "https://files.pythonhosted.org/packages/96/d5/6d9bb2f54e4109a956b7128836529653eb9d740f784bc47ed10a02c1000e/librt-0.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ac04bcd3328eb91d99dfedf6a60d9c1f15d3434e6f6daf922f0420f7d90b85c7", size = 535700, upload-time = "2026-07-08T12:25:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f2/10946922503858a359492fa27f13e86228bde702116a740ac7b3cd185f24/librt-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db327e7271e653c32040b85ae6188059c924b57d7e1e29f935523fa017cd4e82", size = 573566, upload-time = "2026-07-08T12:25:14.336Z" }, + { url = "https://files.pythonhosted.org/packages/48/a8/94f00e3c99479a18088af3685ea016c42f3c7d5d1964d8dbb40c08d7f1aa/librt-0.13.0-cp312-cp312-win32.whl", hash = "sha256:860bd1d8ba48456ce08feaf8d343a8aaeb2fa086f2bcaa2a923fa3f7a3ff9aa3", size = 106099, upload-time = "2026-07-08T12:25:16.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/7b/2da9c74c1ed25a89cc4e1c8e007ea2eb4a0f1fafa3e70d757fe3242c5c5c/librt-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54a315caf843c8d77e388cadc56ea9ded569935ee2d2347d7ea94992e5aa6fa", size = 126934, upload-time = "2026-07-08T12:25:17.275Z" }, + { url = "https://files.pythonhosted.org/packages/d0/65/aead61bbf3b5358593f9d4779d2a0e88eaf6ec191a6342dde36dd1df6371/librt-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:c718e99a0992127af84385378460db624103b559ab260435abcfe77a4e4ed1c1", size = 112236, upload-time = "2026-07-08T12:25:18.425Z" }, + { url = "https://files.pythonhosted.org/packages/67/3b/18e7b63255297a2bdc9c25c8d6d4ca8eca9f63aceb1252c0f7427ac7099e/librt-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a468951af16155824e88bdd8326ebe5bdb371f3ec0ac04642994b98201d914f3", size = 151027, upload-time = "2026-07-08T12:25:19.638Z" }, + { url = "https://files.pythonhosted.org/packages/4d/68/e2248452c00d1a03b45fee1752cdc8f790a476efd2402b75181da88a9e61/librt-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae01d8512cc17079e53425635327dbf3f7ff57a42c00dec348bf79791c56444c", size = 155152, upload-time = "2026-07-08T12:25:20.851Z" }, + { url = "https://files.pythonhosted.org/packages/0e/16/52b1c99bf19057a062aac39c900cbb81499f6f75d6c537c14463d247ba78/librt-0.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32c26893cd085c1efe83219e78d866da23fb20a066101b8f68210004361d224c", size = 502499, upload-time = "2026-07-08T12:25:22.055Z" }, + { url = "https://files.pythonhosted.org/packages/9f/54/b811151805c795f55e0dedee6ec687b75f9982a8105d240ea3910737a77b/librt-0.13.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5929da1981a46bcf4b28b1b9499905f0ff58e2419da402a048234e9783acbc4b", size = 496108, upload-time = "2026-07-08T12:25:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f8/094d6b2bd93f3fdaa54db54cc788c4a365333bddad65ab02e04da0b1d004/librt-0.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b85d664d777bab6c0d709416cb42938251fda9e221b79e3a2215d85df5f4f9", size = 531576, upload-time = "2026-07-08T12:25:24.648Z" }, + { url = "https://files.pythonhosted.org/packages/2e/40/541733d5755824f968f7ec39d78ffbd75d145964157ae5e69a09ec6d7326/librt-0.13.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:531b2df3e9fe96b1fcf73a6d165921e4656be5f58d631d384ebce344298368db", size = 524390, upload-time = "2026-07-08T12:25:25.898Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b5/255673cfdbf5ba663339d36cd863c897289ab4337577e19f9405ce059f36/librt-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:109b84a9edf69ad89dc1f66358659e14a031baca95e3e5b0060bd903ede8efd6", size = 543053, upload-time = "2026-07-08T12:25:27.436Z" }, + { url = "https://files.pythonhosted.org/packages/9e/11/ab5005e9c9850710f21e354201bf090646349d3fabf5f951eaf70235729e/librt-0.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1304368a3e7ffc3e9db986796cc5326fdb5943a3567ecc137cff318e4240c0e7", size = 546387, upload-time = "2026-07-08T12:25:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/a2/04/a5d7ce1d1df1afd15ca283dcdf7530ac073e12d69ae8c40879dda96f7868/librt-0.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e4f9b472e7d308d94b62c801982065661158c6ed02790d6c7ddb4337cea0f9c1", size = 535970, upload-time = "2026-07-08T12:25:30.171Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/927e267a6daa290174ac281b23c9804c8829b042ade9c6f24a065f540958/librt-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f836c37478f167a81200d8c8b2c920a22224564bed2c23d7aeec760965c367a", size = 573582, upload-time = "2026-07-08T12:25:31.507Z" }, + { url = "https://files.pythonhosted.org/packages/10/24/b6c5213efe39c19f9e13605644d0cf063b4ddaa33ac2e45b088e23a70e2e/librt-0.13.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:4000d961ff9598ac6ea603c6c836a5ed49bc205ade5fc378b998dfe1e2c36628", size = 82189, upload-time = "2026-07-08T12:25:32.675Z" }, + { url = "https://files.pythonhosted.org/packages/4c/00/d29736be177a906ac0b84a5b04b4fbfa22c776dc2f366de4172b0f968c08/librt-0.13.0-cp313-cp313-win32.whl", hash = "sha256:79e44cff71750d299d61a678e49995b0d5935a9cda238c2574daeca3ba536927", size = 106193, upload-time = "2026-07-08T12:25:33.692Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ac/aff6fb45393cb8912f39dfb156ef6b2d1cadb207ff465fc8f66141054be8/librt-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:54dab44a847d5ad1acd05c8a83fe518ae685516ecf4d3f7cc6e3df2a66767650", size = 126962, upload-time = "2026-07-08T12:25:34.769Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3a/d68cb2b334d53fd30fac81d3a489ce4ba0d9506f4df43fcf676b68352b19/librt-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:d4cb6fbfdf874340ab5e51450753c0f817b6958a3621125ee695bbc3de866566", size = 112127, upload-time = "2026-07-08T12:25:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/7b/66/f49ae0d592bd45b6941e9a8bafcb6a87cddcd501ee7874707e767f01b585/librt-0.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:25218d94b1d2cbc0ba1d8a3f9dc9af578d9646e5ed16443a70cde1dfdcce6d71", size = 149818, upload-time = "2026-07-08T12:25:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/3d/50/51c76d74014d04fb95b6506d286808984b78a2f7a41039094e6b2194ac48/librt-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f26629539d4893c2957a16c41bb058e1e135c1f150f6a2e25ed047f64cf3f5c6", size = 154071, upload-time = "2026-07-08T12:25:39.399Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fe/f19b0f5f82d5a1f2da736586bc840abd00ce07d6388136ae80b7333883fc/librt-0.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4517d47b2b8af26975a406fba7d314de9696d864252e0257c6ea90238cfe27f", size = 494168, upload-time = "2026-07-08T12:25:40.641Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/b8550c75775127fd31a5f20e8775997f7b527ad661fc8ddccd7497c064f7/librt-0.13.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f19e181de5b3a1148bb3420b8c4b0b0ea0fce6950099724ad151d6cea5acc180", size = 491054, upload-time = "2026-07-08T12:25:41.905Z" }, + { url = "https://files.pythonhosted.org/packages/30/14/4d0204867623df3f33f86efd3d3692ba5e01321443f4d6eab35a22697618/librt-0.13.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22034924f5b42d5a56371cf271771bfeaabf235a7a8b6264bef2d20013f786c6", size = 523006, upload-time = "2026-07-08T12:25:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/19/0a/c45fc9a260934696bace1ac5df1e148ac92bd71767aee3bf7cd7a4534f4c/librt-0.13.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7897db4e95e22468bdda33d8e012ceacd0182abf001e6389d763f0def6286b9", size = 515058, upload-time = "2026-07-08T12:25:44.541Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/50c5ce45b326854ef8fa6ae4c36cf5142e5c55315eaf9e51d0ae73ac4da3/librt-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ce61b3746545029d4f5c17d6bd74b676254ad98433086c846ffb5e8fa73f007", size = 534025, upload-time = "2026-07-08T12:25:45.825Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/08c413c8f93fc13b8103624fce38e5caa86cd08cbbc8465870ab287af54b/librt-0.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:46c330e82565962c761dbce7941be2cff7db674ee807455a8d0cadc5f9b759b0", size = 540557, upload-time = "2026-07-08T12:25:47.059Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/93af71fb4a364952210051811dd4e40174e79656b050c89cacac18af3330/librt-0.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:375f5af8f99cbaa99dd293af986e3d57caabc9ba81a5d3f021603764854197a1", size = 523201, upload-time = "2026-07-08T12:25:48.392Z" }, + { url = "https://files.pythonhosted.org/packages/c1/6e/9766f07b676a4889d9f8bc2864e9ba5fff165653143ef4dda7df6aa34d16/librt-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9320d34c3376ae204b2cd176e8d4883a013934e0aef822f1aed9c536490c275d", size = 565740, upload-time = "2026-07-08T12:25:49.678Z" }, + { url = "https://files.pythonhosted.org/packages/a2/1e/664e3472ce2b6e10e9b83f29d4a36eb982ff6b5a169ae7567bba3a4c4ff5/librt-0.13.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9af313c66157a69dc69ea0059a66961692250e0dc95af9c385a48ffb770a0d16", size = 81611, upload-time = "2026-07-08T12:25:50.857Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d4/8582a4d65e2234673685e07309d02c230b28a85724eb0acbf13f019b7f6e/librt-0.13.0-cp314-cp314-win32.whl", hash = "sha256:f2a7253458e34f33543551394ae4fe104b497ec2a65ac266074de64c1df82e37", size = 100106, upload-time = "2026-07-08T12:25:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/63/ce/0cb99efe6086b46cd985dc26672166fae312a239690e75871f7fafbd3fc5/librt-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:a3dfe4edf10e8ed7e55b026a8bfc2c2a8704218b659cd4bffdf604fab966dc39", size = 121209, upload-time = "2026-07-08T12:25:53.166Z" }, + { url = "https://files.pythonhosted.org/packages/26/85/4f3ccb083a3c9b0d42e223acdb3c3f507953324a59cdcab4826e8e2e3b89/librt-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:68a5faee4bba381cb93b5961f684a514cf0053cb92308ff9c792c2fea0b174c6", size = 106404, upload-time = "2026-07-08T12:25:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/b2/77/333191499538c8e8189de7a4cba8e6f49ee949fd6d6e6324b21fd1522466/librt-0.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a38fb81d8376dfa2f8963b265fec07637802b0d01e2a127c19c66cb070fb24f5", size = 159231, upload-time = "2026-07-08T12:25:55.432Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9e/2aa83758f22c278b837a1d8025898434ce2b8bff36678d5330ecaef56dff/librt-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d4c8d9bd5abce34b2e75edb3bf37ab0f34e49b1f915a40ae8468eb7c85bc5b46", size = 161300, upload-time = "2026-07-08T12:25:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c0/86791e936553ca763d6b3c2fb4d31d596cd00e14fa631c283a40ba01559a/librt-0.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:387e2f1d27e89bffe0d3f520f0da0662c973fd607ca16c1808f8a5085419485e", size = 582056, upload-time = "2026-07-08T12:25:58.144Z" }, + { url = "https://files.pythonhosted.org/packages/a8/d3/a9ec15984a185e000c4d2a16ba28bd623124ad4c38a10974c7ff78e3a893/librt-0.13.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:4f6db193d2e5e0ed60359b9a5a682cd67205d0d3b1e459a867dd4b5c4e7eaa7a", size = 562758, upload-time = "2026-07-08T12:25:59.544Z" }, + { url = "https://files.pythonhosted.org/packages/3c/af/dbe36b78b19c06a55097f99305e4ea9458e2273e6ae16a3cbecaad7ee978/librt-0.13.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d38604854e8d22faadf683ec6c02bb0f886e2ba56ef981a1c36ee275f21ea22", size = 602095, upload-time = "2026-07-08T12:26:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a8/2966891b4dd2830f5203fbee92ac2c4947653a2390ba73dfa44244fad025/librt-0.13.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:371f7ce73026815dafd51c50ce38416e91428b28c4b2ec97cd39271164b0045c", size = 593452, upload-time = "2026-07-08T12:26:02.352Z" }, + { url = "https://files.pythonhosted.org/packages/61/f5/4df8bfc8405ecf8c0d525b4d69636f694bdd8620b313ec8b76e54a5926cc/librt-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3aaedf52171bee90860704c560bc798fe83b76247df47568e0197e9b13c735a0", size = 623729, upload-time = "2026-07-08T12:26:04.294Z" }, + { url = "https://files.pythonhosted.org/packages/d6/13/9ac202dffc8db06f75d06c08c2f9f6ff054be67d21272dcc078fa1cc0c57/librt-0.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:96bad8725a4f196a798366c25ce075d1f7543a4ec045ffc13e6a7ec095cdab04", size = 617077, upload-time = "2026-07-08T12:26:05.845Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f0/ebe38610716aee5cb28efd95089bb90192096179802779381e1c5dcf239c/librt-0.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:6bf6a559ffe4a93bbea6cf31ddf01a7fd9ba342ef51f27beb178e318b74acd61", size = 599561, upload-time = "2026-07-08T12:26:07.21Z" }, + { url = "https://files.pythonhosted.org/packages/4f/5c/c2e72e236fff7abc716d5b1753b8b8cd3ea85ac46fe17d2e7c51d4e1c723/librt-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:301067672387902c55f94b51d5022304b36c966ea9fe1f21caab99a9bef487c9", size = 645511, upload-time = "2026-07-08T12:26:08.562Z" }, + { url = "https://files.pythonhosted.org/packages/0c/99/6203ce619dee940d6bfbe099ec3fe4be00a68e9d60f70abf906cf124fe66/librt-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:5fdcf34f86de8fb66d7dc7589f96ba91c4aa46671200d400e6fd6f109a483f18", size = 104357, upload-time = "2026-07-08T12:26:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/52/dd/843b6314087c41657c7036d7914d8f294bdf9b580aa8513ea0588c8e9a3d/librt-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:260c33e92263fa629b4f6d3c51967a1c2158fe6c33237aaa3ebeac586b085259", size = 126998, upload-time = "2026-07-08T12:26:10.975Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/3dcec2884ba1b0806d1408612555c38dd5d68e90156b59f75f6e36435c3a/librt-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2f281549a4c52ac7bb97997f14353f8bd0e53a34ca0dad1c905cfd0b4a58ae99", size = 110771, upload-time = "2026-07-08T12:26:12.303Z" }, ] [[package]] @@ -1858,16 +1858,16 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.50.2" +version = "0.51.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/f6/cc9aadc0e481344a42095d222bfa764122fb8cfba708d1922917bd8bfb01/uvicorn-0.50.2.tar.gz", hash = "sha256:b92bf03509b82bcb9d49e7335b4fd364518ad021c2dc18b4e6a2fec8c955a0bb", size = 93716, upload-time = "2026-07-06T10:38:31.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c91e1e973bbe2a878591538655d6e1d47f24ba1c51f3/uvicorn-0.51.0.tar.gz", hash = "sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0", size = 94412, upload-time = "2026-07-08T10:59:05.962Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/f0/7c228ee10c7ab8fd3a21d06579a6f7c6075c6ce72594a20fb5d2f206ff24/uvicorn-0.50.2-py3-none-any.whl", hash = "sha256:4ae72a385630bcc17a0adb8290f26c993865e0b43a2114c2aab96420172c056a", size = 72846, upload-time = "2026-07-06T10:38:30.543Z" }, + { url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" }, ] [[package]] From a100a58478d85238d51fbb34b9f58fdfc72d19f6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 13 Jul 2026 20:39:54 -0500 Subject: [PATCH 2990/2998] =?UTF-8?q?py(deps[docs])=20gp-sphinx=200.0.1a33?= =?UTF-8?q?=20=E2=86=92=200.0.1a34?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up the latest gp-sphinx docs stack — hidden +HIDE doctest setup and the sphinx-autodoc-api-style duplicate-modifier fix. what: - Bump gp-sphinx and sibling workspace pins 0.0.1a33 → 0.0.1a34 - Relock uv.lock --- pyproject.toml | 20 +++++----- uv.lock | 104 ++++++++++++++++++++++++------------------------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7be7c60599..55bfd7fcca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,11 +60,11 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a33", - "sphinx-gp-highlighting==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-gp-mermaid==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a34", + "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -88,11 +88,11 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a33", - "sphinx-gp-highlighting==0.0.1a33", # https://gp-sphinx.git-pull.com/ - "sphinx-gp-mermaid==0.0.1a33", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a34", + "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 157f8b0041..b04c8e298a 100644 --- a/uv.lock +++ b/uv.lock @@ -396,7 +396,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -406,9 +406,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/76/60aabfebbb1f1ba252f6b6e88c0ebfbf71f44efa24653fce927523b82492/gp_furo_theme-0.0.1a33.tar.gz", hash = "sha256:9e1b88480e9934e9bdcd6275e6ca2b2e0ebdfc158d2b1168e65c5cabc04eb8fe", size = 34309, upload-time = "2026-07-05T20:59:18.128Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/3d/2f84408adfd0ae79e00c021b205cea3f63e19e7bfb2a0a5adb5859f2e6a0/gp_furo_theme-0.0.1a34.tar.gz", hash = "sha256:fc6ae36a7ad7a23c0da776b6301ab29237b6ac37f4544373964cf94aceb4af75", size = 34308, upload-time = "2026-07-14T01:26:28.876Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/9a/f49007947023fc6434f99f024ff07e93a29bf3b7516d5ae891ebf87c0003/gp_furo_theme-0.0.1a33-py3-none-any.whl", hash = "sha256:c551e2cd2d5183ba2b3a5f27abe23684800ed4c5c74a9664fa9d87aabf5c8ce4", size = 43660, upload-time = "2026-07-05T20:58:52.094Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/88b831bf29ceb7282813f71b4a65d40e1bfdfd1643268f21292e2281f9c7/gp_furo_theme-0.0.1a34-py3-none-any.whl", hash = "sha256:96d4e721ca3747fce26effd5a55bcbbd4db6a056d2cd795cf4ae73828ec9d880", size = 43657, upload-time = "2026-07-14T01:26:02.191Z" }, ] [[package]] @@ -427,7 +427,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -449,9 +449,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/24/77c1e04cc5ba09a6ee86f4a9ae9c32188d9fd130ded03a85bbcfdfb4f697/gp_sphinx-0.0.1a33.tar.gz", hash = "sha256:f4641cb9ca80bc27ff0d56fba7d52d0ae551e6af1b2f29ef934442d05abfd1cf", size = 19762, upload-time = "2026-07-05T20:59:19.043Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/a7/f85c7f300050f58460d13f65daca0ecb033349b57e461b6c1f643561b6d1/gp_sphinx-0.0.1a34.tar.gz", hash = "sha256:5601d9d4f19552d32e5629ce00cf034f7f1fbbbfe36ba6e00c2d2e76bdbb1433", size = 19762, upload-time = "2026-07-14T01:26:29.927Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/3c/02dd665b29fad830a696873a9f33abc675c2259a0add1c596279a7526836/gp_sphinx-0.0.1a33-py3-none-any.whl", hash = "sha256:c5447abf6c300514accf917e93fd93d1893dda5c1d929e0b2f31d2e0967ff1d5", size = 20282, upload-time = "2026-07-05T20:58:53.655Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9b/1812365d4bd5b1a67aa00f18526676064ccfc6580994921f8a484b4b134f/gp_sphinx-0.0.1a34-py3-none-any.whl", hash = "sha256:4dc785ea4aa1374909ef13462a4a04bb138d6d1e57994297cf3f19bb6d02ffb5", size = 20279, upload-time = "2026-07-14T01:26:03.599Z" }, ] [[package]] @@ -1307,7 +1307,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1315,14 +1315,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/76/080b7c325b8f60b4cc57bdc39858baebe2a9e5da31069db98da73ea54036/sphinx_autodoc_api_style-0.0.1a33.tar.gz", hash = "sha256:ddfbe402e57b20b99dbc6b1524da0310c0cdd031058c9ef1e73cdd9bc2b66421", size = 8978, upload-time = "2026-07-05T20:59:19.918Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/75/d1888a511b0f14af5f4b1b8d8a21281674ef16daf6a07b81d18e9491fa42/sphinx_autodoc_api_style-0.0.1a34.tar.gz", hash = "sha256:672146fa2760801653d258c175f3c9e05bb7e149e80b80b01051ddc52e755ca4", size = 9455, upload-time = "2026-07-14T01:26:30.903Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/79/2adee7e13b1f5848333d0024269d25a86e2095d70dc7a37d14eac465f342/sphinx_autodoc_api_style-0.0.1a33-py3-none-any.whl", hash = "sha256:c6e10bb27422dd047e490e4b55d7c6129ba172a6292e6a438f54891c84d2caf5", size = 9066, upload-time = "2026-07-05T20:58:55.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/03/2f11f4acec4faeac941915777dc70cc31218714aa85e1dd70b894ac0918c/sphinx_autodoc_api_style-0.0.1a34-py3-none-any.whl", hash = "sha256:03b5202a976b2bed4249459519523c590d5dca80ff5a0378d9fa8856ab9e8a8b", size = 9567, upload-time = "2026-07-14T01:26:05.332Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1330,22 +1330,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/ab/d57d083b043aecf4a98fd9dee2c83a9b1d0954ca343cfa11a8e1af6f7056/sphinx_autodoc_argparse-0.0.1a33.tar.gz", hash = "sha256:4ae9a7955eee39ccab6eae53818444b7b00f1412093bb45f68d36e533bf331de", size = 42804, upload-time = "2026-07-05T20:59:20.874Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/82/1161221501a288edff7e778801f7d799381d79ef0f6c72ebb5d5167476e6/sphinx_autodoc_argparse-0.0.1a34.tar.gz", hash = "sha256:78ce98475090b2f718fd26e0459c8c6fe5fa1731e1de79571fc3e98271c3bfe0", size = 42801, upload-time = "2026-07-14T01:26:31.861Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/07/66c7c4effef6d9f4562b055459b1524f23e6e06649ed004c3eb565c468ce/sphinx_autodoc_argparse-0.0.1a33-py3-none-any.whl", hash = "sha256:625223f98b8ac8ce259dd1049d803139878d3d7282c1cc6d4d858c0e067a9f9e", size = 47654, upload-time = "2026-07-05T20:58:56.631Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a3/af879d9718607a72eca9fe2a9308377766e0abad883ef404e606d7ae278e/sphinx_autodoc_argparse-0.0.1a34-py3-none-any.whl", hash = "sha256:2eab09a290674b2e7aace149f8e1cf07e3ca8d124ebb21b4826d6984a41b2ef6", size = 47654, upload-time = "2026-07-14T01:26:06.732Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/f6/2e63ba25c40c81dda92069c83a38db483e0510466c286b0fcb81d2ef1899/sphinx_autodoc_typehints_gp-0.0.1a33.tar.gz", hash = "sha256:c7b1da543002d9b61e46ab2e22d9bdceb8f8acec790e5651e0bbeca5979571e4", size = 36501, upload-time = "2026-07-05T20:59:25.657Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/4a/cedc7da36921ba7fdb98d6b9f4b7a9f0d1546be3c84dae6e1667a185d77e/sphinx_autodoc_typehints_gp-0.0.1a34.tar.gz", hash = "sha256:97b9f197e6d3205745db3cad7ba6eb1668ce57680c2cae7c8550e0ce01f6098a", size = 36866, upload-time = "2026-07-14T01:26:36.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/2b/55d6d5ce62d2b9d892622661a2408fff6624093dc0cd8ee65a7c514e2dbf/sphinx_autodoc_typehints_gp-0.0.1a33-py3-none-any.whl", hash = "sha256:dd7c0522383146d4caf8f10db5145ffa0ed405837e4d5e57c500a6a242e5cf9b", size = 38657, upload-time = "2026-07-05T20:59:04.037Z" }, + { url = "https://files.pythonhosted.org/packages/51/05/f49438bedcf8613666d3019b1d2d5816a58711fd944b5a6c64de2980f62d/sphinx_autodoc_typehints_gp-0.0.1a34-py3-none-any.whl", hash = "sha256:dd5575e4d904940eba0a59e1510666de512006a8df7893448bef9143aaabf64d", size = 39049, upload-time = "2026-07-14T01:26:14.05Z" }, ] [[package]] @@ -1407,20 +1407,20 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/97/dae5e823ab8474828f870bfdf2bc6003448beec1365e42391ce9fc55615c/sphinx_fonts-0.0.1a33.tar.gz", hash = "sha256:f5e8c304086ebda2b739c3f72127d2a1ad88153c8c7b59b03b1a015b8e072847", size = 5790, upload-time = "2026-07-05T20:59:26.683Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/64/654804528ef85604722dbb168de178fcae5daac8e85c86317dff5155422d/sphinx_fonts-0.0.1a34.tar.gz", hash = "sha256:bf8392cd057c430db3064a0dd6f43bfd0defe94a80fcd0c68993b04268201cb4", size = 5790, upload-time = "2026-07-14T01:26:37.893Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/2d/d5526216ce75d361f9aebd6bc052e0dd1b200870bc0e082468d22a38b65f/sphinx_fonts-0.0.1a33-py3-none-any.whl", hash = "sha256:4eaa49f30bfa3e2705a6fe7f73865840e6fc387e69a8cb9872543e86ac3ed111", size = 4362, upload-time = "2026-07-05T20:59:05.315Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/713e7e8f1f79105045c30a864bceeef62b6ebf65b6551e531868f2403fa4/sphinx_fonts-0.0.1a34-py3-none-any.whl", hash = "sha256:5057228567d03e554f47045cc32a178bd6bbeab9cd01e760bde8f2236843872e", size = 4361, upload-time = "2026-07-14T01:26:15.473Z" }, ] [[package]] name = "sphinx-gp-highlighting" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1428,75 +1428,75 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/64/391a3cce536f5c94e27a9bfe8a2642b7a94db3c2ac888ab4b041813e2275/sphinx_gp_highlighting-0.0.1a33.tar.gz", hash = "sha256:6dfd4ac73478497f3e5a277a38b10698dd8d18819d404aa7a9e3aee5b901e19a", size = 7452, upload-time = "2026-07-05T20:59:27.488Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/b7/0e144d176a024285c43b81c38e6a49fdd517c06b83b7371afd83fdc6c390/sphinx_gp_highlighting-0.0.1a34.tar.gz", hash = "sha256:e38a705a74ff733079c9d4a4220511b363a313b131da620f6bd641987785ace3", size = 7451, upload-time = "2026-07-14T01:26:38.79Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/43/afaf5370f0992731e9c7554d51661b7328db3836c19549dabad73702a4b2/sphinx_gp_highlighting-0.0.1a33-py3-none-any.whl", hash = "sha256:87e8411505d6f81af95c60d2053e3316c65ed6fee026ff3ad2e1c7180965650d", size = 7389, upload-time = "2026-07-05T20:59:06.446Z" }, + { url = "https://files.pythonhosted.org/packages/00/5c/646952a5105b64dda2309d10a5a0154fb2df47db3799049256a42b1b6c6e/sphinx_gp_highlighting-0.0.1a34-py3-none-any.whl", hash = "sha256:ef9cf59c39324f0e749b5247fe15286976532d36a0a1bd89234ad4debb336976", size = 7388, upload-time = "2026-07-14T01:26:16.711Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/cc/2c09d454b8864e0a097e231759de3c75525adb7f7e5a8a671db7f7719f11/sphinx_gp_llms-0.0.1a33.tar.gz", hash = "sha256:8314ba66140210d7cfe8ab2f5be6b7a805df9a6076b96ff16219b1ca18783504", size = 9910, upload-time = "2026-07-05T20:59:28.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/86/3a1d4a33af633f77a2463bccfd88905eff5c76625250f56e66e5fc8ada8d/sphinx_gp_llms-0.0.1a34.tar.gz", hash = "sha256:19b0d98ba21057c09af49b0794c65cf8fd62860ff2576a631a1ba53684a15037", size = 9911, upload-time = "2026-07-14T01:26:39.676Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/c3/7e338f137ac12a1343c86f0ed1ec11bebc05dc00d159c3271594005b8070/sphinx_gp_llms-0.0.1a33-py3-none-any.whl", hash = "sha256:a4f2b2e037b9f6366482a6acbaa460d3320e32d5bb2581e4cc9d0d070a93d166", size = 12637, upload-time = "2026-07-05T20:59:07.823Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/fff0db236b43e6e11b1625c9988585f14151f1a871bd4d2f20a6ba1d9255/sphinx_gp_llms-0.0.1a34-py3-none-any.whl", hash = "sha256:ef4707c96e5387c95dbc4237f87f8c2d0e85afdd5798aea4f0a86bf767cf87ce", size = 12635, upload-time = "2026-07-14T01:26:18.435Z" }, ] [[package]] name = "sphinx-gp-mermaid" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/1e/70bfe4ac964dd6a99399c6bf534fbf7ba555e78362bbefbc0e354c4c47c8/sphinx_gp_mermaid-0.0.1a33.tar.gz", hash = "sha256:569541543f4a7e9aa26c935718162da438f63268b48db32a3d3d48a1b6ec0697", size = 71321, upload-time = "2026-07-05T20:59:29.391Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/8c/e2f9a363438430cdc30ad5f2caa391416c1e2a5f3458c1ec561c09fb3c49/sphinx_gp_mermaid-0.0.1a34.tar.gz", hash = "sha256:82b2f7594d97a31f87bc9f9285db338b19abdd6f39c35d074198d63b55a6667f", size = 71319, upload-time = "2026-07-14T01:26:40.616Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/fb/871bc7600222d93a270add236c80f9b8b6460f7a5c81fccde5801e6708c7/sphinx_gp_mermaid-0.0.1a33-py3-none-any.whl", hash = "sha256:d520f808ed308eb469f7cacd8c79348334f23e1a5bec05bcfdc63aa932efb8f8", size = 12812, upload-time = "2026-07-05T20:59:09.114Z" }, + { url = "https://files.pythonhosted.org/packages/97/e6/d25d546cccf18afb87bf1944380e95a5a87c942a5f8b95ccddb3142f942f/sphinx_gp_mermaid-0.0.1a34-py3-none-any.whl", hash = "sha256:a6333edc54516caf7c71bfdbdec25a8710f42e53622ba6f9448e5f84368e4529", size = 12812, upload-time = "2026-07-14T01:26:19.651Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/32/5d3621a1b8f2734469f2ecfb3f8600c31dfa4680d0740ec10a30afbd7f31/sphinx_gp_opengraph-0.0.1a33.tar.gz", hash = "sha256:e244a9c4c878251412bb1fe4cd8e334f0fc43617181c4dea396ec5c3e7128b24", size = 11945, upload-time = "2026-07-05T20:59:30.361Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/9f/3b7f06a5cf4cf9b0d5708c40a5b4b731e44626d2bae6ae9e3c1a88beee42/sphinx_gp_opengraph-0.0.1a34.tar.gz", hash = "sha256:a77faf3015422d0e6809a0ad3050ee530701d81cf13e9b0514801b2ec07578c5", size = 11947, upload-time = "2026-07-14T01:26:41.621Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/04/b6d54579356384c5c891927d79b4794bee3d044f94bba4872c964331b3f3/sphinx_gp_opengraph-0.0.1a33-py3-none-any.whl", hash = "sha256:dcda4aff8b6a2288623e007e3b92996442a920f1a4da011fa037d2c525ae949c", size = 12184, upload-time = "2026-07-05T20:59:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/de/99/607674ef3fbd704457f028780c09fbd23a03105113ee9562ed66e65c4d95/sphinx_gp_opengraph-0.0.1a34-py3-none-any.whl", hash = "sha256:2de6db5c3b50e4fa8ade045d1107143eb63d017e2591bdf7bb5e93b05953991b", size = 12183, upload-time = "2026-07-14T01:26:20.855Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/a9/cab24647aca36ca8c4d961c3eaf906bc0bf1f1ae8e8248aa5a7a72c3381d/sphinx_gp_sitemap-0.0.1a33.tar.gz", hash = "sha256:7177a71c6cedc577a1828bac60cff2fd60b3323da527d8dd012e6bedd88065ce", size = 9956, upload-time = "2026-07-05T20:59:31.399Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/40/8fafe3ed25a9ce3f25f7184076544dc87c22014033150190d217d741c70f/sphinx_gp_sitemap-0.0.1a34.tar.gz", hash = "sha256:cef3ba77d161cfabe4655e6278a38e346b074afab261bfbf9a8a318fdc5ccd70", size = 9959, upload-time = "2026-07-14T01:26:42.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/17/83f60b5009886ef70c73b5935f49e38effe64fa53218784cf72fab8eae7e/sphinx_gp_sitemap-0.0.1a33-py3-none-any.whl", hash = "sha256:613444bf15ef05fcf025e0997321b459e16edffa75a918ac6c54a3482009e382", size = 8982, upload-time = "2026-07-05T20:59:11.429Z" }, + { url = "https://files.pythonhosted.org/packages/39/13/864d81d87bb2785d36267083c7b018ca3cacd599775cdfa95ae9656a8f56/sphinx_gp_sitemap-0.0.1a34-py3-none-any.whl", hash = "sha256:4f4b0bbdd7cc573d9d9ecf5d0a94d833f5198e47c4909ab3fb16f5c7573d67d0", size = 8980, upload-time = "2026-07-14T01:26:22.264Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/62/e55df0428b61f184034f66ce7f094f336eb6538c2206325397b2d18ae215/sphinx_gp_theme-0.0.1a33.tar.gz", hash = "sha256:08ca545683715ee8dd3a68083f07453d5d4c2bc70a7df9c709859be17e2fa965", size = 18289, upload-time = "2026-07-05T20:59:32.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/4a/5d42ea3502af7f1a6d7d537cd4b7a8958105ead177964abfaf4604a2ed45/sphinx_gp_theme-0.0.1a34.tar.gz", hash = "sha256:851029dd34c56c6fbda27dd6a228bf57e0b897bf96da1147ad78f11c4f09c067", size = 18286, upload-time = "2026-07-14T01:26:43.306Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/6c/bb66179307b4622db1ad4e9542eaefc079b5a5b893c50cbf1e8990819a66/sphinx_gp_theme-0.0.1a33-py3-none-any.whl", hash = "sha256:cc3f7de56bfeee2f37bffa26d509e8e8cac178378cff644abd3d5ac43f9fe370", size = 19888, upload-time = "2026-07-05T20:59:12.866Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/5af335d6537df8287993d12941962e9732b657ca7b5f7e3d54fe9361c82c/sphinx_gp_theme-0.0.1a34-py3-none-any.whl", hash = "sha256:d54c3dc65d2fb1a96883f7a87fbc6057b66683cf067f3ef227d57cbc097d45a6", size = 19886, upload-time = "2026-07-14T01:26:23.522Z" }, ] [[package]] @@ -1514,28 +1514,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/f3/da87e32ffaba14d5536dfb290dad0dc790257433a8cac0d575f3a0d07a34/sphinx_ux_autodoc_layout-0.0.1a33.tar.gz", hash = "sha256:71791469867946b7341ce3e6a8d192bfefc534f26fed447f77da13f46e363dcd", size = 30603, upload-time = "2026-07-05T20:59:33.228Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/3a/86386c93a03f5f7da5af3854bfe59c6f5f497a4f2ca5695d46a5f061d421/sphinx_ux_autodoc_layout-0.0.1a34.tar.gz", hash = "sha256:1f988b52f33a5d618b5eda9441aadbc2ce752f07debe1b518cf566e49e22bdc1", size = 30598, upload-time = "2026-07-14T01:26:44.323Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/44/68143caeab975add760ff2ce4fca4b0569d20e304c0ee42182d1a649e460/sphinx_ux_autodoc_layout-0.0.1a33-py3-none-any.whl", hash = "sha256:855027108528a770e40cb0521b78f38c085f0779d5efe167b3248606293e8d22", size = 34999, upload-time = "2026-07-05T20:59:14.217Z" }, + { url = "https://files.pythonhosted.org/packages/11/44/2ff46d3b18c53b3218ded9affb99afffe988b33bb722bb377ba070899f37/sphinx_ux_autodoc_layout-0.0.1a34-py3-none-any.whl", hash = "sha256:ce440b8882e034219f2a23a3751e6626b9d81aec71c0ff768ca9c414d99fc783", size = 34998, upload-time = "2026-07-14T01:26:24.881Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a33" +version = "0.0.1a34" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/7c/5b8a75ad4fbc0e64d3d2b9b76460568fb3a2715edecdbaea37d1276ea95b/sphinx_ux_badges-0.0.1a33.tar.gz", hash = "sha256:9a31a48c49c2431afc2450cba0fc6b2af821c3176f8dc742d52cf711f8f07823", size = 16723, upload-time = "2026-07-05T20:59:34.085Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ed/dcc90346f1681ed6ae9f7b16552afdde2e13a3bb407284bf48d7b3aa6bb3/sphinx_ux_badges-0.0.1a34.tar.gz", hash = "sha256:3bd4716e9ab05ca9dac26cadb54213057f7932eb266a943ce2e98d2d08e7e9b5", size = 16723, upload-time = "2026-07-14T01:26:45.277Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/e4/8ddb21f95d22eee8d48f724e359bf2b26f225f815e29bc91dd93652f5539/sphinx_ux_badges-0.0.1a33-py3-none-any.whl", hash = "sha256:1824228a2ecdd7784feb53b2e1aa657f7a48ea17b4c7be8d35f3c90082a67d61", size = 17491, upload-time = "2026-07-05T20:59:15.621Z" }, + { url = "https://files.pythonhosted.org/packages/47/f9/07029ca3cbdb6818dd12bcf89a8396cd0f51464e2dcfd5fac4f395589113/sphinx_ux_badges-0.0.1a34-py3-none-any.whl", hash = "sha256:1f837645d2addd6ce83f3e641148c6ef7e3580bed9e9a981b61da2810eebc433", size = 17490, upload-time = "2026-07-14T01:26:26.113Z" }, ] [[package]] @@ -1701,7 +1701,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a33" }, + { name = "gp-sphinx", specifier = "==0.0.1a34" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1711,10 +1711,10 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a33" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a33" }, - { name = "sphinx-gp-highlighting", specifier = "==0.0.1a33" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a33" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a34" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a34" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a34" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a34" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1722,13 +1722,13 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs", specifier = ">=0.0.18" }, - { name = "gp-sphinx", specifier = "==0.0.1a33" }, + { name = "gp-sphinx", specifier = "==0.0.1a34" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a33" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a33" }, - { name = "sphinx-gp-highlighting", specifier = "==0.0.1a33" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a33" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a34" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a34" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a34" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a34" }, ] lint = [ { name = "mypy" }, From a3bd04f34e89e5fbbbc5a88997600a56f5359c96 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 13 Jul 2026 20:39:54 -0500 Subject: [PATCH 2991/2998] =?UTF-8?q?py(deps[docs])=20gp-libs=200.0.18=20?= =?UTF-8?q?=E2=86=92=200.0.19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: pick up the latest gp-libs docs helpers. what: - Raise gp-libs floor >=0.0.18 → >=0.0.19 - Relock uv.lock --- pyproject.toml | 8 ++++---- uv.lock | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 55bfd7fcca..7e3aa7da54 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,10 +65,10 @@ dev = [ "sphinx-autodoc-api-style==0.0.1a34", "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ + "gp-libs>=0.0.19", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing - "gp-libs>=0.0.18", + "gp-libs>=0.0.19", "pytest", "pytest-rerunfailures", "pytest-mock", @@ -93,11 +93,11 @@ docs = [ "sphinx-autodoc-api-style==0.0.1a34", "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "gp-libs>=0.0.18", # https://gp-libs.git-pull.com/ + "gp-libs>=0.0.19", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] testing = [ - "gp-libs>=0.0.18", + "gp-libs>=0.0.19", "pytest", "pytest-rerunfailures", "pytest-mock", diff --git a/uv.lock b/uv.lock index b04c8e298a..99f9f60288 100644 --- a/uv.lock +++ b/uv.lock @@ -413,16 +413,16 @@ wheels = [ [[package]] name = "gp-libs" -version = "0.0.18" +version = "0.0.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "myst-parser", version = "4.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "myst-parser", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/10/155b50d9aefeef98c590e605334864b069cfb14453a3d3d7395e05129c54/gp_libs-0.0.18.tar.gz", hash = "sha256:cd718110e156eee0efd0ec1c4016332d5839b077bc4fa9a56ca233a5dc232d5e", size = 15743, upload-time = "2026-06-27T16:35:18.345Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/e3/947c93526c57541d7876b3c0177372220a904b4d8fa4024c54a47506a1c6/gp_libs-0.0.19.tar.gz", hash = "sha256:26fa76740dcfcc37b071903572b3fb3bfc71d2b545e07e7e63977838a3b2393e", size = 16022, upload-time = "2026-07-14T01:21:11.509Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/02/b5b58549a9f48740359260dc74dec6e8d506dfb70c0a91e641293ab70c39/gp_libs-0.0.18-py3-none-any.whl", hash = "sha256:7e59ef4644366f33517a580e827b9f7837e3c02ce470af8bb9995ba87c86a20f", size = 16371, upload-time = "2026-06-27T16:35:17.003Z" }, + { url = "https://files.pythonhosted.org/packages/6e/62/f5ad23c155267d145c96ba3485f638956b818f32ba03c7ad3fc31236c01c/gp_libs-0.0.19-py3-none-any.whl", hash = "sha256:f79c3cf4a7f646b26784c599fa39919257df7add43fc004e602777adc0e59f1e", size = 16694, upload-time = "2026-07-14T01:21:10.404Z" }, ] [[package]] @@ -1700,7 +1700,7 @@ dev = [ { name = "aafigure" }, { name = "codecov" }, { name = "coverage" }, - { name = "gp-libs", specifier = ">=0.0.18" }, + { name = "gp-libs", specifier = ">=0.0.19" }, { name = "gp-sphinx", specifier = "==0.0.1a34" }, { name = "mypy" }, { name = "pillow" }, @@ -1721,7 +1721,7 @@ dev = [ ] docs = [ { name = "aafigure" }, - { name = "gp-libs", specifier = ">=0.0.18" }, + { name = "gp-libs", specifier = ">=0.0.19" }, { name = "gp-sphinx", specifier = "==0.0.1a34" }, { name = "pillow" }, { name = "sphinx-autobuild" }, @@ -1738,7 +1738,7 @@ lint = [ { name = "types-pyyaml" }, ] testing = [ - { name = "gp-libs", specifier = ">=0.0.18" }, + { name = "gp-libs", specifier = ">=0.0.19" }, { name = "pytest" }, { name = "pytest-mock" }, { name = "pytest-rerunfailures" }, From 0c9f8c22568c282e7ab2a8934f964cb17c9c56d5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 14 Jul 2026 19:33:18 -0500 Subject: [PATCH 2992/2998] py(deps[dev]) Bump dev packages --- uv.lock | 218 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 133 insertions(+), 85 deletions(-) diff --git a/uv.lock b/uv.lock index 99f9f60288..52b8630465 100644 --- a/uv.lock +++ b/uv.lock @@ -1160,27 +1160,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, - { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, - { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, - { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, - { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, - { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, - { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, - { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, - { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, - { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, ] [[package]] @@ -2021,68 +2021,116 @@ wheels = [ [[package]] name = "websockets" -version = "16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", size = 177343, upload-time = "2026-01-10T09:22:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", size = 175021, upload-time = "2026-01-10T09:22:22.696Z" }, - { url = "https://files.pythonhosted.org/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", size = 175320, upload-time = "2026-01-10T09:22:23.94Z" }, - { url = "https://files.pythonhosted.org/packages/9d/2f/4b3ca7e106bc608744b1cdae041e005e446124bebb037b18799c2d356864/websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72", size = 183815, upload-time = "2026-01-10T09:22:25.469Z" }, - { url = "https://files.pythonhosted.org/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", size = 185054, upload-time = "2026-01-10T09:22:27.101Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", size = 184565, upload-time = "2026-01-10T09:22:28.293Z" }, - { url = "https://files.pythonhosted.org/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", size = 183848, upload-time = "2026-01-10T09:22:30.394Z" }, - { url = "https://files.pythonhosted.org/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", size = 178249, upload-time = "2026-01-10T09:22:32.083Z" }, - { url = "https://files.pythonhosted.org/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", size = 178685, upload-time = "2026-01-10T09:22:33.345Z" }, - { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, - { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, - { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, - { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, - { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, - { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, - { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, - { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, - { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, - { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, - { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, - { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, - { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, - { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, - { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, - { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, - { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, - { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, - { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, - { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, - { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, - { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, - { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, - { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, - { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, - { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, - { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, - { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, - { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, - { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +version = "16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/02/b9a097e1e16fee4e2fd1ec8c39f6a9c5d6257bae8fa12640caf869f54436/websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad", size = 182530, upload-time = "2026-07-10T06:32:57.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/31/cd11d2796b95c93645bac8e396b0f4bac0896a07a7b87d473bfc359f02c3/websockets-16.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de72a9c611178b15557d98eabd3101c9663c4d68938510478a6d162f99afd213", size = 179772, upload-time = "2026-07-10T06:30:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/34306d802f9b599eab041688a2086318037560cfae616a860234cca575b6/websockets-16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:37b0e4d726ffea3776670092d3d13e1cb605076f036a695fd1259de0d9b9fe02", size = 177457, upload-time = "2026-07-10T06:30:24.636Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/36ebbb978a7af70ff952afe5b22561264967164e9ad68b6734cae94efeb4/websockets-16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00d50c0a27098fcb7ab47b3d99a1b1159b534dbcd959fbf05113ebc37e5f927b", size = 177737, upload-time = "2026-07-10T06:30:25.954Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/944f341d0d3c0450ffd3d171479531df1818cb1df1623af4065113999c44/websockets-16.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1acb698bff1da1782b31aebd8d7a24d7d05453964abcd7d03dbf6e25893908e8", size = 186244, upload-time = "2026-07-10T06:30:27.235Z" }, + { url = "https://files.pythonhosted.org/packages/32/e5/a9b98fc49ef0214718a9c839c6c63856a921877256ec46f371be32decfa8/websockets-16.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc2c453f3b5f99c56b16e233aad5299860558487d26adb2ed27a00c14ca24b8c", size = 187484, upload-time = "2026-07-10T06:30:28.615Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7a/a575b52ca090b1976ffbe4b5f0762d03f399dfcb48eab883101331be71a9/websockets-16.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1a9f08a0728b0835f1c6abe1d9b746ab3de49b7336a0e1919cf96be1e76273eb", size = 190143, upload-time = "2026-07-10T06:30:29.91Z" }, + { url = "https://files.pythonhosted.org/packages/7c/40/705fbbd5677242fd36f724e9a94103e6bbdcb7d71e8f4498bfc1a8a7d413/websockets-16.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a089979d6173b27af18026c8d8b0077f83669a9169174482c4651e9f5739a5b6", size = 188004, upload-time = "2026-07-10T06:30:31.357Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0c/58227c8d66b1c4060c53bac8e066fb4fe2603060408e934f48660a448d72/websockets-16.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3c18dba232ec2b92a68579c9fed8ff5a18f853d1e09fc0b6ca3159e94f689fe", size = 186689, upload-time = "2026-07-10T06:30:32.712Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d0/5c1314782594aa347e0f18808ee277a61986a2a2f9f470df9893183995bd/websockets-16.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c1eb7df4170d5068892a8834fb5c07b9552353deb0dbeb0bff3820481ae4792", size = 184559, upload-time = "2026-07-10T06:30:34.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e6/109c6f16850fd674b7e3d0e58b8987f05d3881abaa25f42a9faf5e85f097/websockets-16.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c522bd48e625b6d557aa228967258d6d3da031c4cc21d3352fb302479aa9ba0a", size = 186997, upload-time = "2026-07-10T06:30:35.397Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ec/6afa1aebc59426438b85cf7a3868c53a89005e2250a648c99e99943b90a4/websockets-16.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d106396927a7f00b0f3a69215c3357f87bf0bca6844247121f7e8291e826a3b1", size = 185621, upload-time = "2026-07-10T06:30:36.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/24/c038fe8682e9345bfa422d2cc5cc68b0491ab942c92e176bf8dfa6e8331f/websockets-16.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d71bed12909b8039955536e192867d02d76cd3797cedfd0facf822e7668636c3", size = 187384, upload-time = "2026-07-10T06:30:38.096Z" }, + { url = "https://files.pythonhosted.org/packages/30/ca/dc0ef2be39c67394e24bc982a0af59cd6249bf2f4e4272813c5c505d0da9/websockets-16.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:9c1cf6f9a936b030b5bed0e800c5ee32069338129084546baf5ff5014dc62fa9", size = 185258, upload-time = "2026-07-10T06:30:39.579Z" }, + { url = "https://files.pythonhosted.org/packages/17/6b/3ffecd83ca3404b41fbdf8e9b178e55b529cd59bf64ea08b5a37b616b568/websockets-16.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3fd3e6a7af2c8fcdcf4ffbeaf7f54a567b91a83267204187797f31faaa2a4efa", size = 186050, upload-time = "2026-07-10T06:30:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/75/26/2e068497c78f31591a610ab7ef6d8d383ecadbe98f9121e1ebda77ef6d2b/websockets-16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dddd27175bf640acae5561fa79b77e8ec71fc445816200523e5c19b6a556fb72", size = 186273, upload-time = "2026-07-10T06:30:42.309Z" }, + { url = "https://files.pythonhosted.org/packages/44/ab/4dc049cb2c9e1be3a2c6fef77118f9c5049979e99cd56a97759d2f40f980/websockets-16.1-cp310-cp310-win32.whl", hash = "sha256:cce36c80b3f2fede7942f1756d3d885fa6fa086766c8c1bcf00695ab80f0d51a", size = 180157, upload-time = "2026-07-10T06:30:43.565Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/5e010ce5f66a8e5df380843f704ada508195a021c0c8a0f933639c9ee1c0/websockets-16.1-cp310-cp310-win_amd64.whl", hash = "sha256:115fc4695b94bb855995b23fb1abcb66099a5995575d3d5bc5605a616c58d0eb", size = 180458, upload-time = "2026-07-10T06:30:45.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/13/d47429afcc2c28616c32640009c84ea3f95660dab805766345b9682468e0/websockets-16.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9b1d7a63cba8e6b9b77e499a81eab29d31100298d090ad4507d1048c0b9cae0", size = 179770, upload-time = "2026-07-10T06:30:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c7/2f0a722039a1e0107be73ed672ba604449b4956e48733e8e6b8a005aea42/websockets-16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bedbc5efeb96621aa2921d2d92608246691399418cac22acba427eb11877ea1f", size = 177455, upload-time = "2026-07-10T06:30:47.601Z" }, + { url = "https://files.pythonhosted.org/packages/43/6a/c26b0ae449e93d256ce5cdd50d5fe97b575a63e8dcd311a1faa972fd6bc6/websockets-16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd847ab82133015afe65d778e7966ab42dba16bd7ad2e5b8a7918db6539f3f94", size = 177731, upload-time = "2026-07-10T06:30:49.102Z" }, + { url = "https://files.pythonhosted.org/packages/cc/3f/381550b344a02f0d2f84cda25e79b54575291bc7022128a41163fe8ba5b0/websockets-16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2fb33ccb16ee40a95cc676d7b0ff451a9a2632f11a0dbc2e666326892b2e1de", size = 187066, upload-time = "2026-07-10T06:30:50.505Z" }, + { url = "https://files.pythonhosted.org/packages/4a/87/5ab1ec2086910f23cfb9ec0c1c29fbcc24a9d190b5198b1557c00ce4a47e/websockets-16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f15b6d9ea9c2eaf6ccab964a082b09bfa6634a495bb0c2e9e7ee6943f58976", size = 188301, upload-time = "2026-07-10T06:30:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/75/4b/bbbb8e6fac4cfc53d7aaa69a3d531bf10799354b0021f4b58914aced8c1a/websockets-16.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:638cf57c48b4ad8ac1ff1e453f4f97db2426b690ddc111e6da96b27b4a340bc3", size = 191594, upload-time = "2026-07-10T06:30:53.229Z" }, + { url = "https://files.pythonhosted.org/packages/5c/da/6c0c349443d6e999f481e3d9a0e57e7ac2956d75d6391bec24b92af3fe13/websockets-16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c1c85f61bc9d5eac57ce705d848dc2d2ce3680638300bf4e1da7d749e2cf4ce", size = 188862, upload-time = "2026-07-10T06:30:54.744Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ea/a368d37c010425a5451f42052fe804e754e23333e8448aef5d55c8a8d64f/websockets-16.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:eeab6d27f51c7e579023c971f5e6dff200deadf01faf6831beaecd32052dfaef", size = 187633, upload-time = "2026-07-10T06:30:56.055Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4e/2ecd59add10d0855ec03dbdedfcdacdbd1aaabcd44b7dcbeda27538662e9/websockets-16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ed64e5a97b0b97a0b66e18bfe281317a75fbbd5afe692f939ea8d14a4292f2c", size = 185089, upload-time = "2026-07-10T06:30:57.444Z" }, + { url = "https://files.pythonhosted.org/packages/6f/eb/c6c3dcd7a01097bb0d42f4e9ef21a2c2a491d36b77cd0870ab59f9e8e77f/websockets-16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b3b021d0ed4bc16eea9775f62c9fa71acdacba0fc790b38581754dedf29ca60", size = 187790, upload-time = "2026-07-10T06:30:58.731Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3e/775d36885d5e48ab8020aaf377de0ff5fbeb8bc2682a7e46419e4a14521c/websockets-16.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6eb604a4167f0a0d53c2243dfc667a29f0b43c3436057184e070bb82a1000fa2", size = 186381, upload-time = "2026-07-10T06:31:00.355Z" }, + { url = "https://files.pythonhosted.org/packages/ad/90/6305c00812a92e47d0582604c02bd759db0118bbafc13f707d712dbcf898/websockets-16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9a3f125e44c3e34d61d111652e608e0f5b85ce08c225c8d56ad0eb822fa40030", size = 188193, upload-time = "2026-07-10T06:31:01.677Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/96bf8302c81d961585b4d34a2ddd3f229782f9b8c57bc78bbf98f1b1a4ac/websockets-16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8fdf0b00d0d1f30d1f06a92cab46fe542eec3eb302a7aee7163f142d0780f216", size = 185771, upload-time = "2026-07-10T06:31:03.062Z" }, + { url = "https://files.pythonhosted.org/packages/e8/1f/e8fe44b1d2dc417d740d9959d28fd2a846f268e7df38a686c04ac7dfe947/websockets-16.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67b56828712f5fa7852de4c0265c28827311a657a4d275b7312ed0d1a918bee4", size = 186803, upload-time = "2026-07-10T06:31:04.34Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/b07d3a4e1eb2ab03e94e7f53f0c7a628e85fde6ad86011f7afd08f27b985/websockets-16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39c7e7730be33b8f0cd6f0aa8e8c82f9cdd1813f159765e073b2ece65f4824b5", size = 187041, upload-time = "2026-07-10T06:31:05.567Z" }, + { url = "https://files.pythonhosted.org/packages/a6/fd/e0abb8acc435642ac4a671490f6cf781c882f3fe682cdced9080ea455ab5/websockets-16.1-cp311-cp311-win32.whl", hash = "sha256:c54fe94fb2f11e11b48920c5f971e298cec73ac35db56efe57a49db63dfc95d4", size = 180158, upload-time = "2026-07-10T06:31:06.929Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/85574d9458d3b913090087b817df0cc47b68e9a01dd0ab6ac04b77f49b0a/websockets-16.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9f4fb9ae8b802e55609685db98382d48fd3feb1397804e1e774968dea0f28c7", size = 180456, upload-time = "2026-07-10T06:31:08.247Z" }, + { url = "https://files.pythonhosted.org/packages/a1/52/748c014f07f4e0e170c8932de7e647a1511d5ab3049cd978797136aee577/websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b", size = 179798, upload-time = "2026-07-10T06:31:09.664Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5e/2a2e64d977d084e49d37c187c26c056daaff41965be7300cd5dbde6f8b07/websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164", size = 177478, upload-time = "2026-07-10T06:31:11.072Z" }, + { url = "https://files.pythonhosted.org/packages/aa/12/5b85b4e75d697e548a94962ce5c036b05dd21cb9545759d555c5586422fc/websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5", size = 177746, upload-time = "2026-07-10T06:31:12.386Z" }, + { url = "https://files.pythonhosted.org/packages/9d/62/79b1c8f0cee0da648b4899e1c5b0dbd3aa59846985136a54854db6827ab4/websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a", size = 187345, upload-time = "2026-07-10T06:31:13.754Z" }, + { url = "https://files.pythonhosted.org/packages/25/34/b7c5c52c2f24280e1c017acb7ad491a566750a5cceca7f3cf999373bba21/websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b", size = 188581, upload-time = "2026-07-10T06:31:15.075Z" }, + { url = "https://files.pythonhosted.org/packages/bc/37/604193bebcbeffe96fdf795960b83a15d600880c64dc17ec9c31c5b3427d/websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270", size = 191362, upload-time = "2026-07-10T06:31:16.395Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b4/5ee27575b367d7110d4d13945e2a9de067ec84dc71e54b87f01e38550d9a/websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955", size = 189216, upload-time = "2026-07-10T06:31:17.776Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/3e2dcc78d85fc5d9d814895ce6d07d0dfacc0f6aaa1d151f2b8c8d772299/websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c", size = 187971, upload-time = "2026-07-10T06:31:19.152Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/cd271717b93d5ee19626cb5e38a85baab745c86e33db7c31a3ac729b31b8/websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43", size = 185381, upload-time = "2026-07-10T06:31:20.665Z" }, + { url = "https://files.pythonhosted.org/packages/78/91/6ad6f2f1426317b5001bd490534208c7360636b35bac1dec2e0c22bfc40e/websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9", size = 188015, upload-time = "2026-07-10T06:31:22.024Z" }, + { url = "https://files.pythonhosted.org/packages/c7/6d/533733132ab4c07540efd4a8f0b9a435d3a5059b2f26cc476ace1abf7f45/websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2", size = 186619, upload-time = "2026-07-10T06:31:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/08/73/16c059f3d73b3331eba10793704afa4faa9939234fb08ef7dca35794e8f0/websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452", size = 188497, upload-time = "2026-07-10T06:31:25.024Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/9a8fae7dd2acdcfb1a8844c29fe42b518a04b64fce38a0923b6290e452f1/websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15", size = 186051, upload-time = "2026-07-10T06:31:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/b240c7dd6a0e0c59c1f68377cc3015263521080c327c15f5e753c1f6d378/websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4", size = 187029, upload-time = "2026-07-10T06:31:27.605Z" }, + { url = "https://files.pythonhosted.org/packages/50/35/524e3fac40e47d6fdcf6c4b2c95ef1bc8a97e01593c90eff86621df7b716/websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0", size = 187308, upload-time = "2026-07-10T06:31:28.927Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/56840cf62c8859af6ba22b9529da937332468c80f32b598753e8a66d3990/websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff", size = 180161, upload-time = "2026-07-10T06:31:30.316Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ff/87eb9eb44cb62424a8d729834f2b0515a47e2669fabec29820268f4d50a1/websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21", size = 180462, upload-time = "2026-07-10T06:31:31.708Z" }, + { url = "https://files.pythonhosted.org/packages/d9/63/df158b155420b566f025e75613424ad9649a24bcb0e9f259321ab3d58bea/websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47", size = 179791, upload-time = "2026-07-10T06:31:33.108Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/00fe9414dfeafa6fe54eae9f5716c8c8e9ac59d192be3b893c096d395846/websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b", size = 177472, upload-time = "2026-07-10T06:31:34.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/76/b10633424d40681b4e892ffd08ca5226322b2426e62d4ab71eae484c3a32/websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37", size = 177737, upload-time = "2026-07-10T06:31:35.964Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/d3bb03b2229bb1afd72008742d586cf1ea240dce64dd48c71c8c7fd3294c/websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881", size = 187403, upload-time = "2026-07-10T06:31:37.496Z" }, + { url = "https://files.pythonhosted.org/packages/26/16/cc2e80478f688fc3c39c67dc1fac6a0783858058914ebc2489917462cb42/websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600", size = 188639, upload-time = "2026-07-10T06:31:38.86Z" }, + { url = "https://files.pythonhosted.org/packages/15/d6/ad87b2507e57de1cbf897a56c963f2925962ed5e85fbe06aaa83ced27acd/websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83", size = 190078, upload-time = "2026-07-10T06:31:40.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1a/5b37b3fd335d5811f29fc829f2646a3e6d1463a4bf09c3100708684c766e/websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045", size = 189267, upload-time = "2026-07-10T06:31:41.523Z" }, + { url = "https://files.pythonhosted.org/packages/42/98/06afc33e9450d4230f94c664db78875d90f5f6a5fb77f0bc6ec15ae74e1c/websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9", size = 188022, upload-time = "2026-07-10T06:31:42.838Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/42fef5d5887c18cf2d148b02debf56cecb9cfbffc68027cde9b12c8f432c/websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf", size = 185435, upload-time = "2026-07-10T06:31:44.219Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9b/8021c133add5fe40ed40312553a6cd1408c069d7efe3444ad483d4973ed3/websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057", size = 188080, upload-time = "2026-07-10T06:31:45.986Z" }, + { url = "https://files.pythonhosted.org/packages/69/54/1e37384f395eaa127383aab15c1c45e200890a7d7b99db5c312233d193e0/websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d", size = 186678, upload-time = "2026-07-10T06:31:47.449Z" }, + { url = "https://files.pythonhosted.org/packages/68/79/1caeacab5bc2081e4519288d248bc8bd2de30652e6eaa94be6be09a1fe5b/websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb", size = 188554, upload-time = "2026-07-10T06:31:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/b3dca5fad71487b726e31cb0acf56f226792c1cc34e6ab18cbf146bd2d74/websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7", size = 186109, upload-time = "2026-07-10T06:31:50.508Z" }, + { url = "https://files.pythonhosted.org/packages/5b/0b/8f246c3712f07f207b52ea5fb47f3b2b66fafec7303162644c74aed51c6a/websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9", size = 187061, upload-time = "2026-07-10T06:31:51.861Z" }, + { url = "https://files.pythonhosted.org/packages/47/eb/27d6c92a01696b6495386af4fc941d7d0a13f2eab2bf9c336111d7321491/websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d", size = 187347, upload-time = "2026-07-10T06:31:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d5/eeee439921f55d5eaeabcea18d0f7ce32cdc39cb8fc1e185431a094c5c7b/websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4", size = 180149, upload-time = "2026-07-10T06:31:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/a3/03/971e98d4a4864cf263f9e94c5b2b7c9a9b7682d77bfbba4e732c55ee85a9/websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5", size = 180458, upload-time = "2026-07-10T06:31:56.767Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e6/da1dc11507f8118145a81c751fe0c77e5e1c11b8554496addb39389e2dc2/websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e", size = 179833, upload-time = "2026-07-10T06:31:58.19Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ac/c0d46f62e31e232487b2c123bc3cfd9a4e45684ca7dc0c37f0987f29baae/websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b", size = 177524, upload-time = "2026-07-10T06:31:59.563Z" }, + { url = "https://files.pythonhosted.org/packages/4a/33/abd966074b34a51e4f134e0aaed80f5a4a0a35163ea5ac58a1bc5a076d23/websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe", size = 177743, upload-time = "2026-07-10T06:32:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/ea/30/646e47b8a8dff04e227bdab512e6dde60663a647eeac7bbd6edddd92bbc5/websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09", size = 187474, upload-time = "2026-07-10T06:32:02.54Z" }, + { url = "https://files.pythonhosted.org/packages/d2/72/890ab9d77494af93ea65268230bfbc0a90ba789401ed7a44356a44785644/websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209", size = 188717, upload-time = "2026-07-10T06:32:04.156Z" }, + { url = "https://files.pythonhosted.org/packages/d5/aa/baedbbaa6bf9ed6029617ed5e8976535bd805f483ca9b3484e7ad9ee08bf/websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352", size = 190090, upload-time = "2026-07-10T06:32:05.822Z" }, + { url = "https://files.pythonhosted.org/packages/52/4f/d813ec94e18002571ef4959d87a630eff6e01b72a51bcb0832b75ae8c51a/websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105", size = 189320, upload-time = "2026-07-10T06:32:07.223Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3c/8ec52a6662f3df64090fba28cd521d405d54759268d8e820477037e8c80d/websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367", size = 188068, upload-time = "2026-07-10T06:32:08.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/7f/f0ae6042b14f86fa5f996c6563ea4cf107adc036ccbedc9d4f418d0095f9/websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87", size = 185493, upload-time = "2026-07-10T06:32:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/89/ad/5ffc53af9939c49fd653d147fa5b8f78ced1f6bce6c49a7446860945b0ce/websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953", size = 188141, upload-time = "2026-07-10T06:32:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/67/62/729206c0ee577a4db8eae6dd06e0eef725a1287c6df11b2ef831d003df31/websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502", size = 186653, upload-time = "2026-07-10T06:32:12.845Z" }, + { url = "https://files.pythonhosted.org/packages/1b/86/e8806a99ec4589914f255e6b658853fe537bf359c05e6ba5762ad9c27917/websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca", size = 188614, upload-time = "2026-07-10T06:32:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/89/38/ac554e2fc6ff0b8deeff9798b92e7abd8f99e2bd9731532e7033de208220/websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47", size = 186165, upload-time = "2026-07-10T06:32:15.626Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c5/4ef4d8e53342f94f3c49e1ae089b32c1e8b3878e15e0022c7708c647f351/websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d", size = 187119, upload-time = "2026-07-10T06:32:17.114Z" }, + { url = "https://files.pythonhosted.org/packages/3a/33/4788b1dd417bd97eeb2698af3b9df6775ac656f96e9987da0419a067602f/websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee", size = 187411, upload-time = "2026-07-10T06:32:18.629Z" }, + { url = "https://files.pythonhosted.org/packages/30/38/00d37aad6dc3244ce349e2864815362e50b3cfc00cac28d216db20efe40f/websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c", size = 179822, upload-time = "2026-07-10T06:32:20.233Z" }, + { url = "https://files.pythonhosted.org/packages/9d/37/2a8cb0eaddee5eaebda47a90a3ba0898d1ce3d866b02a4857fea17d82e5b/websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145", size = 180167, upload-time = "2026-07-10T06:32:21.749Z" }, + { url = "https://files.pythonhosted.org/packages/07/5a/262ad5fcaef4198997b165060f09a63f861e76939b1786ab546ccc3f8120/websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268", size = 180166, upload-time = "2026-07-10T06:32:23.278Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/36377db690f4292826e4501a6dec2801dc55fd1cf0405923b04937e478df/websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901", size = 177697, upload-time = "2026-07-10T06:32:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c7/07171abce1e39799a76f473608580fe98bd43a1230f5146159622c02bccf/websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79", size = 177902, upload-time = "2026-07-10T06:32:26.564Z" }, + { url = "https://files.pythonhosted.org/packages/14/17/c831f48e250bc4749f57c00dcce73337c41cd32f6d59a64567b84e782601/websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3", size = 187766, upload-time = "2026-07-10T06:32:27.981Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2e/4dfe63e245b0ecfaf470cf082d25c6ce35808159135fd88c82653a6b11ab/websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2", size = 188939, upload-time = "2026-07-10T06:32:29.365Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/5faf65aebd9562f6b4bc473d24ce38cc56f84eb5f5bee66ed9b86733f93c/websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9", size = 191081, upload-time = "2026-07-10T06:32:30.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/cd/2634f2f2c0556c1aae6501ed6840019cc569dd6fdbcac6494378daea4dc0/websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff", size = 189513, upload-time = "2026-07-10T06:32:32.399Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/2c700b51196104f09715b326b1f092ed25326bdf79a03e00a4842e503743/websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a", size = 188240, upload-time = "2026-07-10T06:32:33.897Z" }, + { url = "https://files.pythonhosted.org/packages/f1/20/86283636e499a1a357fa9441f690ba34f255e731f2fea174132b3b762b57/websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b", size = 185955, upload-time = "2026-07-10T06:32:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/d7fb734b0095d43bc7f1c9f68afd50adb4176e7e513403e8c70ad7daa4fa/websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd", size = 188491, upload-time = "2026-07-10T06:32:36.673Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5e/168a192689db468405ecf3b8e4a2c18811936b0724d017ad7e6d252734f0/websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97", size = 186983, upload-time = "2026-07-10T06:32:38.207Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9b/66795fa91ebe49019ebe4fa910282172252e37046b80e08fc52e0c365150/websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3", size = 188890, upload-time = "2026-07-10T06:32:39.545Z" }, + { url = "https://files.pythonhosted.org/packages/5a/32/126bbc844be5afb3613fd43211dac10a9645f4cf39741d04acaa2ec7030c/websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805", size = 186583, upload-time = "2026-07-10T06:32:41.038Z" }, + { url = "https://files.pythonhosted.org/packages/22/b9/0b5db9cbcf6e4970db4496893244a8d92e07f71a8ef27cf34b08aa02fef1/websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938", size = 187353, upload-time = "2026-07-10T06:32:42.501Z" }, + { url = "https://files.pythonhosted.org/packages/99/2e/254b2131a10d831b76e2c18dfe7add9729c6292c674a8085bf8de01ad151/websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a", size = 187784, upload-time = "2026-07-10T06:32:43.929Z" }, + { url = "https://files.pythonhosted.org/packages/21/dc/e7288aa8e3ac5a88a0924619984d663c1abf2a87d0ea98290c66fdaee0ec/websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341", size = 179947, upload-time = "2026-07-10T06:32:45.495Z" }, + { url = "https://files.pythonhosted.org/packages/d3/de/37edf1260ff0fbbd2f82433489c4cfbe799ac2ff21355331609879329fe6/websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07", size = 180291, upload-time = "2026-07-10T06:32:47.119Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f4/84ef884775bbe77c46cce79bc7d705ea3bc6574cc00acf81af89754c077d/websockets-16.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7289d899c79e763e6221c8dcb8959361cb43274418538d7c7ad16a43b01d12f9", size = 177387, upload-time = "2026-07-10T06:32:48.574Z" }, + { url = "https://files.pythonhosted.org/packages/d3/d9/6831ec6f65e1eeac770375f4f4b604f23df9bafaa1b47004bc5f9488d513/websockets-16.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e22e9e3719f5131bd62da4db63c8da63eb8c91cc99e16c1cbd122f130e1ae07a", size = 177663, upload-time = "2026-07-10T06:32:50.043Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/21d4922fa7fe855813a8b38f181a0ecf02a586e16c1f095fd05471f78cc2/websockets-16.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83bdabafef431247e6b11a9aab8a0893fd8e82e1ed95b32e0373625b03ffce4a", size = 178501, upload-time = "2026-07-10T06:32:51.439Z" }, + { url = "https://files.pythonhosted.org/packages/91/87/7a0320df854dacd09507ca972cb04a4dc5aae279583cc5b80ad5f5819533/websockets-16.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b8d13ceabc5c60995f201b5211d76876e17e68706ebf5d3bc666b32eefff1a6", size = 179397, upload-time = "2026-07-10T06:32:52.892Z" }, + { url = "https://files.pythonhosted.org/packages/31/6a/0da1eb8c8da2ace7b578c8523d32618af85e62a9ebad56051d4a14a38a1c/websockets-16.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81495f9c0085361c582efbc3207fb877174cfe03370f17d9cd70624404aa526f", size = 180546, upload-time = "2026-07-10T06:32:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/66/58/bd83247f39ddc26ffc2c24eb05087a3b749e00cb4509fc6d19daa23c8495/websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81", size = 174031, upload-time = "2026-07-10T06:32:56.079Z" }, ] From a37cc5cc46b729f6498153fc2dba56b9183b5e71 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 18 Jul 2026 05:04:59 -0500 Subject: [PATCH 2993/2998] py(deps[dev]) Bump dev packages --- uv.lock | 294 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 147 insertions(+), 147 deletions(-) diff --git a/uv.lock b/uv.lock index 52b8630465..78fbb84c08 100644 --- a/uv.lock +++ b/uv.lock @@ -65,16 +65,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.14.1" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, ] [[package]] @@ -272,100 +272,100 @@ wheels = [ [[package]] name = "coverage" -version = "7.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/8b/adeb62ea8951f13c4c7fef2e7a85e1a06b499c8d8237ea589d496029e53f/coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f", size = 925362, upload-time = "2026-07-02T13:10:50.535Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/97/c52dc440c390b6cfa87be9432b141a956e2d56d9b9f5fc8bd71c5f471722/coverage-7.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50913d4bf5ddafa6ca3693da5e4dd833dd1b772e0283c99ca7f7d287db67331a", size = 220539, upload-time = "2026-07-02T13:08:19.252Z" }, - { url = "https://files.pythonhosted.org/packages/3f/26/602de8c2aec7e2e3e99ebfb8e04ba65598f746275396eea5f6794ff4673f/coverage-7.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:359e141ccd33893ce3f1ad5525f8b96083003677c82182e5907d62d4ea5799fc", size = 221058, upload-time = "2026-07-02T13:08:21.013Z" }, - { url = "https://files.pythonhosted.org/packages/fc/13/ebab0743138891c1d646d61e247ec29639afcbb6c4e1905e6a0f0c75291a/coverage-7.15.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3200b6204935f928c64b2ca1f923ab8c1acb7c9de45ec61569711b34d25cccaf", size = 247797, upload-time = "2026-07-02T13:08:22.474Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b7/b6ffb9e042aa48dc4144a8a65529affaec8dca0685309353614a2a7386ad/coverage-7.15.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:be616bf61346883b2cfdc5178669647e03531d81ab761a7e378558b7e8bcb628", size = 249626, upload-time = "2026-07-02T13:08:23.803Z" }, - { url = "https://files.pythonhosted.org/packages/9c/06/243ff05b652333d8e3d060c11223efc2723b19cacf6605e433fa686ab5d4/coverage-7.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7bafc3fe1059463a8fdd97ca79972d6e2bf819d775c7d54991b5b1971201d6", size = 251493, upload-time = "2026-07-02T13:08:25.397Z" }, - { url = "https://files.pythonhosted.org/packages/d3/2b/867faa17030a806114dae388b32a3fa929d8cd4bf39226fbc11f6e6bb705/coverage-7.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b713aa7fcf325a01d4184d848acb46fd84f78fdb0978470c636b23a06a753d91", size = 253406, upload-time = "2026-07-02T13:08:26.842Z" }, - { url = "https://files.pythonhosted.org/packages/94/c0/d789ce18f6605afc4895db75723424be2ef494282f77f61d8e5832923183/coverage-7.15.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e38e6fba2d56652fdfaf0231f8f78aeb805234a912de25dc291ee5cce5b8faa4", size = 248512, upload-time = "2026-07-02T13:08:28.398Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b6/b2673c30739f4a2e06649a0a38ad8b093c4d865462dc7bab0e9524a2c3b1/coverage-7.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:884499f42e382675be80770391983b90e0c0c774d87dbeeebf5f991cf6612b20", size = 249532, upload-time = "2026-07-02T13:08:29.731Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/acd79e9a41beabee92b623afe4f30b549916f48566271475f2907e752828/coverage-7.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:840481b12e083dbcbafab14794a8781a958edf327c8d3d70b4eee42f9b8253aa", size = 247537, upload-time = "2026-07-02T13:08:31.173Z" }, - { url = "https://files.pythonhosted.org/packages/12/d4/2d301c4d1b3238d7c88b70ab9d13fd53ed9505662a7ff1b46ba1e2e4e3c3/coverage-7.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:276646e9481703d09f854f3b2f018f24e19fd7049ae670a92570043eb97203b1", size = 251348, upload-time = "2026-07-02T13:08:32.63Z" }, - { url = "https://files.pythonhosted.org/packages/35/bb/c67708b2bc00f32e12805ec23d5fa677a0a51652f449341a89f9d6b1b715/coverage-7.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4de4b4d3f5545aa6c60dc4efd9c63b5b5dcc3bf00fe83146b2bdfffb8f6613bd", size = 247806, upload-time = "2026-07-02T13:08:33.931Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6c/57c4f653c47a6e917748f8938e389e72fbcae44e3643cd906664f0477a13/coverage-7.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c504097b2a89b1e85bc6070d920df77daec701337e3aeef2c17775a5dd0ca90", size = 248410, upload-time = "2026-07-02T13:08:35.189Z" }, - { url = "https://files.pythonhosted.org/packages/6c/94/bb083041aef828903668f134273f319f2bd49224962875359c52faa5497f/coverage-7.15.0-cp310-cp310-win32.whl", hash = "sha256:f6e80ed91f98316e86b9c137206b04b2bcfbffccbdff49bd2eb09dddb1cf14e0", size = 222588, upload-time = "2026-07-02T13:08:36.486Z" }, - { url = "https://files.pythonhosted.org/packages/ef/94/a09d8ee618956f626741b0734854bac4425a00e10c0565f5abca64e7e751/coverage-7.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3b3e22030f3f6f5e01a5ce69936552a5c0f6992b7698777377b99041961031f", size = 223214, upload-time = "2026-07-02T13:08:37.885Z" }, - { url = "https://files.pythonhosted.org/packages/ae/23/82e910835ef4b8391047025e1d53aa48d66029f444eb8b25373c849bf503/coverage-7.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:003fff99412ea848c0aaebcc78ed2b6ce7d8a1227ed17e68470672770b78a02a", size = 220662, upload-time = "2026-07-02T13:08:39.205Z" }, - { url = "https://files.pythonhosted.org/packages/6d/0d/c7b213dde2f1579de5231062b386d8413f79c11667eb58c39319b25991da/coverage-7.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cbd804bf2784ce7b45114516050f346ecd50f960c4bb630a7ee9e1d78fa2118", size = 221168, upload-time = "2026-07-02T13:08:40.471Z" }, - { url = "https://files.pythonhosted.org/packages/33/77/d000aeedfac085088337b3c7becdad328474b1f8a9e4c9368a0c99605d68/coverage-7.15.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8773e15c23305b58882a4611fb9b2755977eae0dc2e515366a1b6c98866cc4c2", size = 251587, upload-time = "2026-07-02T13:08:42.033Z" }, - { url = "https://files.pythonhosted.org/packages/cc/e0/86787c56b9df17afd370d5e293515dd4d9a107a561d13054873eefad8ecc/coverage-7.15.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f50e40081494c1dc4239ebb202014cbcc3306ea96fb6302a34c8cc0967fc5ae8", size = 253497, upload-time = "2026-07-02T13:08:43.387Z" }, - { url = "https://files.pythonhosted.org/packages/3f/02/181bc917359299c07dead6270f94e411151c8b60cec905c33499da69afe6/coverage-7.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daf96f37f5fc3a7b6c6da862eb4aee61c426bd63da236ed4a73ef0e503b4bca5", size = 255607, upload-time = "2026-07-02T13:08:44.897Z" }, - { url = "https://files.pythonhosted.org/packages/b9/35/ca5e7427699913da6788c4f910e73ab16c5f4b59ec5d3a999dce2a45112f/coverage-7.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:51aa20f6ae2788fd197747766edf4cd8234fd9423309b934257fa6b21a592723", size = 257563, upload-time = "2026-07-02T13:08:46.334Z" }, - { url = "https://files.pythonhosted.org/packages/0b/4d/b8220bacc2fc3c4e9078e27c32e99fb411479a4718a72bdd00036a9891c8/coverage-7.15.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03d1f922757662eb7af586e77834792274cff776bc7b1d1a0b66a49ea9d84735", size = 251726, upload-time = "2026-07-02T13:08:47.941Z" }, - { url = "https://files.pythonhosted.org/packages/c4/e4/2e145da1991d72189b9c3cf7eca05c716ee7080d099aaea6757cfc7df008/coverage-7.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a6d6acc9a7666245e6133dd15144ca038a85a9cd5026bb06d6bbae9e77440dc9", size = 253301, upload-time = "2026-07-02T13:08:49.5Z" }, - { url = "https://files.pythonhosted.org/packages/72/28/d2c841d698bf762e481f08bd4839d370246b6d9b61dab085a7b20b201a08/coverage-7.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ac2c4c27c7df851dc9a017c2d7de00b69147e84ba3d96f37a530b0b6fb51035", size = 251361, upload-time = "2026-07-02T13:08:51.304Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ed/55d9ffde994fba3897c0c783f77a7d053b0c18787f6892ed5b0aed73f469/coverage-7.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b761a1d504fd4bd1f20f418753964dca9f5862a511fc854dac58296b3b223671", size = 255129, upload-time = "2026-07-02T13:08:52.661Z" }, - { url = "https://files.pythonhosted.org/packages/1d/c0/ecbf33b8c460ea2718aeb813e2df8140d0370e5f67261c31524ceb0a2a8d/coverage-7.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e43b045e11c16e897895758ae90e4a90cf99e93d58549e2f90c0e2272e155695", size = 251081, upload-time = "2026-07-02T13:08:54.188Z" }, - { url = "https://files.pythonhosted.org/packages/a9/de/fb87b4261f54448dd2b9504ef19a58be42cef0d9520595fbfe1219b15234/coverage-7.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:589b54513e901739f4b4582c705ce96b80c96f57641b1464607e2367a270e540", size = 251988, upload-time = "2026-07-02T13:08:55.726Z" }, - { url = "https://files.pythonhosted.org/packages/df/27/3494d5f291b9a4cb868f73c11221a8bd2d5bd761a8f9acea61ff57128dd1/coverage-7.15.0-cp311-cp311-win32.whl", hash = "sha256:106781b8482749162d0b47056937ba0933508e5d9447f65a5e7d5c422f0d6bb4", size = 222754, upload-time = "2026-07-02T13:08:57.091Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ee/cd4847ebc9be6a9c0123d763645a6f1f3be6b8c58c962706368b79cbac07/coverage-7.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:821e92b3631d762a339695824cadbbc73020354eba2a23a551a99ad34938fbe6", size = 223225, upload-time = "2026-07-02T13:08:58.594Z" }, - { url = "https://files.pythonhosted.org/packages/57/37/5011581aa7f2be498b97dcc7c9902192442a42f4f9a748aeadb3d6506b42/coverage-7.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:309990eb5fb8014b9f67cb211f7fd41876ec8a88a88d3ae76de0ed1d611e3640", size = 222774, upload-time = "2026-07-02T13:09:00.074Z" }, - { url = "https://files.pythonhosted.org/packages/2a/74/fd4c0901137c4f8d81a76ada99e43c65163b4c94a02ece107a4ec0c6b615/coverage-7.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b75ee5e8cb7575636ac598719b4307ac529ec8fcd79608a35c3cd4d4dada812d", size = 220838, upload-time = "2026-07-02T13:09:02.084Z" }, - { url = "https://files.pythonhosted.org/packages/0f/2e/2347583467bd7f0402635101a916961915cc68fce652cd0db5f173ea04fc/coverage-7.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffb31267816b93b075302248cc1737506081b4f163df4401e9df1a6424aafabe", size = 221197, upload-time = "2026-07-02T13:09:03.617Z" }, - { url = "https://files.pythonhosted.org/packages/f0/17/99fa688541ae1d6e84543a0e544f83de0c944815b63e9e7b1ed411d15036/coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c", size = 252705, upload-time = "2026-07-02T13:09:05.059Z" }, - { url = "https://files.pythonhosted.org/packages/fb/02/6a95a5cd83b74839017ef9cf48d2d8c9ae60af919e17a3f336e6f9f1b7bd/coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4", size = 255441, upload-time = "2026-07-02T13:09:06.559Z" }, - { url = "https://files.pythonhosted.org/packages/67/f2/406f6c57d600f68185942422c4c00f1a3255d60aee6e5fd961425cd9987e/coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5", size = 256556, upload-time = "2026-07-02T13:09:08.197Z" }, - { url = "https://files.pythonhosted.org/packages/74/8e/d3fa48489c15ecdec1ba48fd61f68798555dddd2f6716f9ad42adeb1a2a9/coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01", size = 258815, upload-time = "2026-07-02T13:09:09.691Z" }, - { url = "https://files.pythonhosted.org/packages/47/2e/2d40ddd110462c6a2769677cf7f1c119a52b45f568978fc6c98e4cc0dd0f/coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4", size = 253117, upload-time = "2026-07-02T13:09:11.212Z" }, - { url = "https://files.pythonhosted.org/packages/51/c0/310782f0d7c3cb2b5ac05ba8d205fe91f24a36f6bf3256098f1782181c38/coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796", size = 254475, upload-time = "2026-07-02T13:09:13.029Z" }, - { url = "https://files.pythonhosted.org/packages/86/f7/702da6c275f8ae6ade423d2877243122932c9b27f5403003b9ef8c927d12/coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382", size = 252619, upload-time = "2026-07-02T13:09:14.699Z" }, - { url = "https://files.pythonhosted.org/packages/fb/84/c5b15a7e5ecba4e56218d772d99fe80a63e63f8d11f12783723a6005ab45/coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c", size = 256689, upload-time = "2026-07-02T13:09:16.103Z" }, - { url = "https://files.pythonhosted.org/packages/95/2f/c8b07559b57701230c61b23a953858c052890c12ef568d81780c6c46e92e/coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766", size = 252189, upload-time = "2026-07-02T13:09:17.828Z" }, - { url = "https://files.pythonhosted.org/packages/6b/80/6d2f049dd3fd3dbfd60b62ba6b2162a04009e2c002ce70b24cf3878dec7a/coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da", size = 254059, upload-time = "2026-07-02T13:09:19.304Z" }, - { url = "https://files.pythonhosted.org/packages/ce/92/b0287a2c42031d25c628f815f89a3cd9f8268ee78bb1252c9356cda1c689/coverage-7.15.0-cp312-cp312-win32.whl", hash = "sha256:5f764a3fa339bde6b3aa97657f5a6a3a9451e4a5b4ea98a2892c773a43525f77", size = 222893, upload-time = "2026-07-02T13:09:20.812Z" }, - { url = "https://files.pythonhosted.org/packages/a9/69/e34c481915fecb499b3146975061dac528752e37706edc1804f32c822469/coverage-7.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:52f9a4d2c4c56c8848bc2f524916698354b0211488b38c49ad9ae54f6cafbff6", size = 223429, upload-time = "2026-07-02T13:09:22.315Z" }, - { url = "https://files.pythonhosted.org/packages/fe/98/6e878f0b571d32684ef3f38d7c03db241ca5b82a5da8a5391596a8f209c4/coverage-7.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:31e5c3e70c85307ea35a12964e2e40f56ca2ee4b1c8c721ccf4609d17071080b", size = 222810, upload-time = "2026-07-02T13:09:23.812Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/145a3748098bcc86b631a85408d2c3dc5c104e0bd86d605468239b25b6c4/coverage-7.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5be4caf3b28836f078abe700f8944dac4a65d78f16d6c600c89cb624e5535782", size = 220863, upload-time = "2026-07-02T13:09:25.371Z" }, - { url = "https://files.pythonhosted.org/packages/a4/5c/4ed55708fed2c64b63c9bc5715daef670872202101938869b7fe5d5fbb8f/coverage-7.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd58ad1404704303ca8d4f4b8a1095e7cbc7040ef17a66df1e6619aa10176430", size = 221230, upload-time = "2026-07-02T13:09:26.897Z" }, - { url = "https://files.pythonhosted.org/packages/7b/19/3a80b97d3b2a5c77a01ae359c6bed20c13738fe3d9380f08616d4fec0281/coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5", size = 252227, upload-time = "2026-07-02T13:09:28.543Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fa/b70062750686bd7da454da27927622f48bbac6990ac7a4c4a4653e7b0036/coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970", size = 254823, upload-time = "2026-07-02T13:09:30.177Z" }, - { url = "https://files.pythonhosted.org/packages/a9/09/dad6a75a2e561b9dc5086a8c5257a7591d584246f67e23e70d2995b89ab6/coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c", size = 256059, upload-time = "2026-07-02T13:09:31.979Z" }, - { url = "https://files.pythonhosted.org/packages/e6/e7/b5d2941fa9564573d44b693a871ff3156f0c42cbefe977a09fa7fdc59971/coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84", size = 258190, upload-time = "2026-07-02T13:09:34.035Z" }, - { url = "https://files.pythonhosted.org/packages/7c/1d/8e895bcde3c57ccd46d896dda5f2b3d5df761a1b0c6c9d450d175dedc632/coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389", size = 252456, upload-time = "2026-07-02T13:09:35.765Z" }, - { url = "https://files.pythonhosted.org/packages/14/4c/f6997da343ddeb959be82c3b05322793f92c071ad45f7cb8a96336e2dd5f/coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950", size = 254192, upload-time = "2026-07-02T13:09:37.445Z" }, - { url = "https://files.pythonhosted.org/packages/17/27/a0bc09d032267b9da89d95a2d874cfbef2a5aebbf0e87cf7aba221d79a99/coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e", size = 252153, upload-time = "2026-07-02T13:09:39.422Z" }, - { url = "https://files.pythonhosted.org/packages/54/c0/77fc233d9fba07b244c40948c53fe27308b8f21732fb3417f87fbd6fd992/coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e", size = 256310, upload-time = "2026-07-02T13:09:41.006Z" }, - { url = "https://files.pythonhosted.org/packages/d5/24/601cecfb5825becacb8d45219a018a3b55b9dbaec624efdb0ea249d08be2/coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837", size = 251974, upload-time = "2026-07-02T13:09:42.733Z" }, - { url = "https://files.pythonhosted.org/packages/47/1e/6f45e5a5b3d5484318d368702af6716b5ab8913b0428bec981a562fcf296/coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37", size = 253745, upload-time = "2026-07-02T13:09:44.376Z" }, - { url = "https://files.pythonhosted.org/packages/8e/db/4df027a77bd11d0e527f44c53557c76e54ad027413d0304252ea3a78d67e/coverage-7.15.0-cp313-cp313-win32.whl", hash = "sha256:0bf781da64326b677be344df505171435b6f58716108606621d5d27d964fff8b", size = 222902, upload-time = "2026-07-02T13:09:46.122Z" }, - { url = "https://files.pythonhosted.org/packages/a0/10/0355894d34e231f2c5449e71287e81a50793a325df2e2b027b7bcd9dfd19/coverage-7.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:2c57a275078ee3fa185f83e400f765bc764a549de66d99b47881645cbd4ea629", size = 223444, upload-time = "2026-07-02T13:09:47.687Z" }, - { url = "https://files.pythonhosted.org/packages/06/ef/bb725f263befaaff851203ab338e68af15e195d7f7b5f323162532d9b6a8/coverage-7.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:3812c61afc6685c7999b39320779ab8f43b7a3081fdb0def39976e56fbdb9a21", size = 222839, upload-time = "2026-07-02T13:09:49.717Z" }, - { url = "https://files.pythonhosted.org/packages/4f/9c/1e3ca54f72a3185ece06c58d871099898c48f0ed6430d17b6ab75f0d180a/coverage-7.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:41cb79af843222e11da87127ad0ecbfa878abadd0f770a4a99391a27d3887324", size = 220906, upload-time = "2026-07-02T13:09:51.339Z" }, - { url = "https://files.pythonhosted.org/packages/09/37/f718613d83b274880382f6b67e78f3802549ae39b0b3e65ae5b5974df56e/coverage-7.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7d2008989ef8fe54188d3f3bfa2e3099b025af11e90a6a1b9e7dc433d04263d8", size = 221239, upload-time = "2026-07-02T13:09:53.138Z" }, - { url = "https://files.pythonhosted.org/packages/a7/ce/22bae91e0b75445f68d365c7643ed0aa4880bbf77450ee74ca65bdae53a7/coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092", size = 252286, upload-time = "2026-07-02T13:09:54.996Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1e/bec5e32aa508615d9d7a2790effb25fb4dc28606e995816afe400b25ece3/coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502", size = 254789, upload-time = "2026-07-02T13:09:56.678Z" }, - { url = "https://files.pythonhosted.org/packages/17/29/0e865435b4354e4a7c03b1b7920046d31d0a273d55decefea27e011cb9bf/coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2", size = 256135, upload-time = "2026-07-02T13:09:58.343Z" }, - { url = "https://files.pythonhosted.org/packages/84/ff/33a870b58a13325d62fc0a6c8f01fa0ff667cef60c7498e2382a147dfa18/coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e", size = 258449, upload-time = "2026-07-02T13:10:00.057Z" }, - { url = "https://files.pythonhosted.org/packages/18/7b/6fffe596bf3ddba8462758d02c5dad730fd91055a6634aa2e4226229181a/coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888", size = 252313, upload-time = "2026-07-02T13:10:01.946Z" }, - { url = "https://files.pythonhosted.org/packages/58/1b/11468dd6c1676ab831a70cb9a8d4e198e8607fa0b7220ab918b73fe9bfbd/coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859", size = 254142, upload-time = "2026-07-02T13:10:04.065Z" }, - { url = "https://files.pythonhosted.org/packages/79/41/29328e21d16b1b95092c30dd700e08cf915bd3734f836df8f3bdb0e8fa9f/coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99", size = 252108, upload-time = "2026-07-02T13:10:06.11Z" }, - { url = "https://files.pythonhosted.org/packages/9b/de/05ccfb990439655b35afbfd8e0d13fe66677565a7d4eb38c3f5ef2635e1c/coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676", size = 256385, upload-time = "2026-07-02T13:10:08.141Z" }, - { url = "https://files.pythonhosted.org/packages/51/0e/486828a3d2695ea7a2609f17ff572f6b01905e608379440a11da4b8dffbe/coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6", size = 251923, upload-time = "2026-07-02T13:10:10.179Z" }, - { url = "https://files.pythonhosted.org/packages/18/c7/03582b6715f078e5e558354c87616d945b9894cda2dace8e4009b17035e4/coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe", size = 253580, upload-time = "2026-07-02T13:10:12.052Z" }, - { url = "https://files.pythonhosted.org/packages/db/dc/9e578bbaf2ecb4959a81b7e7601ad8cca772cba2892e8d144cb749b4a71a/coverage-7.15.0-cp314-cp314-win32.whl", hash = "sha256:ab282853ed5fbd64bbb162f19cb8fcb7087187508a6374b4f9c34ec1577c4e8f", size = 223107, upload-time = "2026-07-02T13:10:13.994Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3e/c8c3b75d8dbe0e35f7b0cc3ff5e949fc59500f70b21d0398813f66740664/coverage-7.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bb3040e9f4bbe26fcb0cd7cc85ac63e630d3f3a9c74f027abf4caa27e706663", size = 223597, upload-time = "2026-07-02T13:10:15.906Z" }, - { url = "https://files.pythonhosted.org/packages/cd/bc/3cbc9fb036eb388519bccd521f783499c39b64256013fbc362782f196fe1/coverage-7.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:346771144d34f7fa84ec28386f78e0f31653f33cf35e19d253d5b35f9e8201da", size = 223020, upload-time = "2026-07-02T13:10:17.844Z" }, - { url = "https://files.pythonhosted.org/packages/28/00/199c4a8d656dff63102577a056c0fce2ff6a79e40adac092fc986c49cbf1/coverage-7.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d34a010905fb6401324ba016b5da03d574967f7b21ce48ea41e66f0f1f95f641", size = 221638, upload-time = "2026-07-02T13:10:19.703Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8e/9d0092c96a3d3a26951ecc7020826aa57bcb1b119ca81acbba996884ab13/coverage-7.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bb25d825d885ca8036795dacfc3924d33091fc76d71ebc99420c6b79e77d96fa", size = 221903, upload-time = "2026-07-02T13:10:21.514Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b4/c0ca3028f42c9a08e51feb4561ef1192e5de99797cd1db5b04590c215bda/coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461", size = 263267, upload-time = "2026-07-02T13:10:23.261Z" }, - { url = "https://files.pythonhosted.org/packages/5f/aa/a375e3846e5d3c013dc600b2a3231089055c73d77f5393dd2192a8d64da6/coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72", size = 265390, upload-time = "2026-07-02T13:10:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/92/e1/5783cdabb797305e1c9e4809fea496d31834c51fa772514f73dc148bcfc9/coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd", size = 267811, upload-time = "2026-07-02T13:10:27.249Z" }, - { url = "https://files.pythonhosted.org/packages/85/31/96d8bbf58b8e9193bc8389574a91a0db48355ee98feb66aa6bf8d1b32eea/coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5", size = 268928, upload-time = "2026-07-02T13:10:29.242Z" }, - { url = "https://files.pythonhosted.org/packages/5e/7a/5294567e811a1cb7eda93140c628fa050d66189da28da320f93d1d815c73/coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007", size = 262378, upload-time = "2026-07-02T13:10:31.107Z" }, - { url = "https://files.pythonhosted.org/packages/69/3f/3f48538421f899f28946f90a3d272136a4686e1abf461cc9249a783ee0f3/coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9", size = 265263, upload-time = "2026-07-02T13:10:32.942Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d3/092df15efcab8a9c1467ee960eb8019bbad3f9300d115d89ea6195f369ff/coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f", size = 262866, upload-time = "2026-07-02T13:10:35.104Z" }, - { url = "https://files.pythonhosted.org/packages/e5/ab/0254d2b88665efb2c57ad368cc77ab5de3435bd8d5add4729c1b0e79431e/coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571", size = 266599, upload-time = "2026-07-02T13:10:37.05Z" }, - { url = "https://files.pythonhosted.org/packages/a8/79/1cfa4023e489ce6fbc7be4a5d442dbc375edb4f4fda39a352cedb53263c2/coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8", size = 261714, upload-time = "2026-07-02T13:10:38.966Z" }, - { url = "https://files.pythonhosted.org/packages/b7/eb/fee5c8665656be63f497418d410484637c438172568688e8ac92e06574e7/coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68", size = 264025, upload-time = "2026-07-02T13:10:40.789Z" }, - { url = "https://files.pythonhosted.org/packages/ab/99/63005db722f91edc81abc16302f9cc2f6228c1679e46e15be9ae144b14d0/coverage-7.15.0-cp314-cp314t-win32.whl", hash = "sha256:54fd9c53a5fafff509195f1b6a3f9be615d8e8362a3629ff1de23d270c03c86b", size = 223413, upload-time = "2026-07-02T13:10:42.597Z" }, - { url = "https://files.pythonhosted.org/packages/c1/e8/2bc6181c4fb06f1a6b981eb85330cc57bfad7e3f710fc9c9d350013ba228/coverage-7.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:87b47553097ba185ed964866078e7e63adea9f5f51b5f39691c34f30afd21080", size = 224245, upload-time = "2026-07-02T13:10:44.47Z" }, - { url = "https://files.pythonhosted.org/packages/79/b8/4d959bf9cc45d0cfed2f4d35cafcab978cdb6ea02eb5100009cd740632a3/coverage-7.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aeefb2dd178fe7eee79f0ad25d75855cb35ee9ed472db2c5ea06f5b4fd00cec5", size = 223558, upload-time = "2026-07-02T13:10:46.368Z" }, - { url = "https://files.pythonhosted.org/packages/52/30/21b2ad45959cd50e909e02ebac1e30b4ceb7162e91c11d4c570223a458b7/coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19", size = 212632, upload-time = "2026-07-02T13:10:48.641Z" }, +version = "7.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/83/6051c2a2feab48ae5bd27c84ef047191d2d4a3172f689e38eaa48ed17db1/coverage-7.15.1.tar.gz", hash = "sha256:165e9949eaf222ef1f018635d0d7f368a23bfe0212af558534c40d8c04686d67", size = 927640, upload-time = "2026-07-12T20:58:19.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/76/eef242d6bb95fb737fefd9bbf3a318897e4e82cf543b53a61c2a6e8588eb/coverage-7.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:05d87c2a43373ad6b976d0a99ad58c48633633bcdeb896dc645a006472cc4a71", size = 221195, upload-time = "2026-07-12T20:55:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/89/73/41cd50da59d513a30fd3a34b5516b962ac17514defdb6705948446a5c0b1/coverage-7.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2afce82f2cf8f4c9002746a42755e1dc61baff33d9f7ab5569b4c9101f8f4d1d", size = 221714, upload-time = "2026-07-12T20:55:58.104Z" }, + { url = "https://files.pythonhosted.org/packages/22/9d/6df6ac6677719a087c839208186525b7b1f3653c50196c43246482ada65e/coverage-7.15.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a545ef5384d787d0fcac6c349afc2c5f99dcc39e13ed3c191b2c06305f64c04", size = 248454, upload-time = "2026-07-12T20:55:59.336Z" }, + { url = "https://files.pythonhosted.org/packages/9f/f5/86f92c429fbf942986d01c3bb7b0b6c3ad06b09f7fa745023877413dde83/coverage-7.15.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:afaa144b8f5b3bc69fe0ce50d401c46b01ab264782553bfd05a3f98804524ecb", size = 250282, upload-time = "2026-07-12T20:56:00.589Z" }, + { url = "https://files.pythonhosted.org/packages/47/c6/99d0f1c1dd1583aaf8c1deca447e44426be54a76027a8c55e29970f22b15/coverage-7.15.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b6099490e5f88569c46b18605f556c3b30acc9a0a219cf7ef8fab8f7161ec4", size = 252149, upload-time = "2026-07-12T20:56:01.853Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c3/5d30740ec96f5fd8a659e46b6ee9224197f87aa66ce4a20e93dcf46221ac/coverage-7.15.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb5f6c2cf1ffd0bf2bd925c7cdcae9b4f208e9696d453ed51eb1f5fa0cc5b45b", size = 254061, upload-time = "2026-07-12T20:56:03.277Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/3afb2950673ca6cd22bc9ad6a9d6058c853bef8fe27a6d1df3adc274fd88/coverage-7.15.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:81572011fc1fc271317da35da593944daef7bfd507085e35751abbe702b74f69", size = 249152, upload-time = "2026-07-12T20:56:04.618Z" }, + { url = "https://files.pythonhosted.org/packages/ca/53/25ab3c0a7cf517ed4d30cd4dd82331e005d4b57fec8c19c0ffd94fb50baa/coverage-7.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f765d13c08497687d0780cca66115c6aa4ba6703ad43b61e94fab9db689e3a3", size = 250187, upload-time = "2026-07-12T20:56:06Z" }, + { url = "https://files.pythonhosted.org/packages/ad/2a/8afb5f994e26e919e5dca5164f1c7b6b7ce6090aab1aac32b1ae1782f047/coverage-7.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:771caba880fee96493d18dfc465c318e08ab74e3bc2a3e4089e52514be6a6e54", size = 248193, upload-time = "2026-07-12T20:56:07.376Z" }, + { url = "https://files.pythonhosted.org/packages/d4/62/b6616e15288c9a7b628f7745e832fd8af2c03ec1f7dc11da25947f5ab16f/coverage-7.15.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:433a73200848e80f27712fc113b6ff5311f29b479a7d3bd4b1106138a77f9674", size = 252004, upload-time = "2026-07-12T20:56:08.787Z" }, + { url = "https://files.pythonhosted.org/packages/9e/21/5d80d65e4df3018dedb23a44f276f20ce26e429ffd76df03de03bcf9a767/coverage-7.15.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5d6fa45079db9fbeba0a69e3d91189f05301d6ac918162a53179d32fc9ed4910", size = 248463, upload-time = "2026-07-12T20:56:10.245Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/04a22708691561c44d77e1d5a60857b351310fdfbf253533780bb31c8b6f/coverage-7.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:00b6703c6640075cdce5124e9335dfdf9167272475301828acfdd09c0e5ee731", size = 249064, upload-time = "2026-07-12T20:56:11.614Z" }, + { url = "https://files.pythonhosted.org/packages/82/c9/a5c1e8954e657559de478acc1ef73e9393d3fc9b4a2ab4427501d765aca2/coverage-7.15.1-cp310-cp310-win32.whl", hash = "sha256:3ad9a0eac4728327fd870d52f74d2e631d176c5f178eaea2d9983ab5b9755a55", size = 223248, upload-time = "2026-07-12T20:56:13.068Z" }, + { url = "https://files.pythonhosted.org/packages/54/49/5f6566e14611a58e93a926f3a8a7b22e4e0702ebb4c467ac38f452c7f4cf/coverage-7.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:eb5fa75dc3d30e3a1b75da97973479b20ffa9b0641ff56d6e94b5f3e210daa54", size = 223874, upload-time = "2026-07-12T20:56:14.396Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/5095e07a0986930174fc153fd0bb115f7f2724f5344cc672e016d4f23a4e/coverage-7.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6506330b4a8dcf53b95bd84d8d0e817107cdb3fc1438e835029cdf0bc6612eb0", size = 221320, upload-time = "2026-07-12T20:56:16.036Z" }, + { url = "https://files.pythonhosted.org/packages/43/7a/7e2598ce98433a214020a61c0755d5961f9f26df0c630dc73e06b86d3416/coverage-7.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8a51a8ec382c39d939cba0ab07ae949077ae4e842343bd4eed22d432358cea9", size = 221823, upload-time = "2026-07-12T20:56:17.54Z" }, + { url = "https://files.pythonhosted.org/packages/8b/4f/67dac6a69139b490a239d91b6d5ef127982ffb89159769241656ab879ee5/coverage-7.15.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:18ea20e3922d7f8ca9e0ef1084408d08c4ad62d5e531cb9c1f6896a99297ebea", size = 252242, upload-time = "2026-07-12T20:56:18.868Z" }, + { url = "https://files.pythonhosted.org/packages/05/37/5e439725a96de592309725550c8df639c359c209dcb4b152ed46032d4c0d/coverage-7.15.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aab9902a64b8390e3b56e539fddae1d79a267807fe5cb0c18d7d2f544ce867e2", size = 254153, upload-time = "2026-07-12T20:56:20.118Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1c/671ba9e15f9651a99962fb588a1fe4fb267cae4bb85f9bb4ac4413c6f7ef/coverage-7.15.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cc316264317b07a9e90d7f2b4188a15e36e9b54e651081b791b0515fa612a29", size = 256261, upload-time = "2026-07-12T20:56:21.682Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3c/88305322b4d015b4536b7174b8f9b87f850f01af9d89008cdbf984b65ff2/coverage-7.15.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d4e47e7eea81a8ccf060a07627654151d929da62c7b715738387c200905cec89", size = 258222, upload-time = "2026-07-12T20:56:22.962Z" }, + { url = "https://files.pythonhosted.org/packages/8d/20/d02e42333a57f266ded61ed4fb3821da1f2dc143734aaa3dcc9c117204c5/coverage-7.15.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6829d9a3b55ad2b73ef5fda8302e5be03683789e88b1a079dcf4a773229c21d", size = 252368, upload-time = "2026-07-12T20:56:24.475Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d0/94ebc010926a191d83e83b1f1236f8bd0d14d0eb98b5c324aa4be2589a8e/coverage-7.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:764e045811f9c8cda436641f3f088283351d331a519b5807f19041cd0a68da1c", size = 253953, upload-time = "2026-07-12T20:56:26.036Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a6/2c8553191da0c2da2c43ff294fb9bab57a5b0fae03560304a82a8b5addc3/coverage-7.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:09b3b088aa24489c4082bcc35fcc8224281ab94a653dfb6d3f0c8165b0d628ab", size = 252016, upload-time = "2026-07-12T20:56:27.374Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/20f47986d8360fa1a31d9858dd2ba0be009d44ecfa8d02120b1eb93c028b/coverage-7.15.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7911b02f57053adf8164ae63edb1c26574d24dfccabadc5268cf69310a69a358", size = 255783, upload-time = "2026-07-12T20:56:28.921Z" }, + { url = "https://files.pythonhosted.org/packages/17/36/fb61983b5259f78fa5e62ee74e91fe4de4c556fcbc9a3b9c9021c2f8b57b/coverage-7.15.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:664e279ed40599b8ed16f4db18d92a7e212c73129672bec8f5d96d4da48d2404", size = 251735, upload-time = "2026-07-12T20:56:30.465Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2e/d109d8d2d6c726ba2e78125297073918a2a91464f0ea777e5398fa3cf75c/coverage-7.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34fe7cf79d5f1f87f2e8ce7dc1c32950841f50e10d0120f263856acfad66de34", size = 252645, upload-time = "2026-07-12T20:56:32.076Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/5b3219cbb46135e14673427f2bf5890c4da4e6f655243692f3448aa3f42c/coverage-7.15.1-cp311-cp311-win32.whl", hash = "sha256:5e2d2536d2f57a354aa382ed303ac0e2e5c9522a508c05b998d26181b94163a7", size = 223414, upload-time = "2026-07-12T20:56:33.432Z" }, + { url = "https://files.pythonhosted.org/packages/5b/80/24e13ade0b6df8090e2492f9c55044bf1423f7ef28c76fc1af8c827a61cb/coverage-7.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:c337da8fca7ea93ab43f3868cfcde6cf6dad32c3906b273cfbad5d7390bc423b", size = 223888, upload-time = "2026-07-12T20:56:34.784Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9e/34659930ae380491af48e2f5f5f9a2e99cd9fb7de3d30f27be5ac5425137/coverage-7.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:db3403fdb7a94d5eb73e099befad8104d2a7d110a0f0d99df0de61c5d1fa756c", size = 223435, upload-time = "2026-07-12T20:56:36.302Z" }, + { url = "https://files.pythonhosted.org/packages/d9/76/32c1826309beaf4604c54accef108fdd611e5e5e93f2f5192f050cd5f6bd/coverage-7.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d9476292594309db922cc841dd13b303b3c388f4c25d279884f7e2341c681f80", size = 221497, upload-time = "2026-07-12T20:56:37.628Z" }, + { url = "https://files.pythonhosted.org/packages/db/5c/b88ce0d68fa550c7f3b58617fbf363bce64df5bf8295a01b627e4696e022/coverage-7.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c579056b0de461b3a62318b63d0b6ce90aed7f8158d3f00da094df82f29d189", size = 221854, upload-time = "2026-07-12T20:56:39.033Z" }, + { url = "https://files.pythonhosted.org/packages/0e/fe/8509fd2a66fc4e0a829f76a0f0b1dc3cc163368352435b5f243168658077/coverage-7.15.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:23214bdbe226f2b0e9c66a7d6a1d59d4a88045dcf86e702cf0fe0d0935e3d615", size = 253359, upload-time = "2026-07-12T20:56:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/e5/81/c7009ed7ea9765adb2b9d095054d748266fae5f07ac6c5f925f33715fcde/coverage-7.15.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df164be93b46b4825cc39339440a05edc54c4d1d865ba4a60fd43d151a2a1cd3", size = 256096, upload-time = "2026-07-12T20:56:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/21/52/dc8ee03968a5ba86e2da5aa48ddc9e3747bd65d63825fdce2d96acb9c5ff/coverage-7.15.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a524fca1a6f08927d9dc2d4c873cfb7bd7202c247f08b14bdc02424071b8b304", size = 257211, upload-time = "2026-07-12T20:56:43.513Z" }, + { url = "https://files.pythonhosted.org/packages/b8/27/95d7623908da8937deb53d48efcdbf423907a47540e63c62fa21372c652b/coverage-7.15.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d70f3542cd38de85a9e257dcb1ac4c1ab4b6d7d2c2a645809207556628755d1c", size = 259473, upload-time = "2026-07-12T20:56:44.974Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3b/730d761928de97d585465680b568ae69622fb40716babadeabffe75cb51b/coverage-7.15.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d78aa537237212c4313aabe5e964b66acc86350ed19ebc56a3e202df33b6077b", size = 253759, upload-time = "2026-07-12T20:56:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fc/6b9277acff1f9484b6c12857af5774689d1a6a95e13265f7405329d2f5da/coverage-7.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a318112bb4f79d9d04766196d5a3388caa825908a6a9b052aa87de3d9aea7c61", size = 255131, upload-time = "2026-07-12T20:56:48.073Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f2/c704f86129594ba34e25a64695d2068c71d51c2b98907184d716c94f4aec/coverage-7.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e55d24cada901963eed5bc89fa562aa033f0d84b9d3de4ecf363737c13aed11e", size = 253275, upload-time = "2026-07-12T20:56:49.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/29/80fee8af47de4a6dce71ccf2938491f444687a756af258a56d8469b8f1b0/coverage-7.15.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3c78f0cea7275342cf2adc2ad5fdd0aafa106ad91e66d573568f2fcf62c41df5", size = 257345, upload-time = "2026-07-12T20:56:51.038Z" }, + { url = "https://files.pythonhosted.org/packages/20/21/a1e7d7ed1b48a8adf8fd5154d9e83fcc5ad8e6ff20ae00e44865057dce8d/coverage-7.15.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:86bd37eabe39977216f630a7fc1b698e7f5e81a191c7186013245c6c3d313f9d", size = 252844, upload-time = "2026-07-12T20:56:52.535Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8c/a4bc26e6ee207d412f3678f04d74be1550e83140563ca0e4997510579712/coverage-7.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6db15c217693bdc3ca0b84de1ba9afafe1c14c26a8a29d77f4ed0de2b6132e2", size = 254716, upload-time = "2026-07-12T20:56:53.968Z" }, + { url = "https://files.pythonhosted.org/packages/11/9d/8ad0266ecfada6353cf6627a1a02294cf55a907521b6ee0bd7b770cfd659/coverage-7.15.1-cp312-cp312-win32.whl", hash = "sha256:359f3fbe09a51500c51966596ee4ee4070b356552c70b3b2420eb200d68e0f76", size = 223554, upload-time = "2026-07-12T20:56:55.583Z" }, + { url = "https://files.pythonhosted.org/packages/81/6d/24224929e06c6e05a93f738bc5f9e8e6ab658f8f1d9b823e7b85430e28b8/coverage-7.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:fa75dc099c126e941a9c0baa8ebd2cbc78bd778687534fe410baf754f6d9e374", size = 224087, upload-time = "2026-07-12T20:56:57.041Z" }, + { url = "https://files.pythonhosted.org/packages/35/23/f81441dd01de88e53c97842e706907b307d9078918c3f4998b11e9ac7250/coverage-7.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:26f89cf6d0634375f454fa71057945ad18edb0f1607a90fecf22c57dc3dc289a", size = 223472, upload-time = "2026-07-12T20:56:58.594Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1e/6fa289d7993a2a39f1b283ddb58c4bfec80f7800be654b8ba8a9f6a07c63/coverage-7.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71ac4ca1658ca99160fd58cc6967110e989c34b04627f24ed6ec9f70fb24571a", size = 221519, upload-time = "2026-07-12T20:57:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e1/0db4902a0588234a70ab0218073c0b20fbc5c740aa35f91d360160a2ebc9/coverage-7.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:26a40cbf2b13bd94af53ee02a424cb3bb96a9edfac0d00834bd068512a62714b", size = 221895, upload-time = "2026-07-12T20:57:01.867Z" }, + { url = "https://files.pythonhosted.org/packages/b4/cb/3719783865092dac5e08df842730305ee9ab1973ae7ddb6fbdf27d401f30/coverage-7.15.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4c5a5eff4ad4f9f7088fd3fc7a66d98d06566ee294b3b053309fb0a3b45be1e", size = 252882, upload-time = "2026-07-12T20:57:03.459Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5e/caf3abbdbb22629626160ffc9c017eb995b7cb11c0be46b974834cef1792/coverage-7.15.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:962aa56c1c9b016d681265880eb6acc9966029d2c4c559319cc43a1abbb9b59a", size = 255479, upload-time = "2026-07-12T20:57:04.984Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f1/d60f375bfe095fef944f0f19427aefdbf9bdd5a9571c41a4bf6e2f5fdb81/coverage-7.15.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1678eb2dc57a8ce67601b029582ef6d41e9e6ca22692aaeccd4107e40f27386c", size = 256715, upload-time = "2026-07-12T20:57:06.446Z" }, + { url = "https://files.pythonhosted.org/packages/d7/17/8b0cbc90d02dc5adad4d9034c1824ec3fa567771b4c39d9c1e3f9b1431b8/coverage-7.15.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1174900a43f6f8c425fee10d7dbddc308adefcdc78aaced32357f5ab750a0e90", size = 258845, upload-time = "2026-07-12T20:57:08.092Z" }, + { url = "https://files.pythonhosted.org/packages/92/29/c5e69f5fb75c322e9a3e4ef64d02eebfc3d66efceccc8514ff80a3c13a56/coverage-7.15.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98847557a6859cadf693792ce89f440cb89692993f60dc6d3a7e35f3d340216f", size = 253098, upload-time = "2026-07-12T20:57:09.636Z" }, + { url = "https://files.pythonhosted.org/packages/64/57/21144252fdd0c01d707d48fbcea13a80b0b7c42ced3f299f885ab8978c3a/coverage-7.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8697b2edb57143546a24389efc11e1b000cd5800fc20d84f04edb601e4a7cfb8", size = 254844, upload-time = "2026-07-12T20:57:11.141Z" }, + { url = "https://files.pythonhosted.org/packages/59/2a/499a28a322b0ce6768328e6c5bb2e2ad00ac068a7c7adb2ecd8533c8c5d9/coverage-7.15.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6827ac0519be3fe91bf96b4060eb00d1d24f82649b29862cd75a3cfca248b02a", size = 252807, upload-time = "2026-07-12T20:57:12.678Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/928a95da5da8b60f2b00e1482c7787b3316188e6d2d227fb8e124ada43a1/coverage-7.15.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2de8ecbbc77c7e4d22572779920ed8979c69168675e96be3a548c996568c6c31", size = 256965, upload-time = "2026-07-12T20:57:14.326Z" }, + { url = "https://files.pythonhosted.org/packages/16/10/889adbc1b8c9f866ed51e18a98bcafc0259fb9d29b81f50a719407c64ea8/coverage-7.15.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b25f0f0fa5260df9d7bb55d47c8bdc23fa3382c1a18f7c9cae122e6c320b1ad", size = 252628, upload-time = "2026-07-12T20:57:15.892Z" }, + { url = "https://files.pythonhosted.org/packages/1a/30/a5e1871e5d93416511f8e359d1ccebfe0cbb050a1bbf7dd20228533ec0cf/coverage-7.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a2effcbd93ae340a58db718fe4181d967f84d352c4cefeaab4ff82ce813901a", size = 254399, upload-time = "2026-07-12T20:57:17.703Z" }, + { url = "https://files.pythonhosted.org/packages/2d/26/c36fbffd549dadbdd1a75827528fb00a4c46aa3187b007b750b1e2cebbf2/coverage-7.15.1-cp313-cp313-win32.whl", hash = "sha256:895e65c96aef0cecea250f6e35e9a32f11375514e1a0cb5210e0fda128c04e8e", size = 223564, upload-time = "2026-07-12T20:57:19.253Z" }, + { url = "https://files.pythonhosted.org/packages/16/fc/becbb9d2c4206d242b9b1e1e8e24a42f7926c0200dd3c788b9fab4bb96d5/coverage-7.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6d0a28b63a0d75f9ed5118105d1154fc3aa40a8605a30d5d87e3d043ad90fe7", size = 224106, upload-time = "2026-07-12T20:57:21.108Z" }, + { url = "https://files.pythonhosted.org/packages/d3/30/1cfc641461369b6858799fca61c0a8b5edc490c519bf7c636ffa6bbf556f/coverage-7.15.1-cp313-cp313-win_arm64.whl", hash = "sha256:b4ee9818e8bae3544379ad2c09b851c4fb886aaa8860d57a1c1316ddcb16db49", size = 223497, upload-time = "2026-07-12T20:57:22.734Z" }, + { url = "https://files.pythonhosted.org/packages/f0/46/81961952e7aebfb38ad0ae4264e8954cc607a7af9e7ac111f9fa986595cc/coverage-7.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a886af95f59edf67d5770fd3564d53f4a8af93f25f8c1d60d27e00d7f5674ee8", size = 221560, upload-time = "2026-07-12T20:57:24.282Z" }, + { url = "https://files.pythonhosted.org/packages/13/d2/ee14d715889f216baf47301d9f469e08fff6995552aaf67e897b282865f6/coverage-7.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:985657ebd707941de90d488d1cbb5efac20bdf81f7b91eba771624ccda4d36f4", size = 221894, upload-time = "2026-07-12T20:57:25.87Z" }, + { url = "https://files.pythonhosted.org/packages/f3/38/f830bc6e6c2c5f23f43847125e6c650d378872f7eeba8d49f1d42193e8a9/coverage-7.15.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5bbe2a06e0a5e1404d9ffbdb49b819bbd6a3bb198ebea4c8dfe7ad9f1e1c2e81", size = 252938, upload-time = "2026-07-12T20:57:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/e1/53/0d3dd963631259d794c898735d5436e68d6a8d40749c419a07ff7c171469/coverage-7.15.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bde0fe24083d0b7b3dbafa7a09f0796410af1afa2523f28f5f208d8340a4aaca", size = 255445, upload-time = "2026-07-12T20:57:29.234Z" }, + { url = "https://files.pythonhosted.org/packages/b1/fd/aabed228557565c958259251b89bab8c5669b31291fa63b3e2154ebb017a/coverage-7.15.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f89f7453d6d46db14cf233e2cd8edcd78de2b9c49d4f1dc109590b4e5dbfbb74", size = 256790, upload-time = "2026-07-12T20:57:30.826Z" }, + { url = "https://files.pythonhosted.org/packages/bc/aa/1cc888e5d3623e603c4e5399653cb25728bb2b40d7519188a3e293d24620/coverage-7.15.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc3656c9ecc27b36bd0907455b77f83c0069ca9ad4a66dec892b76c696eb6047", size = 259104, upload-time = "2026-07-12T20:57:32.63Z" }, + { url = "https://files.pythonhosted.org/packages/5f/61/fc16d5f5e53098dae41efa21e8ccc611a9b4fe922750dd03dc56db552182/coverage-7.15.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:24d8e85a2a45e44883b488c2659f51fa761dad5353fdb319b672a93facbd2ca9", size = 252956, upload-time = "2026-07-12T20:57:34.316Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f3/52384668c3de4519ca770bf1975a89e4d6eb5aa2faf0da0577a14008cba4/coverage-7.15.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68931b5fe746ed4fdaa8892989cab9e6c35781eeb3b0ab2ded893d561e1b3652", size = 254797, upload-time = "2026-07-12T20:57:35.947Z" }, + { url = "https://files.pythonhosted.org/packages/ce/68/54b807e7c1868178e902fd8360b5d4e559394462f97285c50edf1c4608db/coverage-7.15.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1ce6947e2a95534ecaa5a15e73c21e550514c980d80eda204d064d789a95f6a4", size = 252762, upload-time = "2026-07-12T20:57:37.856Z" }, + { url = "https://files.pythonhosted.org/packages/7b/48/dde8adf0338e3ace738757dccf1ce817e5fdcadfae77e1b48a77e5a3b265/coverage-7.15.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:841befdbc89b9c82435fc25b0f4f41858b6238693e45af758bec4cfc1968171c", size = 257037, upload-time = "2026-07-12T20:57:39.488Z" }, + { url = "https://files.pythonhosted.org/packages/07/f2/179dd88cf60a0aeeee16a970ffe250dccea8b80ed4beab4c5d3f6c41ad4b/coverage-7.15.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5d3de58b837375e7f4c0e1a088ccab5f655efb2fd7427b729df02c862a559633", size = 252577, upload-time = "2026-07-12T20:57:41.363Z" }, + { url = "https://files.pythonhosted.org/packages/2c/37/8a593d69ab521beb6a105a2017cac4ba94425ee0a8349e29c3c0b522d24f/coverage-7.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b1801963f9f44ae0c0f6d737bc7aeb2bbcde7d1fe7e3b43cddc1961af42d3b41", size = 254235, upload-time = "2026-07-12T20:57:43.025Z" }, + { url = "https://files.pythonhosted.org/packages/6d/34/bc9b3bced66f2cdad4bf5e57ae51c54ea226e8aaaebfc9370a9a11877bf3/coverage-7.15.1-cp314-cp314-win32.whl", hash = "sha256:8c7953c4128ef53b6ffb5f90d87c87d4ce26731df294760bb2314eb0e069e44b", size = 223771, upload-time = "2026-07-12T20:57:44.662Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f3/4d20337bed61915d14349e62b88d5e4144d5a9872b64adbe90e9906db6db/coverage-7.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:6f0bab60a582d415f0fb535ccff13ba334a47a1538f98913330a525d23bd535a", size = 224257, upload-time = "2026-07-12T20:57:46.412Z" }, + { url = "https://files.pythonhosted.org/packages/7b/df/bbfeae4948f3ded516f92b32f2d57952427fc5ecfc0924487bb6ee6a5f38/coverage-7.15.1-cp314-cp314-win_arm64.whl", hash = "sha256:0f410ee8f0ac4ec7db71bc0b7632a8b9994e1cad2755bd1566c17e6a162caa74", size = 223683, upload-time = "2026-07-12T20:57:48.106Z" }, + { url = "https://files.pythonhosted.org/packages/35/65/0b431856064e387d1f5cf474625e4a0465e907024d42f35de6af19ced0be/coverage-7.15.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:fc868bab88e049d41fcd41766810d790a8b960053be2a45e060f5ce0d31d258b", size = 222298, upload-time = "2026-07-12T20:57:49.882Z" }, + { url = "https://files.pythonhosted.org/packages/a6/96/50eac9bd49df8a3df5f3d38746d1bf332299dffb554486c94ebd55c9dc49/coverage-7.15.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:206d4ec6028f2773b40932d09f074539d6bcdd8f6b318d40cb04bdbd68ed0b49", size = 222561, upload-time = "2026-07-12T20:57:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5b/6ba1c4a27e10b8816fd2622b98162c83d3bdf1185097360373611bf96364/coverage-7.15.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:620482ef1c9f4e61f962e159325fe77dea59d16e39d9c9470d069053b244d864", size = 263923, upload-time = "2026-07-12T20:57:53.392Z" }, + { url = "https://files.pythonhosted.org/packages/e4/59/fe03ade97a3ca2d890e98c572cf48a99fda9adba85757c34b823f41efe1e/coverage-7.15.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d385fc9b054e309ad3cecdc77b586d2af0c98aeec2fdb3773544586f366e817c", size = 266043, upload-time = "2026-07-12T20:57:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/16/e0/55c4b1217a572a43e13b39e1eb78d0da29fb23679003bd0cdf22c50b1978/coverage-7.15.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1198bca9c0dd7c188aae1f185b0c0b5fc4f0a2b6909000858c29550320bdb07", size = 268465, upload-time = "2026-07-12T20:57:57.017Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/ee47944f76afc03909119b036fe9e0da8cbd274a5141287de79791a0fb6d/coverage-7.15.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d0297e6a070eadb49df7cddd0ab6f420b8b689dd8904c7dd815a323168fa57e", size = 269584, upload-time = "2026-07-12T20:57:58.958Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8a/6b4d9779c7b2e21c3d12c3425e3261aa7411399319e27aa402dfec4db5d0/coverage-7.15.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:916fcf2214f56960e409561b37fc32a160a42b6e85483d0652d7b70fa55d707e", size = 263019, upload-time = "2026-07-12T20:58:00.979Z" }, + { url = "https://files.pythonhosted.org/packages/c4/1e/db5c7fa0c8ba5ece390a1e1a3f30db71d440240a80589df28e66a7503c40/coverage-7.15.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f837bae572c7869ffaa502e604c87e182543012831cf87aae4586ad090ac6dcf", size = 265916, upload-time = "2026-07-12T20:58:03.005Z" }, + { url = "https://files.pythonhosted.org/packages/83/53/fe5176682b00709b13fab36addd26883139d0dea430816fea412e69255e2/coverage-7.15.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3ea65e3ee6c7c32349fd00559927a9e577bdd72386087eeed1c42b62dfce9b82", size = 263520, upload-time = "2026-07-12T20:58:04.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e7/16f15127be93fbc70c667df5ec5dce934fc76c9b0888d84969a5d5341e2c/coverage-7.15.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:345034976f46a1c54bd17f4e43eb30bb92cb7082fcddff03250cff136cc4eb82", size = 267254, upload-time = "2026-07-12T20:58:06.824Z" }, + { url = "https://files.pythonhosted.org/packages/cd/73/e5119111f6f065376395a525f7ce6e9174d83f3db6d217ea0211a61cca4d/coverage-7.15.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4f051a64eb8f8addb4661c2b41d6eea5b7ebc68ad4b2baea8d9bc54e1956e5f7", size = 262366, upload-time = "2026-07-12T20:58:08.555Z" }, + { url = "https://files.pythonhosted.org/packages/d7/9c/6d0a81182df18a73b081e7a8630f0e2a52b12dfd7898c6ab839551a454d2/coverage-7.15.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a7625770f7720b49bb30d194ad2f8d50fab3c5177874af3d2399676f95f9c594", size = 264680, upload-time = "2026-07-12T20:58:10.359Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a2/bac0cbd4450638f1be2041a464b1766c8cc94abf705a2df6f1c8d4be870d/coverage-7.15.1-cp314-cp314t-win32.whl", hash = "sha256:81e503d130a472ad1bd38199ecd35116b40d92bcd31e27a2cacde035381f2070", size = 224077, upload-time = "2026-07-12T20:58:12.065Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b2/d83c5403155172a43ba47c08641bad3f89822d8405102423a41339d2c857/coverage-7.15.1-cp314-cp314t-win_amd64.whl", hash = "sha256:724e878b213b302ad46e9f2fc872d386613f20ebfc492a211482d917ea76c14f", size = 224908, upload-time = "2026-07-12T20:58:13.956Z" }, + { url = "https://files.pythonhosted.org/packages/cc/41/442b74cad832cc77712080585455482e7cc4f4a9a13192f65731dcd18231/coverage-7.15.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ce2f05c14d077f406fefc4fa5e4f093ad0e0787549f6582535d6e28766f0361b", size = 224219, upload-time = "2026-07-12T20:58:16.315Z" }, + { url = "https://files.pythonhosted.org/packages/34/98/07a67cf1a26e795d617ed5c540c042b0ac87b72f810c30c07f076cf334f3/coverage-7.15.1-py3-none-any.whl", hash = "sha256:717d01e6e00bed56ad13306f19e0dd2f4f645ee8159d2c72c72301d6cfc7090c", size = 213284, upload-time = "2026-07-12T20:58:18.079Z" }, ] [package.optional-dependencies] @@ -750,7 +750,7 @@ wheels = [ [[package]] name = "mypy" -version = "2.2.0" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, @@ -760,52 +760,52 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/7e/be536678c6ae49ef058aba4b483d8c7bc104f471479016066f345bc1f5f8/mypy-2.2.0.tar.gz", hash = "sha256:2cdd99d48590dce6f6b7f1961eda75386364398fcdaad86923bc0f0231bf9baf", size = 3950939, upload-time = "2026-07-08T01:37:27.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/f1/a818c375094e20a74ec51444cce6979cedd61d476f860c2f084ea8653bd2/mypy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97d21f3a1582ef30d0b77f9ca3ad88b4263f3c5aea9e7380cb5d7175160aec7e", size = 14903842, upload-time = "2026-07-08T01:33:27.944Z" }, - { url = "https://files.pythonhosted.org/packages/33/15/f332590488a8e4bb4a24036484c8bc750fe01fbef09701451a8790ac4c44/mypy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2529017942b951cc43db2e2712b71cc3aa7e9d90567630c03ed63d430aeec61a", size = 13902986, upload-time = "2026-07-08T01:36:59.24Z" }, - { url = "https://files.pythonhosted.org/packages/38/9f/7ae37860922d264b536790a3307caa195eb8abb733f2e81608229bbb0f07/mypy-2.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0823d7f273f3b4a49df7573eac271ddbf77a0e5f53e24d294a4f0f77ad22e1d7", size = 14132163, upload-time = "2026-07-08T01:34:16.111Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6d/25c31c85a793340a4a9be593f8fe2cea08fd7b615f8b602b3f52f2d822f6/mypy-2.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d78a0fc90704894bc9948d78affad14b882b08183a7c30412d185748aaa9418b", size = 15070110, upload-time = "2026-07-08T01:34:44.933Z" }, - { url = "https://files.pythonhosted.org/packages/cb/67/7adf1caa143f6a0d9c564de24e0c1ed48340185110c3b918adc2f447192b/mypy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6efab25fa3568569fda06928743382900860c48be9200c1758ef5ce94b532714", size = 15371554, upload-time = "2026-07-08T01:34:27.688Z" }, - { url = "https://files.pythonhosted.org/packages/49/cb/ceca928213076f540d9b068c3655c52d43549f124c1f6dece5ecb747bbeb/mypy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:daeaf5287091d68f674c91416cabab0f80f36e347ed17fded38d7ebde682e9d1", size = 11063618, upload-time = "2026-07-08T01:36:13.235Z" }, - { url = "https://files.pythonhosted.org/packages/41/24/08caa177a4f2e0c44b96d5ad85f2754761b45bb6d65841451ef5dc9edb86/mypy-2.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:f8d97940a0259e09c219903579720b2df12170c0c3a3b3799837c1fb63deb44e", size = 10070720, upload-time = "2026-07-08T01:37:13.251Z" }, - { url = "https://files.pythonhosted.org/packages/96/2e/1ea8028583fef6561d146b51d738d91268201313ecf69e603e808a740e74/mypy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea6fe1a30f3e7dc574d641497ffead2428046b0f8bc5804d13b4e4392fdc317b", size = 14739569, upload-time = "2026-07-08T01:35:33.202Z" }, - { url = "https://files.pythonhosted.org/packages/ba/67/c0607da57d78358b3b4fbfa90ee8ca5c6bd1dbb997c9648904ad4d8861d8/mypy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6965829a6d847a0925f51149472bbeb7a39332fb4801972fdfd9cedd9f8d43a4", size = 13821442, upload-time = "2026-07-08T01:33:45.991Z" }, - { url = "https://files.pythonhosted.org/packages/bb/56/0407007d4ec7a762bac20724af1f0a57a9d860186c39e73105b6b8396fa2/mypy-2.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a906bfc9c4c5de3ece6dc4726f8076d56ce9be1720baf0c6f84e926c10262a4", size = 14049813, upload-time = "2026-07-08T01:35:44.282Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d1/d718e006c8fed4bece7a1bebeea6dcd05f31433af552fc45a82fef426379/mypy-2.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91df92625cb3452758f27f4965b000fb05ad89b00c282cc3430a7bd6b0e5389e", size = 14978473, upload-time = "2026-07-08T01:36:54.064Z" }, - { url = "https://files.pythonhosted.org/packages/82/03/dae7299c45a84efb1590875f92652a5beb2da98a2cff9a567995e2583fe4/mypy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d42893d15894fd34f395090e2d78315ba7c637d5ee221683e02893f578c2f548", size = 15224649, upload-time = "2026-07-08T01:35:15.988Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8e/738e4e73d030f20852a81383c74319ca4a9a4fdaadc3a75823588fe2c833/mypy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3abaeec02cdc72e30a147d99eb81852b6b745a2c8d19607e25241d79b1abbce", size = 11049851, upload-time = "2026-07-08T01:34:39.31Z" }, - { url = "https://files.pythonhosted.org/packages/94/09/6c58caedb3fa5831a9b179687cd7dc252c66a61dca4800e5ba19c8eff82b/mypy-2.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c39bdb7ceab252d15011e26d3a254b4aaa3bbf121b551febfa301df9b0c69abe", size = 10060307, upload-time = "2026-07-08T01:33:21.852Z" }, - { url = "https://files.pythonhosted.org/packages/d1/be/fbaba7b0ee89874fb11668416dec9e5585c190b676b0796cff26a9290fe8/mypy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:484a2be712b245ac6e89847141f1f50c612b0a924aa25917e63e6cfcf4da07cd", size = 14928025, upload-time = "2026-07-08T01:37:24.376Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8f/f79a7c5a76671b0f563d4beaa7d99fe90df4500d2c1d2ba1be0432121bcf/mypy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb0a020dc68480d40e484675558ed637140df1ccbf896a81ba68bca85f2b50a0", size = 13793027, upload-time = "2026-07-08T01:34:33.937Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b9/3db0086bab611d34e26061b86189e6f71de6d22a9b81699a93b006eabcf6/mypy-2.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc361340732ce7108fa0308812caf02bb6868f16112f1efd35bcad88badf3327", size = 14108322, upload-time = "2026-07-08T01:36:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/58/29/4f1e13979a848de2a0fd385462354b58358b6e8b3d9661663e308f6e3d5d/mypy-2.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b0179a3a0b833f724a65f22613607cf7ea941ab17ec34fa283f8d6dfe21d9fa9", size = 15190198, upload-time = "2026-07-08T01:36:20.168Z" }, - { url = "https://files.pythonhosted.org/packages/14/f7/7759f6294d9d25d86671957d0974a215a2a24d429526e26a2f603de951c5/mypy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e0899b13da1e4ba44b880550f247402ce90ffecc71c54b220bcbe7ecb34f394", size = 15424222, upload-time = "2026-07-08T01:33:39.398Z" }, - { url = "https://files.pythonhosted.org/packages/d7/1b/05b212bef4d2234b5f0b551ea53ce0680d8075b2e79861c765f70b590945/mypy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:511320b17467402e2906130e185abffffa3d7648aff1444fc2abb61f4c8a087d", size = 11135191, upload-time = "2026-07-08T01:35:03.019Z" }, - { url = "https://files.pythonhosted.org/packages/92/51/495e7122f6589948b36d3820a046461906756a0eb1b6dedc13ebfec7815e/mypy-2.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:7589f370b33dcdd95708f5340f13a67c2c49140957f934b42ef63064d343cca0", size = 10132502, upload-time = "2026-07-08T01:34:04.508Z" }, - { url = "https://files.pythonhosted.org/packages/a3/5f/2d7a9ac5646274cd6e77ce3abcc2a9ece760c2b21f4c4b9f301711e07855/mypy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6968f27347ef539c443ddfd6897e79db525ddb8c856aa8fbf14c34f310ca5193", size = 14931618, upload-time = "2026-07-08T01:33:51.702Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8a/1adaa7caaa104f87021b1ac71252d62e646e9b623d77900ac7a0ae252bf3/mypy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3df226d2a0ae2c3b03845af217800a68e2965d4b14914c99b78d3a2c8ae23299", size = 13857718, upload-time = "2026-07-08T01:35:27.555Z" }, - { url = "https://files.pythonhosted.org/packages/1d/15/b11586b5aebbb82213e297fc30a6fcf3bed6a9deea3739cd8dd87621f3fd/mypy-2.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc53553996aca2094216ad9306a6f06c5265d206c1bcb54dd367560bd3557825", size = 14059704, upload-time = "2026-07-08T01:33:57.363Z" }, - { url = "https://files.pythonhosted.org/packages/03/db/071e05ab442596bdf7a845e830d5ef7128a0175281038245b171a6b16873/mypy-2.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:996abf2f0bebf572556c60720e8dc0cf5292b64060fa68d7f2bc9caa48e01b6f", size = 15128719, upload-time = "2026-07-08T01:33:33.855Z" }, - { url = "https://files.pythonhosted.org/packages/f3/1c/c4b84eafb85ee315da72471523cc1bf7d7c42164085c42333601da7a8817/mypy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ec287c2381898c652bf8ff79448627fe1a9ee76d22005181fac7315a485c7108", size = 15378692, upload-time = "2026-07-08T01:34:10.468Z" }, - { url = "https://files.pythonhosted.org/packages/68/a4/59a0ee94877fdfe2958cec9b6add72a75393063c79cb60ab4026dd5e10c2/mypy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2c967a7685fa93fcf1a778b3ebe76e756b28ba14655f539d7b61ff3da69352a", size = 11150911, upload-time = "2026-07-08T01:35:21.603Z" }, - { url = "https://files.pythonhosted.org/packages/90/e4/6a9144be50180ed43d8c92de9b03dff504daa92b5bcc0353e8960799a23b/mypy-2.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:d59a4b80351ec92e5f7415fcdd008bd77fcbefc7adf9cbc7ffe4eb9f71617734", size = 10125389, upload-time = "2026-07-08T01:36:36.164Z" }, - { url = "https://files.pythonhosted.org/packages/73/32/0aa8d8d197023ca6040f7b25a486cb47037b6350b0d3bae657c8f85fb43f/mypy-2.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1f6c3d76853071409ac58fc0aadfb276a22af5f190fdaa02152a858088a39ebd", size = 14926083, upload-time = "2026-07-08T01:36:02.365Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7c/35bbe0cb10e6699f90e988e537aaf4282a6c16e37f58848a242eb0a98bde/mypy-2.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bdaa177e80cc3292824d4ef3670b5b58771ee8d57c290e0c9c89e7968212332c", size = 13879985, upload-time = "2026-07-08T01:36:31.093Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0c/1597fbebd873e9b63452317740ae3dd32692cec5da180cc65acd96cd28cf/mypy-2.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80923e6d6e7878291f537ee11052f974954c20cb569798429a5dc265eb780b47", size = 14076883, upload-time = "2026-07-08T01:34:21.789Z" }, - { url = "https://files.pythonhosted.org/packages/68/35/2ec021a83ec01b5d522639f78d8b36adade7fa4821db0f48fd6d82e861f3/mypy-2.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f24bd465a09077c8d64be8f19a6646db467a55490fd315fe7871afe6bb9645", size = 15103567, upload-time = "2026-07-08T01:36:47.717Z" }, - { url = "https://files.pythonhosted.org/packages/53/3a/8cb3529f6d6800c7d069935e5c83a05d80263847b8a947cf6b0b16a9e958/mypy-2.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:db34595464869f474708e769413d1d739fc33a69850f253757b9a4cc20bc1fec", size = 15354641, upload-time = "2026-07-08T01:36:41.592Z" }, - { url = "https://files.pythonhosted.org/packages/d6/4d/320bc9a9553f8a9db5e847ec5ded762ef7ed7403c76c4ba2e8181c80e2f0/mypy-2.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b48092132c7b0ef4322773fecae62fc5b0bc339be348badeec8af502122a4a51", size = 7694355, upload-time = "2026-07-08T01:37:03.291Z" }, - { url = "https://files.pythonhosted.org/packages/90/05/bf3b349e2f885cd3aab488111bb9049439c28bc028dac5073350d3df8fbe/mypy-2.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:6fc0e98b95e31755ca06d89f75fafa7820fbb3ea2caace6d83cba17625cd0acb", size = 11329146, upload-time = "2026-07-08T01:35:38.318Z" }, - { url = "https://files.pythonhosted.org/packages/41/a5/558b06e6cfe17ab88bb38f7b370b6bc68a74ba177c9e138db9748e422d2d/mypy-2.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:bc73a5b4d40e8a3e6b12ef82eb0c90430964e34016a36c2aff4e3bfe37ba41f0", size = 10316586, upload-time = "2026-07-08T01:36:25.458Z" }, - { url = "https://files.pythonhosted.org/packages/0b/21/f0b96f19a9b8ba111a45ffbe9508e818b7f6990469b38f6888943f7bfd3a/mypy-2.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6257bd4b4c0ae2148548b869a1ff3758e38645b92c8fe65eca401866c3c551c1", size = 15922565, upload-time = "2026-07-08T01:35:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/18/f2/1dbcb20b0865d5e992541450a8c73f2fcc90f8bd7d8a4b81313e16934870/mypy-2.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa22b3ae862ac1ce76f5976ddd402651b5f090bcfd49c6d0484b8983a29eaf8", size = 14816515, upload-time = "2026-07-08T01:34:58.167Z" }, - { url = "https://files.pythonhosted.org/packages/84/a2/18cce9c7d5b4d14010d1f13836da11b234dda917b17ca8671fc32c136997/mypy-2.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a430bf26fe8cf372f3933fbd83e633d6561868803645a20e4e6d4523f52a3b", size = 15272246, upload-time = "2026-07-08T01:37:08.72Z" }, - { url = "https://files.pythonhosted.org/packages/ce/71/24d720c7924829bd675cbde2d0fa779f50abf676ca617f53d6a8bfef5fa7/mypy-2.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d58655a60e823b1a4c9ebcda072897fb0193c2f3e6f8e7c433e152aa4cb00233", size = 16226295, upload-time = "2026-07-08T01:34:51.861Z" }, - { url = "https://files.pythonhosted.org/packages/b7/5e/785730990fc863ad8340b4ab44ac4ca23270aecff92c180ccdf27f9f5869/mypy-2.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d4452c955caf14e28bb046cbd0c3671272e6381630a8b81b0da9713558148890", size = 16493275, upload-time = "2026-07-08T01:35:09.337Z" }, - { url = "https://files.pythonhosted.org/packages/93/33/55b1edf16f639f153972380d6977b81f65509c5b8f9c86b58b94b7990b03/mypy-2.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:68f5b7f7f755200f68c7181e3dfb28be9858162257690e539759c9f57721e388", size = 11749038, upload-time = "2026-07-08T01:35:50.071Z" }, - { url = "https://files.pythonhosted.org/packages/61/36/67424748a4e65e97f0e05bf00df379dfb6c2d817f82cc3a4ce5c96d99beb/mypy-2.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:78d201accfafce3801d978f2b8dbbd473a9ce364cc0a0dfd9192fe47d977e129", size = 10704254, upload-time = "2026-07-08T01:37:17.971Z" }, - { url = "https://files.pythonhosted.org/packages/28/cb/142c2097ca02c0d295b00625ff946808bdda65acda17d163c680d8a6a474/mypy-2.2.0-py3-none-any.whl", hash = "sha256:ecc138da861e932d1344214da4bae866b21900a9c2778824b51fe2fb47f5180e", size = 2726094, upload-time = "2026-07-08T01:34:00.075Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/12/af/4e516a05d3ca2eb9283e9ec45b2c02225c1514dd6da49fd3c9eaa6639370/mypy-2.3.0.tar.gz", hash = "sha256:465965d41cd9a2726694e983e8ce7113259327bec798115d1e1dfa2a52fb666e", size = 3988104, upload-time = "2026-07-13T11:34:53.387Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/09/f2f5f45dae0c9a0891e4751a73312730e009395102e5d72a22a976cca41f/mypy-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1fa8d916ac3b705af733c4c1e6c9ebe38fd0d52beb15b105c3e8355b55e6ecdc", size = 14927774, upload-time = "2026-07-13T11:28:38.224Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/345367effd3a6877275a94d481614bfca983f45e028c6290e2cc54603811/mypy-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28e1e2af8cd8fff551fd30f2fe4b03fb76764ac8b1ba6c6a1bd00ad32b412db3", size = 14000127, upload-time = "2026-07-13T11:30:19.57Z" }, + { url = "https://files.pythonhosted.org/packages/99/6c/a10b7a7b9f0a755fb94e27ae834d4cea9ad6c5221f9325eef8f182641feb/mypy-2.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e77244df3843048c3f927182916730e40c124cbaa43905c1fb86cb382aa0805", size = 14229437, upload-time = "2026-07-13T11:28:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/d9/bd/a26a602acb1bbf849fa4bdac4bc657ee2f11c0c2a764a2cc87a5304e865c/mypy-2.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9559ab18a9c9957dfa3004ab57cd4bac5f26a724329a9584e583367f0c2e1117", size = 15171457, upload-time = "2026-07-13T11:29:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/124f462bef69bcbc90b9358088460b6091954a3e004852fcd9948db617a5/mypy-2.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09abd66d8685e73f8f7d17b847c3e104d9a7b164a8706ea87d6c96a3d45816d5", size = 15478281, upload-time = "2026-07-13T11:32:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/db/a4/8bdca6a8ac8d856d82ed049144af2721245a135c2e8001d3890c93975852/mypy-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e91adad1ca81742ac7ef9893959911df867752206b37135185e88dfb3c89494", size = 11148008, upload-time = "2026-07-13T11:34:17.332Z" }, + { url = "https://files.pythonhosted.org/packages/83/41/490eea348e60ba50decec20bc750605444149a5d7a8cc560042f90ba2c75/mypy-2.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:6f99ec626e3c3a2f7c0b22c5b90ddb5dabb1c18729c971e9bdaca1f1766d2cee", size = 10142329, upload-time = "2026-07-13T11:32:52.116Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b9/d75b3082b05f1b3028828aeb18e74ae5ab0a0936051bbf1f32f59f654747/mypy-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3419d00717afbc5265b50dd14b1278f29ea4884dd398ab67873489ac093fd329", size = 14838725, upload-time = "2026-07-13T11:32:44.655Z" }, + { url = "https://files.pythonhosted.org/packages/a9/50/79a65c6ea6e115bc73296038a4543b2d5c91f07912b918a2c616a2514bba/mypy-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cfca8ee88544090f86b6dcce05ec55d66eb48a762412ac2507810ba4bd793b6f", size = 13911128, upload-time = "2026-07-13T11:32:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/90/48/e11ed7716c26953ca321f726e452e374dbf81a6f2b8b212ec02af29b6b8f/mypy-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75cbb4b9ef04a0c84a957f07abc4504fbf64b8dcc145675101f2d3a78a4b1d6a", size = 14146742, upload-time = "2026-07-13T11:33:03.313Z" }, + { url = "https://files.pythonhosted.org/packages/06/72/6807565b1c4861ef66f7fdd98b51c61556356eab80235717b46c53bb8627/mypy-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:982e3d53dd23d0a4cef67dd66791fdbede0cf38f9eb617bf47663554c51e1e36", size = 15081418, upload-time = "2026-07-13T11:31:13.899Z" }, + { url = "https://files.pythonhosted.org/packages/00/80/1ea14c5d80e589e415973db3e47c78c2219a305b808b2b506395342c1d79/mypy-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85c5385b93012ffa3b31479ab579aef5415f4f3a32c6cf1ae07a984d2a0ff461", size = 15328164, upload-time = "2026-07-13T11:31:35.723Z" }, + { url = "https://files.pythonhosted.org/packages/37/28/8223157404a3d51920078459c37f80fbdc590e1d8ea049dc5ce48643022a/mypy-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:13b1b16e2fa39f3b2e33fb1c468abc7a69369fa2e886b4b87b5afc81472325cd", size = 11136472, upload-time = "2026-07-13T11:27:37.018Z" }, + { url = "https://files.pythonhosted.org/packages/6f/cc/ea27e5959c5f258585a756b252031f3b313583d81b5064b2bebc41d3706b/mypy-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:b5cd2f027a972a4a5f2278a11fac9747f5f81a53a30b714d74950b6807e55568", size = 10135800, upload-time = "2026-07-13T11:30:08.92Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/0e7e592619e2133596a47cdd642534b0456545c218430bd3b9d8fefdd1b1/mypy-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d53fc67b9d28a43c6199077f49fea0f05839e36cf6158500331c9549225e5a5", size = 15026523, upload-time = "2026-07-13T11:34:49.206Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/1e1731df090a857df2807177a4626863e5ac0f0256513c35780efe53986f/mypy-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbc00cee7bdbb9291979ddc9d08034a29dfcda4932628c9bbc28c1edd589df0c", size = 14032189, upload-time = "2026-07-13T11:33:57.168Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/cab921f4a806e171f34113e6181dd23c55358ccf6a80741269ef594a410e/mypy-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04e617030eca5221909c8b7d8d7fd1c637948199aa2100b2ad9813feb07e1491", size = 14198696, upload-time = "2026-07-13T11:32:12.767Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/e6d008bb19fe446e3662d85e0e2717bf9f2d611a2164fb29d6e067dbf46c/mypy-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56c184d2c20ca6b6378d58d1960270a767f41f5e44acbbd27f05effef4f4e1d7", size = 15286904, upload-time = "2026-07-13T11:34:27.594Z" }, + { url = "https://files.pythonhosted.org/packages/db/83/94397c9293608a364aa03e8084fb34ede4ae976a260384b9b52929308135/mypy-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3961a4a34b05f7c74b0f05aa51fbfe99a2d1e126038df40318d15c8f558b7ef3", size = 15528342, upload-time = "2026-07-13T11:34:07.819Z" }, + { url = "https://files.pythonhosted.org/packages/cf/96/d8b37d819adec6cfccfb1fd3afc1735d94717ddeafb45536db9c6943e09b/mypy-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1942b9314d4c784b8ea1dbab4972603290e5dd5630f06675f13aec97526bc4c", size = 11218346, upload-time = "2026-07-13T11:28:27.745Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cd/cd9f725b19b19e5b530a154cf9bcf9e94279c5d55b3c34fb42b3aa48ea1b/mypy-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:be51653d7669d7d7955d613b8d0bb57d5b652eaf71a873ddf65ac87254dd2595", size = 10204525, upload-time = "2026-07-13T11:31:02.552Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ae/f7d056eb0294586a572d0d0d89580ec633c064db520f11d37d5a2fb833bd/mypy-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:91ad22a52ae2c7e621c2f67c94d5a17f66b3209a4cff5cf8a573579835c69e97", size = 14947298, upload-time = "2026-07-13T11:27:47.734Z" }, + { url = "https://files.pythonhosted.org/packages/32/d5/db3e7af01e7844d21662c6ddc1f7825ec7cb4053f0391ac02faf3638396f/mypy-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99ac767cc5d3b64c8d0ae226ead10c96694f94e4e7da1668642225dcd4e75aac", size = 13950768, upload-time = "2026-07-13T11:27:57.726Z" }, + { url = "https://files.pythonhosted.org/packages/d9/fb/43c031f0190513d1ec248ed037eceb742ddd2a4d74bbf406658a28173837/mypy-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6d2c484742a4d7b0ed6d07b143375624d3b899c5749c7b3c947f56261f48a6", size = 14151586, upload-time = "2026-07-13T11:29:18.615Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c3/f8b2ffc60883084da91be51af58e88a7ffd4ff9795acb7d902ff88d31eb1/mypy-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7da939dd335cfd2ad788bdfd081c9f4e47634ab995e5a45eb15fd1e5bc052f8b", size = 15227411, upload-time = "2026-07-13T11:30:29.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/2e/16b917fc7adcf03f1aadddfc93aab804ffb234b1ab09c0ffd6d92a5d34a2/mypy-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7247eb2824f996722a949530183394921ca71deb9680052a338cf53cff7925c2", size = 15478790, upload-time = "2026-07-13T11:33:14.686Z" }, + { url = "https://files.pythonhosted.org/packages/c0/88/aaa65a93c73d0cdae7e42f8adb302bf6885bb281302084f99d0290a35347/mypy-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:75b0984bb3cbd76bb5c9291a8671f7ae66ca3b51c7584c358fc2e923259f0757", size = 11234919, upload-time = "2026-07-13T11:33:39.28Z" }, + { url = "https://files.pythonhosted.org/packages/35/19/b40de63f1a80e63bc2d40f0679a6a8dbd34e95176c8122119bdf406aa552/mypy-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:d78fcf900b59cb7e82cb7e3a235e31b462d9333d92285bd1e4952d355b8ffba1", size = 10201510, upload-time = "2026-07-13T11:31:52.619Z" }, + { url = "https://files.pythonhosted.org/packages/a4/58/fa0ae047da911f540284009b4f44b96fe09d83c076d7c103e9d645f46303/mypy-2.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ea317b060ce83e26050f8f9e4d7d6bf44ed7597c8ff9990bccffbb9d1d8522db", size = 14941909, upload-time = "2026-07-13T11:32:34.332Z" }, + { url = "https://files.pythonhosted.org/packages/15/14/2ba1d61452d7c2a7fe12741e8d374e52b183476b07aa7f9e2a0d02b0720a/mypy-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:094af99f92638aa92852326188b85a89e50f4a472f44827c03362228482f0762", size = 13967581, upload-time = "2026-07-13T11:30:00.587Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5a/483fb9e5ffbbb1a28dccc7b0a13d141b17ac769b6c9f488c0a0c63698962/mypy-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de121747278144fc9ae7caa2e978cf5df12aebc82933182f5b3b86081a30baef", size = 14168807, upload-time = "2026-07-13T11:28:48.6Z" }, + { url = "https://files.pythonhosted.org/packages/ae/77/70d7a10732063beb74ad713682cf871e88f5c5fa39bfc8beff8a524bf9cb/mypy-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37fa4de896a84e2dc9200d91e614c22563b43d1a266789d4bbac7b22ebe6192b", size = 15200144, upload-time = "2026-07-13T11:31:25.283Z" }, + { url = "https://files.pythonhosted.org/packages/56/72/766218ac783be4fdfcd699b90037b63017348a3e86fb2c1fbfb18302637d/mypy-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f1b3a98dfd21058bc759bb3337d5d1f61d0fdf9f3cf9c00f4291790fb5427bff", size = 15460389, upload-time = "2026-07-13T11:29:29.077Z" }, + { url = "https://files.pythonhosted.org/packages/38/4e/8a9db7411ecb8ec0cb1fd05dba432f28bafffcd38b4e887714a4a0506689/mypy-2.3.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:944c665d984157cb96a679dfb7a4a81dd1d36b24b9c284b699514e6e626b82d4", size = 7753664, upload-time = "2026-07-13T11:29:08.147Z" }, + { url = "https://files.pythonhosted.org/packages/65/4c/c3f8bfd6ed0e5e38b5a244403b27f821d433443df5a15a278417c10a3a3c/mypy-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:4359424140d985192c778c1ce2c114a10c1ca58a381ed79cfa70d37df94b299f", size = 11417237, upload-time = "2026-07-13T11:33:47.467Z" }, + { url = "https://files.pythonhosted.org/packages/3c/00/89a32eaf5ccf174bc4f90db0eaea5d70636c01b8d49f384bdab2e8834390/mypy-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:3dd0bed92c4bdec57c42505b96416fb9e6a5aa7be84d2809bcd5f2ecec2860d7", size = 10389252, upload-time = "2026-07-13T11:31:43.81Z" }, + { url = "https://files.pythonhosted.org/packages/31/56/104f93d69aa9f339b6b9d3b0a7faa699b8b466c942cf3ae86cc2a2ec0915/mypy-2.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:691fdc37132b1ae628d834f672e74de83462d9fb4aff621835767fb43a8dd373", size = 16385495, upload-time = "2026-07-13T11:29:49.818Z" }, + { url = "https://files.pythonhosted.org/packages/d2/03/f1d2123313f55efafdd27706960f43a771c62f1b68426c76043f3ab9ebf3/mypy-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:aec15d465d477558fd842757b487849007311cf3897849cdda0e3162ac0ac556", size = 15098155, upload-time = "2026-07-13T11:30:40.301Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5d/d5f9200399b445e81726c4f23becee33f233aee81c72680b1ef3a258b641/mypy-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b352b7e49f5e6576009e8df730e1ff4f915cb565b851b396d2ffe2f5a6f5da88", size = 15514155, upload-time = "2026-07-13T11:34:38.569Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ce/69977c555f08faa3190cfde44189b89dbd56861b1ab97aa18fc5f3a2e4a3/mypy-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c6c6bf687b17f90dbfcad95b960d32eaa0154c00da45f03ab50bf8952e047fe", size = 16766351, upload-time = "2026-07-13T11:33:29.195Z" }, + { url = "https://files.pythonhosted.org/packages/bc/92/6648b6caa3ab9e00f9ac0c2a78307805f873dd48139b24a6f6f7c3667bbf/mypy-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f4ed18f111bfe2d599bca7468e7f9251042c1c2118f762c8de2766a56d773c60", size = 17043490, upload-time = "2026-07-13T11:30:53.927Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ab/0dc91d80f3f016634c68d451f294a97320fe903a9b6f90b9e57b3f7f1717/mypy-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0b025a93cffb9781d231f232be07a17912f35f10a313c24f301c81e842870654", size = 12146869, upload-time = "2026-07-13T11:29:38.874Z" }, + { url = "https://files.pythonhosted.org/packages/85/b5/4c964d02634ba81f4d1c84838e5c5b18ab06d13ed568960f5d6318495ccc/mypy-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:adebc76aab4f3495a88b41d48aa4aff0c03f2822501da76625afcca5975f19e5", size = 10965113, upload-time = "2026-07-13T11:28:07.056Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fa/fdc54fe583ba3cafbcedfb70eeeaf03849f75b1827a07096c7bd996f582d/mypy-2.3.0-py3-none-any.whl", hash = "sha256:6b1cdb579446b60432432b2b2403a6201b4b475a004d7f488511c9ba177c9e88", size = 2753292, upload-time = "2026-07-13T11:33:18.48Z" }, ] [[package]] @@ -1801,11 +1801,11 @@ wheels = [ [[package]] name = "types-docutils" -version = "0.22.3.20260518" +version = "0.22.3.20260712" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/91/81b520d0869a41aa0d86e713417b63e8604b4280c304bc09b02d74c7efd4/types_docutils-0.22.3.20260518.tar.gz", hash = "sha256:2c45ba63a9ac64246335359b68fe9c27602926499c9b67caec3780745f6aadee", size = 57504, upload-time = "2026-05-18T06:03:53.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/24/f50d49be6d5ebbae29ff83418b6788fc9897fdfb54d56555c9ae4b15fb53/types_docutils-0.22.3.20260712.tar.gz", hash = "sha256:bed54a50136c8e7613c03ee1c51eb958b42754915df83535de356b974ca05877", size = 57848, upload-time = "2026-07-12T05:13:36.059Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/9b/243fb84ede4f987f303a89e734c5def35ead2f8bd962ad301c1e99680958/types_docutils-0.22.3.20260518-py3-none-any.whl", hash = "sha256:9c4cbc37d9e37f47dfe971ac09e9880380dc948ff1f23956892e810d0bf08676", size = 91970, upload-time = "2026-05-18T06:03:52.388Z" }, + { url = "https://files.pythonhosted.org/packages/af/50/2b408d249cc7260b2296af68c395d90267c23288d1eb96765637eb6c1490/types_docutils-0.22.3.20260712-py3-none-any.whl", hash = "sha256:4bbc5cf949f8b1b1c7e1befa5a4d1c3bcad9f22f823538eea26ba7ff694fa38e", size = 91970, upload-time = "2026-07-12T05:13:35.141Z" }, ] [[package]] From 1269f3171a67118ab8a8814b9b430e3c672030a9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Jul 2026 06:56:48 -0500 Subject: [PATCH 2994/2998] ai(rules[AGENTS]) Add lean writing defaults why: the slop rules covered detection but not change footprint or coded labels, and nothing kept this file itself from growing. what: - Coded Labels: plain imperatives, no [R1]/Option B in human text - Change Discipline: smallest coherent change, reuse before create - Keep Instructions Lean: prune, move procedures to skills/hooks/CI --- AGENTS.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index e8fe0fd1fe..267b7a2d19 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -547,6 +547,11 @@ patterns: robust, seamless, production-ready, leverage, delve, tapestry,* and *best practices* with concrete descriptions of behavior, constraints, or trade-offs. +- **Coded Labels:** Write rules, options, and findings as plain + imperatives. Don't tag them with codes like `[R1]`, `A1`, or + `Option B` in artifacts a human reads — the reader shouldn't have to + decode an index. Internal agent bookkeeping may use ids; shipped text + may not. ### Preservation & Context @@ -600,3 +605,25 @@ to identify which commits this branch actually introduced. Then: work or expand the branch beyond its stated goal, stay in lane: protect the current goal and leave prior slop alone. +### Change Discipline + +- Make the smallest coherent change that solves the verified problem; + keep unrelated cleanup out of it. +- Reuse an existing file, component, helper, API, or test before adding + a new one. Modify in place when the change fits the file's + responsibility. +- Keep new APIs private until a caller outside the module needs them. +- Add a file only for a durable boundary — a distinct responsibility, + independent reuse, or splitting an oversized high-touch module — not + for a single-use helper or a one-line re-export. + +### Keep Instructions Lean + +Treat this file like code and prune it. + +- Delete a line whose removal would not cause a mistake. +- Move multi-step procedures into skills, path-specific rules into + nested AGENTS.md files, and hard limits into hooks or CI. +- Keep only non-obvious, broadly applicable defaults here. Anything a + reader can infer from the code, a manifest, or a linter does not + belong. From 960b37b3cac0706d6a15123c34e73463cefdbcd5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Jul 2026 06:56:48 -0500 Subject: [PATCH 2995/2998] ai(rules[AGENTS]) Prefer pinned GitHub source links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit why: blob/master links rot silently — the file moves, lines shift, and the anchor lands on unrelated code while still resolving. The rubric warned against bare SHAs, which reads as "don't pin links either". what: - Add Durable Source Links: tag first, then a trunk-reachable 7-char commit ref, trunk only for living documents - Rule out PR-head SHAs, which can be rebased or garbage-collected - Restrict line anchors to pinned refs --- AGENTS.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 267b7a2d19..3e0a275948 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -553,6 +553,22 @@ patterns: decode an index. Internal agent bookkeeping may use ids; shipped text may not. +### Durable Source Links + +Link to a pinned revision, never to trunk. A pinned permalink is not a +brittle reference; an unlinked SHA dropped into prose is. `blob/master/…` +links rot silently — the file moves, lines shift, and the anchor lands +on unrelated code while still resolving. + +- Prefer a release tag (`blob/v1.4.0/…`). Most durable, and it tells + the reader which released version the claim held for. +- Otherwise use a 7-char commit ref (`blob/9a29b1a/…`) reachable from + trunk. Use when there is no tag or the claim is about unreleased + code. Never a PR-head SHA — it can be rebased or garbage-collected. +- Reserve `blob/master/…` for living documents meant to always show the + latest state, such as a contributing guide. +- Line anchors (`#L120-L145`) are only safe on a pinned ref. + ### Preservation & Context **When unsure, leave the text in place and ask.** Subjective cleanup From 776c3bc4b1316173feae782f1dc000d05837432d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Jul 2026 08:44:01 -0500 Subject: [PATCH 2996/2998] .tool-versions(uv, just) uv 0.11.28 -> 0.11.29, just 1.56.0 -> 1.57.0 - just - https://github.com/casey/just/blob/1.57.0/CHANGELOG.md - https://github.com/casey/just/releases/tag/1.57.0 - uv: - https://github.com/astral-sh/uv/releases/tag/0.11.29 - https://github.com/astral-sh/uv/blob/0.11.29/CHANGELOG.md --- .tool-versions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tool-versions b/.tool-versions index 5bf1525d46..cc11d913c4 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -just 1.54 -uv 0.11.25 +just 1.57.0 +uv 0.11.29 python 3.14 3.13 3.12 3.11 3.10 From 1718ee58396cb7acda79ec33a67597b2f31c9ae4 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Jul 2026 08:44:39 -0500 Subject: [PATCH 2997/2998] py(deps[dev]) Bump dev packages --- uv.lock | 188 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/uv.lock b/uv.lock index 78fbb84c08..4651abbb30 100644 --- a/uv.lock +++ b/uv.lock @@ -272,100 +272,100 @@ wheels = [ [[package]] name = "coverage" -version = "7.15.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/83/6051c2a2feab48ae5bd27c84ef047191d2d4a3172f689e38eaa48ed17db1/coverage-7.15.1.tar.gz", hash = "sha256:165e9949eaf222ef1f018635d0d7f368a23bfe0212af558534c40d8c04686d67", size = 927640, upload-time = "2026-07-12T20:58:19.908Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/76/eef242d6bb95fb737fefd9bbf3a318897e4e82cf543b53a61c2a6e8588eb/coverage-7.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:05d87c2a43373ad6b976d0a99ad58c48633633bcdeb896dc645a006472cc4a71", size = 221195, upload-time = "2026-07-12T20:55:55.82Z" }, - { url = "https://files.pythonhosted.org/packages/89/73/41cd50da59d513a30fd3a34b5516b962ac17514defdb6705948446a5c0b1/coverage-7.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2afce82f2cf8f4c9002746a42755e1dc61baff33d9f7ab5569b4c9101f8f4d1d", size = 221714, upload-time = "2026-07-12T20:55:58.104Z" }, - { url = "https://files.pythonhosted.org/packages/22/9d/6df6ac6677719a087c839208186525b7b1f3653c50196c43246482ada65e/coverage-7.15.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a545ef5384d787d0fcac6c349afc2c5f99dcc39e13ed3c191b2c06305f64c04", size = 248454, upload-time = "2026-07-12T20:55:59.336Z" }, - { url = "https://files.pythonhosted.org/packages/9f/f5/86f92c429fbf942986d01c3bb7b0b6c3ad06b09f7fa745023877413dde83/coverage-7.15.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:afaa144b8f5b3bc69fe0ce50d401c46b01ab264782553bfd05a3f98804524ecb", size = 250282, upload-time = "2026-07-12T20:56:00.589Z" }, - { url = "https://files.pythonhosted.org/packages/47/c6/99d0f1c1dd1583aaf8c1deca447e44426be54a76027a8c55e29970f22b15/coverage-7.15.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b6099490e5f88569c46b18605f556c3b30acc9a0a219cf7ef8fab8f7161ec4", size = 252149, upload-time = "2026-07-12T20:56:01.853Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c3/5d30740ec96f5fd8a659e46b6ee9224197f87aa66ce4a20e93dcf46221ac/coverage-7.15.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb5f6c2cf1ffd0bf2bd925c7cdcae9b4f208e9696d453ed51eb1f5fa0cc5b45b", size = 254061, upload-time = "2026-07-12T20:56:03.277Z" }, - { url = "https://files.pythonhosted.org/packages/71/e5/3afb2950673ca6cd22bc9ad6a9d6058c853bef8fe27a6d1df3adc274fd88/coverage-7.15.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:81572011fc1fc271317da35da593944daef7bfd507085e35751abbe702b74f69", size = 249152, upload-time = "2026-07-12T20:56:04.618Z" }, - { url = "https://files.pythonhosted.org/packages/ca/53/25ab3c0a7cf517ed4d30cd4dd82331e005d4b57fec8c19c0ffd94fb50baa/coverage-7.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f765d13c08497687d0780cca66115c6aa4ba6703ad43b61e94fab9db689e3a3", size = 250187, upload-time = "2026-07-12T20:56:06Z" }, - { url = "https://files.pythonhosted.org/packages/ad/2a/8afb5f994e26e919e5dca5164f1c7b6b7ce6090aab1aac32b1ae1782f047/coverage-7.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:771caba880fee96493d18dfc465c318e08ab74e3bc2a3e4089e52514be6a6e54", size = 248193, upload-time = "2026-07-12T20:56:07.376Z" }, - { url = "https://files.pythonhosted.org/packages/d4/62/b6616e15288c9a7b628f7745e832fd8af2c03ec1f7dc11da25947f5ab16f/coverage-7.15.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:433a73200848e80f27712fc113b6ff5311f29b479a7d3bd4b1106138a77f9674", size = 252004, upload-time = "2026-07-12T20:56:08.787Z" }, - { url = "https://files.pythonhosted.org/packages/9e/21/5d80d65e4df3018dedb23a44f276f20ce26e429ffd76df03de03bcf9a767/coverage-7.15.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5d6fa45079db9fbeba0a69e3d91189f05301d6ac918162a53179d32fc9ed4910", size = 248463, upload-time = "2026-07-12T20:56:10.245Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/04a22708691561c44d77e1d5a60857b351310fdfbf253533780bb31c8b6f/coverage-7.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:00b6703c6640075cdce5124e9335dfdf9167272475301828acfdd09c0e5ee731", size = 249064, upload-time = "2026-07-12T20:56:11.614Z" }, - { url = "https://files.pythonhosted.org/packages/82/c9/a5c1e8954e657559de478acc1ef73e9393d3fc9b4a2ab4427501d765aca2/coverage-7.15.1-cp310-cp310-win32.whl", hash = "sha256:3ad9a0eac4728327fd870d52f74d2e631d176c5f178eaea2d9983ab5b9755a55", size = 223248, upload-time = "2026-07-12T20:56:13.068Z" }, - { url = "https://files.pythonhosted.org/packages/54/49/5f6566e14611a58e93a926f3a8a7b22e4e0702ebb4c467ac38f452c7f4cf/coverage-7.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:eb5fa75dc3d30e3a1b75da97973479b20ffa9b0641ff56d6e94b5f3e210daa54", size = 223874, upload-time = "2026-07-12T20:56:14.396Z" }, - { url = "https://files.pythonhosted.org/packages/67/ee/5095e07a0986930174fc153fd0bb115f7f2724f5344cc672e016d4f23a4e/coverage-7.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6506330b4a8dcf53b95bd84d8d0e817107cdb3fc1438e835029cdf0bc6612eb0", size = 221320, upload-time = "2026-07-12T20:56:16.036Z" }, - { url = "https://files.pythonhosted.org/packages/43/7a/7e2598ce98433a214020a61c0755d5961f9f26df0c630dc73e06b86d3416/coverage-7.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8a51a8ec382c39d939cba0ab07ae949077ae4e842343bd4eed22d432358cea9", size = 221823, upload-time = "2026-07-12T20:56:17.54Z" }, - { url = "https://files.pythonhosted.org/packages/8b/4f/67dac6a69139b490a239d91b6d5ef127982ffb89159769241656ab879ee5/coverage-7.15.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:18ea20e3922d7f8ca9e0ef1084408d08c4ad62d5e531cb9c1f6896a99297ebea", size = 252242, upload-time = "2026-07-12T20:56:18.868Z" }, - { url = "https://files.pythonhosted.org/packages/05/37/5e439725a96de592309725550c8df639c359c209dcb4b152ed46032d4c0d/coverage-7.15.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aab9902a64b8390e3b56e539fddae1d79a267807fe5cb0c18d7d2f544ce867e2", size = 254153, upload-time = "2026-07-12T20:56:20.118Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1c/671ba9e15f9651a99962fb588a1fe4fb267cae4bb85f9bb4ac4413c6f7ef/coverage-7.15.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cc316264317b07a9e90d7f2b4188a15e36e9b54e651081b791b0515fa612a29", size = 256261, upload-time = "2026-07-12T20:56:21.682Z" }, - { url = "https://files.pythonhosted.org/packages/d6/3c/88305322b4d015b4536b7174b8f9b87f850f01af9d89008cdbf984b65ff2/coverage-7.15.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d4e47e7eea81a8ccf060a07627654151d929da62c7b715738387c200905cec89", size = 258222, upload-time = "2026-07-12T20:56:22.962Z" }, - { url = "https://files.pythonhosted.org/packages/8d/20/d02e42333a57f266ded61ed4fb3821da1f2dc143734aaa3dcc9c117204c5/coverage-7.15.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6829d9a3b55ad2b73ef5fda8302e5be03683789e88b1a079dcf4a773229c21d", size = 252368, upload-time = "2026-07-12T20:56:24.475Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d0/94ebc010926a191d83e83b1f1236f8bd0d14d0eb98b5c324aa4be2589a8e/coverage-7.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:764e045811f9c8cda436641f3f088283351d331a519b5807f19041cd0a68da1c", size = 253953, upload-time = "2026-07-12T20:56:26.036Z" }, - { url = "https://files.pythonhosted.org/packages/2e/a6/2c8553191da0c2da2c43ff294fb9bab57a5b0fae03560304a82a8b5addc3/coverage-7.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:09b3b088aa24489c4082bcc35fcc8224281ab94a653dfb6d3f0c8165b0d628ab", size = 252016, upload-time = "2026-07-12T20:56:27.374Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/20f47986d8360fa1a31d9858dd2ba0be009d44ecfa8d02120b1eb93c028b/coverage-7.15.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7911b02f57053adf8164ae63edb1c26574d24dfccabadc5268cf69310a69a358", size = 255783, upload-time = "2026-07-12T20:56:28.921Z" }, - { url = "https://files.pythonhosted.org/packages/17/36/fb61983b5259f78fa5e62ee74e91fe4de4c556fcbc9a3b9c9021c2f8b57b/coverage-7.15.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:664e279ed40599b8ed16f4db18d92a7e212c73129672bec8f5d96d4da48d2404", size = 251735, upload-time = "2026-07-12T20:56:30.465Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2e/d109d8d2d6c726ba2e78125297073918a2a91464f0ea777e5398fa3cf75c/coverage-7.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34fe7cf79d5f1f87f2e8ce7dc1c32950841f50e10d0120f263856acfad66de34", size = 252645, upload-time = "2026-07-12T20:56:32.076Z" }, - { url = "https://files.pythonhosted.org/packages/bc/a0/5b3219cbb46135e14673427f2bf5890c4da4e6f655243692f3448aa3f42c/coverage-7.15.1-cp311-cp311-win32.whl", hash = "sha256:5e2d2536d2f57a354aa382ed303ac0e2e5c9522a508c05b998d26181b94163a7", size = 223414, upload-time = "2026-07-12T20:56:33.432Z" }, - { url = "https://files.pythonhosted.org/packages/5b/80/24e13ade0b6df8090e2492f9c55044bf1423f7ef28c76fc1af8c827a61cb/coverage-7.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:c337da8fca7ea93ab43f3868cfcde6cf6dad32c3906b273cfbad5d7390bc423b", size = 223888, upload-time = "2026-07-12T20:56:34.784Z" }, - { url = "https://files.pythonhosted.org/packages/2d/9e/34659930ae380491af48e2f5f5f9a2e99cd9fb7de3d30f27be5ac5425137/coverage-7.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:db3403fdb7a94d5eb73e099befad8104d2a7d110a0f0d99df0de61c5d1fa756c", size = 223435, upload-time = "2026-07-12T20:56:36.302Z" }, - { url = "https://files.pythonhosted.org/packages/d9/76/32c1826309beaf4604c54accef108fdd611e5e5e93f2f5192f050cd5f6bd/coverage-7.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d9476292594309db922cc841dd13b303b3c388f4c25d279884f7e2341c681f80", size = 221497, upload-time = "2026-07-12T20:56:37.628Z" }, - { url = "https://files.pythonhosted.org/packages/db/5c/b88ce0d68fa550c7f3b58617fbf363bce64df5bf8295a01b627e4696e022/coverage-7.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c579056b0de461b3a62318b63d0b6ce90aed7f8158d3f00da094df82f29d189", size = 221854, upload-time = "2026-07-12T20:56:39.033Z" }, - { url = "https://files.pythonhosted.org/packages/0e/fe/8509fd2a66fc4e0a829f76a0f0b1dc3cc163368352435b5f243168658077/coverage-7.15.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:23214bdbe226f2b0e9c66a7d6a1d59d4a88045dcf86e702cf0fe0d0935e3d615", size = 253359, upload-time = "2026-07-12T20:56:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/e5/81/c7009ed7ea9765adb2b9d095054d748266fae5f07ac6c5f925f33715fcde/coverage-7.15.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df164be93b46b4825cc39339440a05edc54c4d1d865ba4a60fd43d151a2a1cd3", size = 256096, upload-time = "2026-07-12T20:56:42.115Z" }, - { url = "https://files.pythonhosted.org/packages/21/52/dc8ee03968a5ba86e2da5aa48ddc9e3747bd65d63825fdce2d96acb9c5ff/coverage-7.15.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a524fca1a6f08927d9dc2d4c873cfb7bd7202c247f08b14bdc02424071b8b304", size = 257211, upload-time = "2026-07-12T20:56:43.513Z" }, - { url = "https://files.pythonhosted.org/packages/b8/27/95d7623908da8937deb53d48efcdbf423907a47540e63c62fa21372c652b/coverage-7.15.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d70f3542cd38de85a9e257dcb1ac4c1ab4b6d7d2c2a645809207556628755d1c", size = 259473, upload-time = "2026-07-12T20:56:44.974Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3b/730d761928de97d585465680b568ae69622fb40716babadeabffe75cb51b/coverage-7.15.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d78aa537237212c4313aabe5e964b66acc86350ed19ebc56a3e202df33b6077b", size = 253759, upload-time = "2026-07-12T20:56:46.615Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fc/6b9277acff1f9484b6c12857af5774689d1a6a95e13265f7405329d2f5da/coverage-7.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a318112bb4f79d9d04766196d5a3388caa825908a6a9b052aa87de3d9aea7c61", size = 255131, upload-time = "2026-07-12T20:56:48.073Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f2/c704f86129594ba34e25a64695d2068c71d51c2b98907184d716c94f4aec/coverage-7.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e55d24cada901963eed5bc89fa562aa033f0d84b9d3de4ecf363737c13aed11e", size = 253275, upload-time = "2026-07-12T20:56:49.538Z" }, - { url = "https://files.pythonhosted.org/packages/f6/29/80fee8af47de4a6dce71ccf2938491f444687a756af258a56d8469b8f1b0/coverage-7.15.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3c78f0cea7275342cf2adc2ad5fdd0aafa106ad91e66d573568f2fcf62c41df5", size = 257345, upload-time = "2026-07-12T20:56:51.038Z" }, - { url = "https://files.pythonhosted.org/packages/20/21/a1e7d7ed1b48a8adf8fd5154d9e83fcc5ad8e6ff20ae00e44865057dce8d/coverage-7.15.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:86bd37eabe39977216f630a7fc1b698e7f5e81a191c7186013245c6c3d313f9d", size = 252844, upload-time = "2026-07-12T20:56:52.535Z" }, - { url = "https://files.pythonhosted.org/packages/a7/8c/a4bc26e6ee207d412f3678f04d74be1550e83140563ca0e4997510579712/coverage-7.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6db15c217693bdc3ca0b84de1ba9afafe1c14c26a8a29d77f4ed0de2b6132e2", size = 254716, upload-time = "2026-07-12T20:56:53.968Z" }, - { url = "https://files.pythonhosted.org/packages/11/9d/8ad0266ecfada6353cf6627a1a02294cf55a907521b6ee0bd7b770cfd659/coverage-7.15.1-cp312-cp312-win32.whl", hash = "sha256:359f3fbe09a51500c51966596ee4ee4070b356552c70b3b2420eb200d68e0f76", size = 223554, upload-time = "2026-07-12T20:56:55.583Z" }, - { url = "https://files.pythonhosted.org/packages/81/6d/24224929e06c6e05a93f738bc5f9e8e6ab658f8f1d9b823e7b85430e28b8/coverage-7.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:fa75dc099c126e941a9c0baa8ebd2cbc78bd778687534fe410baf754f6d9e374", size = 224087, upload-time = "2026-07-12T20:56:57.041Z" }, - { url = "https://files.pythonhosted.org/packages/35/23/f81441dd01de88e53c97842e706907b307d9078918c3f4998b11e9ac7250/coverage-7.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:26f89cf6d0634375f454fa71057945ad18edb0f1607a90fecf22c57dc3dc289a", size = 223472, upload-time = "2026-07-12T20:56:58.594Z" }, - { url = "https://files.pythonhosted.org/packages/ca/1e/6fa289d7993a2a39f1b283ddb58c4bfec80f7800be654b8ba8a9f6a07c63/coverage-7.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71ac4ca1658ca99160fd58cc6967110e989c34b04627f24ed6ec9f70fb24571a", size = 221519, upload-time = "2026-07-12T20:57:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e1/0db4902a0588234a70ab0218073c0b20fbc5c740aa35f91d360160a2ebc9/coverage-7.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:26a40cbf2b13bd94af53ee02a424cb3bb96a9edfac0d00834bd068512a62714b", size = 221895, upload-time = "2026-07-12T20:57:01.867Z" }, - { url = "https://files.pythonhosted.org/packages/b4/cb/3719783865092dac5e08df842730305ee9ab1973ae7ddb6fbdf27d401f30/coverage-7.15.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4c5a5eff4ad4f9f7088fd3fc7a66d98d06566ee294b3b053309fb0a3b45be1e", size = 252882, upload-time = "2026-07-12T20:57:03.459Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5e/caf3abbdbb22629626160ffc9c017eb995b7cb11c0be46b974834cef1792/coverage-7.15.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:962aa56c1c9b016d681265880eb6acc9966029d2c4c559319cc43a1abbb9b59a", size = 255479, upload-time = "2026-07-12T20:57:04.984Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f1/d60f375bfe095fef944f0f19427aefdbf9bdd5a9571c41a4bf6e2f5fdb81/coverage-7.15.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1678eb2dc57a8ce67601b029582ef6d41e9e6ca22692aaeccd4107e40f27386c", size = 256715, upload-time = "2026-07-12T20:57:06.446Z" }, - { url = "https://files.pythonhosted.org/packages/d7/17/8b0cbc90d02dc5adad4d9034c1824ec3fa567771b4c39d9c1e3f9b1431b8/coverage-7.15.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1174900a43f6f8c425fee10d7dbddc308adefcdc78aaced32357f5ab750a0e90", size = 258845, upload-time = "2026-07-12T20:57:08.092Z" }, - { url = "https://files.pythonhosted.org/packages/92/29/c5e69f5fb75c322e9a3e4ef64d02eebfc3d66efceccc8514ff80a3c13a56/coverage-7.15.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98847557a6859cadf693792ce89f440cb89692993f60dc6d3a7e35f3d340216f", size = 253098, upload-time = "2026-07-12T20:57:09.636Z" }, - { url = "https://files.pythonhosted.org/packages/64/57/21144252fdd0c01d707d48fbcea13a80b0b7c42ced3f299f885ab8978c3a/coverage-7.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8697b2edb57143546a24389efc11e1b000cd5800fc20d84f04edb601e4a7cfb8", size = 254844, upload-time = "2026-07-12T20:57:11.141Z" }, - { url = "https://files.pythonhosted.org/packages/59/2a/499a28a322b0ce6768328e6c5bb2e2ad00ac068a7c7adb2ecd8533c8c5d9/coverage-7.15.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6827ac0519be3fe91bf96b4060eb00d1d24f82649b29862cd75a3cfca248b02a", size = 252807, upload-time = "2026-07-12T20:57:12.678Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6f/928a95da5da8b60f2b00e1482c7787b3316188e6d2d227fb8e124ada43a1/coverage-7.15.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2de8ecbbc77c7e4d22572779920ed8979c69168675e96be3a548c996568c6c31", size = 256965, upload-time = "2026-07-12T20:57:14.326Z" }, - { url = "https://files.pythonhosted.org/packages/16/10/889adbc1b8c9f866ed51e18a98bcafc0259fb9d29b81f50a719407c64ea8/coverage-7.15.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b25f0f0fa5260df9d7bb55d47c8bdc23fa3382c1a18f7c9cae122e6c320b1ad", size = 252628, upload-time = "2026-07-12T20:57:15.892Z" }, - { url = "https://files.pythonhosted.org/packages/1a/30/a5e1871e5d93416511f8e359d1ccebfe0cbb050a1bbf7dd20228533ec0cf/coverage-7.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a2effcbd93ae340a58db718fe4181d967f84d352c4cefeaab4ff82ce813901a", size = 254399, upload-time = "2026-07-12T20:57:17.703Z" }, - { url = "https://files.pythonhosted.org/packages/2d/26/c36fbffd549dadbdd1a75827528fb00a4c46aa3187b007b750b1e2cebbf2/coverage-7.15.1-cp313-cp313-win32.whl", hash = "sha256:895e65c96aef0cecea250f6e35e9a32f11375514e1a0cb5210e0fda128c04e8e", size = 223564, upload-time = "2026-07-12T20:57:19.253Z" }, - { url = "https://files.pythonhosted.org/packages/16/fc/becbb9d2c4206d242b9b1e1e8e24a42f7926c0200dd3c788b9fab4bb96d5/coverage-7.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6d0a28b63a0d75f9ed5118105d1154fc3aa40a8605a30d5d87e3d043ad90fe7", size = 224106, upload-time = "2026-07-12T20:57:21.108Z" }, - { url = "https://files.pythonhosted.org/packages/d3/30/1cfc641461369b6858799fca61c0a8b5edc490c519bf7c636ffa6bbf556f/coverage-7.15.1-cp313-cp313-win_arm64.whl", hash = "sha256:b4ee9818e8bae3544379ad2c09b851c4fb886aaa8860d57a1c1316ddcb16db49", size = 223497, upload-time = "2026-07-12T20:57:22.734Z" }, - { url = "https://files.pythonhosted.org/packages/f0/46/81961952e7aebfb38ad0ae4264e8954cc607a7af9e7ac111f9fa986595cc/coverage-7.15.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a886af95f59edf67d5770fd3564d53f4a8af93f25f8c1d60d27e00d7f5674ee8", size = 221560, upload-time = "2026-07-12T20:57:24.282Z" }, - { url = "https://files.pythonhosted.org/packages/13/d2/ee14d715889f216baf47301d9f469e08fff6995552aaf67e897b282865f6/coverage-7.15.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:985657ebd707941de90d488d1cbb5efac20bdf81f7b91eba771624ccda4d36f4", size = 221894, upload-time = "2026-07-12T20:57:25.87Z" }, - { url = "https://files.pythonhosted.org/packages/f3/38/f830bc6e6c2c5f23f43847125e6c650d378872f7eeba8d49f1d42193e8a9/coverage-7.15.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5bbe2a06e0a5e1404d9ffbdb49b819bbd6a3bb198ebea4c8dfe7ad9f1e1c2e81", size = 252938, upload-time = "2026-07-12T20:57:27.506Z" }, - { url = "https://files.pythonhosted.org/packages/e1/53/0d3dd963631259d794c898735d5436e68d6a8d40749c419a07ff7c171469/coverage-7.15.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bde0fe24083d0b7b3dbafa7a09f0796410af1afa2523f28f5f208d8340a4aaca", size = 255445, upload-time = "2026-07-12T20:57:29.234Z" }, - { url = "https://files.pythonhosted.org/packages/b1/fd/aabed228557565c958259251b89bab8c5669b31291fa63b3e2154ebb017a/coverage-7.15.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f89f7453d6d46db14cf233e2cd8edcd78de2b9c49d4f1dc109590b4e5dbfbb74", size = 256790, upload-time = "2026-07-12T20:57:30.826Z" }, - { url = "https://files.pythonhosted.org/packages/bc/aa/1cc888e5d3623e603c4e5399653cb25728bb2b40d7519188a3e293d24620/coverage-7.15.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc3656c9ecc27b36bd0907455b77f83c0069ca9ad4a66dec892b76c696eb6047", size = 259104, upload-time = "2026-07-12T20:57:32.63Z" }, - { url = "https://files.pythonhosted.org/packages/5f/61/fc16d5f5e53098dae41efa21e8ccc611a9b4fe922750dd03dc56db552182/coverage-7.15.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:24d8e85a2a45e44883b488c2659f51fa761dad5353fdb319b672a93facbd2ca9", size = 252956, upload-time = "2026-07-12T20:57:34.316Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f3/52384668c3de4519ca770bf1975a89e4d6eb5aa2faf0da0577a14008cba4/coverage-7.15.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68931b5fe746ed4fdaa8892989cab9e6c35781eeb3b0ab2ded893d561e1b3652", size = 254797, upload-time = "2026-07-12T20:57:35.947Z" }, - { url = "https://files.pythonhosted.org/packages/ce/68/54b807e7c1868178e902fd8360b5d4e559394462f97285c50edf1c4608db/coverage-7.15.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1ce6947e2a95534ecaa5a15e73c21e550514c980d80eda204d064d789a95f6a4", size = 252762, upload-time = "2026-07-12T20:57:37.856Z" }, - { url = "https://files.pythonhosted.org/packages/7b/48/dde8adf0338e3ace738757dccf1ce817e5fdcadfae77e1b48a77e5a3b265/coverage-7.15.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:841befdbc89b9c82435fc25b0f4f41858b6238693e45af758bec4cfc1968171c", size = 257037, upload-time = "2026-07-12T20:57:39.488Z" }, - { url = "https://files.pythonhosted.org/packages/07/f2/179dd88cf60a0aeeee16a970ffe250dccea8b80ed4beab4c5d3f6c41ad4b/coverage-7.15.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5d3de58b837375e7f4c0e1a088ccab5f655efb2fd7427b729df02c862a559633", size = 252577, upload-time = "2026-07-12T20:57:41.363Z" }, - { url = "https://files.pythonhosted.org/packages/2c/37/8a593d69ab521beb6a105a2017cac4ba94425ee0a8349e29c3c0b522d24f/coverage-7.15.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b1801963f9f44ae0c0f6d737bc7aeb2bbcde7d1fe7e3b43cddc1961af42d3b41", size = 254235, upload-time = "2026-07-12T20:57:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6d/34/bc9b3bced66f2cdad4bf5e57ae51c54ea226e8aaaebfc9370a9a11877bf3/coverage-7.15.1-cp314-cp314-win32.whl", hash = "sha256:8c7953c4128ef53b6ffb5f90d87c87d4ce26731df294760bb2314eb0e069e44b", size = 223771, upload-time = "2026-07-12T20:57:44.662Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f3/4d20337bed61915d14349e62b88d5e4144d5a9872b64adbe90e9906db6db/coverage-7.15.1-cp314-cp314-win_amd64.whl", hash = "sha256:6f0bab60a582d415f0fb535ccff13ba334a47a1538f98913330a525d23bd535a", size = 224257, upload-time = "2026-07-12T20:57:46.412Z" }, - { url = "https://files.pythonhosted.org/packages/7b/df/bbfeae4948f3ded516f92b32f2d57952427fc5ecfc0924487bb6ee6a5f38/coverage-7.15.1-cp314-cp314-win_arm64.whl", hash = "sha256:0f410ee8f0ac4ec7db71bc0b7632a8b9994e1cad2755bd1566c17e6a162caa74", size = 223683, upload-time = "2026-07-12T20:57:48.106Z" }, - { url = "https://files.pythonhosted.org/packages/35/65/0b431856064e387d1f5cf474625e4a0465e907024d42f35de6af19ced0be/coverage-7.15.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:fc868bab88e049d41fcd41766810d790a8b960053be2a45e060f5ce0d31d258b", size = 222298, upload-time = "2026-07-12T20:57:49.882Z" }, - { url = "https://files.pythonhosted.org/packages/a6/96/50eac9bd49df8a3df5f3d38746d1bf332299dffb554486c94ebd55c9dc49/coverage-7.15.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:206d4ec6028f2773b40932d09f074539d6bcdd8f6b318d40cb04bdbd68ed0b49", size = 222561, upload-time = "2026-07-12T20:57:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/e0/5b/6ba1c4a27e10b8816fd2622b98162c83d3bdf1185097360373611bf96364/coverage-7.15.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:620482ef1c9f4e61f962e159325fe77dea59d16e39d9c9470d069053b244d864", size = 263923, upload-time = "2026-07-12T20:57:53.392Z" }, - { url = "https://files.pythonhosted.org/packages/e4/59/fe03ade97a3ca2d890e98c572cf48a99fda9adba85757c34b823f41efe1e/coverage-7.15.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d385fc9b054e309ad3cecdc77b586d2af0c98aeec2fdb3773544586f366e817c", size = 266043, upload-time = "2026-07-12T20:57:55.095Z" }, - { url = "https://files.pythonhosted.org/packages/16/e0/55c4b1217a572a43e13b39e1eb78d0da29fb23679003bd0cdf22c50b1978/coverage-7.15.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1198bca9c0dd7c188aae1f185b0c0b5fc4f0a2b6909000858c29550320bdb07", size = 268465, upload-time = "2026-07-12T20:57:57.017Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e2/ee47944f76afc03909119b036fe9e0da8cbd274a5141287de79791a0fb6d/coverage-7.15.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d0297e6a070eadb49df7cddd0ab6f420b8b689dd8904c7dd815a323168fa57e", size = 269584, upload-time = "2026-07-12T20:57:58.958Z" }, - { url = "https://files.pythonhosted.org/packages/cb/8a/6b4d9779c7b2e21c3d12c3425e3261aa7411399319e27aa402dfec4db5d0/coverage-7.15.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:916fcf2214f56960e409561b37fc32a160a42b6e85483d0652d7b70fa55d707e", size = 263019, upload-time = "2026-07-12T20:58:00.979Z" }, - { url = "https://files.pythonhosted.org/packages/c4/1e/db5c7fa0c8ba5ece390a1e1a3f30db71d440240a80589df28e66a7503c40/coverage-7.15.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f837bae572c7869ffaa502e604c87e182543012831cf87aae4586ad090ac6dcf", size = 265916, upload-time = "2026-07-12T20:58:03.005Z" }, - { url = "https://files.pythonhosted.org/packages/83/53/fe5176682b00709b13fab36addd26883139d0dea430816fea412e69255e2/coverage-7.15.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3ea65e3ee6c7c32349fd00559927a9e577bdd72386087eeed1c42b62dfce9b82", size = 263520, upload-time = "2026-07-12T20:58:04.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e7/16f15127be93fbc70c667df5ec5dce934fc76c9b0888d84969a5d5341e2c/coverage-7.15.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:345034976f46a1c54bd17f4e43eb30bb92cb7082fcddff03250cff136cc4eb82", size = 267254, upload-time = "2026-07-12T20:58:06.824Z" }, - { url = "https://files.pythonhosted.org/packages/cd/73/e5119111f6f065376395a525f7ce6e9174d83f3db6d217ea0211a61cca4d/coverage-7.15.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4f051a64eb8f8addb4661c2b41d6eea5b7ebc68ad4b2baea8d9bc54e1956e5f7", size = 262366, upload-time = "2026-07-12T20:58:08.555Z" }, - { url = "https://files.pythonhosted.org/packages/d7/9c/6d0a81182df18a73b081e7a8630f0e2a52b12dfd7898c6ab839551a454d2/coverage-7.15.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a7625770f7720b49bb30d194ad2f8d50fab3c5177874af3d2399676f95f9c594", size = 264680, upload-time = "2026-07-12T20:58:10.359Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a2/bac0cbd4450638f1be2041a464b1766c8cc94abf705a2df6f1c8d4be870d/coverage-7.15.1-cp314-cp314t-win32.whl", hash = "sha256:81e503d130a472ad1bd38199ecd35116b40d92bcd31e27a2cacde035381f2070", size = 224077, upload-time = "2026-07-12T20:58:12.065Z" }, - { url = "https://files.pythonhosted.org/packages/f0/b2/d83c5403155172a43ba47c08641bad3f89822d8405102423a41339d2c857/coverage-7.15.1-cp314-cp314t-win_amd64.whl", hash = "sha256:724e878b213b302ad46e9f2fc872d386613f20ebfc492a211482d917ea76c14f", size = 224908, upload-time = "2026-07-12T20:58:13.956Z" }, - { url = "https://files.pythonhosted.org/packages/cc/41/442b74cad832cc77712080585455482e7cc4f4a9a13192f65731dcd18231/coverage-7.15.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ce2f05c14d077f406fefc4fa5e4f093ad0e0787549f6582535d6e28766f0361b", size = 224219, upload-time = "2026-07-12T20:58:16.315Z" }, - { url = "https://files.pythonhosted.org/packages/34/98/07a67cf1a26e795d617ed5c540c042b0ac87b72f810c30c07f076cf334f3/coverage-7.15.1-py3-none-any.whl", hash = "sha256:717d01e6e00bed56ad13306f19e0dd2f4f645ee8159d2c72c72301d6cfc7090c", size = 213284, upload-time = "2026-07-12T20:58:18.079Z" }, +version = "7.15.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741, upload-time = "2026-07-15T18:56:19.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/060ce69008ac97bbc01b1411b3e55b61f6f015659400b46749b662107831/coverage-7.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b5bd92ff1ec22e535eab0de75fa6db021992791f461a2aceb7822c625a1187d", size = 221284, upload-time = "2026-07-15T18:53:29.52Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a3/d936e8b53edd9684100a6aefaf3fcabaa54728fe33324436c8d279c047aa/coverage-7.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44826758cfe73fcd0e6af5deb4ba6d5417cc1d13df3acb35c93484a11160f846", size = 221799, upload-time = "2026-07-15T18:53:31.708Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a3/ca234b06aec7ee28226f11d39a696b4481fe5eddfce8e03bf39979bb8ffb/coverage-7.15.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09f5c6ec5901f667bd97dd140b5b9a2586b10efec66f46fb1e6d8135f8b95bdf", size = 248544, upload-time = "2026-07-15T18:53:33.212Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/dda79527bb7573ba91828b2fb91b3105d87378d6a2749ca0c0924ce0addd/coverage-7.15.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1d16e3a7104ea84f03e614611b3edbf6fb6892554b3ab0fe7fbb3f2b2ef04376", size = 250374, upload-time = "2026-07-15T18:53:34.683Z" }, + { url = "https://files.pythonhosted.org/packages/67/c6/c33755a34572f81f49a8c0cdf6b622f35ccb3238b136e1909daf0cdd4319/coverage-7.15.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d46e62cb35d91e6e2589fda6d28074426b0e276422b5d2ebef2c6b11dc60dbfd", size = 252239, upload-time = "2026-07-15T18:53:36.205Z" }, + { url = "https://files.pythonhosted.org/packages/b9/6f/dc341741b375be53a5baeee5b4bf0f0e525d38caed428f7932d23bb7bcb1/coverage-7.15.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dfd3db045e95960ae3683059571e597fda7cc610106a8916f77c5839048c1deb", size = 254150, upload-time = "2026-07-15T18:53:37.863Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8d/966a18a5b195cb4e77b14c53f5f3dce22b5da05e6de7fafd1e08f2d2067a/coverage-7.15.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:affd532502d34c0472d0cdb181325c89f1d2c44992fef0c17e88e7b1576259a1", size = 249234, upload-time = "2026-07-15T18:53:39.394Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/8b2e367496ab48484d48e79984fec76cdc1b7cb5d3a00ee799a5602e3ec9/coverage-7.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d17d7512151fedfcc64c1821a8977fc9be0dbf495754669afcab7b57abc98ae9", size = 250276, upload-time = "2026-07-15T18:53:41.027Z" }, + { url = "https://files.pythonhosted.org/packages/63/92/1199318a200eb6c8c6ce0192c892c8710ac791abbe0f35099294620bbfda/coverage-7.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e26ff680768b8095e8874aabe0e9d3a47a2a9f176a8340d05f8604c56457c23a", size = 248283, upload-time = "2026-07-15T18:53:42.557Z" }, + { url = "https://files.pythonhosted.org/packages/56/da/be284a55c5619bda891a89c27dfd59324a2c6a14d755cf6aac6960ceebeb/coverage-7.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e8f27131dc7cd53de2c137dd207b3720919320b3c20d499dc30aa9ee6173287", size = 252093, upload-time = "2026-07-15T18:53:44.271Z" }, + { url = "https://files.pythonhosted.org/packages/d4/53/ee112da833ddd77b73c6d781a98029b45b584b136615b4900ed0569f887e/coverage-7.15.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:728a33676d4c3f0db977990a4bd421dcaa3be3e53b5b6273036fff6666008e89", size = 248552, upload-time = "2026-07-15T18:53:45.7Z" }, + { url = "https://files.pythonhosted.org/packages/82/6a/802cfc802e9113494c80bf3f284cd4d72faeb1f24e244f61046af364f2ca/coverage-7.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29c052f7c83ccfcc5c577eaae025d2e4a9bb80daf03c0ac31c996e83b000ce88", size = 249154, upload-time = "2026-07-15T18:53:47.256Z" }, + { url = "https://files.pythonhosted.org/packages/2c/65/529808e91d651147edae408fd9e894abc3b8cad7f3e594bbc36719a3e13a/coverage-7.15.2-cp310-cp310-win32.whl", hash = "sha256:1268ac8fb9ddcd783d3948dbabaf80a5d53bfdaa0575e873e2139a692f797443", size = 223334, upload-time = "2026-07-15T18:53:48.768Z" }, + { url = "https://files.pythonhosted.org/packages/68/0f/0e1829d7001130876dfbc0b4e1c737ea7c155b809e3e4a98a0aa268e2369/coverage-7.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:9f4432898c4bf2fba0435bbe35dd4437d7264565e5a88a21f5b49d8662a6b629", size = 223959, upload-time = "2026-07-15T18:53:50.429Z" }, + { url = "https://files.pythonhosted.org/packages/7d/3a/54536704f507d4573bf9161c4d0dd3dd59b6d85e48c664e901b6844d8e33/coverage-7.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f1ec6f304b156669cfde653b4e9a953f5de87e247ea02ac599bce0ab2744036", size = 221414, upload-time = "2026-07-15T18:53:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d9/8ba925d29743e3577b21e4d8c11a702b76bc93c41e7fdfd1177af63d4b8d/coverage-7.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d3361879d736f469f45723c11ea1a5bbdaf1f6928f0e632c940378b5aa9b660", size = 221913, upload-time = "2026-07-15T18:53:53.682Z" }, + { url = "https://files.pythonhosted.org/packages/09/54/a855f3aa0187f2b431ade4e4791b77b56282cfb5d201c83ec26a31b5b36a/coverage-7.15.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c6a98d698f9e2c8008d0370ec7fc452ebfcc530002ae2d0061170d768b992589", size = 252332, upload-time = "2026-07-15T18:53:55.467Z" }, + { url = "https://files.pythonhosted.org/packages/8e/d3/13ac97b4370640ba3452fc8559b06cc2f479ce3ba4a0b632a73e44c38a7d/coverage-7.15.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d50dd325e18ec25bfcc10cd7f99b04df1ab9ec76b0918c260e60817ad0643dee", size = 254243, upload-time = "2026-07-15T18:53:57.055Z" }, + { url = "https://files.pythonhosted.org/packages/88/83/5eca144942d8d0659d3f55176517f4a59cdc65eefd17146a0770935a3ebd/coverage-7.15.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67d7602480a47bdf5b675635403625553ebaa70d5a62a657c035149fd401cea0", size = 256352, upload-time = "2026-07-15T18:53:58.83Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ba/d3db2e01a50fc88cdb4c0f19542bcf6f61489e34dc9aa3538413e2459a38/coverage-7.15.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cee0f89f4767a6057c8fbf168f8135f18be651300496086bd873e3189fed0487", size = 258313, upload-time = "2026-07-15T18:54:00.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/b3/aba83416e9177df28e5186d856c19158c59fc0e7e814aaa61a4a2354ad1b/coverage-7.15.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a29ec5305a7335aacee2d799e3422e91e1c8a12474986e2b3b07e315c91be82f", size = 252449, upload-time = "2026-07-15T18:54:02.456Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a5/4b00ecac0194431ab451b0f6710f8e2517d04cef60f821b14dec4637d575/coverage-7.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:48ccc6395958eda89093ecdc35644c86f23a8b23a7f4d44958812b721aad67c1", size = 254043, upload-time = "2026-07-15T18:54:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/75/b6/cfa209b4313ee7f1b34da47efcd789ea51c024ad35af390e00f5a3c10a2e/coverage-7.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:81f382c5a94b434ec1f6da607edb904c76d7212e618cd4d1bc9f97bed4120ef5", size = 252107, upload-time = "2026-07-15T18:54:06.745Z" }, + { url = "https://files.pythonhosted.org/packages/36/67/e8cac5a6954038c98d7fe7eb9802afe7ab3ecb637bb7cc00e69b4148b56d/coverage-7.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bbc808daf4f5cd567af8075ecc72d21c6dfef9a254709a621a84c217c935ebc0", size = 255873, upload-time = "2026-07-15T18:54:08.48Z" }, + { url = "https://files.pythonhosted.org/packages/2c/92/395cca9f330a86c3fe3471d73e2c102116c4c58fdc619dbbc125c6e93a54/coverage-7.15.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a4c46b247b5d4b78f613bd89fea926d32b25c6cc61a50bd1e99ba310348f3dad", size = 251826, upload-time = "2026-07-15T18:54:10.083Z" }, + { url = "https://files.pythonhosted.org/packages/51/60/3e91b20295439652424f426b7086ec5bf4fbe3f604c73eda22b986c4fd6b/coverage-7.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:094dd37f3ef7b2da8b068b583d1f4c40f91c65197e16c52a71962d5d537fc5db", size = 252735, upload-time = "2026-07-15T18:54:11.878Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/8c07839005e5e3c6b3877d3a6e2a80ce766589f31dd2b6882b78d59a7b8c/coverage-7.15.2-cp311-cp311-win32.whl", hash = "sha256:a63b9e190711134d581c4d703df5df09851b1acf99792c7aacbbe9f41f0283c9", size = 223500, upload-time = "2026-07-15T18:54:13.525Z" }, + { url = "https://files.pythonhosted.org/packages/2e/98/59d83c257cd59f0fbaf9d9ddb26b744a576760dfd1ae16e516408894a02b/coverage-7.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:8bb9f4b4279187560796a4cdaca3b0a93dd97e48ee667df005f4ed9a97403688", size = 223973, upload-time = "2026-07-15T18:54:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/ea/09/2d285c8bef5c4f695d120c1c96dc11715638aa8e134069f210bb6a62a9fe/coverage-7.15.2-cp311-cp311-win_arm64.whl", hash = "sha256:8c726b232659cbd2ae57ade46509eb068c9bd7a06df9fcbff6fe484870006934", size = 223519, upload-time = "2026-07-15T18:54:16.803Z" }, + { url = "https://files.pythonhosted.org/packages/6a/50/eb5bf42e531611a9f8d272556b1ed4de503f84a91413584094487cf69f8f/coverage-7.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1adac78e5abc7c5438f7a209c9ca69d06542f0bf481d728b6989ea80b813fdf9", size = 221587, upload-time = "2026-07-15T18:54:18.439Z" }, + { url = "https://files.pythonhosted.org/packages/06/d1/da99af464c335d4e023a6efcd7ec30f63b88a43c93745154ab74ffb31cea/coverage-7.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b868acc62aa5de3be7a9d05c2333bf8359ca987e43f9cb30ff8fbda6a024ab73", size = 221943, upload-time = "2026-07-15T18:54:20.062Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8a/13c42723d61ca447eafa18732e8141dd6a63f2732e1c7e1502c182dd88d7/coverage-7.15.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6f6966fc30e6f06ca8f98fb0ce51eda6b111b3ee8d066a8b1ec9e77fa06ab55d", size = 253450, upload-time = "2026-07-15T18:54:21.765Z" }, + { url = "https://files.pythonhosted.org/packages/d7/29/99021303f98fbdcb63504b4d07bea4cc025b9b2dd907c4f07c85d50a0dab/coverage-7.15.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:68af907f595ab01a78f794932ff3bdf929c316d3000810d38dbc247129e26f8b", size = 256187, upload-time = "2026-07-15T18:54:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a8/fd503715ed6ca9c5d742923aa5209257340b367a867b2ced0c7d4ba8a0b9/coverage-7.15.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afa29e2eff3d5729267e2cb2fd4ce9d61c952932fb2694e34ccb5d9540c6a296", size = 257301, upload-time = "2026-07-15T18:54:25.183Z" }, + { url = "https://files.pythonhosted.org/packages/da/40/3f4b8fb409810036ebc2857d36adc0498c6e957b5df0290c5036b2e143f1/coverage-7.15.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbf44513ceb1589e31948e20eafbde9deaface90e1a1afa5f5f77b4423d17ce6", size = 259562, upload-time = "2026-07-15T18:54:27.204Z" }, + { url = "https://files.pythonhosted.org/packages/0b/8a/9bdffbef47db77cce3d6b02a28f7e919b19f0106c4b080c2c2246040f885/coverage-7.15.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9deddf09eecb717b7f980414b43d90a5b22ff3967d2949ab29cb0aa83d9e9098", size = 253841, upload-time = "2026-07-15T18:54:29.134Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1e/9031efde019d31a06646261fce6dfc5c3c74e951e27a71e5c9a424563178/coverage-7.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae901f7e55ba405c84ee1cab3d3e962e4e871e4a2bcb9c90911adbd69b42ac5a", size = 255221, upload-time = "2026-07-15T18:54:31.142Z" }, + { url = "https://files.pythonhosted.org/packages/56/db/787acde872389fc84a9ef9d8cd1ccc658e391ab4cb5b28092a714426a394/coverage-7.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a0f47002c6eeb7c280228467a4cb0cc15ca2103a8421b986b2d3ec04a0f9bd8b", size = 253366, upload-time = "2026-07-15T18:54:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/2f/9b/6f57bc4b93c842eef1695f8cdaf2318e35e7ba54f5ba80d84be213ab7858/coverage-7.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd7a5beb7af3e864a13b1f0fb26efd3695da43ef0daf71e586adfffaf34d5b2", size = 257434, upload-time = "2026-07-15T18:54:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/b3186a21b2acc83e451118978905c81c7072c3333707804db09a78c096a2/coverage-7.15.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97a5c5457a9fb1d6c4e06cfb5dc835871fbfb6a6a51addc9e925bdeff5ef7440", size = 252935, upload-time = "2026-07-15T18:54:36.548Z" }, + { url = "https://files.pythonhosted.org/packages/20/c2/c9f3376b2e717ea69ed7a6e9a5fcab968fb0b290db6cf4bd9a1fc7541b75/coverage-7.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0901cfe6c13bcd2302da4f83e884555d2a22bda6e4c476f09ef204ba20ca536e", size = 254807, upload-time = "2026-07-15T18:54:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e1/dfc15401f4a8aaeb486e1ba3e9e3c40522a6e38bd0ecf0b3f29cb8082957/coverage-7.15.2-cp312-cp312-win32.whl", hash = "sha256:b171bdd71cb7ff792bf32e376173b0ace7e7963e7e57c58dfc42063a6a7174cd", size = 223641, upload-time = "2026-07-15T18:54:40.103Z" }, + { url = "https://files.pythonhosted.org/packages/91/40/81b6d809d320cd366ec5bdf8176575e897dcb8efe7fb4b489ef9e93e4d13/coverage-7.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:582edc45c2040543fef83341be23c43024a3ab3ae0c2d8bc498a06282905ad40", size = 224172, upload-time = "2026-07-15T18:54:41.882Z" }, + { url = "https://files.pythonhosted.org/packages/ef/28/9f14ec438149f7de557f45518f09b4a7917b795cc37083aa7db482693f8c/coverage-7.15.2-cp312-cp312-win_arm64.whl", hash = "sha256:a638db90c61cd219aeee65e83a24fdaa57269a741ae0cf773309208ac862cee3", size = 223556, upload-time = "2026-07-15T18:54:43.674Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606, upload-time = "2026-07-15T18:54:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982, upload-time = "2026-07-15T18:54:47.341Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972, upload-time = "2026-07-15T18:54:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569, upload-time = "2026-07-15T18:54:51.098Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806, upload-time = "2026-07-15T18:54:53.145Z" }, + { url = "https://files.pythonhosted.org/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936, upload-time = "2026-07-15T18:54:55.015Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178, upload-time = "2026-07-15T18:54:57.527Z" }, + { url = "https://files.pythonhosted.org/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934, upload-time = "2026-07-15T18:54:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898, upload-time = "2026-07-15T18:55:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056, upload-time = "2026-07-15T18:55:03.243Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718, upload-time = "2026-07-15T18:55:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490, upload-time = "2026-07-15T18:55:06.889Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647, upload-time = "2026-07-15T18:55:08.941Z" }, + { url = "https://files.pythonhosted.org/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190, upload-time = "2026-07-15T18:55:10.789Z" }, + { url = "https://files.pythonhosted.org/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583, upload-time = "2026-07-15T18:55:12.678Z" }, + { url = "https://files.pythonhosted.org/packages/81/5f/aed265fd7a3551a394f36dfe41868aee709b7f95db4052205b4ad1563ac3/coverage-7.15.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:40f633c5c5fc783732f6312280122e859538fa24461235597c13d803ea9a108a", size = 221650, upload-time = "2026-07-15T18:55:14.527Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2c/222ba12a545189017120f8eddfc1a0bd4616b47d5d4a8d99421edb2fe4c6/coverage-7.15.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:075560438765b7a2ef43bf7aa7758661b53d889df47f062a31bda6c1ade553a2", size = 221988, upload-time = "2026-07-15T18:55:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/aa/38/304b5877ab46e6c290b4292cfcf3fe28245f0e5597cad7f6acc91fc7e0a4/coverage-7.15.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:25fd15dd40a0a2c51a500d664ca29053c09c3259d998407bf982b6e114696138", size = 253029, upload-time = "2026-07-15T18:55:18.856Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/821b533b8db9e44cf1d8a97bd525149ced40dde1d0093da02cb78e715244/coverage-7.15.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9a6367e4aff723e8ee8190836836124284e8fcd4265e307c844010cfa074f3f", size = 255536, upload-time = "2026-07-15T18:55:21.027Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f2/7aa06604c389d32ea7f0a6a988359a7eafc3cd3f8e7bc2e88cd2fdf0b877/coverage-7.15.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9854ca62c152874b2060772503535be2e8f53f70b8aaa7686b094888d872f984", size = 256881, upload-time = "2026-07-15T18:55:23.125Z" }, + { url = "https://files.pythonhosted.org/packages/a2/4f/1ef342339c7916d0096bc5888cc0f653882cc7bc8f897d5cb89143287c9b/coverage-7.15.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:913b6c56e110da40e035bbd168353bf7aaa2544a5eaccea5d98a4629aac156c7", size = 259196, upload-time = "2026-07-15T18:55:25.099Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f4/7ed055d7a9c5ec13b161773a115a5ccc6b0081d568c31fad830806306cc7/coverage-7.15.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aaccad4129d735a8a4d526f26929894c9a4e8ef7034566f210b176749d6906e3", size = 253036, upload-time = "2026-07-15T18:55:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/14/79/ea82cca18c242a3a38b6c017da39726aa62dcb64aa635abf79b92009975c/coverage-7.15.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a164b50081fc7357331c4024ef4d17b78ba325f8380d05f5a69599a7e05257ee", size = 254887, upload-time = "2026-07-15T18:55:29.084Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ba/a136db3c0d9562b00e10b72540dbf3a33cd3bc5b95060c9308e247494623/coverage-7.15.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfd341ccf78128e72c094bc70cc25b3ef309c33c7c2c66ba3ed4309549e02de1", size = 252852, upload-time = "2026-07-15T18:55:31.184Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/ea334246b16b7d059953fad6fdefa11e33c68efbd3fe37b1098120a1fac2/coverage-7.15.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1473b3ba8e7ee0f076117b1a72c23f579a2b9e2bb742f48a8d86ea27ca93f91a", size = 257128, upload-time = "2026-07-15T18:55:33.163Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c3/074fb66d46d607855f710876b117cbda562c5ab08363528e78820449f937/coverage-7.15.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:17c432b5f73ad52ef46fb06019f6fa7c66ce381961cf0f7dfd1d3a4bd3a98145", size = 252668, upload-time = "2026-07-15T18:55:35.063Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c1/f620850ada9b36435921c9a3a8057013422b1d964eb4bf37fe138724d192/coverage-7.15.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:77f0ef5011df53a4bd1b35211ab122287f8d9b8d7aa1c4553e5c2deb24b1d446", size = 254325, upload-time = "2026-07-15T18:55:37.125Z" }, + { url = "https://files.pythonhosted.org/packages/cc/31/a729ca3689404493af82ef8e6ff70bd88bdda8da89aeef6ca9b387aeb2b4/coverage-7.15.2-cp314-cp314-win32.whl", hash = "sha256:f653e5d7248c1191ec988a85c72edeab46c3ff44f90639a4ed4874ec0be90243", size = 223844, upload-time = "2026-07-15T18:55:39.078Z" }, + { url = "https://files.pythonhosted.org/packages/c6/83/5d809dc808fb1698c671f3e372259bb9158e64b7ea526fc6ab7de64de9fe/coverage-7.15.2-cp314-cp314-win_amd64.whl", hash = "sha256:9911f31aad8906abe337c271343485cf20df5e70df5d2f57f9f136e7b55f26bc", size = 224331, upload-time = "2026-07-15T18:55:41.346Z" }, + { url = "https://files.pythonhosted.org/packages/16/4e/35e488548e952795829e129995c4174df33bf432b591d1aa42c8d9e4e7ad/coverage-7.15.2-cp314-cp314-win_arm64.whl", hash = "sha256:e38def96ad59853824c97953fdcd2c320a84ba3ce99b417db78af8bb6c3db635", size = 223760, upload-time = "2026-07-15T18:55:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/ed/49/dd2c86cd6374038f6e415fb5bfb86db5218553209c081384a020369dee79/coverage-7.15.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:835ec4e20b45f0a7f63ed78f94065aca00de033403df8377bfe8b9c6abc0a7be", size = 222384, upload-time = "2026-07-15T18:55:45.569Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/173ff17a1c0808e5a438f549f6f145d5ac7528f2791310b63523e3200ac7/coverage-7.15.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7466cc7ab6dc0db871d264bf99e8779f0917ee63d40730af0552f71535a6e072", size = 222647, upload-time = "2026-07-15T18:55:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/84/f8/b8cba872162356fb44ac79c10309d987206a4461e32072fc29228dad7331/coverage-7.15.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e370c12133095ff18432de8c044962be85a5a96d90c6fcbce8e17e76236d2328", size = 264013, upload-time = "2026-07-15T18:55:49.768Z" }, + { url = "https://files.pythonhosted.org/packages/ee/67/a807a7586d0b8cae485308ddd55756f0806c92f8e0b411bacbf23c48edf3/coverage-7.15.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fe41909c9515c3bfdb5f02c4d1f857dba322d9a9a1178069b91eea77889df63a", size = 266135, upload-time = "2026-07-15T18:55:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/cd78771dc985f7e4ebdcc82b1a96d9a932af9e806f01f2f91a89f4c72e80/coverage-7.15.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aa28cfb6488e5453b5b762d65f73aa586380f6693a04d58078ce228a29b06c0", size = 268555, upload-time = "2026-07-15T18:55:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/18/3e/10134cf81275188c58568f324fc74aedff32c63ca4d5bbc513a91944a6f0/coverage-7.15.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcc0aae933921d03096f53b0b03eeb702129fd406dee59f08d2efacc68681fa5", size = 269674, upload-time = "2026-07-15T18:55:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/771b77de446cba985dc414bbc5844bd21604da05dbc044286df8318a48a7/coverage-7.15.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7c63387e21ab21f512c69c9756a8c7dadd322c7275edb064064433c9a09c3743", size = 263101, upload-time = "2026-07-15T18:55:58.107Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b5/70a7011da15f4071943361183aefa27847f3e3aec4fd335f1cb3d3a622b1/coverage-7.15.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e55510bc98ae943cece9e667a6c0fe94c6a92913720dea34243657a17993d0c", size = 266007, upload-time = "2026-07-15T18:56:00.468Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0d/f9547e804ce7ad49646ffeffac26699510efbe6c0f751b66fdc960c4e825/coverage-7.15.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2ff08701be2d1556fc78b326c80a3e8042da09352ecb3819105f8e386c8a3071", size = 263611, upload-time = "2026-07-15T18:56:02.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/59/f576a396659c0efd351f5c1544f67c3560e89c7761cabf7f65e412beeda5/coverage-7.15.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:38c9518b7103826c403a461544e3c2e77151e8676d06eaed85911a97e962584a", size = 267344, upload-time = "2026-07-15T18:56:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5d/c2e4fce3579c0cb635024293f1a32bbe26df101b3e3a69f22243d1352b6c/coverage-7.15.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:dee88b1ed88587abd8c0269a1fc1f4cc77f7750d1dfde2869e2a123af420e67d", size = 262456, upload-time = "2026-07-15T18:56:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/956287d69436b66094bc4b57ac2da71e43bfd2a5524e958900b9f582fcf8/coverage-7.15.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fbeeeecea279727f8ac16c8e1133ddfeee793e985c86ae343d6a5ce744eef8c", size = 264771, upload-time = "2026-07-15T18:56:08.795Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5a/6f979530c2734c575de77cf58f5f28d51f7123a94b5030fd9156fe5f363c/coverage-7.15.2-cp314-cp314t-win32.whl", hash = "sha256:cb0fddaa6884be6aae36ced9544b5e90f7d5f03845a2853bf47a14953a4e8688", size = 224151, upload-time = "2026-07-15T18:56:10.856Z" }, + { url = "https://files.pythonhosted.org/packages/54/7e/27f6b2a74d484742f4017553e710b01e396b23d809df3e95ca0bb9a2824b/coverage-7.15.2-cp314-cp314t-win_amd64.whl", hash = "sha256:77f091ea3a9cc611cd29f433565476bc1936c084ac8eee00ea0e7e70c27e4199", size = 224981, upload-time = "2026-07-15T18:56:12.928Z" }, + { url = "https://files.pythonhosted.org/packages/b1/48/284863423aa474240f6842bd00d680da22f4e6ea2e466618ef7c9c9e69a9/coverage-7.15.2-cp314-cp314t-win_arm64.whl", hash = "sha256:6fc448c377d6eeb00a47c673494bd9bae29280ca53987e1869e67ebedfe20658", size = 224294, upload-time = "2026-07-15T18:56:15.156Z" }, + { url = "https://files.pythonhosted.org/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375, upload-time = "2026-07-15T18:56:17.305Z" }, ] [package.optional-dependencies] From 1d906960779c0b5fe4d582629497f878ed99849e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 19 Jul 2026 17:00:56 -0500 Subject: [PATCH 2998/2998] py(deps[docs]) gp-sphinx 0.0.1a34 -> 0.0.1a35 why: pick up the sidebar project-link fix in the shared docs theme. what: - Bump gp-sphinx and sibling workspace pins 0.0.1a34 -> 0.0.1a35 - Relock uv.lock --- pyproject.toml | 20 +++++----- uv.lock | 104 ++++++++++++++++++++++++------------------------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7e3aa7da54..2dee3574d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,11 +60,11 @@ dev = [ # Docs "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a34", - "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a35", + "sphinx-gp-highlighting==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a35", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.19", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html # Testing @@ -88,11 +88,11 @@ dev = [ docs = [ "aafigure", # https://launchpad.net/aafigure "pillow", # https://pillow.readthedocs.io/ - "gp-sphinx==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-argparse==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-autodoc-api-style==0.0.1a34", - "sphinx-gp-highlighting==0.0.1a34", # https://gp-sphinx.git-pull.com/ - "sphinx-gp-mermaid==0.0.1a34", # https://gp-sphinx.git-pull.com/ + "gp-sphinx==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-argparse==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-autodoc-api-style==0.0.1a35", + "sphinx-gp-highlighting==0.0.1a35", # https://gp-sphinx.git-pull.com/ + "sphinx-gp-mermaid==0.0.1a35", # https://gp-sphinx.git-pull.com/ "gp-libs>=0.0.19", # https://gp-libs.git-pull.com/ "sphinx-autobuild", # https://sphinx-extensions.readthedocs.io/en/latest/sphinx-autobuild.html ] diff --git a/uv.lock b/uv.lock index 4651abbb30..4ff83b3877 100644 --- a/uv.lock +++ b/uv.lock @@ -396,7 +396,7 @@ wheels = [ [[package]] name = "gp-furo-theme" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accessible-pygments" }, @@ -406,9 +406,9 @@ dependencies = [ { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/3d/2f84408adfd0ae79e00c021b205cea3f63e19e7bfb2a0a5adb5859f2e6a0/gp_furo_theme-0.0.1a34.tar.gz", hash = "sha256:fc6ae36a7ad7a23c0da776b6301ab29237b6ac37f4544373964cf94aceb4af75", size = 34308, upload-time = "2026-07-14T01:26:28.876Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/1e/06ca39c8eed45e401dcb56304fc400afb2614010721315febe838e4b3cb4/gp_furo_theme-0.0.1a35.tar.gz", hash = "sha256:d2fb40acebc215fd36345adbcd6d36f454b7f8047206d7f44f5068fbae688ff9", size = 34309, upload-time = "2026-07-19T21:54:01.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/83/88b831bf29ceb7282813f71b4a65d40e1bfdfd1643268f21292e2281f9c7/gp_furo_theme-0.0.1a34-py3-none-any.whl", hash = "sha256:96d4e721ca3747fce26effd5a55bcbbd4db6a056d2cd795cf4ae73828ec9d880", size = 43657, upload-time = "2026-07-14T01:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/63/db/a2ad42d667bd9a028dfcdf3c7bc97bfc761d6ae0c4299dbabd9441ae08cb/gp_furo_theme-0.0.1a35-py3-none-any.whl", hash = "sha256:08a9a87584ac3f971e398deb21468ca63a3243d71907c7c5c01d1f80d3eea257", size = 43660, upload-time = "2026-07-19T21:53:36.455Z" }, ] [[package]] @@ -427,7 +427,7 @@ wheels = [ [[package]] name = "gp-sphinx" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -449,9 +449,9 @@ dependencies = [ { name = "sphinx-inline-tabs" }, { name = "sphinxext-rediraffe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/a7/f85c7f300050f58460d13f65daca0ecb033349b57e461b6c1f643561b6d1/gp_sphinx-0.0.1a34.tar.gz", hash = "sha256:5601d9d4f19552d32e5629ce00cf034f7f1fbbbfe36ba6e00c2d2e76bdbb1433", size = 19762, upload-time = "2026-07-14T01:26:29.927Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/6a/92bc71e25c9a4dae7bac61ce526514a63dc6229012d89c92762a0d5064af/gp_sphinx-0.0.1a35.tar.gz", hash = "sha256:44cfbbd30950f574fdc50beec1c966c1eaa1ac7e71b21bdb775b960d516cc97e", size = 19761, upload-time = "2026-07-19T21:54:02.307Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/9b/1812365d4bd5b1a67aa00f18526676064ccfc6580994921f8a484b4b134f/gp_sphinx-0.0.1a34-py3-none-any.whl", hash = "sha256:4dc785ea4aa1374909ef13462a4a04bb138d6d1e57994297cf3f19bb6d02ffb5", size = 20279, upload-time = "2026-07-14T01:26:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/cd304cc360cdb6771ad63f4084257959bf6bb50b15c0f41a3549e7845f09/gp_sphinx-0.0.1a35-py3-none-any.whl", hash = "sha256:d8772bb635e4001368c1432a5a97b2042e207e381f947e8317df31caf0fac011", size = 20277, upload-time = "2026-07-19T21:53:37.966Z" }, ] [[package]] @@ -1307,7 +1307,7 @@ wheels = [ [[package]] name = "sphinx-autodoc-api-style" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1315,14 +1315,14 @@ dependencies = [ { name = "sphinx-ux-autodoc-layout" }, { name = "sphinx-ux-badges" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/75/d1888a511b0f14af5f4b1b8d8a21281674ef16daf6a07b81d18e9491fa42/sphinx_autodoc_api_style-0.0.1a34.tar.gz", hash = "sha256:672146fa2760801653d258c175f3c9e05bb7e149e80b80b01051ddc52e755ca4", size = 9455, upload-time = "2026-07-14T01:26:30.903Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/11/5b740da185145e5514ca768ed482de5ee2cbffd2f4d239a610eb6ab5e7b3/sphinx_autodoc_api_style-0.0.1a35.tar.gz", hash = "sha256:39a3a3ebbeef23e7caae58bb437da1edb30af9a68c328a35198622993dc24c5a", size = 9453, upload-time = "2026-07-19T21:54:03.704Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/03/2f11f4acec4faeac941915777dc70cc31218714aa85e1dd70b894ac0918c/sphinx_autodoc_api_style-0.0.1a34-py3-none-any.whl", hash = "sha256:03b5202a976b2bed4249459519523c590d5dca80ff5a0378d9fa8856ab9e8a8b", size = 9567, upload-time = "2026-07-14T01:26:05.332Z" }, + { url = "https://files.pythonhosted.org/packages/88/ec/8c984b39cc57ca21b2581f4095f03025ec19f10016aa4a5398041da51142/sphinx_autodoc_api_style-0.0.1a35-py3-none-any.whl", hash = "sha256:45c6a77e0f8df4c4d18c5be55d3db57c00690eb76bce0bf1fa67de1dd64a3a12", size = 9569, upload-time = "2026-07-19T21:53:39.479Z" }, ] [[package]] name = "sphinx-autodoc-argparse" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1330,22 +1330,22 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/82/1161221501a288edff7e778801f7d799381d79ef0f6c72ebb5d5167476e6/sphinx_autodoc_argparse-0.0.1a34.tar.gz", hash = "sha256:78ce98475090b2f718fd26e0459c8c6fe5fa1731e1de79571fc3e98271c3bfe0", size = 42801, upload-time = "2026-07-14T01:26:31.861Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/07/ae5226132714963082214ef73dd39e31f58c05ebe79cf5b4c690eab7b4ee/sphinx_autodoc_argparse-0.0.1a35.tar.gz", hash = "sha256:2e668dac2f115017bd8f95c5997ec174833159589577096b1ebb591b4ca6ed7a", size = 42803, upload-time = "2026-07-19T21:54:04.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a3/af879d9718607a72eca9fe2a9308377766e0abad883ef404e606d7ae278e/sphinx_autodoc_argparse-0.0.1a34-py3-none-any.whl", hash = "sha256:2eab09a290674b2e7aace149f8e1cf07e3ca8d124ebb21b4826d6984a41b2ef6", size = 47654, upload-time = "2026-07-14T01:26:06.732Z" }, + { url = "https://files.pythonhosted.org/packages/b3/28/8d823a8ad5be0dcba4e62a9f9aa72985b0b7647b5cfc7c185fe7fcf36dd2/sphinx_autodoc_argparse-0.0.1a35-py3-none-any.whl", hash = "sha256:582329af0204874216cf081f5d6a31f6a4d3c070cfa6bdf5b03b0de506ee2309", size = 47654, upload-time = "2026-07-19T21:53:40.753Z" }, ] [[package]] name = "sphinx-autodoc-typehints-gp" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/4a/cedc7da36921ba7fdb98d6b9f4b7a9f0d1546be3c84dae6e1667a185d77e/sphinx_autodoc_typehints_gp-0.0.1a34.tar.gz", hash = "sha256:97b9f197e6d3205745db3cad7ba6eb1668ce57680c2cae7c8550e0ce01f6098a", size = 36866, upload-time = "2026-07-14T01:26:36.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6e/f9341eb41928e4512f011b480cc40db51f10718b8458981e7d774b8d7166/sphinx_autodoc_typehints_gp-0.0.1a35.tar.gz", hash = "sha256:38897bb5d3cb1d356cd86283594bf67853df279260493a3860e043c6eaf4cf65", size = 36865, upload-time = "2026-07-19T21:54:09.603Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/05/f49438bedcf8613666d3019b1d2d5816a58711fd944b5a6c64de2980f62d/sphinx_autodoc_typehints_gp-0.0.1a34-py3-none-any.whl", hash = "sha256:dd5575e4d904940eba0a59e1510666de512006a8df7893448bef9143aaabf64d", size = 39049, upload-time = "2026-07-14T01:26:14.05Z" }, + { url = "https://files.pythonhosted.org/packages/a3/e4/78eab0d6113aa6c6051efa0bb19fde3e16f76722ad765bfe1a80e69bf1e8/sphinx_autodoc_typehints_gp-0.0.1a35-py3-none-any.whl", hash = "sha256:fdbd3e3e63c6690f8e0a56abc167e6c74964b5e30a0ee6fbdf931a3aee7ac6ba", size = 39049, upload-time = "2026-07-19T21:53:47.797Z" }, ] [[package]] @@ -1407,20 +1407,20 @@ wheels = [ [[package]] name = "sphinx-fonts" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/64/654804528ef85604722dbb168de178fcae5daac8e85c86317dff5155422d/sphinx_fonts-0.0.1a34.tar.gz", hash = "sha256:bf8392cd057c430db3064a0dd6f43bfd0defe94a80fcd0c68993b04268201cb4", size = 5790, upload-time = "2026-07-14T01:26:37.893Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/db/db42563a8b22886241c00d319cb7c7297c074ce5d45ff4ed23f2fa4b001f/sphinx_fonts-0.0.1a35.tar.gz", hash = "sha256:13a1c83a02c0f14547f0295d8d9d9f5728ba5fb19793b319dbadddace714ee4c", size = 5788, upload-time = "2026-07-19T21:54:10.475Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/bf/713e7e8f1f79105045c30a864bceeef62b6ebf65b6551e531868f2403fa4/sphinx_fonts-0.0.1a34-py3-none-any.whl", hash = "sha256:5057228567d03e554f47045cc32a178bd6bbeab9cd01e760bde8f2236843872e", size = 4361, upload-time = "2026-07-14T01:26:15.473Z" }, + { url = "https://files.pythonhosted.org/packages/13/73/875faebf651c63eb29462ae181b70e164b707d53b245770ab8aa74c93ed2/sphinx_fonts-0.0.1a35-py3-none-any.whl", hash = "sha256:c1a78e43591937d32dab3e4335cfd810f1b3ccc656e2deb873b10d55b179f07d", size = 4360, upload-time = "2026-07-19T21:53:48.957Z" }, ] [[package]] name = "sphinx-gp-highlighting" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1428,75 +1428,75 @@ dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/b7/0e144d176a024285c43b81c38e6a49fdd517c06b83b7371afd83fdc6c390/sphinx_gp_highlighting-0.0.1a34.tar.gz", hash = "sha256:e38a705a74ff733079c9d4a4220511b363a313b131da620f6bd641987785ace3", size = 7451, upload-time = "2026-07-14T01:26:38.79Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/8e/7a169e2f3f8015d1e2af4921186cc032a8cd29e119a33cbb84f426f8a8db/sphinx_gp_highlighting-0.0.1a35.tar.gz", hash = "sha256:d51ddbc437b5458a8c39f7a09761b8332fa9599f6f10468686574cf4f4936ddf", size = 7453, upload-time = "2026-07-19T21:54:11.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/5c/646952a5105b64dda2309d10a5a0154fb2df47db3799049256a42b1b6c6e/sphinx_gp_highlighting-0.0.1a34-py3-none-any.whl", hash = "sha256:ef9cf59c39324f0e749b5247fe15286976532d36a0a1bd89234ad4debb336976", size = 7388, upload-time = "2026-07-14T01:26:16.711Z" }, + { url = "https://files.pythonhosted.org/packages/93/6a/b31a5d0614af78f6d13601d2501a6766b245b395e9d395f99a8f7bfdd135/sphinx_gp_highlighting-0.0.1a35-py3-none-any.whl", hash = "sha256:93fb5de31af957c7fa0ecb0d0448c3f098ccd6ddcd32c480d0ac5a10441c28b0", size = 7388, upload-time = "2026-07-19T21:53:50.117Z" }, ] [[package]] name = "sphinx-gp-llms" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/86/3a1d4a33af633f77a2463bccfd88905eff5c76625250f56e66e5fc8ada8d/sphinx_gp_llms-0.0.1a34.tar.gz", hash = "sha256:19b0d98ba21057c09af49b0794c65cf8fd62860ff2576a631a1ba53684a15037", size = 9911, upload-time = "2026-07-14T01:26:39.676Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/9c/e44a783c0efcf05a0c0589dc66e82d76754a6d4873da3f869c4183fc4b7f/sphinx_gp_llms-0.0.1a35.tar.gz", hash = "sha256:6b511c2f3e7301087ef5c994b9805882a95064a1bb9c40a8bb849528f5103d62", size = 9911, upload-time = "2026-07-19T21:54:12.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/0e/fff0db236b43e6e11b1625c9988585f14151f1a871bd4d2f20a6ba1d9255/sphinx_gp_llms-0.0.1a34-py3-none-any.whl", hash = "sha256:ef4707c96e5387c95dbc4237f87f8c2d0e85afdd5798aea4f0a86bf767cf87ce", size = 12635, upload-time = "2026-07-14T01:26:18.435Z" }, + { url = "https://files.pythonhosted.org/packages/b2/44/81938643bfb8ecfd06fbd0e55326e0f0924b2f0aa06856f14ecaacaa1485/sphinx_gp_llms-0.0.1a35-py3-none-any.whl", hash = "sha256:7f245717fd75218e1cf430fdc774a184a455ace6ec52c6c67a0196e721a2d46c", size = 12638, upload-time = "2026-07-19T21:53:51.27Z" }, ] [[package]] name = "sphinx-gp-mermaid" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/8c/e2f9a363438430cdc30ad5f2caa391416c1e2a5f3458c1ec561c09fb3c49/sphinx_gp_mermaid-0.0.1a34.tar.gz", hash = "sha256:82b2f7594d97a31f87bc9f9285db338b19abdd6f39c35d074198d63b55a6667f", size = 71319, upload-time = "2026-07-14T01:26:40.616Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/7a/2e2510a76ff3a6fb66307bbc4cdbb86ed98b91818559efdc281e3bd14897/sphinx_gp_mermaid-0.0.1a35.tar.gz", hash = "sha256:bdab75ef56933541839463efbbb064315ebe1e03234e925c60ff6cfa824d4494", size = 71320, upload-time = "2026-07-19T21:54:13.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/e6/d25d546cccf18afb87bf1944380e95a5a87c942a5f8b95ccddb3142f942f/sphinx_gp_mermaid-0.0.1a34-py3-none-any.whl", hash = "sha256:a6333edc54516caf7c71bfdbdec25a8710f42e53622ba6f9448e5f84368e4529", size = 12812, upload-time = "2026-07-14T01:26:19.651Z" }, + { url = "https://files.pythonhosted.org/packages/33/56/1301a894a30015d53e0868a4bf0305c76a0fdda88fd53069218ef8e3550f/sphinx_gp_mermaid-0.0.1a35-py3-none-any.whl", hash = "sha256:205e765bab7666d2bc4d8848d819b10a24886088a5bdc664fde49cb6704d3b86", size = 12816, upload-time = "2026-07-19T21:53:52.616Z" }, ] [[package]] name = "sphinx-gp-opengraph" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/9f/3b7f06a5cf4cf9b0d5708c40a5b4b731e44626d2bae6ae9e3c1a88beee42/sphinx_gp_opengraph-0.0.1a34.tar.gz", hash = "sha256:a77faf3015422d0e6809a0ad3050ee530701d81cf13e9b0514801b2ec07578c5", size = 11947, upload-time = "2026-07-14T01:26:41.621Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/26f3f640d542dd0ce29fda607b7ba14e69be570361d977f1472483fb5ce5/sphinx_gp_opengraph-0.0.1a35.tar.gz", hash = "sha256:7cdff5b7bd301ef07f3a38c9506e89e2650fa21380f8bbf5e961aedc0bd9e91b", size = 11947, upload-time = "2026-07-19T21:54:13.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/99/607674ef3fbd704457f028780c09fbd23a03105113ee9562ed66e65c4d95/sphinx_gp_opengraph-0.0.1a34-py3-none-any.whl", hash = "sha256:2de6db5c3b50e4fa8ade045d1107143eb63d017e2591bdf7bb5e93b05953991b", size = 12183, upload-time = "2026-07-14T01:26:20.855Z" }, + { url = "https://files.pythonhosted.org/packages/af/a2/9df8761ba248add19fddf75ce83b2802bd1c753e7a835b9ed4ec75f9280c/sphinx_gp_opengraph-0.0.1a35-py3-none-any.whl", hash = "sha256:75c6a1bffcc21e9484fd5f65b0688cf6063bcf1648f122abd451cc4e7b7a9a80", size = 12185, upload-time = "2026-07-19T21:53:53.803Z" }, ] [[package]] name = "sphinx-gp-sitemap" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/40/8fafe3ed25a9ce3f25f7184076544dc87c22014033150190d217d741c70f/sphinx_gp_sitemap-0.0.1a34.tar.gz", hash = "sha256:cef3ba77d161cfabe4655e6278a38e346b074afab261bfbf9a8a318fdc5ccd70", size = 9959, upload-time = "2026-07-14T01:26:42.473Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/de/6f2ae4274b696d6ae4e19dc2323481c93ee45c7e7ac2fa84f7721042877f/sphinx_gp_sitemap-0.0.1a35.tar.gz", hash = "sha256:83d2ab5b307f3ef03215c0a51c0cae52d46c4bfead2d3c4343ba56d670d7c30f", size = 9956, upload-time = "2026-07-19T21:54:14.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/13/864d81d87bb2785d36267083c7b018ca3cacd599775cdfa95ae9656a8f56/sphinx_gp_sitemap-0.0.1a34-py3-none-any.whl", hash = "sha256:4f4b0bbdd7cc573d9d9ecf5d0a94d833f5198e47c4909ab3fb16f5c7573d67d0", size = 8980, upload-time = "2026-07-14T01:26:22.264Z" }, + { url = "https://files.pythonhosted.org/packages/28/12/8e5cf2ce8cdae9ab3fbf4cd78ada87d0e8539ed6481d286cb3640d7d63da/sphinx_gp_sitemap-0.0.1a35-py3-none-any.whl", hash = "sha256:1852bddc1f67820394cd6c40be1040fc2e9830f63ba2786505c0d55591efb2ac", size = 8982, upload-time = "2026-07-19T21:53:54.969Z" }, ] [[package]] name = "sphinx-gp-theme" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gp-furo-theme" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/4a/5d42ea3502af7f1a6d7d537cd4b7a8958105ead177964abfaf4604a2ed45/sphinx_gp_theme-0.0.1a34.tar.gz", hash = "sha256:851029dd34c56c6fbda27dd6a228bf57e0b897bf96da1147ad78f11c4f09c067", size = 18286, upload-time = "2026-07-14T01:26:43.306Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/33/c70d2736ad56f10dfda3086a5001aec03da53197aeb7289c3e20a4b53547/sphinx_gp_theme-0.0.1a35.tar.gz", hash = "sha256:8c699698cbe65fbdbe6d64201778c4339c4f9707feb6c618c8f4bad6dc191bf0", size = 18486, upload-time = "2026-07-19T21:54:15.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/90/5af335d6537df8287993d12941962e9732b657ca7b5f7e3d54fe9361c82c/sphinx_gp_theme-0.0.1a34-py3-none-any.whl", hash = "sha256:d54c3dc65d2fb1a96883f7a87fbc6057b66683cf067f3ef227d57cbc097d45a6", size = 19886, upload-time = "2026-07-14T01:26:23.522Z" }, + { url = "https://files.pythonhosted.org/packages/57/d9/eed280cbae7110e6930b134605c2e6be76350b67b7fcbb47e25e9ea7b3e3/sphinx_gp_theme-0.0.1a35-py3-none-any.whl", hash = "sha256:5978fe159e467e3263383850331ff14d3f814631e060883764f68278068e0d36", size = 20106, upload-time = "2026-07-19T21:53:56.179Z" }, ] [[package]] @@ -1514,28 +1514,28 @@ wheels = [ [[package]] name = "sphinx-ux-autodoc-layout" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/3a/86386c93a03f5f7da5af3854bfe59c6f5f497a4f2ca5695d46a5f061d421/sphinx_ux_autodoc_layout-0.0.1a34.tar.gz", hash = "sha256:1f988b52f33a5d618b5eda9441aadbc2ce752f07debe1b518cf566e49e22bdc1", size = 30598, upload-time = "2026-07-14T01:26:44.323Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/75/b6b218eb91a7fd24710ebafd4e0be7e3a1a598a7adb389d330a47719345d/sphinx_ux_autodoc_layout-0.0.1a35.tar.gz", hash = "sha256:aec957122a4e20015fd93d5d313d883d934f22fb1f38ec6edcb19d475f6e10b9", size = 30602, upload-time = "2026-07-19T21:54:16.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/44/2ff46d3b18c53b3218ded9affb99afffe988b33bb722bb377ba070899f37/sphinx_ux_autodoc_layout-0.0.1a34-py3-none-any.whl", hash = "sha256:ce440b8882e034219f2a23a3751e6626b9d81aec71c0ff768ca9c414d99fc783", size = 34998, upload-time = "2026-07-14T01:26:24.881Z" }, + { url = "https://files.pythonhosted.org/packages/3e/32/3bc568bb987755aeb2617054c2949f83ff552e05a8de6d33cf5602b2044b/sphinx_ux_autodoc_layout-0.0.1a35-py3-none-any.whl", hash = "sha256:69110289993ed8be86ba256c2f833f31e6b7628c858a5fa6842ed2d93a9a1ee6", size = 34999, upload-time = "2026-07-19T21:53:57.624Z" }, ] [[package]] name = "sphinx-ux-badges" -version = "0.0.1a34" +version = "0.0.1a35" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/ed/dcc90346f1681ed6ae9f7b16552afdde2e13a3bb407284bf48d7b3aa6bb3/sphinx_ux_badges-0.0.1a34.tar.gz", hash = "sha256:3bd4716e9ab05ca9dac26cadb54213057f7932eb266a943ce2e98d2d08e7e9b5", size = 16723, upload-time = "2026-07-14T01:26:45.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/b6/3cda8ad1a84fd2712a8220a8c97b852e93ed88644dd118911ba7de348faa/sphinx_ux_badges-0.0.1a35.tar.gz", hash = "sha256:f2d322c0d1d8bd51804a10daa1ee9e93adab6b5977c13c85b6a7d5ed29efd770", size = 16723, upload-time = "2026-07-19T21:54:17.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/f9/07029ca3cbdb6818dd12bcf89a8396cd0f51464e2dcfd5fac4f395589113/sphinx_ux_badges-0.0.1a34-py3-none-any.whl", hash = "sha256:1f837645d2addd6ce83f3e641148c6ef7e3580bed9e9a981b61da2810eebc433", size = 17490, upload-time = "2026-07-14T01:26:26.113Z" }, + { url = "https://files.pythonhosted.org/packages/96/32/6fcaeda520e242521084220442a5cabefae075ec3477261e0530dacec9d7/sphinx_ux_badges-0.0.1a35-py3-none-any.whl", hash = "sha256:c73426d800e59d403411921cbc37db41bcee70501cb856e50a812c545263de05", size = 17487, upload-time = "2026-07-19T21:53:58.872Z" }, ] [[package]] @@ -1701,7 +1701,7 @@ dev = [ { name = "codecov" }, { name = "coverage" }, { name = "gp-libs", specifier = ">=0.0.19" }, - { name = "gp-sphinx", specifier = "==0.0.1a34" }, + { name = "gp-sphinx", specifier = "==0.0.1a35" }, { name = "mypy" }, { name = "pillow" }, { name = "pytest" }, @@ -1711,10 +1711,10 @@ dev = [ { name = "pytest-watcher" }, { name = "ruff" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a34" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a34" }, - { name = "sphinx-gp-highlighting", specifier = "==0.0.1a34" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a34" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a35" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a35" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a35" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a35" }, { name = "types-docutils" }, { name = "types-pygments" }, { name = "types-pyyaml" }, @@ -1722,13 +1722,13 @@ dev = [ docs = [ { name = "aafigure" }, { name = "gp-libs", specifier = ">=0.0.19" }, - { name = "gp-sphinx", specifier = "==0.0.1a34" }, + { name = "gp-sphinx", specifier = "==0.0.1a35" }, { name = "pillow" }, { name = "sphinx-autobuild" }, - { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a34" }, - { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a34" }, - { name = "sphinx-gp-highlighting", specifier = "==0.0.1a34" }, - { name = "sphinx-gp-mermaid", specifier = "==0.0.1a34" }, + { name = "sphinx-autodoc-api-style", specifier = "==0.0.1a35" }, + { name = "sphinx-autodoc-argparse", specifier = "==0.0.1a35" }, + { name = "sphinx-gp-highlighting", specifier = "==0.0.1a35" }, + { name = "sphinx-gp-mermaid", specifier = "==0.0.1a35" }, ] lint = [ { name = "mypy" },